7813 lines
222 KiB
C++
7813 lines
222 KiB
C++
/**
|
|
* @file GlobalFunc.cpp
|
|
* @brief SendPacket 및 기본적인 함수를 모아둔다.
|
|
* @author Unknown
|
|
* @version Unknown
|
|
*/
|
|
|
|
//------------------------------------------------------------------------------
|
|
// GlobalFunc.cpp
|
|
// (C) 2005 Webzen Sunstudio
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include "SunClientPrecompiledHeader.h"
|
|
#include "GlobalFunc.h"
|
|
#include "soundbgm.h"
|
|
#include "map.h"
|
|
#include "BGMSoundInfoParser.h"
|
|
#include "interfacemanager.h"
|
|
#include "SolarDialog.h"
|
|
#include "Hero.h"
|
|
#include "HeroActionInput.h"
|
|
#include "LoginScene.h"
|
|
#include "BattleScene.h"
|
|
#include "CompetitionScene.h"
|
|
#include "uiBattleZoneCreate/uiBattleZoneCreate.h"
|
|
#include "uiBattleZoneList/uiBattleZoneList.h"
|
|
#include "uiSystemVerify/uiSystemVerify.h"
|
|
#include "uiSystemConfirm/uiSystemConfirm.h"
|
|
#include "uiVendorMan/uiVendorMan_def.h"
|
|
#include "uiVendorBuy/uiVendorBuy.h"
|
|
#include "uiVendorSell/uiVendorSell.h"
|
|
#include "uiVendorPopup/uiVendorPopup.h"
|
|
#include "uiVendorTitlePopup/uiVendorTitlePopup.h"
|
|
#include "uiPartyLeavePopup/uiPartyLeavePopup.h"
|
|
#include "uiTrade/uiTrade.h"
|
|
#include "uiTradeMan/uiTradeMan.h"
|
|
#include "uiCharPopupMenu/uiCharPopupMenu.h"
|
|
#include "uiHelpMenu/uiHelpMenu.h"
|
|
#include "uiHelpWindow/uiHelpWindow.h"
|
|
#include "BattleLobby.h"
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
#include "uiBankMan/uiBankDialog.h"
|
|
#include "GuildSystem/uiGuildWareHouse.h"
|
|
#else
|
|
#include "BankDialog.h"
|
|
#include "inputnumbankdialog.h"
|
|
#include "uiGuildWareHouse/uiGuildWareHouse.h"
|
|
#endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
#include "inputnumtradedialog.h"
|
|
#include "ChatDialog.h"
|
|
#include "uiQuestMan/uiQuestMan.h"
|
|
#include "uiItemTotalComposite/uiItemTotalComposite.h"
|
|
#ifdef _JBH_MOD_VENDOR_SELECT_BUY_NUM
|
|
#include "uiVendorBuyPopup.h"
|
|
#endif
|
|
#include "uiVendorList/uiVendorList.h"
|
|
#include "ItemManager.h"
|
|
#include "MouseHandler.h"
|
|
#include "KeyQueueManager.h"
|
|
#include "RadarInfoParser.h"
|
|
#include "RadarFullDialog.h"
|
|
#include "Application.h"
|
|
#include "SolarDateTime.h"
|
|
#include "uiPasswordMan/uiPassWordMan.h"
|
|
#include "uiPasswordDlg/uiPasswordDlg.h"
|
|
#include "uiMenuMan/uiMenuMan.h"
|
|
#include "uiRadarMan/uiRadarMan.h"
|
|
#include "InventoryDialog.h"
|
|
#include "uiCashItemShopMan/uiCashItemShopMan.h"
|
|
#ifdef __CN_0_20070507_SHOP_MILEAGE
|
|
#include "ShopDefine.h"
|
|
#endif // __CN_0_20070507_SHOP_MILEAGE
|
|
|
|
#include "uiBankMan/uiBankMan.h"
|
|
#include "uiInventoryMan/uiInventoryMan.h"
|
|
#include "Message.h"
|
|
#include "uiHelpMan/uiHelpMan.h"
|
|
#include "uiLoginMan/uiLoginMan.h"
|
|
|
|
#ifdef __CN_269_MATRIX_CARD_AUTH
|
|
#include "MatrixCardAuth.h"
|
|
#endif //__CN_269_MATRIX_CARD_AUTH
|
|
#ifdef _NA_003923_20120222_GUILD_RENEWAL_UI_RENEWAL
|
|
#include "GuildSystem/GuildSystemData.h"
|
|
#include "GuildSystem/GuildSystemFunction.h"
|
|
#else
|
|
#include "uiGuildMan/uiGuildMan.h"
|
|
#include "uiGuildMenu/uiGuildMenu.h"
|
|
#include "uiGuildCreate/uiGuildCreate.h"
|
|
#include "uiGuildWindow/uiGuildWindow.h"
|
|
#include "uiGuildMain/uiGuildMain.h"
|
|
#endif //_NA_003923_20120222_GUILD_RENEWAL_UI_RENEWAL
|
|
#include "uiWayPointMan/uiWayPointMan.h"
|
|
#if defined(_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM)
|
|
#include "uiMissionRankMan2/uiMissionRankMan2.h"
|
|
#else
|
|
#include "uiMissionRankMan/uiMissionRankMan.h"
|
|
#endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM
|
|
#include "uiBattleZoneMan/uiBattleZoneMan.h"
|
|
#include "MapInfoParser.h"
|
|
#include "uiPartyMan/uiPartyMan.h"
|
|
#include "GameConst_Color.h"
|
|
#include "ClientVer.h"
|
|
#include <PacketControl/PacketControl.h>
|
|
#include "CharacterScene.h"
|
|
#include "LoadScene.h"
|
|
#include "uiSSQMan/uiSSQManager.h"
|
|
#include "ItemFormula.h"
|
|
|
|
#ifdef __NA_001358_ENCHANT_UNIFICATION
|
|
#include "InstantEnchantParser.h"
|
|
#include "uiEnchantMan/uiEnchantMan.h"
|
|
#else
|
|
#include "EnchantParser.h"
|
|
#endif //__NA_001358_ENCHANT_UNIFICATION
|
|
|
|
#include "uiPersonalWayPointMan/uiPersonalWayPointMan.h"
|
|
#include "uiPersonalWayPointWindow/uiPersonalWayPointWindow.h"
|
|
#include "uiAreaConquestMan/uiAreaConquestMan.h"
|
|
#include "ProjectileManagerEx.h"
|
|
#include <SSQ/SSQPacketProc.h>
|
|
#include "uiChatMan/uiChatMan_def.h"
|
|
#include "ObjectManager.h"
|
|
|
|
#ifdef _NHN_USA_CHANNELING
|
|
#include <HanAuth/HanReportForClient.h>
|
|
#include <HanAuth/HanAuthforClient.h>
|
|
#endif//_NHN_USA_CHANNELING(북미채널링)
|
|
|
|
#include "uiNoticeMan/uiNoticeMan.h"
|
|
#include "uiGuildNoticeDialog/uiGuildNoticeDialog.h"
|
|
|
|
#include "uiBattleScoreMan\uiBattleScoreMan.h"
|
|
#ifdef _JP000000_ONETIMEPASSWORD_AUTHFLOW_
|
|
#include "uiLoginOneTimePassword/uiLoginOneTimePassword.h"
|
|
#endif //_JP000000_ONETIMEPASSWORD_AUTHFLOW_
|
|
|
|
#include "uiToolTipMan/uiToolTipMan.h"
|
|
#include "ShopDialog.h"
|
|
#include "CastLeaveFieldDialog.h"
|
|
#include "ItemInfoParser.h"
|
|
#include "NPC.h"
|
|
#include "OptionListParser.h"
|
|
|
|
#if defined(__CN_20100909_SECURITY_TOKEN__)
|
|
#include "uiLoginOneTimePassword/uiLoginOneTimePassword.h"
|
|
#endif //__CN_20100909_SECURITY_TOKEN__
|
|
|
|
#include "Item.h"
|
|
#include "ItemShareSystem.h"
|
|
#include "../PartyLib/PartyDefine.h"
|
|
|
|
#include "uiGuideSystemMan/uiGuideSystemMan.h"
|
|
|
|
#ifdef _DH_BATTLEZONE2_
|
|
#include "uiBattlezone2List/uiBattlezone2List.h"
|
|
#include "uiBattlezone2Tree/uiBattlezone2Tree.h"
|
|
#include "uiBattlezone2Man/uiBattlezone2Man.h"
|
|
#include "uiBattlezone2Reservation/uiBattlezone2Reservation.h"
|
|
#endif//_DH_BATTLEZONE2_
|
|
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#include "ChaosSystem/ChaosSystemMan.h"
|
|
#include "ChaosSystem/ChaosSystemData.h"
|
|
#include "BattleGroundInfoParser.h"
|
|
#include "ChaosZoneInfoParser.h"
|
|
#include "SystemDialog.h"
|
|
#endif//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
#include "ChaosSystem/uiChaosZonePVP.h"
|
|
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
#ifdef _NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
#include "uiDominationTowerMan/uiDominationTowerMan.h"
|
|
#endif //_NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
|
|
#ifdef _NA_000000_20140120_SMART_NPC_SYSTEM
|
|
#include "uiSmartNpcDialogMan/uiSmartNpcDialogMan.h"
|
|
#endif //_NA_000000_20140120_SMART_NPC_SYSTEM
|
|
|
|
#ifdef _NA_007086_20140318_MONSTERBOOK
|
|
#include "uiMonsterBookMan/uiMonsterBookMan.h"
|
|
#endif //_NA_007086_20140318_MONSTERBOOK
|
|
#ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
|
|
#include "uiAttendanceCheck/uiAttendanceCheckMan.h"
|
|
#endif //_NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
|
|
#ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM
|
|
#include "uiSUNRankingMan/uiSUNRankingMan.h"
|
|
#endif // _NA_008016_20150203_SUN_RANKING_SYSTEM
|
|
#ifdef _NA_008405_20150716_MINIGAME_BINGO
|
|
#include "uiMiniGameMan/uiMiniGameMan.h"
|
|
#endif // _NA_008405_20150716_MINIGAME_BINGO
|
|
#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
|
|
#include "uiCombatRecordMan/uiCombatRecordMan.h"
|
|
#include "NPCInfoParser.h"
|
|
#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
|
|
|
|
#include "DominationInfoParser.h"
|
|
#include <winconsole.h>
|
|
#include <time.h>
|
|
#include "GlobalFunc.h"
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
#include "uiDominationTimer/uiDominationTimer.h"
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
|
|
#include "ChaosSystem/ChaosSystemPacketFunction.h"
|
|
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
|
|
|
|
#ifdef _JBH_MOD_MONEY_OUTPUT
|
|
#define MONEY_COLOR_1_000 WzColor_RGBA(255,255,255,255)
|
|
#define MONEY_COLOR_10_000 WzColor_RGBA(211,165,223,255)
|
|
#define MONEY_COLOR_100_000 WzColor_RGBA(8,252,54,255)
|
|
#define MONEY_COLOR_1_000_000 WzColor_RGBA(235,227,117,255)
|
|
#define MONEY_COLOR_10_000_000 WzColor_RGBA(44,64,252,255)
|
|
#define MONEY_COLOR_100_000_000 WzColor_RGBA(255,1,1,255)
|
|
#endif
|
|
|
|
DWORD g_dwTotalLoadingTime = 0;
|
|
bool g_bLoadingTimeSave = false;
|
|
char g_szDevOption[1024] = {0};
|
|
|
|
#define MODFLOAT(ratio) ((ratio)<0 ? (-0.5f):(0.5f))
|
|
|
|
using namespace nsSSQ;
|
|
using namespace nsSSQ::Observer;
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL
|
|
GlobalFunc::SendPacketToGameServer( void * pBuf, int iLength )
|
|
{
|
|
return SendPacket( CI_GAMESERVERIDX, pBuf, iLength );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL
|
|
GlobalFunc::SendPacketToWorldServer( void * pBuf, int iLength )
|
|
{
|
|
return SendPacket( CI_CHATSERVERIDX, pBuf, iLength );
|
|
}
|
|
#ifdef _NHN_USA_CHANNELING
|
|
//-------------------------------------------------------------------------------------------
|
|
/** NHN_USA 지표보고패킷(존이동시작)
|
|
401:필드 ---> 필드
|
|
500:필드 ---> 배틀존
|
|
502:배틀존 ---> 필드
|
|
403:포탈이동
|
|
*/
|
|
int GlobalFunc::CheckMoveToZone(MAPID OldMapID,MAPID NewMapID,BOOL bPortal)
|
|
{
|
|
//step1:현재존과 가야할존을 체크
|
|
const sMAPINFO * pOld= MapInfoParser::Instance()->FindMapInfo(OldMapID);
|
|
const sMAPINFO * pNew= MapInfoParser::Instance()->FindMapInfo(NewMapID);
|
|
|
|
if(!pOld || !pNew)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if(pOld->byMKind == eZONETYPE_MAX || pNew->byMKind == eZONETYPE_MAX)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//step2:여기서부터 어떤존인지 값을 삽입한다.(enum정의 없이 eZoneType으로 일괄처리)
|
|
BYTE arZone[2] = {pOld->byMKind ,pNew->byMKind };
|
|
|
|
for(int i=0;i<2;++i)
|
|
{
|
|
switch(arZone[i])
|
|
{
|
|
//일반존이였을경우(마을.필드)
|
|
case eZONETYPE_TUTORIAL_FIELD:
|
|
case eZONETYPE_VILLAGE:
|
|
case eZONETYPE_FIELD:
|
|
{
|
|
arZone[i] = eZONETYPE_FIELD;
|
|
}
|
|
break;
|
|
//배틀존이였을경우(미션.헌팅.저탑.pvp)
|
|
case eZONETYPE_MISSION:
|
|
case eZONETYPE_HUNTING:
|
|
case eZONETYPE_PVP:
|
|
case eZONETYPE_CHUNTING:
|
|
case eZONETYPE_INSTANCE:
|
|
{
|
|
arZone[i] = eZONETYPE_MISSION;
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
//디폴트는 이렇게 MAX(case 지정된값만 값을 변경)
|
|
arZone[i] = eZONETYPE_MAX;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//step3:존에대한판단을한다(eZONETYPE_MAX:case값(필드.배틀존)만판단)
|
|
if(arZone[0] ==eZONETYPE_MAX || arZone[1] == eZONETYPE_MAX)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int nReportVal = -1;
|
|
//현재 필드였었다면
|
|
if(arZone[0]==eZONETYPE_FIELD)
|
|
{
|
|
nReportVal = (arZone[1]==eZONETYPE_FIELD) ? (401):(500);
|
|
}
|
|
else
|
|
{
|
|
//(배틀존->배틀존은 보고안함)
|
|
nReportVal = (arZone[1]==eZONETYPE_FIELD) ? (502):(-1);
|
|
}
|
|
|
|
if(nReportVal!=-1)
|
|
{
|
|
if(bPortal)
|
|
{
|
|
nReportVal = 403;
|
|
}
|
|
//존이동시작보고를 날린다
|
|
SendHanReportPacket(nReportVal);
|
|
return nReportVal;
|
|
}
|
|
return -1;
|
|
}
|
|
//-------------------------------------------------------------------------------------------
|
|
/** NHN_USA 서비스 지표보고패킷
|
|
*/
|
|
int GlobalFunc::SendHanReportPacket(int nVal)
|
|
{
|
|
//300:클라 시작 //301:클라 종료
|
|
//305:캐릭터 선택 //305:캐릭터 선택종료
|
|
//310:채널접속 //311:채널접속 종료
|
|
|
|
int nRet = 0;
|
|
|
|
if(g_szGameString)
|
|
{
|
|
char szMemberId[21]={0x00}; //21 is Max
|
|
nRet = HanAuthGetId(g_szGameString,szMemberId,sizeof(szMemberId));
|
|
char szReportString[INTERFACE_STRING_LENGTH]={0x00};
|
|
Snprintf (szReportString,INTERFACE_STRING_LENGTH-1, "id=%s&value=%d",szMemberId,nVal);
|
|
nRet = HanReportSendPosLog(szReportString);
|
|
}
|
|
return nRet;
|
|
}
|
|
#endif//_NHN_USA_CHANNELING(북미채널링)
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/** RIDER 라이딩 애니메이션
|
|
*/
|
|
WzID GlobalFunc::GetRiderAnimationByPlayerAni(ePLAYER_ANI eState, bool is_spread)
|
|
{
|
|
WzID wzID = NULL;
|
|
|
|
switch(eState)
|
|
{
|
|
case eANI_STAND: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N101"); break; //기본스탠드
|
|
case eANI_IDLE: wzID = (is_spread == false) ? StrToWzID("N002") : StrToWzID("N102"); break; //idle
|
|
case eANI_IDLE2: wzID = (is_spread == false) ? StrToWzID("N003") : StrToWzID("N103"); break; //idle2
|
|
case eANI_SIT: wzID = (is_spread == false) ? StrToWzID("N004") : StrToWzID("N104"); break; //앉기
|
|
case eANI_SIT_IDLE: wzID = (is_spread == false) ? StrToWzID("N005") : StrToWzID("N105"); break; //앉기idle
|
|
case eANI_GETUP: wzID = (is_spread == false) ? StrToWzID("N016") : StrToWzID("N116"); break; //서기
|
|
case eANI_RUN:
|
|
{
|
|
//뛰기
|
|
//wzID = (is_spread == false) ? StrToWzID("N007") : StrToWzID("N107");
|
|
if (is_spread == true)
|
|
{
|
|
if (g_HeroInput.IsLeftKeyPressed())
|
|
{
|
|
wzID = StrToWzID("N120");
|
|
}
|
|
else if (g_HeroInput.IsRightKeyPressed())
|
|
{
|
|
wzID = StrToWzID("N121");
|
|
}
|
|
else
|
|
{
|
|
wzID = StrToWzID("N107");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wzID = StrToWzID("N007");
|
|
}
|
|
}
|
|
break; //뛰기
|
|
case eANI_R_MOVE: wzID = (is_spread == false) ? StrToWzID("N010") : StrToWzID("N110"); break; //오른쪽이동
|
|
case eANI_L_MOVE: wzID = (is_spread == false) ? StrToWzID("N009") : StrToWzID("N109"); break; //왼쪽이동
|
|
case eANI_B_MOVE: wzID = (is_spread == false) ? StrToWzID("N011") : StrToWzID("N111"); break; //뒤로이동
|
|
case eANI_R_ROTATE: wzID = (is_spread == false) ? StrToWzID("N013") : StrToWzID("N113"); break; //우회전
|
|
case eANI_L_ROTATE: wzID = (is_spread == false) ? StrToWzID("N012") : StrToWzID("N112"); break; //좌회전
|
|
case eANI_JUMP_START: wzID = (is_spread == false) ? StrToWzID("J001") : StrToWzID("J101"); break; //점프
|
|
case eANI_JUMP_LOOP: wzID = (is_spread == false) ? StrToWzID("J002") : StrToWzID("J102"); break; //점프중
|
|
case eANI_JUMP_END: wzID = (is_spread == false) ? StrToWzID("J003") : StrToWzID("J103"); break; //착지(제자리)
|
|
case eANI_JUMP_LAND: wzID = (is_spread == false) ? StrToWzID("J004") : StrToWzID("J104"); break; //착지(이동중)
|
|
case eANI_HJUMP_END: wzID = (is_spread == false) ? StrToWzID("J005") : StrToWzID("J105"); break; //높은곳착지
|
|
case eANI_HJUMP_END_LOOP: wzID = (is_spread == false) ? StrToWzID("J006") : StrToWzID("J106"); break; //높으곳착지후 잠시대기
|
|
case eANI_HJUMP_GETUP: wzID = (is_spread == false) ? StrToWzID("J007") : StrToWzID("J107"); break; //높은곳착지후 일어나기
|
|
case eANI_RIDER_SPREAD: wzID = StrToWzID("F001"); break; //!< 탈것이 펼때
|
|
case eANI_RIDER_FURL: wzID = StrToWzID("F002"); break; //!< 탈것이 접을때
|
|
case eANI_SPREAD_OTHERMOTION_MOVE: wzID = StrToWzID("J110"); break; //!< MOVE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
case eANI_SPREAD_OTHERMOTION_IDLE: wzID = StrToWzID("J111"); break; //!< IDLE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
}
|
|
|
|
return wzID;
|
|
}
|
|
//-------------------------------------------------------------------------------------------
|
|
/** PLAYER 라이딩 애니메이션
|
|
*/
|
|
WzID GlobalFunc::GetPlayerAnimationByRiding(ePLAYER_ANI eState, char cType)
|
|
{
|
|
tagWZID AnimID;
|
|
|
|
switch(eState)
|
|
{
|
|
case eANI_STAND: AnimID.id = StrToWzID("T001"); break; //기본스탠드
|
|
case eANI_IDLE: AnimID.id = StrToWzID("T002"); break; //idle
|
|
case eANI_IDLE2: AnimID.id = StrToWzID("T003"); break; //idle2
|
|
case eANI_SIT: AnimID.id = StrToWzID("T004"); break; //앉기
|
|
case eANI_SIT_IDLE: AnimID.id = StrToWzID("T005"); break; //앉기idle
|
|
case eANI_GETUP: AnimID.id = StrToWzID("T016"); break; //서기
|
|
case eANI_RUN: AnimID.id = StrToWzID("T007"); break; //뛰기
|
|
case eANI_L_MOVE: AnimID.id = StrToWzID("T009"); break; //왼쪽이동
|
|
case eANI_R_MOVE: AnimID.id = StrToWzID("T010"); break; //오른쪽이동
|
|
case eANI_B_MOVE: AnimID.id = StrToWzID("T011"); break; //뒤로이동
|
|
case eANI_R_ROTATE: AnimID.id = StrToWzID("T013"); break; //우회전
|
|
case eANI_L_ROTATE: AnimID.id = StrToWzID("T012"); break; //좌회전
|
|
case eANI_JUMP_START: AnimID.id = StrToWzID("T051"); break; //점프
|
|
case eANI_JUMP_LOOP: AnimID.id = StrToWzID("T052"); break; //점프중
|
|
case eANI_JUMP_END: AnimID.id = StrToWzID("T053"); break; //착지(제자리)
|
|
case eANI_JUMP_LAND: AnimID.id = StrToWzID("T054"); break; //착지(이동중)
|
|
case eANI_HJUMP_END: AnimID.id = StrToWzID("T055"); break; //높은곳착지
|
|
case eANI_HJUMP_END_LOOP: AnimID.id = StrToWzID("T056"); break; //높으곳착지후 잠시대기
|
|
case eANI_HJUMP_GETUP: AnimID.id = StrToWzID("T057"); break; //높은곳착지후 일어나기
|
|
case eANI_RIDER_SPREAD: AnimID.id = StrToWzID("T070"); break; //탈것이 펼때
|
|
case eANI_RIDER_FURL: AnimID.id = StrToWzID("T071"); break; //탈것이 접을때
|
|
|
|
//! IDLE/MOVE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
//! J110/J111 애니코드는 탈것 종류에 상관없이 모두 같이 사용하게 함
|
|
case eANI_SPREAD_OTHERMOTION_MOVE: return StrToWzID("J110");
|
|
case eANI_SPREAD_OTHERMOTION_IDLE: return StrToWzID("J111");
|
|
}
|
|
AnimID.code[1] = cType;
|
|
|
|
return AnimID.id;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
WzID GlobalFunc::GetAnimationByPolymorph(ePLAYER_ANI eState)
|
|
{
|
|
switch( eState )
|
|
{
|
|
case eANI_RUN:
|
|
case eANI_L_MOVE: //왼쪽이동
|
|
case eANI_R_MOVE: //오른쪽이동
|
|
case eANI_B_MOVE: //뒤로이동
|
|
case eANI_L_ROTATE: //좌회전
|
|
case eANI_R_ROTATE: //우회전
|
|
return StrToWzID("N007");
|
|
}
|
|
|
|
return StrToWzID("N001");
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
WzID GlobalFunc::GetPlayerAnimationBySpreadWings(ePLAYER_ANI eState)
|
|
{
|
|
WzID wzID = NULL;
|
|
|
|
switch(eState)
|
|
{
|
|
case eANI_STAND: wzID = StrToWzID("N501"); break;//기본스탠드
|
|
case eANI_IDLE: wzID = StrToWzID("N502"); break; //idle
|
|
case eANI_IDLE2: wzID = StrToWzID("N502"); break; //idle
|
|
case eANI_SIT: wzID = StrToWzID("N502"); break; //앉기
|
|
case eANI_SIT_IDLE: wzID = StrToWzID("N502"); break; //앉기idle
|
|
case eANI_GETUP: wzID = StrToWzID("N502"); break; //서기
|
|
case eANI_RUN:
|
|
{
|
|
//뛰기
|
|
if (g_HeroInput.IsLeftKeyPressed())
|
|
{
|
|
wzID = StrToWzID("N522");
|
|
}
|
|
else if (g_HeroInput.IsRightKeyPressed())
|
|
{
|
|
wzID = StrToWzID("N523");
|
|
}
|
|
else
|
|
{
|
|
wzID = StrToWzID("N507");
|
|
}
|
|
}
|
|
break;
|
|
case eANI_L_MOVE: wzID = StrToWzID("N509"); break; //왼쪽이동
|
|
case eANI_R_MOVE: wzID = StrToWzID("N510"); break; //오른쪽이동
|
|
case eANI_B_MOVE: wzID = StrToWzID("N511"); break; //뒤로이동
|
|
case eANI_L_ROTATE: wzID = StrToWzID("N512"); break; //좌회전
|
|
case eANI_R_ROTATE: wzID = StrToWzID("N513"); break; //우회전
|
|
case eANI_JUMP_START: wzID = StrToWzID("J501"); break; //점프
|
|
case eANI_JUMP_LOOP: wzID = StrToWzID("J502"); break; //점프중
|
|
case eANI_JUMP_END: wzID = StrToWzID("J503"); break; //착지(제자리)
|
|
case eANI_JUMP_LAND: wzID = StrToWzID("J504"); break; //착지(이동중)
|
|
case eANI_HJUMP_END: wzID = StrToWzID("J505"); break; //높은곳착지
|
|
case eANI_HJUMP_END_LOOP: wzID = StrToWzID("J506"); break; //높으곳착지후 잠시대기
|
|
case eANI_HJUMP_GETUP: wzID = StrToWzID("J507"); break; //높은곳착지후 일어나기
|
|
case eANI_WINGS_SPREAD: wzID = StrToWzID("N520"); break; //!< 날개 펼때
|
|
case eANI_WINGS_FURL: wzID = StrToWzID("N521"); break; //!< 날개 접을때
|
|
case eANI_SPREAD_OTHERMOTION_MOVE: wzID = StrToWzID("J508"); break; //!< MOVE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
case eANI_SPREAD_OTHERMOTION_IDLE: wzID = StrToWzID("J509"); break; //!< IDLE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
}
|
|
|
|
return wzID;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
WzID GlobalFunc::GetWingsAnimationByPlayerAni(ePLAYER_ANI eState, bool is_spread)
|
|
{
|
|
WzID wzID = NULL;
|
|
|
|
switch(eState)
|
|
{
|
|
case eANI_STAND: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N501");break;//기본스탠드
|
|
case eANI_IDLE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N502"); break; //idle
|
|
case eANI_IDLE2: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N502"); break; //idle
|
|
case eANI_SIT: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N502"); break; //앉기
|
|
case eANI_SIT_IDLE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N502"); break; //앉기idle
|
|
case eANI_GETUP: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N502"); break; //서기
|
|
case eANI_RUN: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N507"); break; //뛰기
|
|
case eANI_L_MOVE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N509"); break; //왼쪽이동
|
|
case eANI_R_MOVE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N510"); break; //오른쪽이동
|
|
case eANI_B_MOVE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N511"); break; //뒤로이동
|
|
case eANI_L_ROTATE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N512"); break; //좌회전
|
|
case eANI_R_ROTATE: wzID = (is_spread == false) ? StrToWzID("N001") : StrToWzID("N513"); break; //우회전
|
|
case eANI_JUMP_START: wzID = (is_spread == false) ? StrToWzID("J001") : StrToWzID("J501"); break; //점프
|
|
case eANI_JUMP_LOOP: wzID = (is_spread == false) ? StrToWzID("J002") : StrToWzID("J502"); break; //점프중
|
|
case eANI_JUMP_END: wzID = (is_spread == false) ? StrToWzID("J003") : StrToWzID("J503"); break; //착지(제자리)
|
|
case eANI_JUMP_LAND: wzID = (is_spread == false) ? StrToWzID("J004") : StrToWzID("J504"); break; //착지(이동중)
|
|
case eANI_HJUMP_END: wzID = (is_spread == false) ? StrToWzID("J005") : StrToWzID("J505"); break; //높은곳착지
|
|
case eANI_HJUMP_END_LOOP: wzID = (is_spread == false) ? StrToWzID("J006") : StrToWzID("J506"); break; //높으곳착지후 잠시대기
|
|
case eANI_HJUMP_GETUP: wzID = (is_spread == false) ? StrToWzID("J007") : StrToWzID("J507"); break; //높은곳착지후 일어나기
|
|
case eANI_WINGS_SPREAD: wzID = StrToWzID("N520"); break; //!< 날개 펼때
|
|
case eANI_WINGS_FURL: wzID = StrToWzID("N521"); break; //!< 날개 접을때
|
|
case eANI_SPREAD_OTHERMOTION_MOVE: wzID = StrToWzID("J508"); break; //!< MOVE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
case eANI_SPREAD_OTHERMOTION_IDLE: wzID = StrToWzID("J509"); break; //!< IDLE 의 다른모션(SPACE KEY누르면 취하는 모션)
|
|
|
|
}
|
|
|
|
return wzID;
|
|
}
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL
|
|
GlobalFunc::SendPacketToAuthServer( void * pBuf, int iLength )
|
|
{
|
|
return SendPacket( CI_AUTHSERVERIDX, pBuf, iLength );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL GlobalFunc::SendPacket(eCONNECTION_INDEX idx, void * pBuf, int iLength )
|
|
{
|
|
using namespace nsPacket;
|
|
if( g_pNetwork && GENERALPARAM->IsNet() )
|
|
{
|
|
if ( g_pNetwork->IsConnected(idx) )
|
|
{
|
|
//#ifdef _DEV_VER
|
|
// if(IsShowNetSendLog())
|
|
// {
|
|
// MSG_BASE * pPacket = (MSG_BASE * )pBuf;
|
|
//
|
|
// char szText[1024] = {0,};
|
|
//
|
|
// Sprintf(szText, "[SEND] Idx : %d, Catagory : %d, Protocol : %d, Size : %d \n\r",
|
|
// idx, pPacket->m_byCategory, pPacket->m_byProtocol, iLength);
|
|
//
|
|
// OutputDebugString(szText);
|
|
// }
|
|
//
|
|
#ifdef _DEBUG //#ifdef _LTJ_PACKET_SHOW_FOR_DEBUG
|
|
if ((g_pPacketShow) && IsShowPacketLog())
|
|
{
|
|
MSG_BASE* packet = (MSG_BASE*)pBuf;
|
|
if( const CHAR* msg_str = g_pPacketShow->fnQuery(packet->m_byCategory, packet->m_byProtocol, NULL) )
|
|
{
|
|
bool writelog = true;
|
|
|
|
if( packet->m_byCategory == CG_SYNC )
|
|
writelog = false;
|
|
|
|
if( packet->m_byCategory == CG_CONNECTION && packet->m_byProtocol == CG_CONNECTION_HEARTBEAT_SYN )
|
|
writelog = false;
|
|
|
|
if( packet->m_byCategory == CW_CONNECTION && packet->m_byProtocol == CW_HEARTBEAT )
|
|
writelog = false;
|
|
|
|
if( writelog == true )
|
|
{
|
|
Write_Packet_Log("[SEND] %s\n", msg_str);
|
|
|
|
#if (WZENGINEVER >= 480)
|
|
WZLOG( WZPKT2, msg_str );
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
#endif //_LTJ_PACKET_SHOW_FOR_DEBUG
|
|
|
|
#ifdef _NA002676_WORLD_SERVER_RENEWAL
|
|
// CHANGES: CI_CHATSERVERIDX same with CI_GAMESERVERIDX
|
|
// since _NA002676_WORLD_SERVER_RENEWAL.
|
|
// To support the accurate world service synchronization added the CW protocol filters
|
|
if (idx == CI_GAMESERVERIDX)
|
|
{
|
|
if (g_pNetwork->CheckSendableMessage(\
|
|
reinterpret_cast<MSG_BASE*>(pBuf)->m_byCategory) == false)
|
|
{
|
|
return false;
|
|
};
|
|
};
|
|
#endif
|
|
//if( CI_GAMESERVERIDX == idx )
|
|
//{
|
|
// //PacketInfo packetInfo = PacketControl::Pack( (MSG_BASE *)pBuf, iLength );
|
|
// return g_pNetwork->Send( idx, (VOID*)pBuf, (INT)iLength );
|
|
//}
|
|
BOOL ret = g_pNetwork->Send( idx, pBuf, iLength );
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SendGMCommand( const std::string& CommandText )
|
|
{
|
|
if( CommandText.size() >= MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH )
|
|
return;
|
|
|
|
MSG_CG_GM_STRING_CMD_SYN msg;
|
|
ZeroMemory(msg.m_szStringCmd, MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
|
|
StrnCopy(msg.m_szStringCmd, CommandText.c_str(), CommandText.size() );
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::PLAY_BGM(int iType, CODETYPE FieldCode, eZONETYPE eRoomType)
|
|
{
|
|
BASE_BGMSoundInfo* pInfo = BGMSoundInfoParser::Instance()->GetBGMInfo(iType, (WORD)FieldCode, eRoomType);
|
|
|
|
if (pInfo != NULL)
|
|
{
|
|
// BGMInfo 스크립트에서 BGM코드가 0이면 BGM 을 플레이하지 않는다.
|
|
g_SoundBGM.Stop();
|
|
if (pInfo->m_wBGMNum != 0)
|
|
{
|
|
g_SoundBGM.Play(pInfo->m_wBGMNum);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#ifdef _DEV_VER
|
|
OutputMsg_Notice(eOUTPUT_MSG_CHAT, "[FieldCode: %d]Failed BGM Play", FieldCode);
|
|
#endif //_DEV_VER
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::InitRandom()
|
|
{
|
|
srand( (unsigned int)time(NULL));
|
|
}
|
|
|
|
int GlobalFunc::GetRandom(int nRandomLimitNum)
|
|
{
|
|
assert(nRandomLimitNum > 0);
|
|
|
|
return (rand() % nRandomLimitNum);
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
DWORD
|
|
GlobalFunc::WzColorToRGBA(WzColor wzColor)
|
|
{
|
|
DWORD dwResult = 0;
|
|
dwResult =
|
|
RGBA(
|
|
Red_WzColor(wzColor),
|
|
Green_WzColor(wzColor),
|
|
Blue_WzColor(wzColor),
|
|
Alpha_WzColor(wzColor)
|
|
);
|
|
return dwResult;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
WzColor
|
|
GlobalFunc::RGBAToWzColor(DWORD dwColor)
|
|
{
|
|
WzColor wzResultColor =
|
|
WzColor_RGBA( GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor),GetAValue(dwColor) );
|
|
return wzResultColor;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::DeadConfirmInHunting(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
// 제자리 부활
|
|
MSG_CG_STATUS_RESURRECTION_SYN SendResurrectSyn; // 부활 요청
|
|
SendPacket( CI_GAMESERVERIDX, &SendResurrectSyn, sizeof(SendResurrectSyn));
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::DeadConfirmInCHunting(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
// 제자리 부활
|
|
MSG_CG_STATUS_RESURRECTION_SYN SendResurrectSyn; // 부활 요청
|
|
SendPacket( CI_GAMESERVERIDX, &SendResurrectSyn, sizeof(SendResurrectSyn));
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::DeadConfirmInCHuntingBeforeStart(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
// 시작위치 부활
|
|
MSG_CG_STATUS_RESURRECTION_TO_SAFEZONE_SYN SendSafeZonePacket;
|
|
SendPacket( CI_GAMESERVERIDX, &SendSafeZonePacket, sizeof(SendSafeZonePacket));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::GetStateInitItemNumConfirm(bool bValid, const char * pString)
|
|
{
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH];
|
|
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
|
|
if (bValid)
|
|
{
|
|
if ( !pString )
|
|
return;
|
|
|
|
int iNum = atoi(pString);
|
|
|
|
POSTYPE FromPos = MouseHandler::Instance()->GetPendingUseChargeItemPos();
|
|
SCSlotContainer * pContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY );
|
|
if (!pContainer)
|
|
return;
|
|
|
|
// 위치 체크
|
|
if ( FromPos >= pContainer->GetMaxSlotNum() || FromPos < 0)
|
|
return;
|
|
|
|
// 비워있는지 체크
|
|
if ( pContainer->IsEmpty(FromPos) )
|
|
return;
|
|
|
|
if ( iNum <= 0 )
|
|
{
|
|
// 5887 사용할 아이템의 수량을 입력해주세요
|
|
g_InterfaceManager.GetInterfaceString( 5887, szMessage, INTERFACE_STRING_LENGTH );
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage );
|
|
return;
|
|
}
|
|
|
|
SCItemSlot & rItemSlot = (SCItemSlot &)pContainer->GetSlot(FromPos);
|
|
if ( rItemSlot.GetNum() < iNum )
|
|
{
|
|
//5889 사용 가능한 아이템 개수를 초과하였습니다.
|
|
g_InterfaceManager.GetInterfaceString( 5889, szMessage, INTERFACE_STRING_LENGTH );
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage );
|
|
return;
|
|
}
|
|
|
|
// TODO : 기타 예외처리를 하고 정상적인 행동일때만 패킷 보낸다.
|
|
ItemManager::Instance()->SendStatInitItem(
|
|
MouseHandler::Instance()->GetPendingUseChargeItemPos(),
|
|
iNum );
|
|
}
|
|
}
|
|
//
|
|
////-------------------------------------------------------------------------------------------
|
|
///**
|
|
//*/
|
|
//void
|
|
//GlobalFunc::DeadConfirmInField(bool bYes)
|
|
//{
|
|
// // 아무 행동도 하지 않는다.
|
|
// if ( bYes )
|
|
// {
|
|
// if (g_pHero && g_pHero->IsDead())
|
|
// {
|
|
// MSG_CG_ZONE_RETURN_VILLAGE_SYN SendLeaveSyn;
|
|
// SendPacket( CI_GAMESERVERIDX, &SendLeaveSyn, sizeof(SendLeaveSyn));
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// // 대기~
|
|
// MSG_CG_STATUS_RESURRECTION_TO_SAFEZONE_SYN SendSafeZonePacket;
|
|
// SendPacket( CI_GAMESERVERIDX, &SendSafeZonePacket, sizeof(SendSafeZonePacket));
|
|
// }
|
|
//}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::DeadConfirmInField(int confirm_value)
|
|
{
|
|
switch (confirm_value)
|
|
{
|
|
case kConfirmSelect1:
|
|
{
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
MSG_CG_ZONE_RETURN_VILLAGE_SYN SendLeaveSyn;
|
|
SendPacket( CI_GAMESERVERIDX, &SendLeaveSyn, sizeof(SendLeaveSyn));
|
|
}
|
|
}
|
|
break;
|
|
case kConfirmSelect2:
|
|
{
|
|
MSG_CG_STATUS_RESURRECTION_TO_SAFEZONE_SYN SendSafeZonePacket;
|
|
SendPacket( CI_GAMESERVERIDX, &SendSafeZonePacket, sizeof(SendSafeZonePacket));
|
|
}
|
|
break;
|
|
case kConfirmClose:
|
|
{
|
|
// no operation
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
#ifdef _DH_BATTLEZONE2_
|
|
void GlobalFunc::PartyRoomJoinConfirm(bool confirm_value)
|
|
{
|
|
uiBattlezone2Tree* battlezone_tree_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2Tree, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_TREE);
|
|
|
|
uiBattlezone2Reservation* battlezone_reservation_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2Reservation, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_RESERVATION);
|
|
|
|
if (confirm_value)
|
|
{
|
|
uiBattlezone2List* battlezone_list_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2List, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LIST);
|
|
|
|
if (battlezone_list_dialog && battlezone_tree_dialog)
|
|
{
|
|
battlezone_list_dialog->EnterRoom(battlezone_tree_dialog->save_party_key(), NULL, NULL);
|
|
battlezone_tree_dialog->set_save_party_key(0);//설정 초기화
|
|
battlezone_tree_dialog->set_is_creating(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (battlezone_tree_dialog)
|
|
{
|
|
if (battlezone_tree_dialog->is_creating())
|
|
{
|
|
battlezone_tree_dialog->CreateRoom();
|
|
}
|
|
}
|
|
if (battlezone_reservation_dialog)
|
|
{
|
|
if (battlezone_reservation_dialog->is_reservation())
|
|
{
|
|
battlezone_reservation_dialog->ReservationStandByRoom();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::PartyContinueConfirm(bool confirm_value)
|
|
{
|
|
uiBattlezone2List* battlezone_list_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2List, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LIST);
|
|
|
|
if (battlezone_list_dialog && confirm_value)
|
|
{
|
|
MSG_CG_PARTY_INVITE_PARTY_ROOM_ANS send_packet;
|
|
send_packet.join_party_key_ = battlezone_list_dialog->follow_party_key();
|
|
send_packet.member_response_ = confirm_value;
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet));
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::PartyLeaveAndJoinConfirm(bool confirm_value)
|
|
{
|
|
uiBattlezone2Tree* battlezone_tree_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2Tree, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_TREE);
|
|
|
|
uiBattlezone2List* battlezone_list_dialog =
|
|
GET_CAST_DIALOG(uiBattlezone2List, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LIST);
|
|
|
|
if (confirm_value)
|
|
{
|
|
if (battlezone_tree_dialog &&battlezone_list_dialog)
|
|
{
|
|
if (battlezone_tree_dialog->is_creating())
|
|
{
|
|
battlezone_tree_dialog->CreateRoom();
|
|
}
|
|
else
|
|
{
|
|
battlezone_list_dialog->EnterRoom(battlezone_tree_dialog->save_party_key(), NULL, NULL);
|
|
battlezone_tree_dialog->set_save_party_key(0);//설정 초기화
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
#endif//_DH_BATTLEZONE2_
|
|
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
void GlobalFunc::PartyLeaveAndFreePVPJoinConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
uiChaosZonePVP* pvp_dialog = GET_CAST_DIALOG(uiChaosZonePVP, IM_CHAOS_SYSTEM_MANAGER::CHAOSZONE_PVP);
|
|
if (pvp_dialog)
|
|
{
|
|
pvp_dialog->SendFreePVPJoinPacket();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
void GlobalFunc::PartyLeaveAndFreePVPCreateConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
uiChaosZonePVP* pvp_dialog = GET_CAST_DIALOG(uiChaosZonePVP, IM_CHAOS_SYSTEM_MANAGER::CHAOSZONE_PVP);
|
|
if (pvp_dialog)
|
|
{
|
|
pvp_dialog->SendFreePVPCreatePacket();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
void GlobalFunc::_fn_uiBankPasswordLockingSyn(bool bYes)
|
|
{
|
|
uiBankMan* pBankMan =
|
|
static_cast<uiBankMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BANK));
|
|
assert (pBankMan);
|
|
|
|
if(pBankMan)
|
|
{
|
|
if (bYes)
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_LOCKING_SYN();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::_fn_uiInvenPasswordLockingSyn(bool bYes)
|
|
{
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER( uiInventoryMan, UIMAN_INVENTORY );
|
|
//static_cast<uiInventoryMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_INVENTORY));
|
|
assert (pInvenMan);
|
|
|
|
if(pInvenMan)
|
|
{
|
|
if (bYes)
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_LOCKING_SYN();
|
|
}
|
|
else
|
|
{
|
|
pInvenMan->set_open_password_confirm(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::_fn_uiBankPassword_Clear(bool bYes)
|
|
{
|
|
uiBankMan* pBankMan =
|
|
static_cast<uiBankMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BANK));
|
|
assert (pBankMan);
|
|
|
|
if(pBankMan)
|
|
{
|
|
if (bYes)
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_CHECK_SYN( MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_CLEAR);
|
|
}
|
|
else
|
|
{
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
if(pPasswordMan)
|
|
{
|
|
// 비밀번호를 입력해주세요
|
|
pBankMan->SetPasswordState(eBankDlgState_Check_Unlock);
|
|
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
showPassChgBtn = ( pBankMan->GetBankLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
|
|
pPasswordMan->PasswordDlg(5551, GlobalFunc::_fn_uiBankPassword, 4, 8, showPassChgBtn, ePassWordCalledState_WareHouse);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::_fn_uiInvenPassword_Clear(bool bYes)
|
|
{
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER( uiInventoryMan, UIMAN_INVENTORY );
|
|
//static_cast<uiInventoryMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_INVENTORY));
|
|
assert (pInvenMan);
|
|
|
|
if(pInvenMan)
|
|
{
|
|
if (bYes)
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_CHECK_SYN( MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_CLEAR);
|
|
}
|
|
else
|
|
{
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
if(pPasswordMan)
|
|
{
|
|
// 비밀번호를 입력해주세요
|
|
pInvenMan->SetPasswordState(eInventoryDlgState_Check_Unlock);
|
|
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
showPassChgBtn = ( pInvenMan->GetInventoryLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
|
|
pPasswordMan->PasswordDlg(5551, GlobalFunc::_fn_uiInvenPassword, 4, 8, showPassChgBtn, ePassWordCalledState_Inven);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::_fn_uiBankPassword(bool bYes)
|
|
{
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
|
|
uiBankMan* pBankMan =
|
|
static_cast<uiBankMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BANK));
|
|
assert (pBankMan);
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
if (bYes)
|
|
{
|
|
if(pPasswordMan && pBankMan)
|
|
{
|
|
switch(pBankMan->GetPasswordState())
|
|
{
|
|
|
|
case eBankDlgState_Setting_SSN:
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_SETTING_SYN(MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_SSN, pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
}
|
|
break;
|
|
|
|
case eBankDlgState_Check_Clear:
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_CHECK_SYN(MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_WITH_SSN, pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
}
|
|
break;
|
|
|
|
case eBankDlgState_Setting_PasswordCmp:
|
|
{
|
|
Snprintf(szMessage, INTERFACE_STRING_LENGTH, _T("%s"), pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
pBankMan->SetPasswordStr(szMessage);
|
|
// 비밀번호 확인
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
showPassChgBtn = ( pBankMan->GetBankLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
|
|
pPasswordMan->PasswordDlg(5553, GlobalFunc::_fn_uiBankPassword, 4, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH, showPassChgBtn, ePassWordCalledState_WareHouse);
|
|
|
|
pBankMan->SetPasswordState(eBankDlgState_Setting_PasswordSend);
|
|
}
|
|
break;
|
|
|
|
case eBankDlgState_Setting_PasswordSend:
|
|
{
|
|
Snprintf(szMessage, INTERFACE_STRING_LENGTH, _T("%s"), pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
if(StrnCmp(szMessage, pBankMan->GetPAsswordStr(), MAX_WAREHOUSE_INVENTORY_PWD_LENGTH) == NULL)
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_SETTING_SYN(MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_PWD, pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
}
|
|
else
|
|
{
|
|
uiSystemMan* pSystemMan =
|
|
static_cast<uiSystemMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM));
|
|
if(pSystemMan)
|
|
{
|
|
pBankMan->SetPasswordState(eBankDlgState_Setting_PasswordCmp);
|
|
// 비밀번호가 틀렸습니다.
|
|
g_InterfaceManager.GetInterfaceString( 5555, szMessage, INTERFACE_STRING_LENGTH );
|
|
pSystemMan->Sys_Verify(szMessage, GlobalFunc::_fn_uiBankPassword_invalidPassword);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case eBankDlgState_Check_Unlock:
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_CHECK_SYN( MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_WITH_PWD, pPasswordMan->m_pUIPasswordDlg->GetStrPassword() );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(pBankMan)
|
|
{
|
|
switch(pBankMan->GetPasswordState())
|
|
{
|
|
case eBankDlgState_Setting_SSN:
|
|
case eBankDlgState_Setting_PasswordCmp:
|
|
case eBankDlgState_Setting_PasswordSend:
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_SETTING_SYN(MSG_CG_WAREHOUSE_PWD_SETTING_SYN::SYNC_CANCEL);
|
|
}
|
|
break;
|
|
case eBankDlgState_Check_Unlock:
|
|
case eBankDlgState_Check_Clear:
|
|
{
|
|
pBankMan->Send_CG_WAREHOUSE_PWD_CHECK_SYN(MSG_CG_WAREHOUSE_PWD_CHECK_SYN::SYNC_CANCEL);
|
|
}
|
|
}
|
|
pBankMan->ClearPassword();
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::_fn_uiInvenPassword(bool bYes)
|
|
{
|
|
uiPasswordMan* pPasswordMan = GET_DIALOG_MANAGER( uiPasswordMan, UIMAN_PASSWORD );
|
|
//static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER( uiInventoryMan, UIMAN_INVENTORY );
|
|
//static_cast<uiInventoryMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_INVENTORY));
|
|
assert (pInvenMan);
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
if (bYes)
|
|
{
|
|
if(pPasswordMan && pInvenMan)
|
|
{
|
|
switch(pInvenMan->GetPasswordState())
|
|
{
|
|
case eInventoryDlgState_Setting_SSN:
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_SETTING_SYN(MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_SSN, pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
}
|
|
break;
|
|
|
|
case eInventoryDlgState_Check_Clear:
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_CHECK_SYN(MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_WITH_SSN, pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
}
|
|
break;
|
|
|
|
case eInventoryDlgState_Setting_PasswordCmp:
|
|
{
|
|
Snprintf(szMessage, INTERFACE_STRING_LENGTH, _T("%s"), pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
pInvenMan->SetPasswordStr(szMessage);
|
|
// 비밀번호 확인
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
showPassChgBtn = ( pInvenMan->GetInventoryLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
|
|
pPasswordMan->PasswordDlg(5553, GlobalFunc::_fn_uiInvenPassword, 4, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH, showPassChgBtn, ePassWordCalledState_Inven);
|
|
pInvenMan->SetPasswordState(eInventoryDlgState_Setting_PasswordSend);
|
|
}
|
|
break;
|
|
|
|
case eInventoryDlgState_Setting_PasswordSend:
|
|
{
|
|
Snprintf(szMessage, INTERFACE_STRING_LENGTH, _T("%s"), pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
if(StrnCmp(szMessage, pInvenMan->GetPAsswordStr(), MAX_WAREHOUSE_INVENTORY_PWD_LENGTH) == NULL)
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_SETTING_SYN( MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_PWD, pPasswordMan->m_pUIPasswordDlg->GetStrPassword() );
|
|
}
|
|
else
|
|
{
|
|
uiSystemMan* pSystemMan =
|
|
static_cast<uiSystemMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM));
|
|
if(pSystemMan)
|
|
{
|
|
pInvenMan->SetPasswordState(eInventoryDlgState_Setting_PasswordCmp);
|
|
// 비밀번호가 틀렸습니다.
|
|
g_InterfaceManager.GetInterfaceString( 5555, szMessage, INTERFACE_STRING_LENGTH );
|
|
pSystemMan->Sys_Verify( szMessage, GlobalFunc::_fn_uiInvenPassword_invalidPassword);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case eInventoryDlgState_Check_Unlock:
|
|
{
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_CHECK_SYN( MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_WITH_PWD, pPasswordMan->m_pUIPasswordDlg->GetStrPassword() );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(pInvenMan)
|
|
{
|
|
switch(pInvenMan->GetPasswordState())
|
|
{
|
|
case eInventoryDlgState_Setting_SSN:
|
|
case eInventoryDlgState_Setting_PasswordCmp:
|
|
case eInventoryDlgState_Setting_PasswordSend:
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_SETTING_SYN(MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN::SYNC_CANCEL);
|
|
break;
|
|
|
|
case eInventoryDlgState_Check_Unlock:
|
|
case eInventoryDlgState_Check_Clear:
|
|
pInvenMan->Send_CG_ITEM_INVENTORY_PWD_CHECK_SYN(MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN::SYNC_CANCEL);
|
|
break;
|
|
}
|
|
pInvenMan->ClearPassword();
|
|
}
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::_fn_uiBankPassword_invalidPassword( void )
|
|
{
|
|
// 비밀번호를 입력해 주세요
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
|
|
uiBankMan* pBankMan = static_cast<uiBankMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BANK));
|
|
assert (pBankMan);
|
|
if(pBankMan)
|
|
{
|
|
showPassChgBtn = ( pBankMan->GetBankLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
}
|
|
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
if(pPasswordMan)
|
|
{
|
|
pPasswordMan->PasswordDlg(5551, GlobalFunc::_fn_uiBankPassword, 4, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH, showPassChgBtn, ePassWordCalledState_WareHouse);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::_fn_uiBankPassword_invalidSSN( void )
|
|
{
|
|
// 주민등록 번호를 입력해 주세요
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
uiBankMan* pBankMan = static_cast<uiBankMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BANK));
|
|
assert (pBankMan);
|
|
if(pBankMan)
|
|
{
|
|
showPassChgBtn = ( pBankMan->GetBankLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
}
|
|
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
|
|
if(pPasswordMan)
|
|
{
|
|
pPasswordMan->PasswordDlg(5579, GlobalFunc::_fn_uiBankPassword, 0, MAX_SSN_COUNT, showPassChgBtn, ePassWordCalledState_WareHouse);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::_fn_uiInvenPassword_invalidPassword( void )
|
|
{
|
|
// 비밀번호를 입력해 주세요
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER( uiInventoryMan, UIMAN_INVENTORY );//static_cast<uiInventoryMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_INVENTORY));
|
|
assert (pInvenMan);
|
|
|
|
if(pInvenMan)
|
|
{
|
|
showPassChgBtn = ( pInvenMan->GetInventoryLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
}
|
|
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
|
|
if(pPasswordMan)
|
|
{
|
|
pPasswordMan->PasswordDlg(5551, GlobalFunc::_fn_uiInvenPassword, 4, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH, showPassChgBtn, ePassWordCalledState_Inven);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::_fn_uiInvenPassword_invalidSSN( void )
|
|
{
|
|
// 주민등록 번호를 입력해 주세요
|
|
BOOL showPassChgBtn = TRUE;
|
|
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER( uiInventoryMan, UIMAN_INVENTORY );//static_cast<uiInventoryMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_INVENTORY));
|
|
assert (pInvenMan);
|
|
|
|
if(pInvenMan)
|
|
{
|
|
showPassChgBtn = ( pInvenMan->GetInventoryLockState() & MSG_CG_WAREHOUSE_START_ACK::DISABLED );
|
|
}
|
|
|
|
uiPasswordMan* pPasswordMan =
|
|
static_cast<uiPasswordMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD));
|
|
assert (pPasswordMan);
|
|
if(pPasswordMan)
|
|
{
|
|
pPasswordMan->PasswordDlg(5579, GlobalFunc::_fn_uiInvenPassword, 0, MAX_SSN_COUNT, showPassChgBtn, ePassWordCalledState_Inven);
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::_fn_TutorialSkip(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
uiMenuMan* puiMan = static_cast<uiMenuMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_MENU));
|
|
|
|
if(puiMan)
|
|
{
|
|
if(TUTO_FIELD == g_pMap->GetMapID())
|
|
puiMan->Send_CG_ZONE_EX_TUTORIAL_FIELD_LEAVE_SYN();
|
|
else if(TUTO_MISSION == g_pMap->GetMapID())
|
|
puiMan->Send_CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_SYN();
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::DeadVerifyInMission(void)
|
|
{
|
|
// 아무 행동도 하지 않는다.
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
#ifdef _NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
void GlobalFunc::DeadConfirmInDomination(DWORD lParam, DWORD wParam)
|
|
{
|
|
uiDominationTowerMan* domination_man = GET_DIALOG_MANAGER(uiDominationTowerMan, UIMAN_DOMINATIONWAR_TOWER);
|
|
if (domination_man)
|
|
{
|
|
domination_man->ShowDominationResurrectionPopup();
|
|
}
|
|
}
|
|
#endif //_NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::ShrinkBoundingVolume(WzBoundingVolume *pBV,float fRate)
|
|
{
|
|
if (pBV->m_eBvType == BVT_AABB)
|
|
{
|
|
WzVector vCenter = (pBV->m_aabb.m_wvMin + pBV->m_aabb.m_wvMax) * 0.5f;
|
|
WzVector vDiff = (pBV->m_aabb.m_wvMax - pBV->m_aabb.m_wvMin) * 0.5f;
|
|
|
|
// 축소율 적용;
|
|
vDiff *= fRate;
|
|
|
|
pBV->m_aabb.m_wvMax = vCenter + vDiff;
|
|
pBV->m_aabb.m_wvMin = vCenter - vDiff;
|
|
}
|
|
else if (pBV->m_eBvType == BVT_SPHERE)
|
|
{
|
|
pBV->m_BvSphere.m_fRadius *= fRate;
|
|
}
|
|
}
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SystemExitConfirm(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
GuildSystem::Function::CloseGuildWareHouse();
|
|
#else
|
|
uiGuildMan* pGuildMan = (uiGuildMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD);
|
|
if(pGuildMan)
|
|
{
|
|
if(pGuildMan->IsGuildWareHouseWindow())
|
|
{
|
|
pGuildMan->SEND_CG_GUILD_WAREHOUSE_CLOSE_SYN();
|
|
}
|
|
}
|
|
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
|
|
MSG_CG_CONNECTION_NOTIFY_LOGOUT_SYN logout_packet;
|
|
SendPacket(CI_GAMESERVERIDX, &logout_packet, sizeof(logout_packet));
|
|
|
|
#ifdef _NA_008090_20150226_GAMEOPTION_RECVPACKET_DONT_WAIT
|
|
LogOutGame();
|
|
#else
|
|
uiGuideSystemMan* guide_manager = GET_DIALOG_MANAGER(uiGuideSystemMan, UIMAN_GUIDE_SYSTEM);
|
|
if (guide_manager != NULL)
|
|
{
|
|
//타이머 체크 후 종료
|
|
guide_manager->set_waiting_repeat_save_recv(true);
|
|
guide_manager->set_waiting_library_save_recv(true);
|
|
}
|
|
|
|
//로그아웃 함수는 GuideSystemMan 에서 타이머 체크 후 호출합니다. (송찬종)
|
|
//LogOutGame();
|
|
#endif //_NA_008090_20150226_GAMEOPTION_RECVPACKET_DONT_WAIT
|
|
|
|
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::QuestAbandon(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
uiQuestMan * pQuestMan = (uiQuestMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUEST);
|
|
if ( pQuestMan )
|
|
{
|
|
pQuestMan->NET_SEND_CG_QUEST_ABANDON_SYN( pQuestMan->GetPendingAbandonQuestCode() );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::RepairConfirm(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
if (g_pHero && g_pHero->IsTransForm() &&
|
|
MouseHandler::Instance()->GetPendingRepairSlotIdx() == SI_EQUIPMENT)
|
|
{
|
|
// 5139 변신 상태에서는 이용이 가능하지 않습니다.
|
|
TCHAR message[INTERFACE_STRING_LENGTH] = {0,};
|
|
g_InterfaceManager.GetInterfaceString(5139, message, INTERFACE_STRING_LENGTH);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message);
|
|
return;
|
|
}
|
|
|
|
ItemManager::Instance()->SendItemRepairMsg(
|
|
MouseHandler::Instance()->GetPendingRepairSlotIdx(),
|
|
MouseHandler::Instance()->GetPendingRepairPos(),
|
|
MouseHandler::Instance()->GetPendingRepairAll() != FALSE );
|
|
}
|
|
}
|
|
|
|
|
|
void GlobalFunc::DeleteItemConfirm(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
ItemManager::Instance()->SendDeleteItemMsg(
|
|
ItemManager::Instance()->GetPendingDeleteItemPos() );
|
|
}
|
|
else
|
|
{
|
|
MouseHandler::Instance()->RollbackItemAtHand();
|
|
MouseHandler::Instance()->UnLockWasteDeleteItem();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::SaveCurrentPosAtItem(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
ItemManager::Instance()->SendItemUseMsg(
|
|
SI_INVENTORY,
|
|
MouseHandler::Instance()->GetPendingSavePositionPos() );
|
|
}
|
|
|
|
MouseHandler::Instance()->SetSavingPosition(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::UsePoralCoordItem(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
|
|
POSTYPE OutPos = INVALID_SLOT_POS;
|
|
BOOL bRet = ItemManager::Instance()->FindFirstItem( eITEMTYPE_PORTAL, OutPos );
|
|
if ( !bRet )
|
|
{
|
|
// 포탈아이템이 없습니다.( 5931 )
|
|
TCHAR szResultMsg[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString(5931, szResultMsg, INTERFACE_STRING_LENGTH);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResultMsg);
|
|
|
|
MouseHandler::Instance()->SetTryPortal(FALSE);
|
|
}
|
|
else
|
|
{
|
|
keyMsg msg;
|
|
ZeroMemory(&msg,sizeof(msg));
|
|
msg.dwType = eDoType_GeneralWarp;
|
|
msg.DoSomething = GlobalFunc::isOutUseCoordItem;
|
|
msg.lParam = InterfaceManager::DIALOG_DELAY_CASTING;
|
|
msg.wParam = eDoType_GeneralWarp;
|
|
g_KeyQueueManager.PushBack(msg);
|
|
|
|
// 딜레이 캐스트 창을 띄우고 타이머를 세팅한다.
|
|
StartLeaveFieldCastTimer( eDoType_GeneralWarp, DEALY_SPAWN_VILLAGE );
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::isOutUseCoordItem(DWORD wParam,DWORD lParam)
|
|
{
|
|
CastLeaveFieldDialog* castleave_dialog = GET_CAST_DIALOG(CastLeaveFieldDialog, StrToWzID("0281"));
|
|
if (castleave_dialog == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
castleave_dialog->ShowWindow(FALSE);
|
|
MouseHandler::Instance()->SetTryPortal(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::isRunUsePoralCoordItem()
|
|
{
|
|
POSTYPE OutPos = INVALID_SLOT_POS;
|
|
BOOL bRet = ItemManager::Instance()->FindFirstItem( eITEMTYPE_PORTAL, OutPos );
|
|
|
|
ItemManager::Instance()->SendItemPortalMsg(
|
|
MouseHandler::Instance()->GetPendingUseCoordPortalPos(), OutPos );
|
|
|
|
MouseHandler::Instance()->SetTryPortal(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::SavePersnalWaypoint(bool bYes)
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
if (bYes)
|
|
{
|
|
pDlg->SEND_CG_CHAR_WAYPOINT_INFO_SAVE_SYN();
|
|
}
|
|
pDlg->SetDialogBtnPending(false);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DeletePersnalWaypoint(bool bYes)
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
pDlg->SEND_CG_CHAR_WAYPOINT_INFO_DEL_SYN();
|
|
}
|
|
pDlg->SetDialogBtnPending(false);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::ExecutePersnalWaypoint(bool bYes)
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
pDlg->SEND_CG_CHAR_WAYPOINT_INFO_EXE_CMD();
|
|
pDlg->ShowWindow(false);
|
|
}
|
|
pDlg->SetDialogBtnPending(false);
|
|
}
|
|
}
|
|
|
|
int GlobalFunc::GetUsedWayPointSlotCount()
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
return pDlg->GetUsedWayPointSlotCount();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool GlobalFunc::IsWayPointItemPending()
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
return pDlg->IsWayPointItemPending();
|
|
}
|
|
return true;
|
|
}
|
|
void GlobalFunc::SetWayPointItemPending(bool bFlag)
|
|
{
|
|
uiPersonalWayPointWindow* pDlg =
|
|
GET_CAST_DIALOG(uiPersonalWayPointWindow, IM_PERSONAL_WAYPOINT_MANAGER::WAYPOINT_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
return pDlg->SetWayPointItemPending(bFlag);
|
|
}
|
|
}
|
|
|
|
bool GlobalFunc::IsBattleZone()
|
|
{
|
|
if (GameFramework::GetCurrentScene() &&
|
|
(SCENE_TYPE_VILLAGE != GameFramework::GetCurrentScene()->GetType() &&
|
|
SCENE_TYPE_FIELD != GameFramework::GetCurrentScene()->GetType() ) )
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::_fn_UseTopOfTrialItem(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
GuildSystem::Function::CloseGuildWareHouse();
|
|
#else
|
|
uiGuildMan* pGuildMan = (uiGuildMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD);
|
|
if(pGuildMan)
|
|
{
|
|
if(pGuildMan->IsGuildWareHouseWindow())
|
|
{
|
|
pGuildMan->SEND_CG_GUILD_WAREHOUSE_CLOSE_SYN();
|
|
}
|
|
}
|
|
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
|
|
ItemManager::Instance()->SendTopOfTrialItemMsg( MouseHandler::Instance()->GetPendingUseChargeItemPos() );
|
|
}
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::_fn_UseSSQItem(bool b)
|
|
{
|
|
if (b)
|
|
{
|
|
LEVELTYPE level = g_pHero->GetLevel();
|
|
MONEY money = g_pHero->GetMoney();
|
|
|
|
const SSQInfo * pInfo = SSQInfoParser::Instance()->FindSSQInfoEnterableLevel( level );
|
|
|
|
//해당레벨에 대한 정보가 없다는것은 정의가 되지않았다고 판단
|
|
if( pInfo == NULL )
|
|
{
|
|
//6430:입장할수없는 레벨입니다.
|
|
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, g_InterfaceManager.GetInterfaceString( 6430 ) );
|
|
}
|
|
else if( money < pInfo->m_Cost )
|
|
{
|
|
//6411: 입장료가 부족합니다.
|
|
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, g_InterfaceManager.GetInterfaceString( 6411 ) );
|
|
}
|
|
else
|
|
{
|
|
MSG_CG_ZONE_EX_SSQ_JOIN_INFO_SYN SendPacketAck;
|
|
SendPacketAck.m_ItemPos = MouseHandler::Instance()->GetPendingUseChargeItemPos();
|
|
GlobalFunc::SendPacket( CI_GAMESERVERIDX, (BYTE *)&SendPacketAck, sizeof(SendPacketAck));
|
|
}
|
|
}
|
|
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::_fn_UsePortalQuestItem(bool bYes)
|
|
{
|
|
if( bYes )
|
|
{
|
|
MSG_CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN SendMsg;
|
|
SendMsg.m_ItemPos = MouseHandler::Instance()->GetPendingUseChargeItemPos();
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendMsg, sizeof( SendMsg ));
|
|
}
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::_fn_UseCharacterNameChangeItem(uiSystemMessage::ButtonIndex button_index)
|
|
{
|
|
if (button_index == uiSystemMessage::kConfirm_Button)
|
|
{
|
|
if (GameFramework::GetCurrentScene() &&
|
|
(GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_VILLAGE))
|
|
{
|
|
SLOTIDX slot_index = MouseHandler::Instance()->GetSendSlotIdx();
|
|
POSTYPE pos = MouseHandler::Instance()->GetSendAtPos();
|
|
|
|
ItemManager::Instance()->SendItemUseMsg(slot_index, pos);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void GlobalFunc::_fn_CharacterNameChangeAck(uiSystemMessage::ButtonIndex button_index)
|
|
{
|
|
if (button_index == uiSystemMessage::kVerify_Button)
|
|
{
|
|
// 시스템종료
|
|
GlobalFunc::LogOutGame();
|
|
}
|
|
|
|
}
|
|
|
|
void GlobalFunc::UseChargeItem(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
ItemManager::Instance()->SendItemUseMsg(
|
|
SI_INVENTORY,
|
|
MouseHandler::Instance()->GetPendingUseChargeItemPos());
|
|
}
|
|
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::UseChargeItemStatInitAll(bool bYes)
|
|
{
|
|
if ( bYes )
|
|
{
|
|
ItemManager::Instance()->SendStatInitItem(
|
|
MouseHandler::Instance()->GetPendingUseChargeItemPos(),
|
|
1 );
|
|
}
|
|
|
|
MouseHandler::Instance()->SetTryUseChageItem(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::SendCheckUseItemByPopup( bool b )
|
|
{
|
|
if( b )
|
|
{
|
|
SLOTIDX SlotIdx = MouseHandler::Instance()->GetSendSlotIdx();
|
|
POSTYPE AtPos = MouseHandler::Instance()->GetSendAtPos();
|
|
|
|
ItemManager::Instance()->SendItemUseMsg( SlotIdx, AtPos );
|
|
}
|
|
}
|
|
|
|
|
|
void GlobalFunc::SendStateInitSyn( bool bYes )
|
|
{
|
|
if( bYes )
|
|
{
|
|
// 패킷 보내자.
|
|
MSG_CG_STATUS_FREE_INIT_STAT_UNDER_20_SYN sendPacket;
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &sendPacket, sizeof (sendPacket));
|
|
}
|
|
}
|
|
|
|
BOOL GlobalFunc::IsDeadField()
|
|
{
|
|
if(g_pHero && g_pHero->IsDead() && g_pMap && g_pMap->IsField())
|
|
{
|
|
//필드사망시 시스템창띄우기막기
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GlobalFunc::IsexceptionPercentageType( int OptionKind)
|
|
{
|
|
switch( OptionKind )
|
|
{
|
|
case 52: //사망시스스로부활할확률
|
|
case 56: //방어력무시확율
|
|
case 60: //스킬효과무시확율
|
|
case 43: //데미지 반사
|
|
case 44: //하임 증가
|
|
case 45: //경험치 증가
|
|
case 46: //다중공격 확률
|
|
case 53: //데미지 두배 확률
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
#ifdef _ADD_CHARGE_ITEM_RANDOM_OPTION
|
|
void GlobalFunc::AddRandomOption( bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
// TODO : 특정 패킷 을 보낸다.
|
|
}
|
|
|
|
MouseHandler::Instance()->SetTryAddRandomOption(FALSE);
|
|
}
|
|
#endif // _ADD_CHARGE_ITEM_RANDOM_OPTION
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// use caes
|
|
// 1. 퀘스트 창에서 미션보상 정보 보여줄때.
|
|
// 2. 미션 랭킹에서 미션 정보 보여줄때.
|
|
// 대표 멥정보를 가져온다.
|
|
sMAPINFO * GlobalFunc::GetMainMapFromGroup(MAPCODE MapKind)
|
|
{
|
|
MapGroup * pGroup = MapInfoParser::Instance()->GetMapGroup( MapKind );
|
|
|
|
if (!pGroup)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
sMAPINFO * pMapInfo = NULL;
|
|
int nMaxCnt = pGroup->GetMapInfoHash().size();
|
|
|
|
//메인(0)부터 참조
|
|
pMapInfo = (sMAPINFO *)(const sMAPINFO *)pGroup->GetMapInfoIndex(0);
|
|
|
|
//GS_BUG_FIX:예외 메인이없고 서브가 있을때
|
|
if(!pMapInfo && nMaxCnt>0)
|
|
{
|
|
for ( int i = 0; i < nMaxCnt; ++i )
|
|
{
|
|
pMapInfo = (sMAPINFO *)(const sMAPINFO *)pGroup->GetMapInfoIndex(i+1);
|
|
|
|
if (pMapInfo)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return pMapInfo;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// use caes
|
|
// 1. 퀘스트 창에서 미션보상 정보 보여줄때.
|
|
// 2. 미션 랭킹에서 미션 정보 보여줄때.
|
|
// 대표 멥정보를 가져온다.
|
|
sMAPINFO * GlobalFunc::GetMainMapFromGroup(MapGroup * pGroup)
|
|
{
|
|
if (!pGroup)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
sMAPINFO * pMapInfo = NULL;
|
|
|
|
int nMaxCnt = pGroup->GetMapInfoHash().size();
|
|
|
|
pMapInfo = (sMAPINFO *)(const sMAPINFO *)pGroup->GetMapInfoIndex(0);
|
|
|
|
//GS_BUG_FIX:예외 메인이없고 서브가 있을때
|
|
if(!pMapInfo && nMaxCnt>0)
|
|
{
|
|
for ( int i = 0; i < nMaxCnt; ++i )
|
|
{
|
|
pMapInfo = (sMAPINFO *)(const sMAPINFO *)pGroup->GetMapInfoIndex(i+1);
|
|
if (pMapInfo)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return pMapInfo;
|
|
}
|
|
void GlobalFunc::LogOutGame(bool is_send_notify/* = true*/)
|
|
{
|
|
if (is_send_notify == true)
|
|
{
|
|
MSG_CG_CONNECTION_NOTIFY_LOGOUT_SYN SendLogoutPacket;
|
|
SendPacket(CI_GAMESERVERIDX, &SendLogoutPacket, sizeof(SendLogoutPacket));
|
|
}
|
|
|
|
if( g_hWndMain )
|
|
{
|
|
SendMessage(g_hWndMain, WM_CLOSE, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
g_bExitFlag = true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::DoSystemDialog(DWORD wParam,DWORD lParam)
|
|
{
|
|
#ifdef _GS_GSP_BLOCK_SYSTEMDLG_THEN_DEAD
|
|
if(IsDeadField())
|
|
{
|
|
//필드사망시 시스템창띄우기막기
|
|
return;
|
|
}
|
|
#endif//_GS_GSP_BLOCK_SYSTEMDLG_THEN_DEAD
|
|
|
|
SolarDialog* trade_dialog = g_InterfaceManager.GetDialog(IM_TRADE_MANAGER::TRADE);
|
|
if ((trade_dialog != NULL) && (trade_dialog->IsVisible() == TRUE))
|
|
{
|
|
TCHAR message[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
|
|
//! 5392 거래중에는 사용할 수 없는 기능입니다.
|
|
g_InterfaceManager.GetInterfaceString(5392, message, INTERFACE_STRING_LENGTH);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message);
|
|
return;
|
|
}
|
|
|
|
SolarDialog* pSystemDlg=g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SYSTEM);
|
|
|
|
if(pSystemDlg)
|
|
{
|
|
BOOL val = pSystemDlg->IsVisibleWindow();
|
|
pSystemDlg->ShowDialog(val ^= TRUE );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoAutoAttack(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_HeroInput.SetAutoAttack(FALSE,FALSE);
|
|
}
|
|
|
|
void GlobalFunc::DoAutoRun(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_HeroInput.SetAutoRun(FALSE,FALSE);
|
|
}
|
|
|
|
void GlobalFunc::DoAreaSkill(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_HeroInput.SetAreaSkill(FALSE);
|
|
g_SkillQueue.Pop();
|
|
}
|
|
|
|
void GlobalFunc::DoTarget(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_HeroInput.SetCurrentTarget(0);
|
|
}
|
|
|
|
void GlobalFunc::DoCastCancel(DWORD wParam,DWORD lParam)
|
|
{
|
|
//캐스팅 취소 패킷 날리자.
|
|
if(g_pHero&&g_pHero->IsCasting())
|
|
{
|
|
if( GENERALPARAM->IsNet()==FALSE)// 싱글 모드 일경우
|
|
{
|
|
g_pHero->SetNextState(STATE::IDLE,g_CurTime);
|
|
g_pHero->CommitChangeState(g_CurTime);
|
|
}
|
|
else
|
|
{
|
|
//if(g_pHero->GetCurrentAction()->ActionID==ACTION_SKILL&&BIT_CHECK( g_pHero->m_dwPacketStatus, PACKET_STATUS_CAST_CANCEL )==FALSE)
|
|
if(ACTION_SKILL == g_pHero->GetCurrentAction()->ActionID)
|
|
{
|
|
//g_InterfaceManager.ShowMessageBox("보냈다",1000);
|
|
//BIT_ADD( g_pHero->m_dwPacketStatus, PACKET_STATUS_CAST_CANCEL );
|
|
MSG_CG_SKILL_CASTING_CANCEL_SYN Packet;
|
|
Packet.m_byCategory = CG_SKILL;
|
|
Packet.m_byProtocol = CG_SKILL_CASTING_CANCEL_SYN;
|
|
Packet.m_SkillCode = (SLOTCODE)g_pHero->GetCurrentAction()->SKILL.dwSkillID;
|
|
g_pHero->SendPacket(&Packet,sizeof(Packet));
|
|
}
|
|
else if(g_pHero->GetCurrentAction()->ActionID==ACTION_SUMMON_RIDER)
|
|
{
|
|
//소환캐스팅취소패킷
|
|
MSG_CG_ITEM_RIDER_CONTROL_SYN Packet;
|
|
Packet.header.request = Packet.header.eReq_SummonCancel;
|
|
g_pHero->SendPacket(&Packet,sizeof(Packet));
|
|
}
|
|
|
|
|
|
else if (g_pHero->GetCurrentAction()->ActionID == ACTION_ETHERIA_EXTRACT)
|
|
{
|
|
//에테리아 캐스팅 취소패킷
|
|
MSG_CG_ITEM_ETHERIA_CONTROL_SYN packet;
|
|
packet.header.request = packet.header.eReq_CastingCancel;
|
|
g_pHero->SendPacket(&packet, sizeof(packet));
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoLotteryOpenCancel(DWORD wParam,DWORD lParam)
|
|
{
|
|
// 판도라상자 오픈취소
|
|
g_InterfaceManager.ShowWindow((InterfaceManager::eDIALOG_ID)lParam, FALSE);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Lottery_OpenDlg);
|
|
g_InterfaceManager.UnLockDlgs();
|
|
}
|
|
|
|
void GlobalFunc::DoLeaveFieldCancel(DWORD wParam,DWORD lParam)
|
|
{
|
|
// 필드를 떠나는 행위를 취소한다.
|
|
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
|
|
if ( eDoType_ServerSelectStandingBy == wParam )
|
|
{
|
|
GlobalFunc::SendServerSelectRequestPacket(MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_SYN::eQuery_StopTransaction);
|
|
return;
|
|
}
|
|
#endif //__NA001334_090420_SERVER_SELECT_FACILITY__
|
|
|
|
CastLeaveFieldDialog* castleave_dialog = GET_CAST_DIALOG(CastLeaveFieldDialog, StrToWzID("0281"));
|
|
if (castleave_dialog == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
castleave_dialog->ShowWindow(FALSE);
|
|
|
|
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
//Scene에 맞춰 부활 캐스팅 시전
|
|
GlobalFunc::ReviveCastFromSceneType();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoLogin(DWORD wParam,DWORD lParam)
|
|
{
|
|
}
|
|
|
|
//WzId로 다이얼로그를 닫는다
|
|
void GlobalFunc::DoShowWindowEx(DWORD wParam,DWORD lParam)
|
|
{
|
|
SolarDialog* pDlg=g_InterfaceManager.GetDialog((WzID)wParam);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->ShowDialog(FALSE);
|
|
}
|
|
|
|
}
|
|
|
|
void GlobalFunc::DoShowWindow(DWORD wParam,DWORD lParam)
|
|
{
|
|
SolarDialog* pDlg=g_InterfaceManager.GetDialog((InterfaceManager::eDIALOG_ID)wParam);
|
|
|
|
if(pDlg)
|
|
{
|
|
ShopDialog* shop_dialog = static_cast<ShopDialog*>(g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SHOP));
|
|
if ((shop_dialog != NULL) &&
|
|
(shop_dialog == pDlg) &&
|
|
(shop_dialog->IsVisible() == TRUE))
|
|
{
|
|
if ((MouseHandler::Instance()->GetMouseState() == MouseHandler::BUY) ||
|
|
(MouseHandler::Instance()->GetMouseState() == MouseHandler::SELL) ||
|
|
(MouseHandler::Instance()->GetMouseState() == MouseHandler::REPAIR))
|
|
{
|
|
shop_dialog->SetCheckTrade(ShopDialog::SHOP_METHOD_NONE);
|
|
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::BUY);
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::SELL);
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::REPAIR);
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
pDlg->ShowDialog(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void GlobalFunc::DoDeleteWindow(DWORD wParam,DWORD lParam)
|
|
{
|
|
SolarDialog* pDlg=g_InterfaceManager.GetDialog((WzID) wParam);
|
|
if(pDlg)
|
|
{
|
|
pDlg->ShowDialog(FALSE);
|
|
pDlg->SetDestroyWindow(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
void GlobalFunc::DoShowQuestWindow(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiQuestMan * pQuestMan = (uiQuestMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUEST);
|
|
if ( !pQuestMan )
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch((eQUEST_WINDOW_TYPE)wParam)
|
|
{
|
|
case QUEST_WINDOW_PLAYER:
|
|
{
|
|
if ( pQuestMan->IsOpenQuestList() )
|
|
{
|
|
pQuestMan->CloseQuestList();
|
|
}
|
|
else
|
|
{
|
|
;
|
|
}
|
|
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_Quest_Player );
|
|
}
|
|
break;
|
|
|
|
case QUEST_WINDOW_NPC:
|
|
{
|
|
if ( pQuestMan->IsOpenQuestNPC() )
|
|
{
|
|
pQuestMan->CloseQuestNPC();
|
|
}
|
|
else
|
|
{
|
|
;
|
|
}
|
|
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_Quest_NPC );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoRadarFullDialog(DWORD wParam, DWORD lParam)
|
|
{
|
|
RadarFullDialog* pfullRadar = GET_CAST_DIALOG(RadarFullDialog, IM_RADAR_MANAGER::RADAR_DIALOG_FULL);
|
|
|
|
if (pfullRadar)
|
|
{
|
|
pfullRadar->ResetRadarState();
|
|
pfullRadar->ShowWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoContinentMapDlg(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiBase* pCMDlg = GET_DIALOG(IM_RADAR_MANAGER::CONTINENT_MAP_DLG);
|
|
if(pCMDlg)
|
|
pCMDlg->ShowWindow(FALSE);
|
|
pCMDlg = GET_DIALOG(IM_RADAR_MANAGER::CONTINENT_MAP_EP2_DLG);
|
|
if (pCMDlg)
|
|
{
|
|
pCMDlg->ShowWindow(FALSE);
|
|
}
|
|
}
|
|
void GlobalFunc::DoQuestListDlg(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiBase* pQLDlg = GET_DIALOG(IM_QUEST_MANAGER::QUEST_LIST_DLG);
|
|
if(pQLDlg)
|
|
pQLDlg->ShowWindow(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::DoQuestInfoDlg(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiBase* pQLDlg = GET_DIALOG(IM_QUEST_MANAGER::QUEST_LIST_MISSION);
|
|
if(pQLDlg)
|
|
pQLDlg->ShowWindow(FALSE);
|
|
}
|
|
|
|
void GlobalFunc::DoBattleCreate(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiBattleZoneCreate* pDlg=(uiBattleZoneCreate*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_BATTLEZONE_CREATE);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->ExitZoneCreate();
|
|
}
|
|
}
|
|
|
|
|
|
void GlobalFunc::DoZoneList(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiBattleZoneList* pDlg=(uiBattleZoneList*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_BATTLEZONE_LIST);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->ExitZoneList();
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
#else
|
|
void GlobalFunc::DoGuildMenu(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiGuildMenu* pDlg =
|
|
(uiGuildMenu *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_GUILD_MENU);
|
|
|
|
if (pDlg)
|
|
{
|
|
pDlg->ShowInterface(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoGuildMain(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiGuildMain* pDlg =
|
|
(uiGuildMain *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_GUILD_MAIN);
|
|
|
|
if (pDlg)
|
|
{
|
|
pDlg->ShowInterface(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoGuildCreate(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiGuildCreate* pDlg =
|
|
(uiGuildCreate *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_GUILD_CREATE);
|
|
|
|
if (pDlg)
|
|
{
|
|
pDlg->ShowInterface(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoGuildWindow(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiGuildWindow* pDlg =
|
|
(uiGuildWindow *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_GUILD_WINDOW);
|
|
|
|
if (pDlg)
|
|
{
|
|
pDlg->ShowInterface(FALSE);
|
|
}
|
|
}
|
|
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
|
|
void GlobalFunc::DoAreaConquest(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiBase* pDlg = GET_DIALOG(IM_AREACONQUEST_MANAGER::AREACONQUEST_DIALOG);
|
|
if (pDlg)
|
|
{
|
|
pDlg->ShowDialog(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoTotalComposite(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiItemTotalcomposite * pDlg = (uiItemTotalcomposite *)g_InterfaceManager.GetDialog
|
|
(InterfaceManager::DIALOG_ITEM_TOTAL_COMPOSITE);
|
|
if ( pDlg )
|
|
{
|
|
pDlg->ShowDialog(FALSE);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoDeleteItemCancel(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::THROW_WASTE_BASKET );
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_delete_cancel );
|
|
}
|
|
|
|
|
|
void GlobalFunc::DoRankDownCancle(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::RANK_DOWN);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Rank_Down_Cancle);
|
|
}
|
|
|
|
void GlobalFunc::DoRepairLimitedCancle(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::REPAIR_LIMITED);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Repair_Limited_Cancle);
|
|
}
|
|
|
|
void GlobalFunc::DoStatChangeItemCancel(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::ITEM_STAT_CHANGE );
|
|
g_KeyQueueManager.DeleteMsg( eDoType_Stat_Change_Item );
|
|
}
|
|
|
|
#ifdef __NA_001358_ENCHANT_UNIFICATION
|
|
void GlobalFunc::DoInstantEnchantCancle(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::ENCHANT );
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_InstantEnchant_Cancle );
|
|
}
|
|
#endif // __NA_001358_ENCHANT_UNIFICATION
|
|
|
|
void GlobalFunc::DoWaxGlossItemCancle(DWORD wParam,DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::RIDER_WAX );
|
|
g_KeyQueueManager.DeleteMsg( eDoType_Cursor_Rider_Wax );
|
|
}
|
|
|
|
void GlobalFunc::ReviveCastFromSceneType()
|
|
{
|
|
// 2011.08.09 / 송찬종 / 리스폰 캐스팅 바와 마을로 가기 캐스팅 바가 곂치면서 다이얼로그 락이 안풀리는 현상 수정
|
|
// 마을로 가기 캐스팅 바가 끝날 때 캐릭터가 죽은 상태라면 리스폰 캐스팅 시작
|
|
// 2012.10.15 / 송찬종 / 점령전에 이어 전장과 자유전투실에도 같은 룰 적용
|
|
|
|
//_NA_000000_121015_LEAVE_CANCEL_TO_REVIVE_RE_CASTING
|
|
//Scene에 맞춰 부활 캐스팅 시전
|
|
if (SCENE_TYPE_DOMINATION == GameFramework::GetCurScene())
|
|
{
|
|
|
|
#ifdef _NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
DeadConfirmInDomination(0,0);
|
|
#else
|
|
const sDOMINATION_INFO* domination_info =
|
|
DominationInfoParser::Instance()->GetDominationInfo(g_pMap->GetCurrentFieldID());
|
|
if (domination_info)
|
|
{
|
|
StartLeaveFieldCastTimer( eDoType_Delay_Spawn_DominationWar, domination_info->m_RespawnDelay);
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szResultInfo[INTERFACE_STRING_LENGTH] = {0,};
|
|
g_InterfaceManager.GetInterfaceString(3326, szMessage, INTERFACE_STRING_LENGTH);
|
|
Sprintf( szResultInfo, szMessage, domination_info->m_RespawnDelay/1000);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResultInfo);
|
|
}
|
|
#endif //_NA_007029_20140120_DOMINATION_RESURRECTION_REFORM
|
|
}
|
|
#ifdef _NA_000000_20120527_CHAOS_ZONE
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
else if (SCENE_TYPE_BATTLEGROUND == GameFramework::GetCurScene()
|
|
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
|| SCENE_TYPE_GOLDRUSH == GameFramework::GetCurScene()
|
|
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
)
|
|
{
|
|
const BattleGroundInfo* battle_ground_info =
|
|
BattleGroundInfoParser::Instance()->FindData(g_pMap->GetCurrentFieldID());
|
|
if (battle_ground_info)
|
|
{
|
|
StartLeaveFieldCastTimer(eDoType_Delay_Spawn_BattleGround, battle_ground_info->dead_time*1000);
|
|
}
|
|
}
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
else if (SCENE_TYPE_FREEPVP == GameFramework::GetCurScene())
|
|
{
|
|
StartLeaveFieldCastTimer(eDoType_Delay_Spawn_FreePVP, DEALY_SPAWN_VILLAGE);
|
|
}
|
|
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
#endif //_NA_000000_20120527_CHAOS_ZONE
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
else if (SCENE_TYPE_SONNENSCHEIN == GameFramework::GetCurScene()
|
|
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
|
|
|| SCENE_TYPE_GUILDMISSION == GameFramework::GetCurScene()
|
|
#endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION
|
|
)
|
|
{
|
|
ShowSonnenScheinResurrectionPopup(0,0);
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
else
|
|
{
|
|
//no op
|
|
}
|
|
}
|
|
|
|
#ifdef _NA_0_20111012_ITEM_DATE_EXTEND
|
|
void GlobalFunc::DoExtendItemDate(DWORD l_param, DWORD r_param)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::EXTEND_ITEMDATE);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Extend_ItemDate);
|
|
}
|
|
#endif//_NA_0_20111012_ITEM_DATE_EXTEND
|
|
|
|
#ifdef _NA_003740_20111122_RANDOM_ITEM
|
|
void GlobalFunc::DoRandomizeItem(DWORD l_param, DWORD r_param)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::RANDOMIZE_ITEM);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Randomize_Item);
|
|
}
|
|
#endif//_NA_003740_20111122_RANDOM_ITEM
|
|
|
|
void GlobalFunc::DoEtheriaExtract(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::ETHERIA_EXTRACT);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Etheria_Extract);
|
|
}
|
|
void GlobalFunc::DoEtheriaCombination(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::ETHERIA_COMBINATION);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Etheria_Combine);
|
|
}
|
|
|
|
void GlobalFunc::DoSocketIdentify(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::SOCKET_IDENTIFY);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_SocketIdentify);
|
|
}
|
|
void GlobalFunc::DoSocketRecreate(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::SOCKET_RECREATE);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_SocketRecreate);
|
|
}
|
|
|
|
void GlobalFunc::DoCrystalization( DWORD l_param, DWORD r_param )
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState(MouseHandler::CRYSTALIZATION);
|
|
g_KeyQueueManager.DeleteMsg(eDoType_Crystalization);
|
|
InventoryDialog* inventory_dialog_ptr = static_cast<InventoryDialog*>(GET_DIALOG(IM_INVENTORY_MANAGER::INVEN_DLG));
|
|
if (inventory_dialog_ptr)
|
|
{
|
|
inventory_dialog_ptr->RevertCrystalizationItemIconDeActiveRender();
|
|
// 경고음 출력
|
|
g_SoundEffect.PlayUI(UI_SOUND_ITEM_PUT_CRYSTALIZATION);
|
|
|
|
// 5849 : 결정화가 모두 취소되었습니다.
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
g_InterfaceManager.GetInterfaceString(5849, format_string);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, format_string);
|
|
}
|
|
}
|
|
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
void GlobalFunc::DoChaoszoneDialog(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
uiChaosSystemMan* chaos_manager = GET_DIALOG_MANAGER(uiChaosSystemMan, UIMAN_CHAOS);
|
|
if (chaos_manager)
|
|
{
|
|
chaos_manager->ToggleChaoszoneDialog(true); //창 닫기
|
|
}
|
|
g_KeyQueueManager.DeleteMsg(eDoType_ChaoszoneDialog);
|
|
}
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
|
|
#ifdef _NA_000000_20140120_SMART_NPC_SYSTEM
|
|
void GlobalFunc::DoSmartNpcMenuDialog(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_InterfaceManager.DeleteInterface(IM_SMARTNPCDIALOG_MANAGER::SMARTNPCDIALOG_MENU);
|
|
}
|
|
void GlobalFunc::DoSmartNpcReplyDialog(DWORD wParam,DWORD lParam)
|
|
{
|
|
g_InterfaceManager.DeleteInterface(IM_SMARTNPCDIALOG_MANAGER::SMARTNPCDIALOG_REPLY);
|
|
}
|
|
#endif //_NA_000000_20140120_SMART_NPC_SYSTEM
|
|
|
|
#ifdef _NA_007086_20140318_MONSTERBOOK
|
|
void GlobalFunc::DoMonsterBookDialog(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
uiMonsterBookMan* monsterbook_man = GET_DIALOG_MANAGER(uiMonsterBookMan, UIMAN_MONSTERBOOK);
|
|
if (monsterbook_man)
|
|
{
|
|
monsterbook_man->toggle_monster_book(TRUE);
|
|
}
|
|
}
|
|
#endif //_NA_007086_20140318_MONSTERBOOK
|
|
#ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
|
|
void GlobalFunc::DoAttendanceCheckDialog(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
uiAttendanceCheckMan* manager = GET_DIALOG_MANAGER(uiAttendanceCheckMan, UIMAN_ATTENDANCE_CHECK);
|
|
if (manager)
|
|
{
|
|
manager->toggle_window(TRUE);
|
|
}
|
|
}
|
|
void GlobalFunc::AttendanceCheckRewardConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
MSG_CG_CHARINFO_GET_ATTENDANCE_REWARD_PACKET packet;
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &packet, sizeof(MSG_CG_CHARINFO_GET_ATTENDANCE_REWARD_PACKET));
|
|
}
|
|
return;
|
|
}
|
|
#endif //_NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
|
|
#ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM
|
|
void GlobalFunc::DoSUNRankingDialog(DWORD l_param, DWORD r_param)
|
|
{
|
|
uiSUNRankingMan* sun_ranking_manager = GET_DIALOG_MANAGER(uiSUNRankingMan, UIMAN_SUNRANKING);
|
|
if ( sun_ranking_manager )
|
|
{
|
|
sun_ranking_manager->ToggleSUNRankingDialog();
|
|
}
|
|
}
|
|
#endif // _NA_008016_20150203_SUN_RANKING_SYSTEM
|
|
#ifdef _NA_008405_20150716_MINIGAME_BINGO
|
|
void GlobalFunc::DoBingoGameDialog( DWORD l_param, DWORD r_param )
|
|
{
|
|
uiMiniGameMan* mini_game_manager = GET_DIALOG_MANAGER(uiMiniGameMan, UIMAN_MINIGAME);
|
|
if ( mini_game_manager )
|
|
{
|
|
mini_game_manager->ToggleBingoGameDialog();
|
|
}
|
|
}
|
|
#endif // _NA_008405_20150716_MINIGAME_BINGO
|
|
|
|
#ifdef _ADD_CHARGE_ITEM_RANDOM_OPTION
|
|
//----------------------------------------------------------------------------
|
|
/** 렌덤옵션 추가.
|
|
*/
|
|
void GlobalFunc::DoAddRandomOption(DWORD wParam, DWORD lParam)
|
|
{
|
|
MouseHandler::Instance()->RemoveMouseState( MouseHandler::ADD_RANDOM_OPTION);
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_Random_Option_cancel );
|
|
}
|
|
|
|
#endif
|
|
|
|
void GlobalFunc::DoBank(DWORD wParam,DWORD lParam)
|
|
{
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
uiBankDialog *pBankDlg = GET_CAST_DIALOG(uiBankDialog, IM_BANK_MANAGER::BANK_DIALOG);
|
|
#else
|
|
BankDialog *pBankDlg = GET_CAST_DIALOG(BankDialog, IM_BANK_MANAGER::BANK_DIALOG);
|
|
#endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
|
|
if(pBankDlg)
|
|
{
|
|
pBankDlg->SendWareHouseEnd();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoGuildWareHouse(DWORD wParam, DWORD lParam)
|
|
{
|
|
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
DWORD dialog_id = uiGuildWareHouse::kDialog_ID;
|
|
#else
|
|
DWORD dialog_id = IM_GUILD_MANAGER::GUILD_WAREHOUSE;
|
|
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
uiGuildWareHouse* guildwareouse_dlg_ptr = GET_CAST_DIALOG(uiGuildWareHouse, dialog_id);
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
if (guildwareouse_dlg_ptr != NULL)
|
|
{
|
|
guildwareouse_dlg_ptr->SendWareHouseEnd();
|
|
}
|
|
#else
|
|
uiGuildMan* pGuildMan = (uiGuildMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD);
|
|
if(pGuildMan)
|
|
{
|
|
if ((MouseHandler::Instance()->GetMouseState() == MouseHandler::GUILD_WITHDRAW) ||
|
|
(MouseHandler::Instance()->GetMouseState() == MouseHandler::GUILD_DEPOSIT))
|
|
{
|
|
if (guildwareouse_dlg_ptr != NULL)
|
|
{
|
|
guildwareouse_dlg_ptr->InitButton();
|
|
}
|
|
return;
|
|
}
|
|
|
|
pGuildMan->SEND_CG_GUILD_WAREHOUSE_CLOSE_SYN();
|
|
}
|
|
#endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
}
|
|
|
|
|
|
void GlobalFunc::DoVentorBuy(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiVendorBuy* pDlg=(uiVendorBuy*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_VENDOR_BUY);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
|
|
}
|
|
|
|
void GlobalFunc::DoVentorSell(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiVendorSell* pDlg=(uiVendorSell*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_VENDOR_SELL);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
|
|
}
|
|
|
|
void GlobalFunc::DoTrade(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiTrade* pDlg = (uiTrade *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_TRADE);
|
|
|
|
if (pDlg)
|
|
{
|
|
uiTradeMan* tradeMan =
|
|
static_cast<uiTradeMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_TRADE));
|
|
assert (tradeMan);
|
|
tradeMan->SendTradeCancel();
|
|
|
|
pDlg->ShowInterface(FALSE);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::DoSystemConfirm(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiSystemConfirm* system_confirm = GET_CAST_DIALOG(uiSystemConfirm, lParam);
|
|
if (system_confirm != NULL)
|
|
{
|
|
system_confirm->OnClose();
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::DoSystemVerify(DWORD wParam,DWORD lParam)
|
|
{
|
|
if( uiSystemVerify* pDlg = (uiSystemVerify *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SYSTEM_VERIFY) )
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoInputNumBank(DWORD wParam,DWORD lParam)
|
|
{
|
|
#ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
// no operation
|
|
#else
|
|
if( InputNumBankDialog* pDlg = (InputNumBankDialog*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_INPUT_NUM) )
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
#endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM
|
|
}
|
|
|
|
void GlobalFunc::DoInputNumTradeBank(DWORD wParam,DWORD lParam)
|
|
{
|
|
if( InputNumTradeDialog* pDlg = (InputNumTradeDialog*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_INPUT_NUM) )
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
}
|
|
|
|
|
|
void GlobalFunc::DoVentorPopup(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiVendorPopup* pDlg=(uiVendorPopup*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_VENDOR_POPUP);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoVentorTitlePopup(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiVendorTitlePopup* pDlg=(uiVendorTitlePopup*)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_VENDOR_TITLE_POPUP);
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoPartyLeave(DWORD wParam,DWORD lParam)
|
|
{
|
|
uiPartyLeavePopup * pDlg = GET_CAST_DIALOG( uiPartyLeavePopup, IM_PARTY_MANAGER::PARTY_LEAVE_POPUP );
|
|
|
|
if(pDlg)
|
|
{
|
|
pDlg->Exit();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::DoInvokeSceneEvent(DWORD wParam,DWORD lParam)
|
|
{
|
|
if (GameFramework::GetCurrentScene())
|
|
{
|
|
GameFramework::GetCurrentScene()->KeyManagerProc(wParam,lParam);
|
|
}
|
|
}
|
|
|
|
#ifdef _JBH_MOD_VENDOR_SELECT_BUY_NUM
|
|
void GlobalFunc::DoVendorBuyPopup(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiVendorBuyPopup * pDlg = GET_DIALOG( IM_VENDOR_MANAGER::VENDOR_BUY_POPUP );
|
|
if( pDlg )
|
|
{
|
|
pDlg->ShowWindow(FALSE);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void GlobalFunc::DoVendorList(DWORD wParam, DWORD lParam)
|
|
{
|
|
uiVendorList * pDlg = GET_CAST_DIALOG( uiVendorList, IM_VENDOR_MANAGER::VENDOR_LIST );
|
|
if( pDlg )
|
|
{
|
|
pDlg->NET_SEND_CG_VENDOR_LIST_END_SYN();
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::ShowMessageBox_Debug( LPCTSTR szMessage,int iDelay, WzColor *pTextColor )
|
|
{
|
|
#ifdef _DEBUG
|
|
g_InterfaceManager.ShowMessageBox( szMessage, iDelay, pTextColor, 0 );
|
|
#endif
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
void GlobalFunc::SetCaptionByPasswordType(CCtrlStaticWZ* pCtrlTxt, INOUT LPTSTR strPassword)
|
|
{
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
int iCount = _tcslen(strPassword);
|
|
|
|
for(int i = 0; i < iCount; i++)
|
|
{
|
|
_tcscat(szMessage, _T("*"));
|
|
}
|
|
|
|
if( pCtrlTxt )
|
|
{
|
|
pCtrlTxt->SetTextWZ( szMessage );
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetCaption( CCtrlStaticWZ *pControl, LPCTSTR pMsg )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetTextWZ( const_cast<LPTSTR>(pMsg) );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetCaption( CCtrlButtonWZ *pControl, LPCTSTR pMsg )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetTextWZ( const_cast<LPTSTR>(pMsg) );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetText( CCtrlDxIMEEditBox *pControl, OUT TCHAR *pMsg, int iSize )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->GetTextWZ( pMsg, iSize );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetText( CCtrlDxIMEEditBox *pControl, LPCTSTR pMsg )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetTextWZ( const_cast<LPTSTR>(pMsg) );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetItemText( CCtrlListWZ *pControl, int iIndex, LPCTSTR pMsg )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetItemTextWZ( iIndex, const_cast<LPTSTR>(pMsg) );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetItemText( CCtrlListWZ *pControl, int iIndex, int iSubIndex, LPCTSTR pMsg )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetItemTextWZ( iIndex, iSubIndex, const_cast<LPTSTR>(pMsg) );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetItem( CCtrlListWZ *pControl, int nIndex, TCHAR* pszText, DWORD dwFontID, DWORD dwTextStyle, COLORREF BKColor, COLORREF TextColor, COLORREF SelTextColor )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetItemWZ( nIndex, pszText, dwFontID, dwTextStyle, BKColor, TextColor, SelTextColor );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetItem( CCtrlListWZ *pControl, int nIndex, int nSubIndex, TCHAR* pszText, DWORD dwFontID, DWORD dwTextStyle, COLORREF BKColor, COLORREF TextColor, COLORREF SelTextColor )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetItemWZ( nIndex, nSubIndex, pszText, dwFontID, dwTextStyle, BKColor, TextColor, SelTextColor );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetReportButtonInfo( CCtrlListWZ *pControl, int nIndex,int nLength, LPCTSTR pszSZ )
|
|
{
|
|
if( pControl )
|
|
{
|
|
pControl->SetReportButtonInfo( nIndex, nLength, const_cast<TCHAR*>( pszSZ ) );
|
|
//pControl->SetReportButtonInfo( nIndex, nLength, pszSZ );
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::SetFocus( SolarDialog * pDlg, CCtrlDxEditBox * pControl)
|
|
{
|
|
if ( pDlg && pControl)
|
|
{
|
|
pControl->SetFocusWZ();
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetMoneyText( CCtrlStaticWZ *pControl, MONEY money)
|
|
{
|
|
if(!pControl)
|
|
return;
|
|
|
|
NUMBERFMT nFmt = { 0, 0, 3, _T("."), _T(","), 1 };
|
|
|
|
TCHAR szResult[INTERFACE_STRING_LENGTH] ={0,};
|
|
TCHAR szMoney[INTERFACE_STRING_LENGTH] ={0,};
|
|
// 돈을 셋팅한다.
|
|
Sprintf(szMoney, _T("%I64u"), money);
|
|
|
|
::GetNumberFormat(
|
|
LOCALE_SYSTEM_DEFAULT,
|
|
NULL,
|
|
szMoney,
|
|
&nFmt,
|
|
szResult,
|
|
sizeof(szResult));
|
|
|
|
SetCaption( pControl, szResult );
|
|
}
|
|
|
|
void GlobalFunc::SetPointText(TCHAR *result_string, INT64 number)
|
|
{
|
|
if(result_string == NULL)
|
|
{
|
|
return;
|
|
}
|
|
NUMBERFMT format = { 0, 0, 3, _T("."), _T(","), 1 };// 3자리마다 ',' 찍기
|
|
TCHAR buffer_string[INTERFACE_STRING_LENGTH] ={0,};
|
|
|
|
// 숫자를 셋팅한다.
|
|
Sprintf(buffer_string, _T("%I64u"), number);
|
|
::GetNumberFormat(LOCALE_SYSTEM_DEFAULT, NULL, buffer_string, &format,
|
|
result_string, sizeof(buffer_string));
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetMoneyText(CCtrlStaticWZ *control, MONEY money, BYTE money_type, bool is_minus)
|
|
{
|
|
if (!control)
|
|
{
|
|
return;
|
|
}
|
|
|
|
NUMBERFMT format = { 0, 0, 3, _T("."), _T(","), 1 };
|
|
TCHAR result_string[INTERFACE_STRING_LENGTH] ={0,};
|
|
TCHAR money_string[INTERFACE_STRING_LENGTH] ={0,};
|
|
TCHAR message_string[INTERFACE_STRING_LENGTH] ={0,};
|
|
TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,};
|
|
int string_code = 0;
|
|
|
|
// 돈을 셋팅한다.
|
|
Sprintf(money_string, _T("%I64u"), money);
|
|
::GetNumberFormat(LOCALE_SYSTEM_DEFAULT, NULL, money_string, &format, result_string, sizeof(result_string));
|
|
|
|
switch (money_type)
|
|
{
|
|
case CASH_ITEM_SHOP_DEFAULT:
|
|
{
|
|
if (is_minus)
|
|
{
|
|
string_code = 155361; // 155361 -%s 캐시
|
|
}
|
|
else
|
|
{
|
|
string_code = 155362; // 155362 %s 캐시
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CASH_ITEM_SHOP_HAIM:
|
|
{
|
|
if (is_minus)
|
|
{
|
|
string_code = 155363; // 155363 -%s 하임
|
|
}
|
|
else
|
|
{
|
|
string_code = 155364; // 155364 %s 하임
|
|
}
|
|
}
|
|
break;
|
|
case CASH_ITEM_SHOP_MILEAGE:
|
|
{
|
|
if (is_minus)
|
|
{
|
|
string_code = 155388; // 155388 %s 마일리지
|
|
}
|
|
else
|
|
{
|
|
string_code = 155389; // 155389 -%s 마일리지
|
|
}
|
|
}
|
|
break;
|
|
case CASH_ITEM_SHOP_CCASH:
|
|
{
|
|
if (is_minus)
|
|
{
|
|
string_code = 155446; // 155388 -%s cash(c)
|
|
}
|
|
else
|
|
{
|
|
string_code = 155445; // 155389 %s cash(c)
|
|
}
|
|
}
|
|
break;
|
|
case CASH_ITEM_SHOP_PCASH:
|
|
{
|
|
if (is_minus)
|
|
{
|
|
string_code = 155448; // 155388 -%s cash(p)
|
|
}
|
|
else
|
|
{
|
|
string_code = 155447; // 155389 %s cash(p)
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
_asm nop;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (string_code)
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(string_code, temp_string ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(message_string ,INTERFACE_STRING_LENGTH , temp_string , result_string);
|
|
SetCaption(control, message_string);
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::CalcTime(DWORD64 dwTime IN, TCHAR *ptszOutString OUT)
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
YYYYMMDDHHMMSSToSYSTEMTIME(dwTime, sysTime);
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
// 155365 %d년 %d월 %d일
|
|
g_InterfaceManager.GetInterfaceString( 155365 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage, sysTime.wYear, sysTime.wMonth, sysTime.wDay);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
void GlobalFunc::CalcTime(DWORD dwSec IN, int& min OUT, int& sec OUT, TCHAR *ptszOutString OUT)
|
|
{
|
|
min = 0;
|
|
sec = 0;
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] ={0,};
|
|
if(dwSec)
|
|
{
|
|
min = dwSec / 60;
|
|
sec = dwSec % 60;
|
|
|
|
if(min && sec)
|
|
{
|
|
// 155366 %d분 %d초
|
|
g_InterfaceManager.GetInterfaceString(155366 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString,INTERFACE_STRING_LENGTH-1, szMessage , min, sec );
|
|
}
|
|
else if(min)
|
|
{
|
|
// 155367 %d분
|
|
g_InterfaceManager.GetInterfaceString( 155367 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString,INTERFACE_STRING_LENGTH-1, szMessage , min);
|
|
}
|
|
else if(sec)
|
|
{
|
|
// 155368 %d초
|
|
g_InterfaceManager.GetInterfaceString( 155368 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString,INTERFACE_STRING_LENGTH-1, szMessage, sec );
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void GlobalFunc::CalcTime(DWORD dwMin IN, int& day OUT, int& hour OUT, int& min OUT, TCHAR *ptszOutString OUT)
|
|
{
|
|
day = 0;
|
|
hour = 0;
|
|
min = 0;
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] ={0,};
|
|
|
|
if(dwMin)
|
|
{
|
|
hour = dwMin / 60;
|
|
min = dwMin % 60;
|
|
|
|
if(hour)
|
|
{
|
|
day = hour / 24;
|
|
|
|
if(day)
|
|
{
|
|
//155369 %d일
|
|
g_InterfaceManager.GetInterfaceString(155369 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage , day);
|
|
}
|
|
else if(hour && min)
|
|
{
|
|
//155370 %d시간 %d분
|
|
g_InterfaceManager.GetInterfaceString(155370 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage , hour, min);
|
|
}
|
|
else if(hour)
|
|
{
|
|
// 155371 %d시간
|
|
g_InterfaceManager.GetInterfaceString(155371 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage , hour);
|
|
}
|
|
else if(min)
|
|
{
|
|
// 155367 %d분
|
|
g_InterfaceManager.GetInterfaceString(155367 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage , min);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(min)
|
|
{
|
|
// 155367 %d분
|
|
g_InterfaceManager.GetInterfaceString(155367 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, szMessage, min);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Snprintf(ptszOutString, INTERFACE_STRING_LENGTH-1, "0" );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
bool GlobalFunc::CompareLimitText(CCtrlDxIMEEditBox * m_pEditCtrl, TCHAR* szOutMessage, int iSize, int iErrorNum)
|
|
{
|
|
TCHAR szTemp[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
GetText(m_pEditCtrl, szMessage, INTERFACE_STRING_LENGTH);
|
|
|
|
if(_tcslen(szMessage) > (size_t)iSize)
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(iErrorNum, szTemp, INTERFACE_STRING_LENGTH);
|
|
uiSystemMan * pSystemMan = (uiSystemMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM);
|
|
if(pSystemMan)
|
|
pSystemMan->Sys_Verify(szTemp, FALSE);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
CopyMemory(szOutMessage, szMessage, iSize);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::ProcessChatMessage( TCHAR* message )
|
|
{
|
|
if( ChatDialog* pChatDlg = GET_CAST_DIALOG(ChatDialog, IM_CHAT_MANAGER::CHAT_DIALOG) )
|
|
{
|
|
pChatDlg->OnProcessChatMessage( message );
|
|
}
|
|
}
|
|
|
|
bool GlobalFunc::BeforeLoadingInputLock()
|
|
{
|
|
#ifdef _DH_BATTLEZONE2_
|
|
// 배틀존 입장 Lock
|
|
uiBattlezone2Man* ui_battlezone2_manager_ = GET_DIALOG_MANAGER(uiBattlezone2Man, UIMAN_BATTLE_ZONE_MANAGER);
|
|
if (ui_battlezone2_manager_ && ui_battlezone2_manager_->is_wait())
|
|
{
|
|
return true;
|
|
}
|
|
#endif //_DH_BATTLEZONE2_
|
|
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
//전장 입장 Lock
|
|
if (ChaosSystem::GetChaosZoneData().is_wait() == true)
|
|
{
|
|
return true;
|
|
}
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
|
|
return false;
|
|
}
|
|
//----------------------------------------------------------------------
|
|
// 메시지 출력 관련
|
|
|
|
void GlobalFunc::default_OutputMsg( int eMsgType, TCHAR * pszMessage, int iDisplayTime/* = 10000*/ )
|
|
{
|
|
if ( eMsgType & eOUTPUT_MSG_TOP_SHOW )
|
|
{
|
|
WzColor color = c_Chat_NoticeColor;
|
|
g_InterfaceManager.ShowMessageBox(pszMessage , iDisplayTime , &color, 0);
|
|
}
|
|
|
|
if ( eMsgType & eOUTPUT_MSG_CENTER_SHOW )
|
|
{
|
|
WzColor color = c_Chat_NoticeColor;
|
|
g_InterfaceManager.ShowCenterMessageBox( pszMessage, iDisplayTime , &color, FALSE );
|
|
}
|
|
|
|
if ( eMsgType & eOUTPUT_MSG_CHAT )
|
|
{
|
|
ChatDialog * pChatDlg = GET_CAST_DIALOG(ChatDialog, IM_CHAT_MANAGER::CHAT_DIALOG);//(ChatDialog *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_CHAT);
|
|
if ( pChatDlg )
|
|
{
|
|
pChatDlg->AddString( pszMessage );
|
|
}
|
|
}
|
|
|
|
if ( eMsgType & eOUTPUT_MSG_OUPUT_DEBUG )
|
|
{
|
|
OutputDebugString( pszMessage );
|
|
}
|
|
|
|
#ifdef _USE_LUA_SCRIPT
|
|
if ( eMsgType & eOUTPUT_MSG_LUA_CONSOLE )
|
|
{
|
|
CWinConsole::Write(pszMessage);
|
|
}
|
|
#endif//
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::OutputMsg_SysAlertMsg( const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
// 채팅창과 화면 중앙 위쪽에 동시에 출력
|
|
default_OutputMsg( eOUTPUT_MSG_CHAT, szOutputMsg);
|
|
g_InterfaceManager.ShowMessageBox( szOutputMsg, -1, NULL, 0 ); // 다른 메시지 오기전까지 계속 노출됨
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::OutputMsg_SysMsg( const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
// 채팅창과 화면 중앙 위쪽에 동시에 출력
|
|
default_OutputMsg( eOUTPUT_MSG_CHAT, szOutputMsg);
|
|
g_InterfaceManager.ShowMessageBox(szOutputMsg, 10000, NULL, 0);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::OutputMsg_Notice( int eMsgType, const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
default_OutputMsg( eMsgType, szOutputMsg);
|
|
}
|
|
|
|
void GlobalFunc::OutputMsg_PCBang_Notice(TCHAR* pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
default_OutputMsg( eOUTPUT_MSG_CENTER_SHOW, szOutputMsg, 20000);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::OutputMsg_Error( int eMsgType, const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
default_OutputMsg( eMsgType, szOutputMsg);
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::OutputMsg_Guide( int eMsgType, const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
default_OutputMsg( eMsgType, szOutputMsg);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::OutputMsg_Warning( int eMsgType, const TCHAR * pszMessage, ...)
|
|
{
|
|
TCHAR szOutputMsg[512] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
default_OutputMsg( eMsgType, szOutputMsg);
|
|
}
|
|
|
|
void GlobalFunc::DisplayMessageForTrigger( BOOL bDone, int iTextID, BYTE byIsParty, int iDisplayWindow, int iDisplaySwitch, DWORD dwObjectKey)
|
|
{
|
|
if (bDone)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( MESSAGE_INFO* pMessageInfo = MessageInfoParser::Instance()->GetMessage( iTextID ) )
|
|
{
|
|
uiHelpMan* helpMan =
|
|
static_cast<uiHelpMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP));
|
|
|
|
int iType = (int)pMessageInfo->byType;
|
|
switch(iType)
|
|
{
|
|
case MESSAGE_TYPE_AREA_NAME: // 지역명
|
|
if( iDisplaySwitch == 0 )
|
|
{
|
|
g_InterfaceManager.ShowMissionAreaInfo( pMessageInfo->pszMessage, pMessageInfo->iTime, NULL );
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_NORMAL: // 가운데 시스템 메시지 + 채팅창 시스템 메시지
|
|
if ( iDisplaySwitch == 0 )
|
|
{
|
|
g_InterfaceManager.ShowMessageBox( pMessageInfo->pszMessage, pMessageInfo->iTime, NULL, 0 );
|
|
|
|
TCHAR szBuffer[MAX_SHOWMESSAGE_LENGTH] = {0,};
|
|
TCHAR szMessage[MAX_SHOWMESSAGE_LENGTH] = {0,};
|
|
StrnCopy(szBuffer,pMessageInfo->pszMessage, pMessageInfo->MessageLen);
|
|
|
|
// 다이얼로그 창 내부에서 길이 개행 및 길이 처리
|
|
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szBuffer );
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_NPC: // 가운데 시스템 메시지 + 이그니스창
|
|
if( iDisplaySwitch == 0 )
|
|
{
|
|
g_InterfaceManager.ShowMessageBox( pMessageInfo->pszMessage, pMessageInfo->iTime, NULL, 0 );
|
|
|
|
#ifdef _SCJ_REMOVE_ANNOUNCE_WINDOW
|
|
#else
|
|
if (helpMan)
|
|
{
|
|
helpMan->ShowHelpAnnounce(pMessageInfo->dwDCode,TRUE);
|
|
}
|
|
#endif //_SCJ_REMOVE_ANNOUNCE_WINDOW
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_TRIGGER: // 가운데 시스템 메시지 + 아이템 정보창
|
|
if( iDisplaySwitch == 0 )
|
|
{
|
|
g_InterfaceManager.ShowMessageBox( pMessageInfo->pszMessage, pMessageInfo->iTime, NULL, 0 );
|
|
|
|
if (helpMan)
|
|
{
|
|
helpMan->AddHelpMission(iTextID, pMessageInfo->dwNCode, pMessageInfo->dwDCode, pMessageInfo->dwImgCode);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 아이템 제거
|
|
if (helpMan)
|
|
{
|
|
helpMan->DelHelpMission(iTextID);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_NPC_ONLY: // 이그니스창
|
|
if( iDisplaySwitch == 0 )
|
|
{
|
|
#ifdef _SCJ_REMOVE_ANNOUNCE_WINDOW
|
|
#else
|
|
if (helpMan)
|
|
{
|
|
helpMan->ShowHelpAnnounce(pMessageInfo->dwDCode,TRUE);
|
|
}
|
|
#endif //_SCJ_REMOVE_ANNOUNCE_WINDOW
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_TRIGGER_ONLY: //아이템 정보창
|
|
if( iDisplaySwitch == 0 )
|
|
{
|
|
if (helpMan)
|
|
{
|
|
helpMan->AddHelpMission(iTextID, pMessageInfo->dwNCode, pMessageInfo->dwDCode, pMessageInfo->dwImgCode);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 아이템 제거
|
|
if (helpMan)
|
|
{
|
|
helpMan->DelHelpMission(iTextID);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_CENTER_MSG_ONLY:
|
|
{
|
|
|
|
default_OutputMsg(eOUTPUT_MSG_TOP_SHOW, pMessageInfo->pszMessage, pMessageInfo->iTime );
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_GUILD_MESSAGE:
|
|
if( uiNoticeMan* pUIMan = GET_DIALOG_MANAGER(uiNoticeMan, UIMAN_NOTICE) )
|
|
{
|
|
pUIMan->ShowNoticeMessage(eGuild_Notice, pMessageInfo->pszMessage, pMessageInfo->iTime);
|
|
}
|
|
break;
|
|
|
|
case MESSAGE_TYPE_BATTLE_RESULT: //
|
|
if( uiBattleScoreMan* battle_score_manager_ptr =
|
|
static_cast<uiBattleScoreMan*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BATTLE_SCORE)) )
|
|
{
|
|
if (battle_score_manager_ptr)
|
|
{
|
|
battle_score_manager_ptr->set_toggle_ui_open(true);
|
|
battle_score_manager_ptr->SendPacketBattleResultSYN();
|
|
}
|
|
}
|
|
break;
|
|
// 오브젝트 말풍선 대사
|
|
case MESSAGE_TYPE_OBJECT_BALLOON_MSGBOX:
|
|
// 오브젝트를 얻어와서 말풍선 출력
|
|
if( Object* object = g_ObjectManager.GetObject(dwObjectKey) )
|
|
{
|
|
object->AddChatMessage(pMessageInfo->pszMessage);
|
|
}
|
|
break;
|
|
case MESSAGE_TYPE_OBJECT_BALLOON_MSGBOX_WITH_SYSTEM:
|
|
// 오브젝트 말풍선 대사 및 시스템메시지
|
|
// 오브젝트를 얻어와서 말풍선 출력
|
|
if( Object* object = g_ObjectManager.GetObject(dwObjectKey) )
|
|
{
|
|
object->AddChatMessage(pMessageInfo->pszMessage);
|
|
}
|
|
// 시스템메시지에 출력
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, pMessageInfo->pszMessage);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_SYSCHAT, "Invalid MessageInfo: %d", iTextID);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
LONG
|
|
GlobalFunc::GetTextHeight(TCHAR* pText, WzID wiFont)
|
|
{
|
|
SIZE TextSize;
|
|
int iTextLength = (int)_tcslen(pText);
|
|
|
|
g_pSunRenderer->x_pManagerTextOut->StartToUseFont(wiFont);
|
|
g_pSunRenderer->x_pManagerTextOut->GetTextExtentPoint(pText, iTextLength, &TextSize );
|
|
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
|
|
|
|
return TextSize.cy;
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
LPCSTR GlobalFunc::ReplaceFileExt(LPCSTR FileName, LPCSTR NewExt )
|
|
{
|
|
static char szBufStr[MAX_PATH] = { 0, };
|
|
static char szDir[MAX_PATH] = { 0, };
|
|
static char szFName[MAX_PATH] = { 0, };
|
|
static char szExt[MAX_PATH] = { 0, };
|
|
|
|
_snprintf( szBufStr, MAX_PATH, "%s", FileName);
|
|
_splitpath(szBufStr, NULL, szDir, szFName, szExt);
|
|
|
|
sprintf(szBufStr, "%s%s.%s", szDir, szFName, NewExt);
|
|
|
|
return szBufStr; // 항상 같은 주소를 리턴하는것에 주의
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
LONG
|
|
GlobalFunc::GetTextWidth(TCHAR* pText, WzID wiFont)
|
|
{
|
|
SIZE TextSize;
|
|
int iTextLength = (int)_tcslen(pText);
|
|
|
|
g_pSunRenderer->x_pManagerTextOut->StartToUseFont(wiFont);
|
|
g_pSunRenderer->x_pManagerTextOut->GetTextExtentPoint(pText, iTextLength, &TextSize );
|
|
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
|
|
|
|
return TextSize.cx;
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL
|
|
GlobalFunc::IsSlang(TCHAR* pText, bool bShowMsg)
|
|
{
|
|
#if defined(_GLOBAL) || defined(_RUSSIA)
|
|
return FALSE;
|
|
#endif//defined(_GLOBAL) || defined(_RUSSIA)
|
|
char szString[MAX_MESSAGE_LENGTH] = {0,};
|
|
TCHAR szMessage[MAX_MESSAGE_LENGTH] = {0,};
|
|
|
|
// 금지단어 check
|
|
if (g_slangFilter.IsHaveReplace(pText))
|
|
{
|
|
// 사용 금지 단어입니다
|
|
if(bShowMsg)
|
|
{
|
|
g_InterfaceManager.GetInterfaceString( eST_CANNOT_USE_WORD, szMessage, MAX_MESSAGE_LENGTH );
|
|
OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
source_text : 금칙어 검사를 할 원본 텍스트
|
|
dest_buffer : 금칙어를 대체문자로 대치하여 저장할 텍스트 버퍼
|
|
buffer_length : 버퍼의 길이
|
|
|
|
return value
|
|
true : 금칙어가 존재하며 금칙어를 대체문자로 대치하여 버퍼에 출력함.
|
|
false : 금칙어가 존재하지 않음.
|
|
*/
|
|
bool GlobalFunc::ReplaceSlangWord(TCHAR* source_text, TCHAR* dest_buffer, int buffer_size)
|
|
{
|
|
bool is_replace = g_slangFilter.IsHaveReplace(source_text, dest_buffer, buffer_size);
|
|
return is_replace;
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::GetWideString(TCHAR *ptszInString, TCHAR *ptszOutString, int iStringLen)
|
|
{
|
|
TCHAR szWideString[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
StrnCopy(szWideString, ptszInString, iStringLen);
|
|
|
|
StrnCopy(ptszOutString, szWideString, iStringLen);
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::CovertSimpleText( TCHAR *pMsg,int nSize ,DWORD dwFontID,RECT &rc)
|
|
{
|
|
if(!_tcslen(pMsg)) return false;
|
|
|
|
TCHAR szTemp[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
int step1 = 0; // szText Inc
|
|
int step2 = 0; // szTemp Inc
|
|
int width = 0;
|
|
BOOL complate = FALSE;
|
|
int nRectWidth = rc.right-rc.left;
|
|
char * ellipsis = " ...";
|
|
|
|
int ellipwidth = GetTextWidth( ellipsis, dwFontID );
|
|
ellipwidth += 20;
|
|
|
|
while(1)
|
|
{
|
|
if (_ismbblead(pMsg[step1]))
|
|
{
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
else
|
|
{
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
|
|
if( pMsg[step1] == '\0' )
|
|
{
|
|
complate = TRUE;
|
|
break;
|
|
}
|
|
|
|
width = GetTextWidth( szTemp, dwFontID );
|
|
|
|
if( width >= nRectWidth-ellipwidth )
|
|
break;
|
|
}
|
|
|
|
if( complate )
|
|
{
|
|
StrnCopy(szMessage, szTemp, INTERFACE_STRING_LENGTH - 1);
|
|
//Snprintf( szMessage, INTERFACE_STRING_LENGTH-1, szTemp );
|
|
}
|
|
else
|
|
{
|
|
StrnCopy(szMessage, szTemp, INTERFACE_STRING_LENGTH - 1);
|
|
strcat(szMessage, ellipsis);
|
|
//Snprintf( szMessage, INTERFACE_STRING_LENGTH-1, _T("%s%s"), szTemp, ellipsis );
|
|
}
|
|
|
|
memcpy(pMsg,szMessage,nSize);
|
|
|
|
return (complate) ? (false):(true);
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::SetCaptionSimple( CControlWZ *pControl, INOUT TCHAR *pMsg,int nType)
|
|
{
|
|
TCHAR szTemp[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
CCtrlStaticWZ* pStaticWZ=(CCtrlStaticWZ*)pControl;
|
|
CCtrlButtonWZ* pButtonWZ=(CCtrlButtonWZ*)pControl;
|
|
|
|
DWORD dwFontID = (nType==0) ? (pStaticWZ->GetFontID() ):(pButtonWZ->GetFontID());
|
|
|
|
RECT rc = pControl->GetSize();
|
|
|
|
int step1 = 0; // szText Inc
|
|
int step2 = 0; // szTemp Inc
|
|
int width = 0;
|
|
BOOL complate = FALSE;
|
|
char * ellipsis = " ...";
|
|
|
|
int ellipwidth = GetTextWidth( ellipsis, dwFontID );
|
|
ellipwidth += 20;
|
|
|
|
while(1)
|
|
{
|
|
if (_ismbblead(pMsg[step1]))
|
|
{
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
else
|
|
{
|
|
szTemp[step2] = pMsg[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
|
|
if( pMsg[step1] == '\0' )
|
|
{
|
|
complate = TRUE;
|
|
break;
|
|
}
|
|
|
|
width = GetTextWidth( szTemp, dwFontID );
|
|
|
|
if( width >= rc.right - ellipwidth )
|
|
break;
|
|
}
|
|
|
|
if( complate )
|
|
{
|
|
Snprintf( szMessage, INTERFACE_STRING_LENGTH-1, szTemp );
|
|
}
|
|
else
|
|
{
|
|
Snprintf( szMessage, INTERFACE_STRING_LENGTH-1, _T("%s%s"), szTemp, ellipsis );
|
|
}
|
|
|
|
|
|
if( pControl )
|
|
{
|
|
if(nType==0)
|
|
pStaticWZ->SetTextWZ( szMessage );
|
|
else
|
|
pButtonWZ->SetTextWZ( szMessage );
|
|
}
|
|
|
|
return (complate) ? (false):(true);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool
|
|
GlobalFunc::ProcessWordWrapByFontSize(std::vector<util::_tstring> *vstr, LPCTSTR szText, WzID wiFont, int strLen, int cutLen, bool bChatDialog /* = false */)
|
|
{
|
|
if (!vstr)
|
|
return false;
|
|
|
|
TCHAR szTemp[4096];
|
|
ZeroMemory(&szTemp, 4096);
|
|
|
|
int step1 = 0; // szText Inc
|
|
int step2 = 0; // szTemp Inc
|
|
|
|
int iWidth = 0;
|
|
|
|
BOOL bLineChange = FALSE;
|
|
BOOL bMBC = FALSE;
|
|
while(1)
|
|
{
|
|
//2줄 이상부터는 공란 2칸을 포함한다(GM 사칭방지)
|
|
if( bChatDialog && bLineChange)
|
|
{
|
|
szTemp[step2] = ' ';
|
|
step2++;
|
|
szTemp[step2] = ' ';
|
|
step2++;
|
|
bLineChange = FALSE;
|
|
}
|
|
|
|
if( bChatDialog == false )
|
|
{
|
|
if( ( szText[step1] == '\n' ) || ( szText[step1] == '#' ) )
|
|
{
|
|
// lammy : 처음부터 개행이라면 패스
|
|
if( step2 == 0 )
|
|
{
|
|
step1++;
|
|
continue;
|
|
}
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step1 += 1;
|
|
step2 = 0;
|
|
continue;
|
|
}
|
|
|
|
if( !_ismbblead( szText[step1] ) )
|
|
{
|
|
if( ( szText[step1] == '\\' ) )
|
|
{
|
|
if (szText[step1 + 1] == 'n')
|
|
{
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step1 += 2;
|
|
step2 = 0;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_ismbblead(szText[step1]))
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
bMBC = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// lammy : 젤 처음이 공백이라면 넣지 말자.
|
|
if( step2 == 0 )
|
|
{
|
|
if( szText[step1] == ' ' )
|
|
{
|
|
step1++;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
bMBC = FALSE;
|
|
}
|
|
|
|
iWidth = GetTextWidth(szTemp, wiFont);
|
|
if( iWidth >= cutLen - 6 )
|
|
{
|
|
int backstep = 1;
|
|
if(bMBC)
|
|
{
|
|
backstep = 2;
|
|
|
|
}
|
|
step1-= backstep;
|
|
step2-= backstep;
|
|
memset(&szTemp[step2], 0, backstep);
|
|
#ifdef _INTERNATIONAL_UI
|
|
if(!bChatDialog)
|
|
{
|
|
BOOL bReCover = FALSE;
|
|
|
|
TCHAR szReCover[4096];
|
|
memcpy(szReCover,szTemp,sizeof(szTemp));
|
|
|
|
if( !_ismbblead( szText[step1] ) )
|
|
{
|
|
TCHAR * tok = " ";
|
|
|
|
if( _tcscmp( &szTemp[step1], tok ) != 0 )
|
|
{
|
|
int n = step2;
|
|
|
|
for( ; ; )
|
|
{
|
|
if( _tcscmp( &szTemp[n], tok ) == 0 )
|
|
break;
|
|
|
|
szTemp[n] = '\0';
|
|
n--;
|
|
|
|
//safecode
|
|
if(n<=0)
|
|
{
|
|
bReCover = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//safecode
|
|
if(bReCover)
|
|
{
|
|
memcpy(szTemp,szReCover,sizeof(szTemp));
|
|
}
|
|
else
|
|
{
|
|
step1 -= (step2 - n);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// lammy : 마지막문자가 마침표라면 같이 붙여 주자.
|
|
if( _ismbblead(szText[step1]) )
|
|
{
|
|
// 일본 버전 전용
|
|
// 、。일경우는 개행하지 않고 끝에 붙여준다.
|
|
if( szText[step1 + 1] == 0x41 || szText[step1 + 1] == 0x42 )
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( szText[step1] == '.' || szText[step1] == ',' )
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
}
|
|
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step2 = 0;
|
|
bLineChange = TRUE;
|
|
}
|
|
|
|
if( step1 >= strLen )
|
|
{
|
|
vstr->push_back(szTemp);
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#ifdef _NA_000000_20130114_RENEWER_UI
|
|
bool GlobalFunc::ProcessWordWrapByFontSize2( std::vector<util::_tstring> *vstr, LPCTSTR szText, WzID wiFont,
|
|
int strLen, int cutLen, bool bChatDialog /*= false*/,bool bTapCheck /*= false*/ )
|
|
{
|
|
if (!vstr)
|
|
return false;
|
|
|
|
TCHAR szTemp[4096];
|
|
ZeroMemory(&szTemp, 4096);
|
|
|
|
int step1 = 0; // szText Inc
|
|
int step2 = 0; // szTemp Inc
|
|
|
|
int iWidth = 0;
|
|
|
|
BOOL bLineChange = FALSE;
|
|
BOOL bMBC = FALSE;
|
|
while(1)
|
|
{
|
|
//2줄 이상부터는 공란 2칸을 포함한다(GM 사칭방지)
|
|
if( bChatDialog && bLineChange)
|
|
{
|
|
szTemp[step2] = ' ';
|
|
step2++;
|
|
szTemp[step2] = ' ';
|
|
step2++;
|
|
bLineChange = FALSE;
|
|
}
|
|
|
|
if( bChatDialog == false )
|
|
{
|
|
if( ( szText[step1] == '\n' ) || ( szText[step1] == '#' ) )
|
|
{
|
|
// lammy : 처음부터 개행이라면 패스
|
|
if( step2 == 0 )
|
|
{
|
|
step1++;
|
|
continue;
|
|
}
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step1 += 1;
|
|
step2 = 0;
|
|
continue;
|
|
}
|
|
|
|
if( !_ismbblead( szText[step1] ) )
|
|
{
|
|
if( ( szText[step1] == '\\' ) )
|
|
{
|
|
if (szText[step1 + 1] == 'n')
|
|
{
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step1 += 2;
|
|
step2 = 0;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_ismbblead(szText[step1]))
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
bMBC = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// lammy : 젤 처음이 공백이라면 넣지 말자.
|
|
if( step2 == 0 && bTapCheck == false)
|
|
{
|
|
if( szText[step1] == ' ' )
|
|
{
|
|
step1++;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
bMBC = FALSE;
|
|
}
|
|
|
|
iWidth = GetTextWidth(szTemp, wiFont);
|
|
if( iWidth >= cutLen - 6 )
|
|
{
|
|
int backstep = 1;
|
|
if(bMBC)
|
|
{
|
|
backstep = 2;
|
|
|
|
}
|
|
step1-= backstep;
|
|
step2-= backstep;
|
|
memset(&szTemp[step2], 0, backstep);
|
|
#ifdef _INTERNATIONAL_UI
|
|
if(!bChatDialog)
|
|
{
|
|
BOOL bReCover = FALSE;
|
|
|
|
TCHAR szReCover[4096];
|
|
memcpy(szReCover,szTemp,sizeof(szTemp));
|
|
|
|
if( !_ismbblead( szText[step1] ) )
|
|
{
|
|
TCHAR * tok = " ";
|
|
|
|
if( _tcscmp( &szTemp[step1], tok ) != 0 )
|
|
{
|
|
int n = step2;
|
|
|
|
for( ; ; )
|
|
{
|
|
if( _tcscmp( &szTemp[n], tok ) == 0 )
|
|
break;
|
|
|
|
szTemp[n] = '\0';
|
|
n--;
|
|
|
|
//safecode
|
|
if(n<=0)
|
|
{
|
|
bReCover = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//safecode
|
|
if(bReCover)
|
|
{
|
|
memcpy(szTemp,szReCover,sizeof(szTemp));
|
|
}
|
|
else
|
|
{
|
|
step1 -= (step2 - n);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// lammy : 마지막문자가 마침표라면 같이 붙여 주자.
|
|
if( _ismbblead(szText[step1]) )
|
|
{
|
|
// 일본 버전 전용
|
|
// 、。일경우는 개행하지 않고 끝에 붙여준다.
|
|
if( szText[step1 + 1] == 0x41 || szText[step1 + 1] == 0x42 )
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( szText[step1] == '.' || szText[step1] == ',' )
|
|
{
|
|
szTemp[step2] = szText[step1];
|
|
step1++;
|
|
step2++;
|
|
}
|
|
}
|
|
|
|
vstr->push_back(szTemp);
|
|
ZeroMemory(&szTemp, 4096);
|
|
step2 = 0;
|
|
bLineChange = TRUE;
|
|
}
|
|
|
|
if( step1 >= strLen )
|
|
{
|
|
vstr->push_back(szTemp);
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
#endif//#ifdef _NA_000000_20130114_RENEWER_UI
|
|
|
|
//------------------------------------------------------------------------------
|
|
// 텍스트 복사가 좀 많으므로 랜더나 업데이트등에서의 호출은 자제
|
|
void GlobalFunc::SetWordWarpText( CControlWZ* control )
|
|
{
|
|
if( control != NULL )
|
|
{
|
|
TCHAR new_text[4096];
|
|
ZeroMemory(&new_text,4096);
|
|
|
|
TCHAR old_text[4096];
|
|
control->GetTextWZA( old_text, 4096 );
|
|
|
|
if( ProcessWordWrapByFontSize( new_text, old_text, control->GetFontID(), _tcslen(old_text), control->GetSize().right, -1, true ) )
|
|
{
|
|
control->SetTextWZA( new_text );
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
int GlobalFunc::ProcessWordWrapByFontSize(OUT TCHAR* out_msg, IN LPCTSTR in_msg, IN WzID font_id,
|
|
IN int str_len, IN int area_width,
|
|
IN int valid_line/* = -1*/, IN bool is_reducing/* = false*/)
|
|
{
|
|
std::vector<util::_tstring> msg_vector;
|
|
msg_vector.clear();
|
|
if (GlobalFunc::ProcessWordWrapByFontSize(&msg_vector, in_msg, font_id, _tcslen(in_msg), area_width) == true)
|
|
{
|
|
std::vector<util::_tstring>::iterator begin = msg_vector.begin();
|
|
std::vector<util::_tstring>::iterator end = msg_vector.end();
|
|
int line_index = 0;
|
|
for (; begin != end; ++begin, ++line_index)
|
|
{
|
|
if ((valid_line > 0) && (line_index >= valid_line))
|
|
{
|
|
break;
|
|
}
|
|
if ((is_reducing == true) && (valid_line > 0) && (line_index == valid_line - 1))
|
|
{
|
|
//마지막줄 이면 말줄임
|
|
int dot_width = GetTextWidth(_T("......"), font_id);
|
|
|
|
//std::vector<util::_tstring> sub_msg_vector;
|
|
//sub_msg_vector.clear();
|
|
//if (GlobalFunc::ProcessWordWrapByFontSize(&sub_msg_vector, (TCHAR*)(begin->c_str()), font_id, _tcslen(begin->c_str()), area_width - dot_width) == true)
|
|
//{
|
|
// _tcscat(out_msg, sub_msg_vector.begin()->c_str());
|
|
// if (sub_msg_vector.size() > 1)
|
|
// {
|
|
// _tcscat(out_msg, _T("......"));
|
|
// }
|
|
//}
|
|
|
|
int msg_width = GetTextWidth((TCHAR*)(begin->c_str()), font_id);
|
|
if (msg_width + dot_width > area_width)
|
|
{
|
|
// 다시 자른다.
|
|
std::vector<util::_tstring> sub_msg_vector;
|
|
sub_msg_vector.clear();
|
|
if (GlobalFunc::ProcessWordWrapByFontSize(&sub_msg_vector, (TCHAR*)(begin->c_str()), font_id, _tcslen(begin->c_str()), area_width - dot_width) == true)
|
|
{
|
|
_tcscat(out_msg, sub_msg_vector.begin()->c_str());
|
|
_tcscat(out_msg, _T("......"));
|
|
}
|
|
else
|
|
{
|
|
_tcscat(out_msg, begin->c_str());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_tcscat(out_msg, begin->c_str());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_tcscat(out_msg, begin->c_str());
|
|
}
|
|
_tcscat(out_msg, _T("\n"));
|
|
}
|
|
}
|
|
|
|
return static_cast<int>(msg_vector.size());
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::ChangeMultiEditInput(WCHAR *pwszInput, TCHAR *pszOutput)
|
|
{
|
|
int iSize = wcslen(pwszInput);
|
|
|
|
for(int i=0; i<iSize; ++i)
|
|
{
|
|
if(pwszInput[i] == '♧')
|
|
pwszInput[i] = L'\n';
|
|
}
|
|
|
|
WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, pwszInput, -1, pszOutput, INTERFACE_STRING_LENGTH, NULL, NULL );
|
|
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void
|
|
GlobalFunc::ChangeMultiEditOutput(TCHAR *pszInput, WCHAR *pszwOutput)
|
|
{
|
|
int iSize = strlen(pszInput);
|
|
int focus = 0;
|
|
|
|
int i = 0;
|
|
|
|
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszInput, -1, pszwOutput, INTERFACE_STRING_LENGTH);
|
|
//strcpy(pszOutput, pszInput);
|
|
for(int i=0; i<iSize; ++i)
|
|
{
|
|
if(pszwOutput[i] == L'\n')
|
|
{
|
|
pszwOutput[i] = '♧';
|
|
}
|
|
}
|
|
//WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, pwszInput, -1, pszOutput, INTERFACE_STRING_LENGTH, NULL, NULL );
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
typedef struct MONEY_COLOR_TABLE
|
|
{
|
|
DWORD money_color;
|
|
MONEY money_unit;
|
|
}MONEY_COLOR;
|
|
|
|
DWORD GlobalFunc::GetMoneyColor(MONEY money)
|
|
{
|
|
DWORD money_color = RGBA(255,255,255,255);
|
|
MONEY_COLOR money_colors[] = {
|
|
#ifdef _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION
|
|
{ RGBA(153,102,255,255), 100000000000 }, // 1000억 0xff9966ff
|
|
#endif // _NA_008678_20160203_ADD_HEIM_NOTIFICATION_OPTION
|
|
{ RGBA(255,0,0,255), 10000000000 }, // 100억 붉은색
|
|
{ RGBA(227,108,10,255), 1000000000 }, // 10억 주황색
|
|
{ RGBA(255,255,0,255), 100000000 }, // 1억 노랑색
|
|
{ RGBA(255,0,255,255), 10000000 }, // 1000만 핑크색
|
|
{ RGBA(0,176,80,255), 1000000 }, // 100만 녹색
|
|
{ RGBA(0,176,240,255), 100000 }, // 10만 하늘색
|
|
{ RGBA(255,255,255,255), 0 }, //흰색 0
|
|
};
|
|
|
|
unsigned char unit = 0;
|
|
while (money_colors[unit].money_unit != 0)
|
|
{
|
|
if (money >= money_colors[unit].money_unit)
|
|
{
|
|
money_color = money_colors[unit].money_color;
|
|
break;
|
|
}
|
|
++unit;
|
|
}
|
|
|
|
/*DWORD money_color = RGBA(255,255,255,255);
|
|
if( money >= 1000000000)
|
|
{
|
|
money_color = RGBA(123,76,166,255);
|
|
}
|
|
else if( money >= 100000000)
|
|
{
|
|
money_color = RGBA(189,156,89,255);
|
|
}
|
|
else if( money >= 10000000)
|
|
{
|
|
money_color = RGBA(255,32,32,255);
|
|
}
|
|
else if ( money >= 1000000)
|
|
{
|
|
money_color = RGBA(71,255,1,255);
|
|
}
|
|
else if ( money >= 100000 )
|
|
{
|
|
money_color = RGBA(86,185,226,255);
|
|
}
|
|
else if (money >= 10000)
|
|
{
|
|
money_color = RGBA(255,184,226,255);
|
|
}*/
|
|
|
|
return money_color;
|
|
}
|
|
|
|
#ifdef _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION
|
|
DWORD GlobalFunc::GetMoneyWzColor( MONEY money )
|
|
{
|
|
DWORD money_color = WzColor_RGBA(255,255,255,255);
|
|
MONEY_COLOR money_colors[] = {
|
|
{ WzColor_RGBA(153,102,255,255), 100000000000 }, // 1000억 보라색
|
|
{ WzColor_RGBA(255,0,0,255), 10000000000 }, // 100억 붉은색
|
|
{ WzColor_RGBA(227,108,10,255), 1000000000 }, // 10억 주황색
|
|
{ WzColor_RGBA(255,255,0,255), 100000000 }, // 1억 노랑색
|
|
{ WzColor_RGBA(255,0,255,255), 10000000 }, // 1000만 핑크색
|
|
{ WzColor_RGBA(0,176,80,255), 1000000 }, // 100만 녹색
|
|
{ WzColor_RGBA(0,176,240,255), 100000 }, // 10만 하늘색
|
|
{ WzColor_RGBA(255,255,255,255), 0 }, //흰색 0
|
|
};
|
|
|
|
unsigned char unit = 0;
|
|
while (money_colors[unit].money_unit != 0)
|
|
{
|
|
if (money >= money_colors[unit].money_unit)
|
|
{
|
|
money_color = money_colors[unit].money_color;
|
|
break;
|
|
}
|
|
++unit;
|
|
}
|
|
|
|
return money_color;
|
|
}
|
|
|
|
std::string GlobalFunc::GetMoneyColorHexForString( MONEY money )
|
|
{
|
|
std::string color_string;
|
|
|
|
struct MoneyColorForString
|
|
{
|
|
std::string money_color_string;
|
|
MONEY money_unit;
|
|
};
|
|
|
|
MoneyColorForString money_colors[] = {
|
|
{ "ff9966ff", 100000000000 }, // 1000억 0xff9966ff
|
|
{ "ffff0000", 10000000000 }, // 100억 붉은색
|
|
{ "ffe36c0a", 1000000000 }, // 10억 주황색
|
|
{ "ffffff00", 100000000 }, // 1억 노랑색
|
|
{ "ffff00ff", 10000000 }, // 1000만 핑크색
|
|
{ "ff00b050", 1000000 }, // 100만 녹색
|
|
{ "ff00b0f0", 100000 }, // 10만 하늘색
|
|
{ "ffffffff", 0 }, //흰색 0
|
|
};
|
|
|
|
unsigned char unit = 0;
|
|
while (money_colors[unit].money_unit != 0)
|
|
{
|
|
if (money >= money_colors[unit].money_unit)
|
|
{
|
|
color_string = money_colors[unit].money_color_string;
|
|
break;
|
|
}
|
|
++unit;
|
|
}
|
|
|
|
if (color_string == "")
|
|
{
|
|
color_string = "ffffffff";
|
|
}
|
|
|
|
return color_string;
|
|
}
|
|
#endif // _NA_008678_20160203_ADD_HEIM_NOTIFICATION_OPTION
|
|
|
|
#ifdef _JBH_MOD_MONEY_OUTPUT
|
|
// 돈을 한글로 읽어주는 함수.
|
|
VOID GlobalFunc::ChangeMoneyToStringMoney ( MONEY money , TCHAR * pszResult)
|
|
{
|
|
// 국내 버전에서만 적용한다. 스트링 테이블 필요 X
|
|
// Generalparam 참조하여 KOREA가 아니면 툴팁을 등록 시키지 않도록 처리.
|
|
TCHAR szNumber[9][3] =
|
|
{
|
|
{"일"},
|
|
{"이"},
|
|
{"삼"},
|
|
{"사"},
|
|
{"오"},
|
|
{"육"},
|
|
{"칠"},
|
|
{"팔"},
|
|
{"구"},
|
|
};
|
|
|
|
if( money > 0 )
|
|
{
|
|
int count = 0;
|
|
int value = 0;
|
|
TCHAR StringMoney[20];
|
|
TCHAR OneChar;
|
|
_itot(money , StringMoney , 10);
|
|
int Stringlength = _tcslen(StringMoney);
|
|
|
|
pszResult[0] = '\0';
|
|
|
|
for( int i = 0 ; i < Stringlength ; i++ )
|
|
{
|
|
int length = _tcslen(pszResult);
|
|
OneChar = StringMoney[i];
|
|
value = atoi(&OneChar) ;
|
|
int index = Stringlength - i;
|
|
if( value == 1 )
|
|
{
|
|
// ' 일' 자는 억단위 이상에만 붙인다.
|
|
if( index > 8 || index == 1 )
|
|
StrnCopy(&pszResult[length] , szNumber[value -1] , 3 );
|
|
}
|
|
else if ( value > 1 )
|
|
{
|
|
// 이 , 삼 , 사 , 오 ~~ 는 모든 수에 붙인다.
|
|
StrnCopy(&pszResult[length] , szNumber[value -1] , 3 );
|
|
}
|
|
// 단위 입력
|
|
|
|
switch ( index )
|
|
{
|
|
case 9:
|
|
{
|
|
_tcscat(pszResult , _T("억") );
|
|
}
|
|
break;
|
|
case 5:
|
|
{
|
|
if( money - 100000000 >= 10000)
|
|
_tcscat(pszResult , _T("만") );
|
|
}
|
|
break;
|
|
case 2:
|
|
case 6:
|
|
case 10:
|
|
{
|
|
if( value > 0 )
|
|
_tcscat(pszResult , _T("십") );
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
case 7:
|
|
case 11:
|
|
{
|
|
if( value > 0)
|
|
_tcscat(pszResult , _T("백") );
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
case 8:
|
|
case 12:
|
|
{
|
|
if( value > 0)
|
|
_tcscat(pszResult , _T("천") );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
_tcscat(pszResult, _T(" 하임") );
|
|
|
|
int length = _tcslen(pszResult);
|
|
pszResult[length] = '\0';
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
HANDLE GlobalFunc::CreateEffectBeUpToOption(WzID wzEffID, WzVector wvPos,DWORD dwId,DWORD dwId2)
|
|
{
|
|
HANDLE hHandle=INVALID_HANDLE_VALUE;
|
|
|
|
WzVector wvScale = {1.f, 1.f, 1.f};
|
|
WzVector wvRot = {0.f, 0.f, 0.f};
|
|
|
|
#ifdef _DEBUG
|
|
//! 디버깅용
|
|
char str[256] = {NULL, };
|
|
WzIDToString( str, wzEffID );
|
|
#endif
|
|
|
|
hHandle = CreateEffectBeUpToOption(wzEffID, wvPos, wvScale, wvRot, dwId, dwId2);
|
|
|
|
return hHandle;
|
|
}
|
|
|
|
HANDLE GlobalFunc::CreateEffectBeUpToOption(WzID wzEffID, WzVector wvPos, WzVector wvScale,DWORD dwId,DWORD dwId2)
|
|
{
|
|
HANDLE hHandle=INVALID_HANDLE_VALUE;
|
|
|
|
//WzVector wvRot = {1.f, 1.f, 1.f};
|
|
WzVector wvRot = {0.0f, 0.0f, 0.0f};
|
|
hHandle = CreateEffectBeUpToOption(wzEffID, wvPos, wvScale, wvRot, dwId, dwId2);
|
|
|
|
return hHandle;
|
|
}
|
|
|
|
HANDLE GlobalFunc::CreateEffectBeUpToOption(WzID wzEffID, WzVector wvPos, WzVector wvScale, WzVector wvRot,DWORD dwId,DWORD dwId2)
|
|
{
|
|
#ifdef _DEBUG
|
|
//! 디버깅용
|
|
char str[256] = {NULL, };
|
|
WzIDToString( str, wzEffID );
|
|
if (Stricmp(str, "B006") == 0)
|
|
{
|
|
int a = 0;
|
|
}
|
|
|
|
#endif
|
|
HANDLE hHandle = INVALID_HANDLE_VALUE;
|
|
|
|
if ((g_pHero == NULL) &&
|
|
(GameFramework::GetCurScene() != SCENE_TYPE_CHARSELECT) &&
|
|
(GameFramework::GetCurScene() != SCENE_TYPE_LOAD) &&
|
|
(GameFramework::GetCurScene() != SCENE_TYPE_NONE))
|
|
{
|
|
return hHandle;
|
|
}
|
|
|
|
if ((GameFramework::GetCurScene() == SCENE_TYPE_CHARSELECT) ||
|
|
(GameFramework::GetCurScene() == SCENE_TYPE_LOAD) ||
|
|
(GameFramework::GetCurScene() == SCENE_TYPE_NONE))
|
|
{
|
|
hHandle = g_pEffectManager->CreateEffect( wzEffID, wvPos, wvScale, wvRot );
|
|
}
|
|
else
|
|
{
|
|
St_BodyCreate* pBC = g_pEffectManager->GetEffectInfo(wzEffID);
|
|
if (pBC)
|
|
{
|
|
St_Create_Info* pCI = (St_Create_Info*)(*pBC->m_stdList_Create.begin());//바디
|
|
if (NULL == pCI)
|
|
{
|
|
return hHandle;
|
|
}
|
|
|
|
if (0 == pCI->m_byLoopType) //루프아님
|
|
{
|
|
WzVector wvLen = g_pHero->GetVisiblePos() - wvPos;
|
|
float fLen2 = VectorLength2(&wvLen);
|
|
|
|
if (g_pHero->GetObjectKey() == dwId || g_pHero->GetObjectKey() == dwId2 || (0 == dwId && 0 == dwId2))
|
|
{
|
|
hHandle = g_pEffectManager->CreateEffect( wzEffID, wvPos, wvScale, wvRot, 100);
|
|
}
|
|
else
|
|
{
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//거리값의 제곱(fLen2)에 가중치(cEFFECT_DIST_WEIGHT)를 곱하기 때문에
|
|
//거리가 멀어질수록 Rate는 제곱으로 떨어진다.
|
|
int lod_grade = GAMEOPTION->GetLOD();
|
|
if (lod_grade == eOPTION_LEVEL_HIGH)
|
|
{
|
|
fLen2 *= cEFFECT_DIST_WEIGHT_HIGH;
|
|
}
|
|
else if (lod_grade == eOPTION_LEVEL_MIDDLE)
|
|
{
|
|
fLen2 *= cEFFECT_DIST_WEIGHT_MIDDLE;
|
|
}
|
|
else if (lod_grade == eOPTION_LEVEL_LOW)
|
|
{
|
|
fLen2 *= cEFFECT_DIST_WEIGHT_LOW;
|
|
}
|
|
|
|
const float dist2 = DIST_FROM_NEAR * DIST_FROM_NEAR;
|
|
if (fLen2 > dist2){fLen2 = dist2;}
|
|
if (fLen2 < 0.f){fLen2 = 0.f;}
|
|
float temp_rate = 1.0f - fLen2/dist2;
|
|
int rate = static_cast<int>(100.f * temp_rate);
|
|
|
|
hHandle = g_pEffectManager->CreateEffect( wzEffID, wvPos, wvScale, wvRot, rate);
|
|
//////////////////////////////////////////////////////////////////////////
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hHandle = g_pEffectManager->CreateEffect( wzEffID, wvPos, wvScale, wvRot );
|
|
}
|
|
}
|
|
}
|
|
|
|
return hHandle;
|
|
}
|
|
|
|
|
|
void GlobalFunc::ErrorCode_Player_State(ePLAYER_BEHAVE_STATE eState)
|
|
{
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH];
|
|
BOOL m_bPrint = TRUE;
|
|
switch ( eState )
|
|
{
|
|
case PLAYER_BEHAVE_TRADE_STATE:
|
|
{
|
|
//5814 상대방이 거래중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5814, szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_VENDOR_ESTABLISHER_STATE:
|
|
{
|
|
// 5815 상대방이 개인상점을 개설 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5815 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_VENDOR_OBSERVER_STATE:
|
|
{
|
|
// 5816 상대방이 개인상점을 관람 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5816 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_NPCSHOP_STATE:
|
|
{
|
|
// 5817 상대방이 상점을 이용 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5817 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_PARTY_THINKING_LEAVE:
|
|
case PLAYER_BEHAVE_PARTY_THINKING_JOIN:
|
|
{
|
|
// 5818 상대방의 파티초대 수락여부를 기다리고 있는 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5818 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
case PLAYER_BEHAVE_GROUP_THINKING_LEAVE:
|
|
case PLAYER_BEHAVE_GROUP_THINKING_JOIN:
|
|
{
|
|
// 7055 상대방의 그룹초대 수락여부를 기다리고 있는 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(7055 , szMessage ,INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_SYSTEM_LOCK:
|
|
{
|
|
// 5819 상대방이 응답할 수 없는 상태입니다.
|
|
g_InterfaceManager.GetInterfaceString(5819 , szMessage , INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
case PLAYER_BEHAVE_BANK_STATE:
|
|
{
|
|
// 5820 상대방이 창고를 이용 중입니다.
|
|
g_InterfaceManager.GetInterfaceString(5820 , szMessage , INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
// 표시하지 않는다.
|
|
m_bPrint = FALSE;
|
|
}
|
|
}
|
|
if( m_bPrint)
|
|
{
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT , szMessage );
|
|
}
|
|
}
|
|
|
|
#ifdef __CN_269_MATRIX_CARD_AUTH
|
|
void GlobalFunc::MatrixCodeSubmit( bool bYes)
|
|
{
|
|
MatrixCardAuth * pMatrixCardAuth = ( MatrixCardAuth *) g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_MATRIX_CARD_AUTH);
|
|
|
|
if( !pMatrixCardAuth)
|
|
return;
|
|
|
|
if( bYes )
|
|
{
|
|
uiPasswordMan * pPasswordMan = (uiPasswordMan *) g_InterfaceManager.GetUserInterfaceManager(UIMAN_PASSWORD);
|
|
if( !pPasswordMan )
|
|
return;
|
|
|
|
int iMatrixCode = _ttoi(pPasswordMan->m_pUIPasswordDlg->GetStrPassword());
|
|
#ifdef __CHINA_MATRIXCARD_CODE_ONE_SHOT_SUBMIT
|
|
pMatrixCardAuth->SEND_AUTH_MATRIX_CARD_ACK(iMatrixCode);
|
|
#else// __CHINA_MATRIXCARD_CODE_ONE_SHOT_SUBMIT
|
|
pMatrixCardAuth->SetMatrixCardCode(iMatrixCode);
|
|
if( pMatrixCardAuth->IsFinishInput() == FALSE)
|
|
{
|
|
|
|
pPasswordMan->m_pUIPasswordDlg->ShowInterface(TRUE);
|
|
pPasswordMan->m_pUIPasswordDlg->_SetPsaawordMinMaxCount( 1, 3);
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
// 1231 보안 카드 인증
|
|
g_InterfaceManager.GetInterfaceString(1231 , szMessage , INTERFACE_STRING_LENGTH);
|
|
pPasswordMan->m_pUIPasswordDlg->_SetPasswordMessage(szMessage);
|
|
|
|
RECT rt;
|
|
pMatrixCardAuth->GetDialogWZ()->GetClientRect(&rt);
|
|
pPasswordMan->m_pUIPasswordDlg->MoveWindowWZ( rt.right , rt.top );
|
|
}
|
|
#endif //__CHINA_MATRIXCARD_CODE_ONE_SHOT_SUBMIT
|
|
}
|
|
else
|
|
{
|
|
pMatrixCardAuth->ShowInterface(FALSE);
|
|
g_LoginScene.Disconnect();
|
|
g_LoginScene.Connect();
|
|
|
|
uiLoginMan * pLoginMan = ( uiLoginMan *) g_InterfaceManager.GetUserInterfaceManager(UIMAN_LOGIN);
|
|
if( pLoginMan )
|
|
{
|
|
pLoginMan->resetTryReconnect();
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
char * GlobalFunc::AddNationName(char * szString)
|
|
{
|
|
|
|
|
|
static util::_tstring file_name;
|
|
|
|
file_name.clear();
|
|
|
|
return GlobalFunc::AddNationName((LanguageType)CGameOption::Instance()->GetLanguageType(), szString, file_name);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
char* GlobalFunc::AddNationName(IN LanguageType language_type, IN const char* file_name, OUT util::_tstring& new_file_name)
|
|
{
|
|
if (NULL == file_name)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static char szFileName[512] = {0,};
|
|
|
|
ZeroMemory(szFileName , 512);
|
|
|
|
StrnCopy(szFileName, file_name, strlen(file_name) - 4);
|
|
|
|
switch (language_type)
|
|
{
|
|
case kLanguageGlobal: strcat( szFileName, "_en.txt"); break;
|
|
case kLanguageKorea: strcat( szFileName, ".txt"); break;
|
|
case kLanguageChina: strcat( szFileName, "_cn.txt"); break;
|
|
case kLanguageTaiwan: strcat( szFileName, "_tw.txt"); break;
|
|
case kLanguageJapan: strcat( szFileName, "_jp.txt"); break;
|
|
case kLanguageGermany: strcat( szFileName, "_ger.txt"); break;
|
|
case kLanguageRussia: strcat( szFileName, "_ru.txt"); break;
|
|
default: strcat( szFileName, ".txt"); break;
|
|
}
|
|
|
|
new_file_name = szFileName;
|
|
|
|
return szFileName;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool GlobalFunc::HasFile(const char* file_name)
|
|
{
|
|
ePACK_FILE_NAME disk_type = ePFN_NONE;
|
|
|
|
if (CGeneralGameParam::Instance()->IsUsePackFile() == TRUE)
|
|
{
|
|
disk_type = ePFN_RESOURCE;
|
|
}
|
|
else
|
|
{
|
|
disk_type = ePFN_NOT_USE_PACKFILE;
|
|
}
|
|
|
|
DA_FILE hf = g_pApplication->GetDiscAccess()->OpenFile(disk_type,
|
|
file_name,
|
|
DA_READ,
|
|
SM_READ,
|
|
OD_OPEN_EXISTING);
|
|
|
|
if (hf == INVALID_DA_FILE)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
g_pApplication->GetDiscAccess()->CloseFile(hf);
|
|
|
|
return true;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool GlobalFunc::HasFile_Nation(const char* file_name, LanguageType language_type)
|
|
{
|
|
util::_tstring nation_file_name;
|
|
|
|
if (AddNationName(language_type, file_name, OUT nation_file_name) == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return HasFile(nation_file_name.c_str());
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
void GlobalFunc::GetCrashReportFileName(TCHAR* pszFileName)
|
|
{
|
|
TCHAR szFileName[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szLogPath[MAX_PATH] = {0,};
|
|
GetLogPath(szLogPath);
|
|
Snprintf(szFileName, INTERFACE_STRING_LENGTH-1, _T("%s\\%s"), szLogPath, _T("CrashReport.log"));
|
|
|
|
StrnCopy(pszFileName, szFileName, _tcslen(szFileName));
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetLogPath()
|
|
{
|
|
TCHAR szLogPath[MAX_PATH] = {0,};
|
|
TCHAR szCurDirectory[MAX_PATH] = {0,};
|
|
TCHAR szLogDirectory[MAX_PATH] = {0,};
|
|
|
|
GetCurrentDirectory(MAX_PATH, szCurDirectory);
|
|
Snprintf(szLogDirectory, MAX_PATH-1, _T("%s\\log"), szCurDirectory);
|
|
_tmkdir(szLogDirectory);
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::GetLogPath(TCHAR* pszLogPath)
|
|
{
|
|
TCHAR szLogPath[MAX_PATH] = {0,};
|
|
|
|
TCHAR szCurDirectory[MAX_PATH] = {0,};
|
|
TCHAR szLogDirectory[MAX_PATH] = {0,};
|
|
|
|
GetCurrentDirectory(MAX_PATH, szCurDirectory);
|
|
Snprintf(szLogDirectory, MAX_PATH-1, _T("%s\\log"), szCurDirectory);
|
|
|
|
StrnCopy(pszLogPath, szLogDirectory, _tcslen(szLogDirectory));
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
#ifdef _DEV_VER
|
|
void GlobalFunc::WriteErrLog(eLOG_LEVEL eLevel, WORD wOutputStyle, TCHAR * pszMessage, ...)
|
|
{
|
|
if((eLevel <= eLOG_LEVEL_NONE) || (eLevel > eLOG_LEVEL_TRA))
|
|
return;
|
|
|
|
if(GetLogLevel() >= eLevel)
|
|
{
|
|
TCHAR szOutputMsg[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szErrLog[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szTempErrMsg[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szErrLog, INTERFACE_STRING_LENGTH-1, pszMessage, args );
|
|
va_end(args);
|
|
|
|
|
|
#if (WZENGINEVER >= 480)
|
|
// 로그에 적용
|
|
WZLOG( (WZLOG_TYPE)eLevel, szErrLog );
|
|
#endif
|
|
|
|
static const char cloglevel[6] = {'N','E','W','I','D','T'};
|
|
Snprintf(szTempErrMsg, INTERFACE_STRING_LENGTH-1, _T("[%c] %s"), cloglevel[eLevel], szErrLog);
|
|
|
|
if(BIT_CHECK(wOutputStyle, c_wOUTPUT_LOG_SCREEN))
|
|
{
|
|
char sz[4] = {0,};
|
|
Snprintf(sz, INTERFACE_STRING_LENGTH-1, _T("%c"), cloglevel[eLevel]);
|
|
CustomAssertion::Instance()->PushMsg(sz,szErrLog);
|
|
|
|
}
|
|
|
|
if(BIT_CHECK(wOutputStyle, c_wOUTPUT_LOG_SYSCHAT))
|
|
{
|
|
OutputMsg_Error(eOUTPUT_MSG_CHAT, szTempErrMsg);
|
|
}
|
|
|
|
if(BIT_CHECK(wOutputStyle, c_wOUTPUT_LOG_CENTER))
|
|
{
|
|
OutputMsg_Error(eOUTPUT_MSG_CENTER_SHOW, szTempErrMsg);
|
|
}
|
|
|
|
if(BIT_CHECK(wOutputStyle, c_wOUTPUT_LOG_CONSOLE))
|
|
{
|
|
OutputDebugString(szTempErrMsg);
|
|
OutputDebugString("\n");
|
|
}
|
|
|
|
if(BIT_CHECK(wOutputStyle, c_wOUTPUT_LOG_FILE))
|
|
{
|
|
struct tm * today;
|
|
time_t ltime;
|
|
time( <ime );
|
|
today = localtime( <ime );
|
|
|
|
Snprintf(szOutputMsg, INTERFACE_STRING_LENGTH-1, _T("[%02d:%02d:%02d] %s\n"), today->tm_hour, today->tm_min, today->tm_sec, szTempErrMsg);
|
|
|
|
TCHAR szFileName[MAX_PATH] = {0,};
|
|
Snprintf(szFileName, MAX_PATH-1,
|
|
_T("log\\ClientErrMsg_%02d%02d%02d_%s.log"),
|
|
today->tm_year+1900,
|
|
today->tm_mon+1,
|
|
today->tm_mday,
|
|
c_tcBUILD_VERSION);
|
|
|
|
FILE * fp = _tfopen(szFileName, _T("a+t"));
|
|
fwrite( szOutputMsg, _tcslen(szOutputMsg), 1, fp );
|
|
fclose( fp );
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
#endif
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
DWORD GlobalFunc::StartTimeCheck()
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
return clock_function::GetTickCount();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::EndTimeCheck(DWORD dwStartTime, bool bSave, TCHAR * pszMessage)
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
{
|
|
DWORD dwEndTime=clock_function::GetTickCount();
|
|
TCHAR szText[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
DWORD msec = dwEndTime-dwStartTime;
|
|
DWORD tempTime= msec / 1000;
|
|
|
|
Snprintf(szText, INTERFACE_STRING_LENGTH-1, _T("%s [%d Second] (%d msec)"), pszMessage, tempTime, msec);
|
|
WriteLoadingTimeLog(szText);
|
|
|
|
if(bSave)
|
|
g_dwTotalLoadingTime += msec;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
DWORD GlobalFunc::StartScriptLoading(TCHAR* pszMessage)
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
{
|
|
TCHAR szText[INTERFACE_STRING_LENGTH] = {0,};
|
|
Snprintf(szText, INTERFACE_STRING_LENGTH-1, _T(" %s Load Start"), pszMessage);
|
|
WriteLoadingTimeLog(szText);
|
|
|
|
return clock_function::GetTickCount();
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::EndScriptFileLoading(DWORD dwStartTime, TCHAR* pszMessage)
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
{
|
|
DWORD dwEndTime = clock_function::GetTickCount();
|
|
TCHAR szText[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
DWORD msec = dwEndTime-dwStartTime;
|
|
DWORD tempTime = msec / 1000;
|
|
|
|
Snprintf(szText, INTERFACE_STRING_LENGTH-1, _T(" %s End [%d Second] (%d msec)"), pszMessage, tempTime, msec);
|
|
WriteLoadingTimeLog(szText);
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::ClearTotalLoadingTime()
|
|
{
|
|
g_dwTotalLoadingTime = 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::PrintTotalLoadingTime()
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
{
|
|
WriteLoadingTimeLog(_T("Total: %d sec (%d msec)"), g_dwTotalLoadingTime/1000, g_dwTotalLoadingTime);
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::WriteLoadingTimeLog(TCHAR * pszMessage, ...)
|
|
{
|
|
if(g_bLoadingTimeSave)
|
|
{
|
|
TCHAR szOutputMsg[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szErrLog[INTERFACE_STRING_LENGTH] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szErrLog, INTERFACE_STRING_LENGTH-1, pszMessage, args );
|
|
va_end(args);
|
|
|
|
|
|
struct tm * today;
|
|
time_t ltime;
|
|
time( <ime );
|
|
today = localtime( <ime );
|
|
|
|
Snprintf(szOutputMsg, INTERFACE_STRING_LENGTH-1, _T("[%02d:%02d:%02d] %s\n"), today->tm_hour, today->tm_min, today->tm_sec, szErrLog);
|
|
|
|
TCHAR szFileName[MAX_PATH] = {0,};
|
|
Snprintf(szFileName, MAX_PATH-1, _T("log\\LoadingTime.log"));
|
|
|
|
FILE * fp = _tfopen(szFileName, _T("a+t"));
|
|
fwrite( szOutputMsg, _tcslen(szOutputMsg), 1, fp );
|
|
fclose( fp );
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetLoadingTimeSaveMode(bool bSave)
|
|
{
|
|
g_bLoadingTimeSave = bSave;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SetLogLevel(eLOG_LEVEL eLogLevel)
|
|
{
|
|
g_eLogLevel = eLogLevel;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
eLOG_LEVEL GlobalFunc::GetLogLevel()
|
|
{
|
|
return g_eLogLevel;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::ShowNetRecvLog(bool bShow)
|
|
{
|
|
g_bNetRecvLog = bShow;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::IsShowNetRecvLog()
|
|
{
|
|
return g_bNetRecvLog;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::ShowPacketLog(bool bShow)
|
|
{
|
|
g_bShowPacket = bShow;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::TogglePacketLog()
|
|
{
|
|
g_bShowPacket = !g_bShowPacket;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::IsShowPacketLog()
|
|
{
|
|
return g_bShowPacket;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::ShowNetSendLog(bool bShow)
|
|
{
|
|
g_bNetSendLog = bShow;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::IsShowNetSendLog()
|
|
{
|
|
return g_bNetSendLog;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
bool GlobalFunc::CheckIncludeStringOnAbroad(const char * pszMessage)
|
|
{
|
|
#if defined(_CHINA)
|
|
if (PROGRAMPARAM->nation_type() == kLanguageTaiwan) //!< 2:중국, 3:대만
|
|
{
|
|
return (g_slangNameFilter.CheckIncludeStringTaiwan(pszMessage));
|
|
}
|
|
else
|
|
{
|
|
return ( g_slangNameFilter.CheckIncludeStringChina(pszMessage) );
|
|
}
|
|
#elif defined(_JAPAN)
|
|
return (g_slangNameFilter.CheckIncludeStringJapan(pszMessage));
|
|
#elif defined(_RUSSIA)
|
|
return (g_slangNameFilter.CheckIncludeStringRussia(pszMessage));
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
BOOL GlobalFunc::IsDigit(TCHAR * pszMessage)
|
|
{
|
|
int len = lstrlen(pszMessage);
|
|
|
|
for (int i=0; i<len; ++i)
|
|
{
|
|
if (pszMessage[i]<_T('0') || pszMessage[i]>_T('9'))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/** 리스트에 문자열을 사이즈에 맞춰계산 삽입
|
|
리턴값0 실패 0보다크면 리스트열수리턴
|
|
*/
|
|
|
|
BYTE GlobalFunc::AddDescribeString( CCtrlListWZ * pControl, TCHAR * pszText, DWORD dwFontID,
|
|
DWORD dwTextStyle, COLORREF BKColor, COLORREF TextColor, COLORREF SelTextColor )
|
|
{
|
|
pControl->SetUnuseSelBar( FALSE );
|
|
pControl->SetUseReport(FALSE);
|
|
|
|
std::vector<util::_tstring> vstrMsg;
|
|
vstrMsg.clear();
|
|
|
|
if(!_tcslen(pszText))
|
|
return 0;
|
|
|
|
RECT rc = pControl->GetSizeRect();
|
|
int ListWidth = rc.right - rc.left + 2;
|
|
ProcessWordWrapByFontSize( &vstrMsg, pszText, dwFontID, _tcslen(pszText), ListWidth );
|
|
|
|
pControl->DeleteItemAll();
|
|
pControl->SetColorSelBar( WzColorToRGBA( WzColor_RGBA(255,255,255,0) ) );
|
|
int iListIndex = -1;
|
|
|
|
for( size_t i = 0; i<vstrMsg.size(); ++i )
|
|
{
|
|
iListIndex = pControl->InsertItemBack();
|
|
|
|
TCHAR *pStr = const_cast<TCHAR *>( vstrMsg[i].c_str() );
|
|
SetItem( pControl, iListIndex, 0, pStr, dwFontID, dwTextStyle, BKColor, TextColor, SelTextColor );
|
|
}
|
|
|
|
return vstrMsg.size();
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
BOOL GlobalFunc::SysMessageBox( LPCTSTR szMessage, BOOL shutdown )
|
|
{
|
|
uiSystemMan * pSystemMan = GET_DIALOG_MANAGER( uiSystemMan, UIMAN_SYSTEM );
|
|
|
|
if(pSystemMan)
|
|
{
|
|
pSystemMan->Sys_VerifyLock( szMessage, shutdown );
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
void GlobalFunc::SysConfirmBox( LPCTSTR szMessage, void (*_fn_sysconfirm)(bool),
|
|
LPCTSTR pszTitle, LPCTSTR pszSubject, DWORD dwStrOKID, DWORD dwStrCancleID, bool bLock )
|
|
{
|
|
|
|
uiSystemMan * pSystemMan = GET_DIALOG_MANAGER( uiSystemMan, UIMAN_SYSTEM );
|
|
|
|
if( pSystemMan )
|
|
pSystemMan->Sys_Confirm( szMessage, _fn_sysconfirm, pszTitle, pszSubject, dwStrOKID, dwStrCancleID, bLock );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::SysConfirmExtendBox( LPCTSTR szMessage, void (*_fn_sysconfirm)(bool),
|
|
LPCTSTR pszTitle, LPCTSTR pszSubject, DWORD dwStrOKID, DWORD dwStrCancleID, bool bLock )
|
|
{
|
|
uiSystemMan * pSystemMan = GET_DIALOG_MANAGER( uiSystemMan, UIMAN_SYSTEM );
|
|
|
|
if( pSystemMan )
|
|
pSystemMan->Sys_ConfirmExtend( szMessage, _fn_sysconfirm, pszTitle, pszSubject, dwStrOKID, dwStrCancleID, bLock );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
BOOL GlobalFunc::IsParty( DWORD dwKey )
|
|
{
|
|
uiPartyMan * pPartyManager = GET_DIALOG_MANAGER( uiPartyMan, UIMAN_PARTY );
|
|
|
|
if( pPartyManager )
|
|
{
|
|
if( pPartyManager->IsPartyMember( dwKey ) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
|
|
|
|
BOOL GlobalFunc::GetModuleFileNameDirectory( LPTSTR lpBuffer, DWORD nBufferLength )
|
|
{
|
|
if( GetModuleFileName( NULL, lpBuffer, nBufferLength ) == 0 )
|
|
return FALSE;
|
|
|
|
size_t len = _tcslen( lpBuffer );
|
|
|
|
for( size_t i = len; i > 0; i-- )
|
|
{
|
|
if( lpBuffer[i] == '\\' )
|
|
break;
|
|
|
|
lpBuffer[i] = '\0';
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
OSTYPE GlobalFunc::GetOsVersion()
|
|
{
|
|
OSVERSIONINFO OsInfo;
|
|
OsInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
GetVersionEx( &OsInfo );
|
|
|
|
switch( OsInfo.dwMajorVersion )
|
|
{
|
|
case 5:
|
|
{
|
|
switch( OsInfo.dwMinorVersion )
|
|
{
|
|
case 0:
|
|
return WINDOWS_2000;
|
|
case 1:
|
|
return WINDOWS_XP;
|
|
case 2:
|
|
return WINDOWS_SERVER_2003;
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
return WINDOWS_VISTA;
|
|
}
|
|
|
|
return NO_INDENFIED_VERSION;
|
|
}
|
|
|
|
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
|
|
void GlobalFunc::SendServerSelectRequestPacket( MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_SYN::eQuery eQueryTransaction )
|
|
{
|
|
// 새로운 플로우대로 패킷 전송
|
|
// 이후 응답을 받고 처리
|
|
MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_SYN sync;
|
|
sync.m_bQueryType = eQueryTransaction;
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &sync, sizeof(sync));
|
|
|
|
}
|
|
#endif //__NA001334_090420_SERVER_SELECT_FACILITY__
|
|
|
|
void GlobalFunc::GoToServerList()
|
|
{
|
|
#ifdef _COMMON_CHANNELING_LOGIC_DEFINE
|
|
assert(!"채널링 이후 GlobalFunc::GoToServerList() 는 호출되면 안됨 - 종료시킴");
|
|
GlobalFunc::LogOutGame();
|
|
return;
|
|
|
|
#else //_COMMON_CHANNELING_LOGIC_DEFINE
|
|
#ifdef _JAPAN_GAMECHU_SUPPORT_DOUBLE_AUTH_FLOW_
|
|
if (uiLoginMan::IsUseParameterAuthInfo() == true)
|
|
{
|
|
GlobalFunc::LogOutGame();
|
|
return;
|
|
}
|
|
#endif //_JAPAN_GAMECHU_SUPPORT_DOUBLE_AUTH_FLOW_
|
|
g_isChangeServer = true;
|
|
g_CharSelectScene.m_bConnected = false;
|
|
|
|
if (g_pNetwork)
|
|
{
|
|
g_pNetwork->Disconnect(CI_GAMESERVERIDX);
|
|
#if !defined(_NA002676_WORLD_SERVER_RENEWAL)
|
|
g_pNetwork->Disconnect(CI_CHATSERVERIDX);
|
|
g_pNetwork->SetEnableSendChatHeartBeat(FALSE);
|
|
#endif
|
|
g_pNetwork->SetEnableSendHeartBeat(FALSE);
|
|
}
|
|
|
|
g_LoadScene.SetNextSceneAfterLoaded(SCENE_TYPE_LOGIN, 11001, 0);
|
|
GameFramework::ChangeScene( SCENE_TYPE_LOAD );
|
|
#endif //_COMMON_CHANNELING_LOGIC_DEFINE
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
SCENE_TYPE GlobalFunc::ConvertClientZoneType(const eZONETYPE eCommonZoneType, const eINSTANCE_DUNGEON_KIND eIDK /*= INDUN_KIND_MAX*/)
|
|
{
|
|
SCENE_TYPE eSceneType = SCENE_TYPE_NONE;
|
|
switch( eCommonZoneType)
|
|
{
|
|
case eZONETYPE_VILLAGE:
|
|
eSceneType = SCENE_TYPE_VILLAGE;
|
|
break;
|
|
case eZONETYPE_MISSION:
|
|
eSceneType = SCENE_TYPE_MISSION;
|
|
break;
|
|
case eZONETYPE_CHUNTING:
|
|
eSceneType = SCENE_TYPE_CHUNTING;
|
|
break;
|
|
case eZONETYPE_INSTANCE:
|
|
{
|
|
if (eIDK == INDUN_KIND_CHAOS_ZONE)
|
|
{
|
|
eSceneType;
|
|
}
|
|
else
|
|
{
|
|
eSceneType = SCENE_TYPE_INSTANCE_DUNGEON;
|
|
}
|
|
}
|
|
break;
|
|
case eZONETYPE_PVP:
|
|
eSceneType = SCENE_TYPE_PVP;
|
|
break;
|
|
case eZONETYPE_AIRSHIP_FIELD:
|
|
case eZONETYPE_FIELD:
|
|
eSceneType = SCENE_TYPE_FIELD;
|
|
break;
|
|
case eZONETYPE_DOMINATION_FIELD:
|
|
eSceneType = SCENE_TYPE_DOMINATION;
|
|
break;
|
|
}
|
|
return eSceneType;
|
|
}
|
|
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
SCENE_TYPE GlobalFunc::ConvertClientZoneType(const eZONETYPE eCommonZoneType, const eINSTANCE_DUNGEON_KIND eIDK, MAPCODE map_code)
|
|
{
|
|
if ((eCommonZoneType == eZONETYPE_INSTANCE) && (eIDK == INDUN_KIND_CHAOS_ZONE))
|
|
{
|
|
// 카오스존 일 때
|
|
ChaosZoneType chaos_zone_type = ChaosZoneInfoParser::Instance()->GetType(map_code);
|
|
if (chaos_zone_type == kBattleGround)
|
|
{
|
|
return SCENE_TYPE_BATTLEGROUND;
|
|
}
|
|
else if (chaos_zone_type == kFreePVP)
|
|
{
|
|
return SCENE_TYPE_FREEPVP;
|
|
}
|
|
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
else if (chaos_zone_type == eCHAOSZONE_TYPE_GOLDRUSH)
|
|
{
|
|
return SCENE_TYPE_GOLDRUSH;
|
|
}
|
|
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
else if (chaos_zone_type == eCHAOSZONE_TYPE_SONNENSCHEIN)
|
|
{
|
|
return SCENE_TYPE_SONNENSCHEIN;
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
|
|
else if (chaos_zone_type == eCHAOSZONE_TYPE_ONEDAYSGUILDMISSION)
|
|
{
|
|
return SCENE_TYPE_GUILDMISSION;
|
|
}
|
|
#endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION)
|
|
}
|
|
|
|
return ConvertClientZoneType(eCommonZoneType, eIDK);
|
|
}
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void GlobalFunc::InitGameInfo()
|
|
{
|
|
uiHelpMan* helpMan = static_cast<uiHelpMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP));
|
|
|
|
if (helpMan)
|
|
{
|
|
helpMan->InitHelpMenuList();
|
|
}
|
|
|
|
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
GuildSystem::GetGuildSystemData().Clear();
|
|
#else
|
|
uiGuildMan* guildMan =
|
|
static_cast<uiGuildMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUILD));
|
|
|
|
if(guildMan)
|
|
{
|
|
guildMan->Clear();
|
|
guildMan->ClearNotice();
|
|
}
|
|
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
|
|
|
|
uiWayPointMan* waypoint = GET_DIALOG_MANAGER(uiWayPointMan, UIMAN_WAYPOINT);
|
|
|
|
if(waypoint)
|
|
{
|
|
waypoint->Clear();
|
|
}
|
|
|
|
#ifdef _NA_008016_20150202_OLD_RANKING_SYSTEM
|
|
#if defined(_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM)
|
|
uiMissionRankMan2* rank_manager_ptr2 = GET_DIALOG_MANAGER( uiMissionRankMan2, UIMAN_MISSION_RANK );
|
|
|
|
if ( rank_manager_ptr2 )
|
|
{
|
|
rank_manager_ptr2->ClearRankData();
|
|
rank_manager_ptr2->InitMission();
|
|
}
|
|
#else
|
|
uiMissionRankMan* pRankMan = GET_DIALOG_MANAGER( uiMissionRankMan, UIMAN_MISSION_RANK );
|
|
|
|
if(pRankMan)
|
|
{
|
|
pRankMan->InitMissionGroup();
|
|
pRankMan->ClearRankData();
|
|
pRankMan->InitMission();
|
|
}
|
|
#endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM
|
|
#endif // _NA_008016_20150202_OLD_RANKING_SYSTEM
|
|
}
|
|
|
|
TCHAR * GlobalFunc::GetCorpsName(int iCorps)
|
|
{
|
|
static TCHAR szCorpsName[256];
|
|
ZeroMemory(szCorpsName, sizeof(szCorpsName));
|
|
if( iCorps == 0 )
|
|
{
|
|
//1268 직할
|
|
g_InterfaceManager.GetInterfaceString(1268, szCorpsName,255);
|
|
}
|
|
else
|
|
{
|
|
_itoa(iCorps, szCorpsName, 10);
|
|
}
|
|
return szCorpsName;
|
|
}
|
|
|
|
|
|
void GlobalFunc::NET_SEND_CG_ITEM_USE_SKILL_ACTION_SYN(eITEMTYPE ItemType, WzVector wvTargetPos)
|
|
{
|
|
MSG_CG_ITEM_USE_SKILL_ACTION_SYN SendMsg;
|
|
SendMsg.m_wvMainTargetPos = wvTargetPos;
|
|
SendMsg.m_atIndex = SI_INVENTORY;
|
|
SendMsg.m_atPos = MouseHandler::Instance()->GetPendingSkillItemPos();
|
|
SendMsg.byAttackPropensity = MouseHandler::Instance()->GetPendingCtrlKeyDown();
|
|
SendMsg.target_code_ = 0; // 아이템 사용 대상의 코드
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendMsg, sizeof(SendMsg));
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::NET_SEND_CG_ITEM_USE_SKILL_ACTION_SYN(eSlotContainerIndex container_index,
|
|
POSTYPE at_pos,
|
|
DWORD target_objectkey,
|
|
WzVector& target_pos)
|
|
{
|
|
|
|
MSG_CG_ITEM_USE_SKILL_ACTION_SYN msg;
|
|
msg.m_atIndex = container_index;
|
|
msg.m_atPos = at_pos;
|
|
msg.target_code_ = target_objectkey;
|
|
msg.m_wvMainTargetPos = target_pos;
|
|
|
|
msg.byAttackPropensity = false;
|
|
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg));
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/** 착용제한 수치 랩핑
|
|
*/
|
|
WORD GlobalFunc::CalcLimitStat(WORD ItemLimitStr, SCItemSlot* ItemSlot, LimitStatCompositeType limitstat_composite_type, BOOL bIgnoreLimit)
|
|
{
|
|
if (ItemSlot == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
WORD (*PCalcLimitStat)(WORD, BYTE, eRANK, LEVELTYPE, float);
|
|
|
|
//==========================================
|
|
// 무기타입적용(웨폰 or 아머)
|
|
//==========================================
|
|
if (ItemSlot->GetItemInfo()->IsWeapon())
|
|
{
|
|
PCalcLimitStat = CalcLimitStatWeapon;
|
|
}
|
|
#ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION
|
|
else if (ItemSlot->GetItemInfo()->IsArmor() || ItemSlot->IsWingItem())
|
|
#else
|
|
else if (ItemSlot->GetItemInfo()->IsArmor())
|
|
#endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION
|
|
{
|
|
PCalcLimitStat = CalcLimitStatArmor;
|
|
}
|
|
else
|
|
{
|
|
assert(!"뭥미 -_- 여긴오면안됨");
|
|
}
|
|
|
|
//==========================================
|
|
// 리미티드 계산부부분(반올림적용)
|
|
//==========================================
|
|
if (ItemSlot->IsLimited() && (bIgnoreLimit == FALSE))
|
|
{
|
|
int nRatio = ItemSlot->GetLimitValueRatio();
|
|
ItemLimitStr = (ItemLimitStr + (WORD)((float)ItemLimitStr * nRatio / 100.0f + MODFLOAT(nRatio)));
|
|
}
|
|
|
|
|
|
//==========================================
|
|
// 조합타입(0:없음 1:랭크업 2:인첸트)
|
|
// 조합창에서 다음랭크를 보기위해쓰임
|
|
//==========================================
|
|
int iRank = ItemSlot->GetRank();
|
|
BYTE byEnchant = ItemSlot->GetEnchant();
|
|
LEVELTYPE lv = ItemSlot->GetItemInfo()->m_LV;
|
|
|
|
switch (limitstat_composite_type)
|
|
{
|
|
case kLimitStatCompositeRankup:
|
|
++iRank;
|
|
break;
|
|
|
|
case kLimitStatCompositeEnchant:
|
|
++byEnchant;
|
|
break;
|
|
}
|
|
|
|
//==========================================
|
|
// 인첸트 리뉴얼적용부분
|
|
//==========================================
|
|
#ifdef __NA_001358_ENCHANT_UNIFICATION
|
|
float fLimitRatio = InstantEnchantParser::Instance()->GetLimitRatio(byEnchant);
|
|
#else
|
|
float fLimitRatio = EnchantParser::Instance()->GetLimitRatio(lv,
|
|
byEnchant,
|
|
ItemSlot->GetItemInfo()->IsWeapon(),
|
|
ItemSlot->IsLimited() );
|
|
#endif //__NA_001358_ENCHANT_UNIFICATION
|
|
|
|
return (WORD)(PCalcLimitStat(ItemLimitStr, byEnchant, (eRANK)iRank, lv, fLimitRatio));
|
|
}
|
|
|
|
void GlobalFunc::InsertItemToInvenOfHero( const ITEMSLOTEX * pSlot, int count )
|
|
{
|
|
if( g_pHero == NULL )
|
|
return;
|
|
|
|
const ITEMSLOTEX * pTempSlot = pSlot;
|
|
SCItemSlot Item;
|
|
|
|
for( int i = 0; i < count; i++ )
|
|
{
|
|
Item.Clear();
|
|
Item.Copy( pTempSlot[i].m_Stream );
|
|
|
|
g_pHero->GetSlotContainer( SI_INVENTORY )->InsertSlot( pTempSlot[i].m_Pos, Item );
|
|
}
|
|
}
|
|
|
|
const std::string GlobalFunc::CalculateThousandDigit( MONEY money )
|
|
{
|
|
TCHAR szMoney[MAX_PATH];
|
|
|
|
_i64tot( money, szMoney, 10 );
|
|
|
|
std::string strTemp( szMoney );
|
|
|
|
size_t len = strTemp.length();
|
|
|
|
if( len > 3 )
|
|
{
|
|
int count = 1;
|
|
for( int i = len - 1; i > 0; i-- )
|
|
{
|
|
if( count % 3 == 0 )
|
|
{
|
|
strTemp.insert( i, "," );
|
|
}
|
|
|
|
count++;
|
|
}
|
|
}
|
|
|
|
return strTemp;
|
|
}
|
|
|
|
BOOL GlobalFunc::IsSSQScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_SSQ ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_SSQ ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
BOOL GlobalFunc::IsBattleGroundScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_BATTLEGROUND ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_BATTLEGROUND ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
void GlobalFunc::BattleGroundBackToTheVillageConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
BattleScene::BackToTheVillageTransact();
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
void GlobalFunc::BattleGroundCharacterSelectConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
SystemDialog* system_dialog = GET_CAST_DIALOG(SystemDialog, InterfaceManager::DIALOG_SYSTEM);
|
|
if (system_dialog)
|
|
{
|
|
system_dialog->CharacterSelectStandingBy();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
void GlobalFunc::BattleGroundServerSelectConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
SystemDialog* system_dialog = GET_CAST_DIALOG(SystemDialog, InterfaceManager::DIALOG_SYSTEM);
|
|
if (system_dialog)
|
|
{
|
|
system_dialog->ServerSelectStandingBy();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
|
|
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
|
|
void GlobalFunc::BattleGroundReservationConfirm(bool confirm_value)
|
|
{
|
|
if (confirm_value)
|
|
{
|
|
// 인벤토리에 자리가 없으면 에러메세지
|
|
// 필요한 인벤 개수 비교
|
|
BYTE need_inventory_num = 0;
|
|
SCSlotContainer* equip_container = ItemManager::Instance()->GetContainer(SI_EQUIPMENT);
|
|
if (equip_container)
|
|
{
|
|
for (int i = 0; i < eEQUIPCONTAINER_CHARGE5 - eEQUIPCONTAINER_CHARGE1; ++i)
|
|
{
|
|
if (equip_container->IsEmpty(eEQUIPCONTAINER_CHARGE1 + i) == FALSE)
|
|
{
|
|
++need_inventory_num;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < eEQUIPCONTAINER_PC_ROOM3 - eEQUIPCONTAINER_PC_ROOM1; ++i)
|
|
{
|
|
if (equip_container->IsEmpty(eEQUIPCONTAINER_PC_ROOM1 + i) == FALSE)
|
|
{
|
|
++need_inventory_num;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (g_pHero->GetEmptyUseSlot() >= need_inventory_num)
|
|
{
|
|
// 자리 있으면 장착 해제보내고 예약 시도
|
|
// 서버에서 반지 빼줌
|
|
/*
|
|
SCSlotContainer* inventory_container = ItemManager::Instance()->GetContainer(SI_INVENTORY);
|
|
|
|
POSTYPE max_slot = inventory_container->GetMaxSlotNum();
|
|
POSTYPE empty_position = 0;
|
|
|
|
for (int i = 0; i < eEQUIPCONTAINER_CHARGE5 - eEQUIPCONTAINER_CHARGE1; ++i)
|
|
{
|
|
if (equip_container->IsEmpty(eEQUIPCONTAINER_CHARGE1 + i) == FALSE)
|
|
{
|
|
// 빈 슬롯 찾아서 이동
|
|
for ( ; empty_position < max_slot; ++empty_position)
|
|
{
|
|
if (inventory_container->IsEmpty(empty_position))
|
|
{
|
|
ItemManager::Instance()->SendItemMoveMsg(
|
|
SI_EQUIPMENT,
|
|
SI_INVENTORY,
|
|
eEQUIPCONTAINER_CHARGE1 + i,
|
|
empty_position);
|
|
++empty_position;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (int i = 0; i < eEQUIPCONTAINER_PC_ROOM3 - eEQUIPCONTAINER_PC_ROOM1; ++i)
|
|
{
|
|
if (equip_container->IsEmpty(eEQUIPCONTAINER_PC_ROOM1 + i) == FALSE)
|
|
{
|
|
// 빈 슬롯 찾아서 이동
|
|
for ( ; empty_position < max_slot; ++empty_position)
|
|
{
|
|
if (inventory_container->IsEmpty(empty_position))
|
|
{
|
|
ItemManager::Instance()->SendItemMoveMsg(
|
|
SI_EQUIPMENT,
|
|
SI_INVENTORY,
|
|
eEQUIPCONTAINER_PC_ROOM1 + i,
|
|
empty_position);
|
|
++empty_position;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
DWORD mapcode = ChaosSystem::GetBattleGroundData().select_mapcode();
|
|
ChaosSystem::PacketFunction::SEND_CG_BATTLE_GROUND_RESERVATION_SYN(mapcode);
|
|
}
|
|
else
|
|
{
|
|
// 인벤토리가 모자릅니다.
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//nop
|
|
}
|
|
}
|
|
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
|
|
|
|
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
BOOL GlobalFunc::IsGoldRushScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_GOLDRUSH ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_GOLDRUSH ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
#ifdef _NA_007115_20140313_MONDSCHIEN_RENEWAL
|
|
BOOL GlobalFunc::IsDominationScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_DOMINATION ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_DOMINATION ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GlobalFunc::IsMondschienMap()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_DOMINATION ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_DOMINATION ) )
|
|
{
|
|
if (!g_pMap)
|
|
return FALSE;
|
|
|
|
const sDOMINATION_INFO* domination_info_ptr =
|
|
DominationInfoParser::Instance()->GetDominationInfo(g_pMap->GetCurrentFieldID());
|
|
if (domination_info_ptr && domination_info_ptr->m_DominationType == DOMINATION_TYPE_MONDSCHIEN)
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#endif // _NA_007115_20140313_MONDSCHIEN_RENEWAL
|
|
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
BOOL GlobalFunc::IsFreePVPScene()
|
|
{
|
|
if ((g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_FREEPVP) ||
|
|
(GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_FREEPVP) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
BOOL GlobalFunc::IsSpaScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_SPA ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_SPA ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
BOOL GlobalFunc::IsSonnenScheinScene()
|
|
{
|
|
if( g_LoadScene.GetNextSceneAfterLoaded() == SCENE_TYPE_SONNENSCHEIN ||
|
|
( GameFramework::GetCurrentScene() && GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_SONNENSCHEIN ) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
BOOL GlobalFunc::HideSonnenScheinnBuffScene()
|
|
{
|
|
// 소넨샤인 버프 가리는 곳 (서버에선 막았는데 클라에서도 막도록)
|
|
if ((GlobalFunc::IsSSQScene() == TRUE)
|
|
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
|| (GlobalFunc::IsBattleGroundScene() == TRUE)
|
|
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
|| (GlobalFunc::IsFreePVPScene() == TRUE)
|
|
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
|
|
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
|| (GlobalFunc::IsGoldRushScene() == TRUE)
|
|
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
// 점령상태가 온일때
|
|
#ifdef _NA_007115_20140313_MONDSCHIEN_RENEWAL
|
|
if (GlobalFunc::IsDominationScene())
|
|
{
|
|
uiDominationTimer* domination_timer = GET_CAST_DIALOG(uiDominationTimer, IM_DOMINATION_TOWER_MANAGER::DOMINATIONWAR_TIMER_DIALOG);
|
|
if (domination_timer)
|
|
{
|
|
if ((domination_timer->event_state() == DOMINATION_EVENT_WAIT) ||
|
|
(domination_timer->event_state() == DOMINATION_EVENT_START))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
#endif //_NA_007115_20140313_MONDSCHIEN_RENEWAL
|
|
|
|
if (GlobalFunc::IsSonnenScheinScene())
|
|
{
|
|
uiDominationTimer* domination_timer = GET_CAST_DIALOG(uiDominationTimer, IM_DOMINATION_TOWER_MANAGER::DOMINATIONWAR_TIMER_DIALOG);
|
|
if (domination_timer)
|
|
{
|
|
if ((domination_timer->event_state() == SONNENSCHEIN_EVENT_STATE_WAIT) ||
|
|
(domination_timer->event_state() == SONNENSCHEIN_EVENT_STATE_START))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
WzVector GlobalFunc::GetObserverPos( int index )
|
|
{
|
|
WzVector vPos[4];
|
|
|
|
SetVector( &vPos[0], 200.00f, 177.42f, 8.77f );
|
|
SetVector( &vPos[1], 222.10f, 199.89f, 8.77f );
|
|
SetVector( &vPos[2], 200.00f, 223.44f, 8.77f );
|
|
SetVector( &vPos[3], 176.96f, 199.87f, 8.77f );
|
|
|
|
return vPos[index];
|
|
}
|
|
|
|
|
|
const WzVector GlobalFunc::GetObserverAngle( int index )
|
|
{
|
|
WzVector vTarget;
|
|
SetVector( &vTarget, 200.58f, 200.13f, 9.03f );
|
|
const WzVector * vPos = nsSSQ::Observer::Controller::GetPosByIndex( (Info::eCoordinates)index );
|
|
|
|
const WzVector vTemp = vTarget - *vPos;
|
|
|
|
WzVector vResult;
|
|
vResult.x = Math_GetAngleFromVector( &vTemp );
|
|
vResult.y = 0.30f;
|
|
vResult.z = 0.0f;
|
|
|
|
return vResult;
|
|
}
|
|
|
|
void GlobalFunc::fnSendSelectObserverMode( bool b )
|
|
{
|
|
BYTE RequestType = Info::eRequest_None;
|
|
|
|
if( b )
|
|
{
|
|
RequestType = Info::eRequest_Observer;
|
|
}
|
|
else
|
|
{
|
|
RequestType = Info::eRequest_Leave;
|
|
}
|
|
|
|
SendObserverPacket( RequestType );
|
|
}
|
|
|
|
BOOL GlobalFunc::SendObserverCtrl( BYTE KeyCmd )
|
|
{
|
|
MSG_CG_ZONE_EX_SSQ_OBSERVER_SYN Msg;
|
|
Msg.Request = (BYTE)Info::eRequest_ChangeCoord;
|
|
Msg.ObserverCmd.PressedKey = KeyCmd;
|
|
|
|
return SendPacket( CI_GAMESERVERIDX, &Msg, sizeof( Msg ) );
|
|
}
|
|
|
|
BOOL GlobalFunc::SendObserverPacket( BYTE RequestType )
|
|
{
|
|
MSG_CG_ZONE_EX_SSQ_OBSERVER_SYN Msg;
|
|
Msg.Request = RequestType;
|
|
|
|
return SendPacketToGameServer( &Msg, sizeof( Msg ) );
|
|
}
|
|
|
|
BOOL GlobalFunc::IsInventoryLocknMessage()
|
|
{
|
|
uiInventoryMan* pInvenMan = GET_DIALOG_MANAGER(uiInventoryMan, UIMAN_INVENTORY );
|
|
if (pInvenMan)
|
|
{
|
|
int LockState = pInvenMan->GetInventoryLockState();
|
|
if ( LockState & PLAYERINFO_FOR_PACKET::DISABLED )
|
|
{
|
|
uiSystemMan* pSysMan = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_INVENTORY );
|
|
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString(5572, szMessage, INTERFACE_STRING_LENGTH);
|
|
|
|
pSysMan->Sys_Verify(szMessage);
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void GlobalFunc::UsePossessionItem(bool bUse)
|
|
{
|
|
if ( bUse )
|
|
{
|
|
MSG_CG_ITEM_IDENTIFY_POSSESSION_SYN Msg;
|
|
POSTYPE ToPos;
|
|
POSTYPE ItemPos =(POSTYPE)Msg.m_ItemPos;
|
|
MouseHandler::Instance()->GetPossessionItemPOS(ItemPos, ToPos);
|
|
GlobalFunc::SendPacket( CI_GAMESERVERIDX, &Msg, sizeof(Msg) );
|
|
}
|
|
MouseHandler::Instance()->SetPossessionWin(false);
|
|
}
|
|
|
|
#ifdef __NA_001358_ENCHANT_UNIFICATION
|
|
void GlobalFunc::UseInstantEnchantGem(bool bEnchant)
|
|
{
|
|
uiEnchantMan* pUIMan = GET_DIALOG_MANAGER(uiEnchantMan, UIMAN_ENCHANT);
|
|
if(pUIMan)
|
|
{
|
|
pUIMan->UnsetPendingAsk();
|
|
if ( bEnchant )
|
|
{
|
|
pUIMan->SendPacketInstantEnchant();
|
|
}
|
|
}
|
|
}
|
|
#endif //__NA_001358_ENCHANT_UNIFICATION
|
|
|
|
void GlobalFunc::ApplayOptionShowPlayers()
|
|
{
|
|
if (NULL == g_pHero)
|
|
{
|
|
return;
|
|
}
|
|
//Object* pObject = g_pHero->GetTargetObject();
|
|
Object* pObject = g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
|
|
if (pObject && pObject->IsKindOfObject(PLAYER_OBJECT))
|
|
{
|
|
Player* pPlayer = (Player*)pObject;
|
|
if ( false == pPlayer->IsShowByGameOption() )
|
|
{
|
|
g_HeroInput.SetCurrentTarget(NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef _JP000000_ONETIMEPASSWORD_AUTHFLOW_
|
|
void GlobalFunc::RetryOneTimePassword()
|
|
{
|
|
uiLoginOneTimePassword* pUI = GET_CAST_DIALOG(uiLoginOneTimePassword, IM_LOGIN_MANAGER::LOGIN_ONETIMEPASSWORD);
|
|
if (pUI)
|
|
{
|
|
if (uiLoginOneTimePassword::UseNRetryOneTimePassword == pUI->GetOTPUserStamp())
|
|
{
|
|
pUI->ShowInterface(TRUE);
|
|
}
|
|
else if (uiLoginOneTimePassword::UseNExpiredOneTimePassword != pUI->GetOTPUserStamp())
|
|
{
|
|
uiLoginMan* pUIMan = GET_DIALOG_MANAGER(uiLoginMan, UIMAN_LOGIN);
|
|
if (pUIMan)
|
|
{
|
|
pUIMan->resetTryReconnect();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::EncourageOTP(bool bYes)
|
|
{
|
|
uiLoginMan* pUIMan = GET_DIALOG_MANAGER(uiLoginMan, UIMAN_LOGIN);
|
|
SUN_ASSERT(pUIMan);
|
|
|
|
if (bYes)
|
|
{
|
|
// OTP 웹페이지 열기
|
|
TCHAR szREGISTER_URL[512];
|
|
// 마이폴더 홈페이지에 접속하렴
|
|
SHELLEXECUTEINFO ShExecInfo;
|
|
|
|
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
ShExecInfo.fMask = NULL;
|
|
ShExecInfo.hwnd = g_hWndMain;
|
|
ShExecInfo.lpVerb = NULL;
|
|
g_InterfaceManager.GetInterfaceString(5638, szREGISTER_URL, 512);
|
|
ShExecInfo.lpFile = szREGISTER_URL;
|
|
ShExecInfo.lpParameters = NULL;
|
|
ShExecInfo.lpDirectory = NULL;
|
|
ShExecInfo.nShow = SW_MAXIMIZE;
|
|
ShExecInfo.hInstApp = NULL;
|
|
|
|
ShellExecuteEx(&ShExecInfo);
|
|
|
|
if (pUIMan)
|
|
{
|
|
pUIMan->resetTryReconnect();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 서버선택목록 요청하기 - 혹은 서버목록을 받아둔상태에서 보여주는 것으로 변경이 필요할지도...
|
|
if (pUIMan)
|
|
{
|
|
pUIMan->SEND_AUTH_SERVER_LIST_SYN();
|
|
}
|
|
}
|
|
}
|
|
#endif //_JP000000_ONETIMEPASSWORD_AUTHFLOW_
|
|
|
|
#if defined(__KR) || defined(_KOREA)
|
|
#if defined(_DEV_VER)
|
|
|
|
void GlobalFunc::LoadDevIniFile()
|
|
{
|
|
char lpszFilePath[MAX_PATH];
|
|
GetCurrentDirectoryA( MAX_PATH, lpszFilePath);
|
|
strcat( lpszFilePath, "\\");
|
|
strcat( lpszFilePath, "dev.ini");
|
|
|
|
GetPrivateProfileStringA( "Command", "option", 0, g_szDevOption, 1023, lpszFilePath);
|
|
}
|
|
|
|
|
|
char* GlobalFunc::GetDevOption()
|
|
{
|
|
return g_szDevOption;
|
|
}
|
|
|
|
#endif //#if defined(_DEV_VER)
|
|
#endif //#if defined(__KR) || defined(_KOREA)
|
|
|
|
|
|
void GlobalFunc::UseRandomItem(bool bUse)
|
|
{
|
|
if ( bUse )
|
|
{
|
|
MSG_CG_ITEM_USE_RANDOM_ITEM_SYN Msg;
|
|
MouseHandler::Instance()->GetRandomItemPOS(Msg.m_TargetPos);
|
|
GlobalFunc::SendPacket( CI_GAMESERVERIDX, &Msg, sizeof(Msg) );
|
|
|
|
|
|
}
|
|
MouseHandler::Instance()->SetRandomWin(false);
|
|
}
|
|
|
|
void GlobalFunc::GoDefaultVillage()
|
|
{
|
|
if (g_pMap == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
MSG_CG_GM_STRING_CMD_SYN msg;
|
|
ZeroMemory(msg.m_szStringCmd,MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
|
|
TCHAR cmd_message[MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH] = {0,};
|
|
|
|
//무조건 맵 이동은 하게 된다.
|
|
if (g_pMap->GetMapID() != 10002)
|
|
{
|
|
Sprintf(cmd_message, "go 10002");
|
|
}
|
|
else
|
|
{
|
|
Sprintf(cmd_message, "go 10001");
|
|
}
|
|
|
|
StrnCopy(msg.m_szStringCmd, cmd_message, MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
|
|
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
|
|
}
|
|
|
|
void GlobalFunc::GetMonGradeDesc(eNPC_GRADE npc_grade, TCHAR* desc_str)
|
|
{
|
|
switch(npc_grade)
|
|
{
|
|
case eNPC_GENERAL:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("일반"));
|
|
break;
|
|
case eNPC_ELITE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("정예"));
|
|
break;
|
|
case eNPC_LEADER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("리더"));
|
|
break;
|
|
case eNPC_MIDDLEBOSS:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("캡틴"));
|
|
break;
|
|
case eNPC_BOSS:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("보스"));
|
|
break;
|
|
case eNPC_MERCHANT_NPC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("NPC(상인)"));
|
|
break;
|
|
case eNPC_SUMMON_NPC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("NPC(소환체)"));
|
|
break;
|
|
case eNPC_MAPOBJECT_NPC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("NPC(맵오브젝트)"));
|
|
break;
|
|
case eNPC_LUCKY_MONSTER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("럭키몬스터"));
|
|
break;
|
|
case eNPC_TOTEM:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("토템"));
|
|
break;
|
|
case eNPC_SSQ_MONSTER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("SSQ 몬스터"));
|
|
break;
|
|
case eNPC_CRYSTAL_WARP:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("워프수정"));
|
|
break;
|
|
case eNPC_DOMINATION_MAPOBJECT_NPC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("지역점령전_맵오브젝트"));
|
|
break;
|
|
case eNPC_FRIEND_MAPOBJECT_NPC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("일반 몬스터와는 적대적, Player와 우호 적인 맵 오브젝트"));
|
|
break;
|
|
case eNPC_FRIEND_MONSTER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("일반 몬스터와는 적대적, Player와 우호형 몬스터"));
|
|
break;
|
|
case eNPC_MOVE_SYNC_MERCHANT:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("장거리 이동 NPC등을 위한 타입"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetAICodeDesc(WORD ai_code, TCHAR* desc_str)
|
|
{
|
|
switch(ai_code)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("일반"));
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("럭키"));
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("SSQ 몬스터"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetAttackAttitudeDesc(eATTACK_ATTITUDE att_attitude, TCHAR* desc_str)
|
|
{
|
|
switch(att_attitude)
|
|
{
|
|
case ATTACK_ATTITUDE_AFTER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("비선공"));
|
|
break;
|
|
case ATTACK_ATTITUDE_NEARES_FIRST:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("선공(거리)"));
|
|
break;
|
|
case ATTACK_ATTITUDE_LOW_HP_FIRST:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("선공(체력)"));
|
|
break;
|
|
case ATTACK_ATTITUDE_LOW_LEVEL_FIRST:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("선공(레벌)"));
|
|
break;
|
|
case ATTACK_ATTITUDE_HIGH_MP_FIRST:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("선공(마나)"));
|
|
break;
|
|
case ATTACK_ATTITUDE_ONE_TARGET:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("단순무식"));
|
|
break;
|
|
case ATTACK_ATTITUDE_NO_ATTACK:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("공격안함"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetAttTypeDesc(eATTACK_TYPE att_type, TCHAR* desc_str)
|
|
{
|
|
switch(att_type)
|
|
{
|
|
case eATTACK_TYPE_ALL_OPTION:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("모든 옵션"));
|
|
break;
|
|
case eATTACK_TYPE_MELEE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("근접"));
|
|
break;
|
|
case eATTACK_TYPE_RANGE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("원거리"));
|
|
break;
|
|
case eATTACK_TYPE_WATER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("물"));
|
|
break;
|
|
case eATTACK_TYPE_FIRE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("불"));
|
|
break;
|
|
case eATTACK_TYPE_WIND:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("바람"));
|
|
break;
|
|
case eATTACK_TYPE_EARTH:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("대지"));
|
|
break;
|
|
case eATTACK_TYPE_DARKNESS:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("암흑"));
|
|
break;
|
|
case eATTACK_TYPE_DIVINE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("신성"));
|
|
break;
|
|
case eATTACK_TYPE_PHYSICAL_OPTION:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("물리 옵션"));
|
|
break;
|
|
case eATTACK_TYPE_MAGIC_OPTION:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("마법 옵션"));
|
|
break;
|
|
case eATTACK_TYPE_ALL_MAGIC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("모든 마법속성"));
|
|
break;
|
|
case eATTACK_TYPE_MAGIC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("마법"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetMoveAttitudeDesc(eNPC_MOVE_ATTITUDE move_attitude, TCHAR* desc_str)
|
|
{
|
|
switch(move_attitude)
|
|
{
|
|
case eMOVE_ATTITUDE_WANDER:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("이동형"));
|
|
break;
|
|
case eMOVE_ATTITUDE_ETERNAL_STOP:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("완전 정지형"));
|
|
break;
|
|
case eMOVE_ATTITUDE_SPAWN_STOP:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("스폰 정지형(적이 나타나기 전까지만 정지)"));
|
|
break;
|
|
case eMOVE_ATTITUDE_PATROL:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("패트롤"));
|
|
break;
|
|
case eMOVE_ATTITUDE_SEARCH_AREA:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("특정 영역을 우선적으로 검색"));
|
|
break;
|
|
case eMOVE_ATTITUDE_PATHLIST:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("경로 이동형 (설정된 경로 1회 이동)"));
|
|
break;
|
|
case eMOVE_ATTITUDE_FOLLOW:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("주위 아군 따라가기"));
|
|
break;
|
|
case eMOVE_ATTITUDE_ETERNAL_STOP_NO_ATTACK:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("완전 정지(공격 안함)"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetMeleeTypeDesc(eMELEE_TYPE melee_type, TCHAR* desc_str)
|
|
{
|
|
switch(melee_type)
|
|
{
|
|
case eMELEE_TYPE_NOT:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("타입없음(공격없음)"));
|
|
break;
|
|
case eMELEE_TYPE_SLASH:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("베기"));
|
|
break;
|
|
case eMELEE_TYPE_PIERCE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("찌르기"));
|
|
break;
|
|
case eMELEE_TYPE_HIT:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("타격"));
|
|
break;
|
|
case eMELEE_TYPE_MAGIC:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("마법(오브, 지팡이)"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::GetArmorTypeDesc(eARMOR_TYPE armor_type, TCHAR* desc_str)
|
|
{
|
|
switch(armor_type)
|
|
{
|
|
case eARMOR_HARD:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("HEAVY"));
|
|
break;
|
|
case eARMOR_MEDIUM:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("MEDIUM"));
|
|
break;
|
|
case eARMOR_SOFT:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("LIGHT"));
|
|
break;
|
|
case eARMOR_SIEGE:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("SIEGE"));
|
|
break;
|
|
case eARMOR_UNARMOR:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("UNARMOR"));
|
|
break;
|
|
default:
|
|
Snprintf(desc_str, INTERFACE_STRING_LENGTH, _T("????"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
DWORD GlobalFunc::GetClassNameCode(BYTE class_type)
|
|
{
|
|
DWORD class_name_code = eST_CHARACTER_CLASS_NAME_BERSERKER;
|
|
switch (class_type)
|
|
{
|
|
case eCHAR_BERSERKER:
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_BERSERKER;
|
|
}
|
|
break;
|
|
case eCHAR_DRAGON:
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_DRAGON;
|
|
}
|
|
break;
|
|
case eCHAR_SHADOW:
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_SHADOW;
|
|
}
|
|
break;
|
|
case eCHAR_VALKYRIE:
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_VALKYRIE;
|
|
}
|
|
break;
|
|
case eCHAR_ELEMENTALIST:
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_MAGICIAN;
|
|
}
|
|
break;
|
|
case eCHAR_MYSTIC: //_NA_004965_20120613_NEW_CHARACTER_MYSTIC
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_MYSTIC;
|
|
}
|
|
break;
|
|
case eCHAR_HELLROID: //_NA_000000_20130812_NEW_CHARACTER_HELLROID
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_HELLROID;
|
|
}
|
|
break;
|
|
case eCHAR_WITCHBLADE: //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
|
{
|
|
class_name_code = eST_CHARACTER_CLASS_NAME_WITCHBLADE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return class_name_code;
|
|
}
|
|
|
|
bool GlobalFunc::IsMyItem(Item* item_pointer)
|
|
{
|
|
//내 것의 아이템인지 ([*]표시를 보일지)
|
|
if (uiAreaConquestMan::CanPickACItem(item_pointer,false) == false) //소유가 있더라도 완료한 AC템이면 제외 (1순위검사)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if ((item_pointer->GetOwner() == 0) ||
|
|
(g_pHero && g_pHero->GetObjectKey() == item_pointer->GetOwner()))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
|
|
if (partyMan && partyMan->IsPartyMember(item_pointer->GetOwner()))
|
|
{
|
|
const BASE_ITEMINFO* Item_Info = item_pointer->GetItemSlot().GetItemInfo();
|
|
if ((Item_Info != NULL) &&
|
|
((Item_Info->m_wType == eITEMTYPE_AC) ||
|
|
(Item_Info->m_wType == eITEMTYPE_QUEST) ||
|
|
(Item_Info->m_wType == eITEMTYPE_EVENT_FIELD_PARTY_ALL_MEMBER_PICK_UP)))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
ItemShareSystem* item_share = GET_CAST_DIALOG(ItemShareSystem,IM_PARTY_MANAGER::PARTY_ITEM_SHARE_SYSTEM);
|
|
if ((item_share != NULL) &&
|
|
(item_share->GetItemShareType() == eITEM_DISTRIBUTION_DEFAULT)
|
|
#ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING
|
|
|| (item_share->GetItemShareType() == eITEM_DISTRIBUTION_DICE_AND_DEFAULT)
|
|
#endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
bool GlobalFunc::CanGetItem(Item* item_pointer)
|
|
{
|
|
//내가 줍을 수 있는 아이템인지
|
|
if ((item_pointer->GetOwner() == 0) ||
|
|
(g_pHero && g_pHero->GetObjectKey() == item_pointer->GetOwner()))
|
|
{
|
|
return TRUE;
|
|
}
|
|
//줍기에 대해서 파티원 내의 소유권이면 모두 먹을 수 있게 함
|
|
uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
|
|
if (partyMan && partyMan->IsPartyMember(item_pointer->GetOwner()))
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
bool GlobalFunc::CanGetHaim(Item* item_pointer)
|
|
{
|
|
if (item_pointer->GetOwner() == 0 ||
|
|
(g_pHero && g_pHero->GetObjectKey() == item_pointer->GetOwner()))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
|
|
if (partyMan && partyMan->IsPartyMember(item_pointer->GetOwner()))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
bool GlobalFunc::IsNumberic(BYTE option_kind, BASE_OptionList* option_list_info)
|
|
{
|
|
//__UNUSED(option_list_info);
|
|
if (option_kind == VALUE_TYPE_VALUE)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool GlobalFunc::IsPercentage(BYTE option_kind, BASE_OptionList* option_list_info)
|
|
{
|
|
//__UNUSED(option_list_info);
|
|
if (option_kind != VALUE_TYPE_VALUE)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void GlobalFunc::AddOptionSuffix(BYTE option_kind, BASE_OptionList* option_list_info, TCHAR* INOUT string_desc)
|
|
{
|
|
if ((option_list_info == NULL) || (string_desc == NULL))
|
|
{
|
|
assert(option_list_info && "잘못된 OptionList 정보 값이 들어왔습니다.");
|
|
return;
|
|
}
|
|
TCHAR string_suffix[INTERFACE_STRING_LENGTH + 1] = {0,};
|
|
|
|
switch(option_list_info->valuetype)
|
|
{
|
|
case OptionListParser::eOPTION_VALUE_TYPE_NORMAL:
|
|
{
|
|
if (option_kind == VALUE_TYPE_VALUE)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
//11299 %
|
|
g_InterfaceManager.GetInterfaceString(11299, string_suffix, INTERFACE_STRING_LENGTH);
|
|
}
|
|
}
|
|
break;
|
|
case OptionListParser::eOPTION_VALUE_TYPE_PERCENTAGE:
|
|
{
|
|
//11299 %
|
|
g_InterfaceManager.GetInterfaceString(11299, string_suffix, INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
case OptionListParser::eOPTION_VALUE_TYPE_SECOND:
|
|
#ifdef _NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND
|
|
case OptionListParser::eOPTION_VALUE_TYPE_MILIISECOND:
|
|
#endif //_NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND
|
|
{
|
|
//11300 초
|
|
g_InterfaceManager.GetInterfaceString(11300, string_suffix, INTERFACE_STRING_LENGTH);
|
|
}
|
|
break;
|
|
}
|
|
|
|
_tcscat(string_desc,string_suffix);
|
|
|
|
return;
|
|
}
|
|
|
|
#ifdef _NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND
|
|
int GlobalFunc::OptionValueQuantification(BASE_OptionList* option_list_info, int option_value)
|
|
{
|
|
if (option_list_info != NULL &&
|
|
option_list_info->valuetype == OptionListParser::eOPTION_VALUE_TYPE_MILIISECOND)
|
|
{
|
|
return (option_value/1000);
|
|
}
|
|
|
|
return option_value;
|
|
}
|
|
#endif //_NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::Write_Packet_Log(CHAR* message, ...)
|
|
{
|
|
#ifdef _DEV_VER
|
|
|
|
char szErrLog[1024] = {0,};
|
|
|
|
va_list args;
|
|
va_start(args, message);
|
|
_vsntprintf( szErrLog, 1023, message, args );
|
|
va_end(args);
|
|
|
|
char szOutputMsg[1024] = {0,};
|
|
_snprintf(szOutputMsg, 1023, _T("%s\n"), szErrLog);
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
SYSTEMTIME time;
|
|
GetSystemTime(&time);
|
|
char str[256] = {NULL, };
|
|
sprintf(str, "[%02d:%02d:%02d] ", time.wHour, time.wMinute, time.wSecond);
|
|
OutputDebugString(str);
|
|
|
|
OutputDebugString(szOutputMsg);
|
|
#else
|
|
char szFileName[MAX_PATH] = {0,};
|
|
_snprintf(szFileName, MAX_PATH-1, _T("log\\packet.log"));
|
|
|
|
FILE* fp = _tfopen(szFileName, _T("a+t"));
|
|
if (fp)
|
|
{
|
|
fwrite( szOutputMsg, _tcslen(szOutputMsg), 1, fp );
|
|
fclose( fp );
|
|
}
|
|
#endif
|
|
#endif //_DEV_VER
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::OutputMsg_WingControl_ResultCode(uint8_t result, uint16_t result_code)
|
|
{
|
|
WingControl::eResult res = static_cast<WingControl::eResult>(result);
|
|
WingControl::eResultCode res_code = static_cast<WingControl::eResultCode>(result_code);
|
|
|
|
if (res == WingControl::eRet_Success)
|
|
{
|
|
}
|
|
else if (res == WingControl::eRet_Failed)
|
|
{
|
|
DWORD string_code = 0;
|
|
switch (res_code)
|
|
{
|
|
case WingControl::eRetCode_Unknown:
|
|
case WingControl::eRetCode_NotWingsItem:
|
|
break;
|
|
case WingControl::eRetCode_InvalidCharState:
|
|
string_code = 5249;
|
|
break;
|
|
case WingControl::eRetCode_TimeExpired:
|
|
case WingControl::eRetCode_AlreadySpread:
|
|
case WingControl::eRetCode_AlreadyFurled:
|
|
case WingControl::eRetCode_FurledByHit:
|
|
case WingControl::eRetCode_CantDuplicateAction:
|
|
case WingControl::eRetCode_NotToFlyingItem:
|
|
break;
|
|
}
|
|
|
|
if (string_code > 0)
|
|
{
|
|
TCHAR message[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(string_code, message, INTERFACE_STRING_LENGTH );
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message);
|
|
}
|
|
}
|
|
else if (res == WingControl::eRet_ItemFailed)
|
|
{
|
|
ItemManager::Instance()->NoticeReasonItemErrorCode(static_cast<DWORD>(result_code));
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_TYPE eMsgType, TCHAR * pszMessage, ...)
|
|
{
|
|
#if defined ( _DEBUG ) || defined (_GAMECLIENT_VER)
|
|
static TCHAR szDebugOutputMsg[512];
|
|
static TCHAR szResultMsg[512];
|
|
|
|
va_list args;
|
|
va_start(args, pszMessage);
|
|
_vsntprintf( szDebugOutputMsg, 512, pszMessage, args );
|
|
va_end(args);
|
|
|
|
Sprintf(szResultMsg, _T("[DEBUG]%s"), szDebugOutputMsg);
|
|
|
|
default_OutputMsg( eMsgType, szDebugOutputMsg);
|
|
|
|
#endif
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::AlwaysOutputMsg( eOUTPUT_MSG_TYPE eMsgType, TCHAR * pszMessage, ...)
|
|
{
|
|
default_OutputMsg( eMsgType, pszMessage);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
#if defined(__CN_20100909_SECURITY_TOKEN__)
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::RetrySecurityToken(bool bYes)
|
|
{
|
|
if (bYes)
|
|
{
|
|
uiLoginOneTimePassword* token_ui = GET_CAST_DIALOG(uiLoginOneTimePassword, IM_LOGIN_MANAGER::LOGIN_ONETIMEPASSWORD);
|
|
if (token_ui)
|
|
{
|
|
token_ui->ShowInterface(TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GlobalFunc::LogOutGame();
|
|
}
|
|
}
|
|
#endif // __CN_20100909_SECURITY_TOKEN__
|
|
|
|
void GlobalFunc::GetDateString(TCHAR* OUT date_string, int string_size, int string_code, SYSTEMTIME& system_time)
|
|
{
|
|
// string_code 를 통해 포맷 스트링을 얻음
|
|
TCHAR temp_string[INTERFACE_STRING_LENGTH] = {'\0', };
|
|
g_InterfaceManager.GetInterfaceString(string_code, temp_string);
|
|
|
|
#ifdef _INTERNATIONAL_DATE_TOOLTIP
|
|
|
|
TCHAR month_string[32] = {'\0', };
|
|
int month_string_code = 11071;
|
|
uiToolTipMan* ui_tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
|
|
if (ui_tooltip_manager != NULL)
|
|
{
|
|
month_string_code = ui_tooltip_manager->GetStringMonth(system_time.wMonth);
|
|
}
|
|
g_InterfaceManager.GetInterfaceString(month_string_code, month_string, 32);
|
|
|
|
#ifdef _RUSSIA
|
|
Snprintf(date_string,
|
|
string_size - 1,
|
|
temp_string,
|
|
month_string, //달
|
|
system_time.wDay, //일
|
|
system_time.wYear, //년도
|
|
system_time.wHour, //시
|
|
system_time.wMinute);//분
|
|
#else //_RUSSIA
|
|
Snprintf(date_string,
|
|
string_size - 1,
|
|
temp_string,
|
|
month_string, //달
|
|
system_time.wDay, //일
|
|
system_time.wHour, //시
|
|
system_time.wMinute,//분
|
|
system_time.wYear); //년도
|
|
#endif //_RUSSIA
|
|
|
|
#else
|
|
|
|
Snprintf(date_string,
|
|
string_size - 1,
|
|
temp_string,
|
|
system_time.wYear,
|
|
system_time.wMonth,
|
|
system_time.wDay,
|
|
system_time.wHour,
|
|
system_time.wMinute );
|
|
#endif//_INTERNATIONAL_DATE_TOOLTIP
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
#ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
|
|
LPCTSTR GlobalFunc::GetRaceString(eCHAR_TYPE race_type)
|
|
{
|
|
DWORD race_name_code = 70395;
|
|
switch (race_type)
|
|
{
|
|
case eCHAR_BERSERKER:
|
|
race_name_code = 10122;//루크
|
|
break;
|
|
case eCHAR_DRAGON:
|
|
race_name_code = 10123;//로드아일
|
|
break;
|
|
case eCHAR_SHADOW:
|
|
race_name_code = 10124;//헬론
|
|
break;
|
|
case eCHAR_VALKYRIE:
|
|
race_name_code = 10125;//에이셔
|
|
break;
|
|
case eCHAR_ELEMENTALIST:
|
|
race_name_code = 10126;//카린
|
|
break;
|
|
case eCHAR_MYSTIC:
|
|
race_name_code = 10127;//미오
|
|
break;
|
|
case eCHAR_HELLROID: //_NA_000000_20130812_NEW_CHARACTER_HELLROID
|
|
race_name_code = 46693; // HEL-P7
|
|
break;
|
|
case eCHAR_WITCHBLADE: //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
|
race_name_code = 46707; // 사라드
|
|
break;
|
|
}
|
|
return g_InterfaceManager.GetInterfaceString(race_name_code);
|
|
}
|
|
#endif//_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
LPCTSTR GlobalFunc::GetClassString(eCHAR_TYPE char_type)
|
|
{
|
|
switch (char_type)
|
|
{
|
|
case eCHAR_BERSERKER: return g_InterfaceManager.GetInterfaceString(10001); break;
|
|
case eCHAR_DRAGON: return g_InterfaceManager.GetInterfaceString(10004); break;
|
|
case eCHAR_SHADOW: return g_InterfaceManager.GetInterfaceString(10005); break;
|
|
case eCHAR_VALKYRIE: return g_InterfaceManager.GetInterfaceString(10007); break;
|
|
case eCHAR_ELEMENTALIST: return g_InterfaceManager.GetInterfaceString(10010); break;
|
|
//_NA_004965_20120613_NEW_CHARACTER_MYSTIC
|
|
case eCHAR_MYSTIC: return g_InterfaceManager.GetInterfaceString(10002); break;
|
|
//_NA_000000_20130812_NEW_CHARACTER_HELLROID
|
|
case eCHAR_HELLROID: return g_InterfaceManager.GetInterfaceString(10006); break;
|
|
//_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
|
case eCHAR_WITCHBLADE: return g_InterfaceManager.GetInterfaceString(2685); break;
|
|
}
|
|
return g_InterfaceManager.GetInterfaceString(70395);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetText_SignMoney(CControlWZ* control, INT64 money)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessage_SignMoney(msg, INTERFACE_STRING_LENGTH, money);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetTextFromStringTable(CControlWZ* control, int format_string_code)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, msg, INTERFACE_STRING_LENGTH);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetTextFromStringTable(CControlWZ* control, int format_string_code, int val)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessageFromStringTable(msg, INTERFACE_STRING_LENGTH, format_string_code, val);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetTextFromStringTable_Money(CControlWZ* control, int format_string_code, MONEY money)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessageFromStringTable_Money(msg, INTERFACE_STRING_LENGTH, format_string_code, money);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetTextFromStringTable(CControlWZ* control, int format_string_code, TCHAR* val)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessageFromStringTable(msg, INTERFACE_STRING_LENGTH, format_string_code, val);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetTextFromStringTable(CControlWZ* control, int format_string_code, TCHAR* val1, TCHAR* val2)
|
|
{
|
|
if (control != NULL)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessageFromStringTable(msg, INTERFACE_STRING_LENGTH, format_string_code, val1, val2);
|
|
|
|
control->SetTextWZ(msg);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessage_SignMoney(OUT TCHAR* msg, int msg_size, INT64 money)
|
|
{
|
|
NUMBERFMT nFmt = { 0, 0, 3, _T("."), _T(","), 1 };
|
|
TCHAR temp[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
|
|
Snprintf(temp, INTERFACE_STRING_LENGTH, _T("%I64d"), money);
|
|
|
|
::GetNumberFormat(LOCALE_SYSTEM_DEFAULT, NULL, temp, &nFmt, msg, msg_size);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code, int val)
|
|
{
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
TCHAR parameter[32] = {NULL, };
|
|
Snprintf(parameter, _countof(parameter) - 1, _T("%d"), val);
|
|
|
|
Snprintf(msg, msg_size, string_format, parameter);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable_Money(OUT TCHAR* msg, int msg_size, int format_string_code, MONEY money)
|
|
{
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
TCHAR parameter[32] = {NULL, };
|
|
Snprintf(parameter, _countof(parameter) - 1, _T("%I64u"), money);
|
|
|
|
Snprintf(msg, msg_size, string_format, parameter);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code, TCHAR* val)
|
|
{
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
Snprintf(msg, msg_size, string_format, val);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code, TCHAR* val1, TCHAR* val2)
|
|
{
|
|
if (val1 == NULL || val2 == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
Snprintf(msg, msg_size, string_format, val1, val2);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code,
|
|
TCHAR* val1, TCHAR* val2, int val3, TCHAR* val4)
|
|
{
|
|
if (val1 == NULL || val2 == NULL || val4 == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
TCHAR parameter[32] = {NULL, };
|
|
Snprintf(parameter, _countof(parameter) - 1, _T("%d"), val3);
|
|
|
|
Snprintf(msg, msg_size, string_format, val1, val2, parameter, val4);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code,
|
|
int val1, TCHAR* val2, int val3, TCHAR* val4)
|
|
{
|
|
if (val2 == NULL || val4 == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
TCHAR parameter[32] = {NULL, };
|
|
Snprintf(parameter, _countof(parameter) - 1, _T("%d"), val1);
|
|
TCHAR parameter2[32] = {NULL, };
|
|
Snprintf(parameter2, _countof(parameter2) - 1, _T("%d"), val3);
|
|
|
|
Snprintf(msg, msg_size, string_format, parameter, val2, parameter2, val4);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code,
|
|
int val1, TCHAR* val2, TCHAR* val3, TCHAR* val4)
|
|
{
|
|
if (val2 == NULL || val4 == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
TCHAR parameter[32] = {NULL, };
|
|
Snprintf(parameter, _countof(parameter) - 1, _T("%d"), val1);
|
|
|
|
Snprintf(msg, msg_size, string_format, parameter, val2, val3, val4);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable(OUT TCHAR* msg, int msg_size, int format_string_code,
|
|
TCHAR* val1, TCHAR* val2, TCHAR* val3, TCHAR* val4)
|
|
{
|
|
if (val2 == NULL || val4 == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
Snprintf(msg, msg_size, string_format, val1, val2, val3, val4);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable_YYYYMMDD(OUT TCHAR* msg, int msg_size, int format_string_code,
|
|
DWORD64 wztime64_value)
|
|
{
|
|
if (msg == NULL || msg_size <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SYSTEMTIME systime;
|
|
util::YYYYMMDDHHMMSSToSYSTEMTIME(wztime64_value, systime);
|
|
TCHAR msg_time[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
Snprintf(msg_time, INTERFACE_STRING_LENGTH, " %04d.%02d.%02d", systime.wYear, systime.wMonth, systime.wDay);
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
Snprintf(msg, msg_size, string_format, msg_time);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MakeMessageFromStringTable_tm(OUT TCHAR* msg, int msg_size, int format_string_code, tm* time_stmp)
|
|
{
|
|
if (msg == NULL || msg_size <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR msg_time[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
Snprintf(msg_time, INTERFACE_STRING_LENGTH, " %04d.%02d.%02d", time_stmp->tm_year, time_stmp->tm_mon, time_stmp->tm_mday);
|
|
|
|
TCHAR string_format[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, string_format, INTERFACE_STRING_LENGTH);
|
|
|
|
Snprintf(msg, msg_size, string_format, msg_time);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::MoveToTopDialog(DWORD dialog_id)
|
|
{
|
|
g_InterfaceManager.AttachFirstDialog(dialog_id);
|
|
g_InterfaceManager.DeAttachFirstDialog(dialog_id);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::ExecWebSite(DWORD string_code)
|
|
{
|
|
TCHAR register_url[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(string_code, register_url, INTERFACE_STRING_LENGTH);
|
|
|
|
SHELLEXECUTEINFO shell_execute_info;
|
|
{
|
|
shell_execute_info.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
shell_execute_info.fMask = NULL;
|
|
shell_execute_info.hwnd = g_hWndMain;
|
|
shell_execute_info.lpVerb = "open";
|
|
shell_execute_info.lpFile = register_url;
|
|
shell_execute_info.lpParameters = NULL;
|
|
shell_execute_info.lpDirectory = NULL;
|
|
shell_execute_info.nShow = SW_MAXIMIZE;
|
|
shell_execute_info.hInstApp = NULL;
|
|
}
|
|
ShellExecuteEx(&shell_execute_info);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetFTextFromStringTable(FTextRender& render, FTextParser& parser, FTextSentence& sentence, int format_string_code)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
g_InterfaceManager.GetInterfaceString(format_string_code, msg, INTERFACE_STRING_LENGTH);
|
|
|
|
if (parser.Parser(msg, sentence) == TRUE)
|
|
{
|
|
render.Append(sentence);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetFTextFromStringTable(FTextRender& render, FTextParser& parser, FTextSentence& sentence, int format_string_code, int val1)
|
|
{
|
|
TCHAR msg[INTERFACE_STRING_LENGTH] = {NULL, };
|
|
GlobalFunc::MakeMessageFromStringTable(msg, INTERFACE_STRING_LENGTH, format_string_code, val1);
|
|
|
|
if (parser.Parser(msg, sentence) == TRUE)
|
|
{
|
|
render.Append(sentence);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void GlobalFunc::SetFTextFromMsg(FTextRender& render, FTextParser& parser, FTextSentence& sentence, const TCHAR* msg)
|
|
{
|
|
if (parser.Parser(msg, sentence) == TRUE)
|
|
{
|
|
render.Append(sentence);
|
|
}
|
|
}
|
|
|
|
DWORD GlobalFunc::VerifyMessage(DWORD message_code,
|
|
DWORD title_code /*= 0*/,
|
|
uiSystemMessage::MessageCallback callback_function /*= NULL*/,
|
|
bool is_modal /*= false*/)
|
|
{
|
|
DWORD message_dialog_key = 0;
|
|
uiSystemMan* ui_system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (ui_system_manager == NULL)
|
|
{
|
|
return message_dialog_key;
|
|
}
|
|
|
|
TCHAR title_stinrg[INTERFACE_STRING_LENGTH] = {'\0', };
|
|
if (title_code == 0)
|
|
{
|
|
// 4533 알림!
|
|
g_InterfaceManager.GetInterfaceString(4533, title_stinrg);
|
|
}
|
|
else
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(title_code, title_stinrg);
|
|
}
|
|
|
|
message_dialog_key = ui_system_manager->Sys_SystemMessage(
|
|
g_InterfaceManager.GetInterfaceString(message_code),
|
|
title_stinrg,
|
|
callback_function,
|
|
uiSystemMessage::kVerify_Type,
|
|
is_modal);
|
|
|
|
return message_dialog_key;
|
|
}
|
|
|
|
DWORD GlobalFunc::VerifyMessage(const TCHAR* message,
|
|
const TCHAR* title,
|
|
uiSystemMessage::MessageCallback callback_function /*= NULL*/,
|
|
bool is_modal /*= false*/)
|
|
{
|
|
DWORD message_dialog_key = 0;
|
|
uiSystemMan* ui_system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (ui_system_manager == NULL)
|
|
{
|
|
return message_dialog_key;
|
|
}
|
|
|
|
message_dialog_key = ui_system_manager->Sys_SystemMessage(
|
|
message,
|
|
title,
|
|
callback_function,
|
|
uiSystemMessage::kVerify_Type,
|
|
is_modal);
|
|
|
|
return message_dialog_key;
|
|
}
|
|
DWORD GlobalFunc::ConfirmMessage(DWORD message_code,
|
|
DWORD title_code /*= 0*/,
|
|
uiSystemMessage::MessageCallback callback_function /*= NULL*/,
|
|
bool is_modal /*= false*/)
|
|
{
|
|
DWORD message_dialog_key = 0;
|
|
uiSystemMan* ui_system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (ui_system_manager == NULL)
|
|
{
|
|
return message_dialog_key;
|
|
}
|
|
|
|
TCHAR title_stinrg[INTERFACE_STRING_LENGTH] = {'\0', };
|
|
if (title_code == 0)
|
|
{
|
|
// 4533 알림!
|
|
g_InterfaceManager.GetInterfaceString(4533, title_stinrg);
|
|
}
|
|
else
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(title_code, title_stinrg);
|
|
}
|
|
|
|
message_dialog_key = ui_system_manager->Sys_SystemMessage(
|
|
g_InterfaceManager.GetInterfaceString(message_code),
|
|
title_stinrg,
|
|
callback_function,
|
|
uiSystemMessage::kConfirm_Type,
|
|
is_modal);
|
|
|
|
return message_dialog_key;
|
|
}
|
|
|
|
DWORD GlobalFunc::ConfirmMessage(const TCHAR* message,
|
|
const TCHAR* title,
|
|
uiSystemMessage::MessageCallback callback_function /*= NULL*/,
|
|
bool is_modal /*= false*/)
|
|
{
|
|
DWORD message_dialog_key = 0;
|
|
uiSystemMan* ui_system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (ui_system_manager == NULL)
|
|
{
|
|
return message_dialog_key;
|
|
}
|
|
|
|
message_dialog_key = ui_system_manager->Sys_SystemMessage(
|
|
message,
|
|
title,
|
|
callback_function,
|
|
uiSystemMessage::kConfirm_Type,
|
|
is_modal);
|
|
|
|
return message_dialog_key;
|
|
}
|
|
|
|
void GlobalFunc::EnableControl( CControlWZ* control_ptr, bool enable_state )
|
|
{
|
|
if (control_ptr == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
bool current_state = (control_ptr->GetDrawState() == E_DISABLE) ? false : true;
|
|
if (current_state != enable_state)
|
|
{
|
|
control_ptr->EnableWindowWZ(enable_state);
|
|
}
|
|
}
|
|
|
|
float GlobalFunc::GetCameraHeight( eCHAR_TYPE CharType )
|
|
{
|
|
static float default_eye_height = 1.0f;
|
|
if( CharType == eCHAR_MYSTIC )
|
|
return default_eye_height;
|
|
|
|
return 1.3f; // default
|
|
}
|
|
|
|
void GlobalFunc::EquipmentPlayerRefreshAppearRender( const BOOL& is_bone_refresh /*= FALSE*/ )
|
|
{
|
|
Player* equipment_player_ptr = static_cast<Player*>(g_ObjectManager.GetObject(EQUIPMENT_CHARACTER_KEY));
|
|
if ( equipment_player_ptr )
|
|
{
|
|
equipment_player_ptr->RefreshAppearRender(is_bone_refresh);
|
|
}
|
|
}
|
|
|
|
#ifdef _NA_000000_20140519_GAMEGUARD_LOG
|
|
void GlobalFunc::Write_GameGuard_Log( TCHAR* message )
|
|
{
|
|
struct tm * today;
|
|
time_t ltime;
|
|
time( <ime );
|
|
today = localtime( <ime );
|
|
TCHAR szOutputMsg[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
Snprintf(szOutputMsg, INTERFACE_STRING_LENGTH-1, _T("[%02d:%02d:%02d] %s\n"), today->tm_hour, today->tm_min, today->tm_sec, message);
|
|
|
|
TCHAR szFileName[MAX_PATH] = {0,};
|
|
Snprintf(szFileName, MAX_PATH-1,
|
|
_T("ClientGameGuardLog_%02d%02d%02d_%s.log"),
|
|
today->tm_year+1900,
|
|
today->tm_mon+1,
|
|
today->tm_mday,
|
|
c_tcBUILD_VERSION);
|
|
|
|
FILE * fp = _tfopen(szFileName, "a");
|
|
fwrite( szOutputMsg, _tcslen(szOutputMsg), 1, fp );
|
|
fclose( fp );
|
|
}
|
|
#endif // _NA_000000_20140519_GAMEGUARD_LOG
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
void GlobalFunc::ShowSonnenScheinResurrectionPopup(DWORD l_prarm, DWORD r_prarm)
|
|
{
|
|
TCHAR string[INTERFACE_STRING_LENGTH] = {0,};
|
|
uiSystemMan* system_manager =
|
|
static_cast<uiSystemMan*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM));
|
|
if (system_manager)
|
|
{
|
|
g_KeyQueueManager.SetDefaultFun(NULL);
|
|
CastLeaveFieldDialog* castleave_dialog = GET_CAST_DIALOG(CastLeaveFieldDialog, StrToWzID("0281"));
|
|
if (castleave_dialog)
|
|
{
|
|
castleave_dialog->ShowWindow(FALSE);
|
|
}
|
|
|
|
// 891 캐릭터가 사망했습니다.
|
|
g_InterfaceManager.GetInterfaceString(891, string, INTERFACE_STRING_LENGTH - 1);
|
|
system_manager->Sys_ConfirmDontCloseButton(string, GlobalFunc::SonnenScheinResurrectionConfirm, NULL, NULL, 3476 /* 부활하기 */, 3301 /*필드로 이동*/);
|
|
}
|
|
}
|
|
void GlobalFunc::SonnenScheinResurrectionConfirm(int confirm_value)
|
|
{
|
|
if (confirm_value == kConfirmSelect1)
|
|
{
|
|
// 부활하기
|
|
if (g_pHero && g_pHero->IsDead())
|
|
{
|
|
keyMsg msg;
|
|
ZeroMemory(&msg,sizeof(msg));
|
|
msg.dwType = eDoType_Delay_Spawn_SonnenSchein;
|
|
msg.DoSomething = ShowSonnenScheinResurrectionPopup;
|
|
msg.lParam = InterfaceManager::DIALOG_DELAY_CASTING;
|
|
msg.wParam = eDoType_Delay_Spawn_SonnenSchein;
|
|
g_KeyQueueManager.PushBack(msg);
|
|
|
|
StartLeaveFieldCastTimer( eDoType_Delay_Spawn_SonnenSchein, 5000);
|
|
|
|
// 3326 %d초 후에 시작지점으로 리스폰 됩니다.
|
|
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
|
|
TCHAR szResultInfo[INTERFACE_STRING_LENGTH] = {0,};
|
|
g_InterfaceManager.GetInterfaceString(3326, szMessage, INTERFACE_STRING_LENGTH);
|
|
Sprintf( szResultInfo, szMessage, 5);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResultInfo);
|
|
}
|
|
else
|
|
{
|
|
g_KeyQueueManager.SetDefaultFun(GlobalFunc::DoSystemDialog);
|
|
}
|
|
|
|
//ShowInterface(FALSE);
|
|
}
|
|
else if (confirm_value == kConfirmSelect2)
|
|
{
|
|
BattleScene::BackToTheVillageTransact();
|
|
}
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
#ifdef _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION
|
|
bool GlobalFunc::HeimTradingvolumeCheck( const MONEY& money)
|
|
{
|
|
const MONEY& heim_tradingvolume = GAMEOPTION->GetHeimTradingvolumeNotification();
|
|
if (heim_tradingvolume != 0 &&
|
|
money >= heim_tradingvolume)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#endif // _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION
|
|
|
|
#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
|
|
void GlobalFunc::WriteCombatRecord( const eCOMBAT_RECORD_KIND& combat_record_kind,
|
|
const int& damage,
|
|
std::string character_name,
|
|
std::string damage_kind,
|
|
const time_t& server_time,
|
|
const bool& is_critical /*= false*/ )
|
|
{
|
|
tm* time = ::localtime(&server_time);
|
|
|
|
if (time == NULL)
|
|
{
|
|
assert(time);
|
|
return;
|
|
}
|
|
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR because_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
int string_index = 0;
|
|
|
|
WzColor text_color = WzColor_RGBA(255, 255, 0, 255);
|
|
|
|
if (character_name == "" || damage_kind == "")
|
|
{
|
|
Snprintf(because_string, INTERFACE_STRING_LENGTH-1, _T("%s%s"),
|
|
const_cast<TCHAR*>(character_name.c_str()),
|
|
const_cast<TCHAR*>(damage_kind.c_str()));
|
|
}
|
|
else
|
|
{
|
|
Snprintf(because_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"),
|
|
const_cast<TCHAR*>(character_name.c_str()),
|
|
const_cast<TCHAR*>(damage_kind.c_str()));
|
|
}
|
|
|
|
switch (combat_record_kind)
|
|
{
|
|
case eCRK_DAMAGE_BY:
|
|
{
|
|
if (is_critical == true)
|
|
{
|
|
string_index = 2092;
|
|
|
|
text_color = WzColor_RGBA(255, 163, 168, 255);
|
|
}
|
|
else
|
|
{
|
|
string_index = 2095;
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
damage,
|
|
because_string);
|
|
}
|
|
break;
|
|
case eCRK_ABILITY_BY:
|
|
{
|
|
string_index = 2090;
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
because_string);
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
break;
|
|
case eCRK_ABILITY_TO:
|
|
{
|
|
string_index = 2094;
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
because_string);
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
break;
|
|
case eCRK_DAMAGE_TO:
|
|
{
|
|
if (is_critical == true)
|
|
{
|
|
string_index = 2093;
|
|
|
|
text_color = WzColor_RGBA(142, 242, 255, 255);
|
|
}
|
|
else
|
|
{
|
|
string_index = 2097;
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
damage,
|
|
because_string);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
uiCombatRecordMan* ui_combat_record_manager = GET_DIALOG_MANAGER(uiCombatRecordMan, UIMAN_COMBAT_RECORD);
|
|
if (ui_combat_record_manager == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ui_combat_record_manager->AddData(combat_record_kind, result_string, text_color);
|
|
}
|
|
|
|
void GlobalFunc::WriteCombatRecord( const eCOMBAT_RECORD_KIND& combat_record_kind,
|
|
const int& damage,
|
|
Object* character_ptr,
|
|
std::string damage_kind,
|
|
const time_t& server_time,
|
|
const bool& is_critical /*= false*/ )
|
|
{
|
|
tm* time = ::localtime(&server_time);
|
|
|
|
if (time == NULL)
|
|
{
|
|
assert(time);
|
|
return;
|
|
}
|
|
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR because_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
int string_index = 0;
|
|
|
|
WzColor text_color = WzColor_RGBA(255, 255, 0, 255);
|
|
|
|
std::string character_name;
|
|
if (character_ptr == NULL)
|
|
{
|
|
character_name = "";
|
|
}
|
|
else
|
|
{
|
|
character_name = character_ptr->GetName();
|
|
}
|
|
|
|
if (character_name == "" || damage_kind == "")
|
|
{
|
|
Snprintf(because_string, INTERFACE_STRING_LENGTH-1, _T("%s%s"),
|
|
const_cast<TCHAR*>(character_name.c_str()),
|
|
const_cast<TCHAR*>(damage_kind.c_str()));
|
|
}
|
|
else
|
|
{
|
|
Snprintf(because_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"),
|
|
const_cast<TCHAR*>(character_name.c_str()),
|
|
const_cast<TCHAR*>(damage_kind.c_str()));
|
|
}
|
|
|
|
switch (combat_record_kind)
|
|
{
|
|
case eCRK_DAMAGE_BY:
|
|
{
|
|
if (is_critical == true)
|
|
{
|
|
string_index = 2092;
|
|
|
|
text_color = WzColor_RGBA(255, 163, 168, 255);
|
|
}
|
|
else
|
|
{
|
|
string_index = 2095;
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
damage,
|
|
because_string);
|
|
}
|
|
break;
|
|
case eCRK_ABILITY_BY:
|
|
{
|
|
string_index = 2090;
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
because_string);
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
break;
|
|
case eCRK_ABILITY_TO:
|
|
{
|
|
string_index = 2094;
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
because_string);
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
break;
|
|
case eCRK_DAMAGE_TO:
|
|
{
|
|
if (is_critical == true)
|
|
{
|
|
string_index = 2093;
|
|
|
|
text_color = WzColor_RGBA(142, 242, 255, 255);
|
|
}
|
|
else
|
|
{
|
|
string_index = 2097;
|
|
|
|
text_color = WzColor_RGBA(255, 255, 255, 255);
|
|
}
|
|
|
|
g_InterfaceManager.GetInterfaceString(string_index, format_string);
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, format_string,
|
|
time->tm_hour,
|
|
time->tm_min,
|
|
time->tm_sec,
|
|
damage,
|
|
because_string);
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
uiCombatRecordMan* ui_combat_record_manager = GET_DIALOG_MANAGER(uiCombatRecordMan, UIMAN_COMBAT_RECORD);
|
|
if (ui_combat_record_manager == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ui_combat_record_manager->AddData(combat_record_kind, result_string, text_color);
|
|
}
|
|
|
|
void GlobalFunc::WriteDeadCombatRecord( const BYTE& dead_type, const DWORD& dead_data )
|
|
{
|
|
uiCombatRecordMan* ui_combat_record_manager = GET_DIALOG_MANAGER(uiCombatRecordMan, UIMAN_COMBAT_RECORD);
|
|
if (ui_combat_record_manager == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR total_result_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
switch (dead_type)
|
|
{
|
|
case eCHAR_DEAD_INFO_NONE: // 알수 없음
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
case eCHAR_DEAD_INFO_KILL_PLAYER: // 플레이어를 죽였을 경우
|
|
case eCHAR_DEAD_INFO_KILL_TO_PLAYER: // 플레이어에게 죽었을 경우
|
|
{
|
|
Object* target_object = g_ObjectManager.GetObject(dead_data);
|
|
if (target_object)
|
|
{
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
if (dead_type == eCHAR_DEAD_INFO_KILL_PLAYER)
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(2098, format_string);
|
|
Snprintf(total_result_string, INTERFACE_STRING_LENGTH-1, format_string, target_object->GetName());
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_TO, total_result_string, WzColor_RGBA(0, 150, 250, 255));
|
|
}
|
|
else
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(2096, format_string);
|
|
Snprintf(total_result_string, INTERFACE_STRING_LENGTH-1, format_string, target_object->GetName());
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_BY, total_result_string, WzColor_RGBA(255, 0, 0, 255));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case eCHAR_DEAD_INFO_KILL_MONSTER: // 몬스터를 죽였을 경우
|
|
case eCHAR_DEAD_INFO_KILL_TO_MONSERT: // 몬스터에게 죽었을 경우
|
|
{
|
|
Object* target_object = g_ObjectManager.GetObject(dead_data);
|
|
BASE_NPCINFO* npc_info = NPCInfoParser::Instance()->GetNPCInfo(dead_data);
|
|
if (npc_info)
|
|
{
|
|
TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR temp_string2[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR grade_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR name_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
BOOL bGrade = TRUE;
|
|
switch (npc_info->m_byGrade)
|
|
{
|
|
case eNPC_GENERAL: //11501 일반
|
|
case eNPC_MAPOBJECT_NPC:
|
|
g_InterfaceManager.GetInterfaceString(11501, grade_string);
|
|
break;
|
|
case eNPC_ELITE: //11503 정예
|
|
g_InterfaceManager.GetInterfaceString(11503, grade_string);
|
|
break;
|
|
case eNPC_LEADER: //11502 리더
|
|
g_InterfaceManager.GetInterfaceString(11502, grade_string);
|
|
break;
|
|
case eNPC_MIDDLEBOSS: //11504 캡틴
|
|
g_InterfaceManager.GetInterfaceString(11504, grade_string);
|
|
break;
|
|
case eNPC_BOSS: //11505 보스
|
|
g_InterfaceManager.GetInterfaceString(11505, grade_string);
|
|
break;
|
|
case eNPC_LUCKY_MONSTER: //11500 럭키
|
|
g_InterfaceManager.GetInterfaceString(11500, grade_string);
|
|
break;
|
|
case eNPC_MERCHANT_NPC:
|
|
bGrade = FALSE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
g_InterfaceManager.GetInterfaceString(npc_info->m_NCode, name_string, INTERFACE_STRING_LENGTH);
|
|
|
|
// 3240 LV %s
|
|
g_InterfaceManager.GetInterfaceString(3240, temp_string);
|
|
|
|
if (bGrade == TRUE)
|
|
{
|
|
Snprintf(temp_string2, INTERFACE_STRING_LENGTH-1, "%d %s(%s)",
|
|
npc_info->m_DisplayLevel,
|
|
name_string,
|
|
grade_string);
|
|
}
|
|
else
|
|
{
|
|
Snprintf(temp_string2, INTERFACE_STRING_LENGTH-1, "%d %s",
|
|
npc_info->m_DisplayLevel,
|
|
name_string);
|
|
}
|
|
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, temp_string, temp_string2);
|
|
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
|
|
if (dead_type == eCHAR_DEAD_INFO_KILL_MONSTER)
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(2098, format_string);
|
|
Snprintf(total_result_string, INTERFACE_STRING_LENGTH-1, format_string, result_string);
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_TO, total_result_string, WzColor_RGBA(0, 150, 250, 255));
|
|
}
|
|
else
|
|
{
|
|
g_InterfaceManager.GetInterfaceString(2096, format_string);
|
|
Snprintf(total_result_string, INTERFACE_STRING_LENGTH-1, format_string, result_string);
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_BY, total_result_string, WzColor_RGBA(255, 0, 0, 255));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case eCHAR_DEAD_INFO_KILL_TO_TRIGGER: // 트리거에 의해 죽었을 경우
|
|
{
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
TCHAR trigger_name_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
g_InterfaceManager.GetInterfaceString(2096, format_string);
|
|
g_InterfaceManager.GetInterfaceString(2091, trigger_name_string);
|
|
Snprintf(total_result_string, INTERFACE_STRING_LENGTH-1, format_string, trigger_name_string);
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_BY, total_result_string, WzColor_RGBA(255, 0, 0, 255));
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void GlobalFunc::WriteResurrectionRecord( Character* character_ptr )
|
|
{
|
|
if (character_ptr == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
uiCombatRecordMan* ui_combat_record_manager = GET_DIALOG_MANAGER(uiCombatRecordMan, UIMAN_COMBAT_RECORD);
|
|
if (ui_combat_record_manager == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TCHAR format_string[INTERFACE_STRING_LENGTH] = {0, };
|
|
g_InterfaceManager.GetInterfaceString(2073, format_string);
|
|
ui_combat_record_manager->AddData(eCRK_DAMAGE_BY, format_string, WzColor_RGBA(0, 255, 0, 255));
|
|
}
|
|
|
|
#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
|