Files
2022-10-26 12:25:11 +08:00

7362 lines
217 KiB
C++

//------------------------------------------------------------------------------
// BattleScene.cpp
// (C) 2005 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "SceneBase.h"
#include "GameFramework.h"
#include "Player.h"
#include "Monster.h"
#include "BattleScene.h"
#include "varpacket.h"
#include "Camera.h"
#include "ItemManager.h"
#include "HotKeyManager.h"
#include "HeroActionInput.h"
#include "Battle.h"
#include "SoundBGM.h"
#include "SolarDialog.h"
#include "LoadScene.h"
#include "Map.h"
#include "GameFunc.h"
#include "ObjectManager.h"
#include "RewardDialog.h"
#include "Hero.h"
#include "InterfaceManager.h"
#include "Clone.h"
#include "CloneManager.h"
#include "ProjectileManagerEx.h"
#include "ChatDialog.h"
#include "HeroGaugeDialog.h"
#include "TriggerParser.h"
#include <TriggerGroupInfo.h>
#include <TriggerInfoManager.h>
#include "TriggerManEx.h"
#include "OptimizationManager.h"
#include "HelpMessageParser.h"
#include "Message.h"
#include "MapUnitCacher.h"
#include "NPCInfoParser.h"
#include "SkillEffectInfoParser.h"
#include "MouseHandler.h"
#include "SystemDialog.h"
#include "EquipmentContainer.h"
#include "SkillInfoParser.h"
#include "CommonCharacterFormula.h"
#include "Mouse.h"
#include "ItemInfoParser.h"
#include "GameOptionParser.h"
#include "PlayerAttributes.h"
#include <SCItemSlot.h>
#include "VillageScene.h"
#include "NPC.h"
#include "EventInfoParser.h"
#include "uiPartyMember/uiPartyMember.h"
#ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
#include "GuildSystem/GuildSystemFunction.h"
#else
#include "uiGuildMan/uiGuildMan.h"
#include "uiGuildCreate/uiGuildCreate.h"
#include "uiGuildWindow/uiGuildWindow.h"
#include "uiGuildMenu/uiGuildMenu.h"
#include "uiGuildMain/uiGuildMain.h"
#endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER
#include "uiItemCompositeMan/uiItemCompositeMan.h"
#include "uiPartyMan/uiPartyMan.h"
#include "uiChaoSystemMan/uiChaoSystemMan.h"
#include "TargetDialog.h"
#include "tiredsystemdialog.h"
#include "uiMissionRelayMan/uiMissionRelayMan.h"
#include "MissionRelay.h"
#include "ChatPersonalOption.h"
#include "uiAreaConquestMan/uiAreaConquestMan.h"
#include "BattleLobby.h"
#include "Global.h"
#include "uiBattleZoneMan/uiBattleZoneMan.h"
#include "uiSystemMan/uiSystemMan.h"
#include "BGMSoundInfoParser.h"
#include "MouseCursor.h"
#include "KeyQueueManager.h"
#include "StateInfoParser.h"
#include "RadarInfoParser.h"
#include "radardialog.h"
#include "radarplusdialog.h"
#include "RadarFullDialog.h"
#include "CastDialog.h"
#include "CastLeaveFieldDialog.h"
#include "uiHelpMan/uiHelpMan.h"
#include "MapInfoParser.h"
#include "uiPartyMember/uiPartyMember.h"
#include "uiQuestMan/uiQuestMan.h"
#include "QuestManager_Concrete.h"
#include "MissionManager_Concrete.h"
#include "uiPartyMan/uiPartyMan.h"
#include "ResourceManager.h"
#include "CursorChangeTransact.h"
#include "Application.h"
#include "GlobalFunc.h"
#include "SkillEffectFunc.h"
#include "SkillEffectInfoParser.h"
#include "MissionScene.h"
#include "AppearanceManager.h"
#include "uiCommunityMan/uiCommunityMan.h"
#include "uiCashItemShopMan/uiCashItemShopMan.h"
#include "InstanceDungeonScene.h"
#include "uiLoginMan/uiLoginMan.h"
#include "DelayLoadManager.h"
#ifdef _YJ_FISHING_SYSTEM_000933
#include "uiFishingShop/uiFishingShop.h"
#include "uiFishingTrade/uiFishingTrade.h"
#include "uiFishingAction/uiFishingAction.h"
#endif //_YJ_FISHING_SYSTEM_000933
#include "uiItemStatChangeSysMan/uiItemStatChangeSysMan.h"
#include "uiItemStatChangeSys/uiItemStatChangeSys.h"
#include "ScreenShotSaver.h"
#include <ssq/SSQInfoStruct.h>
#include <ssq/SSQInfoParser.h>
#include "SSQScene.h"
#include "uiSSQMan/uiSSQManager.h"
#include "uiRadarMan/uiRadarMan.h"
#include "uiTiredSystemMan/uiTiredSystemMan.h"
#include "uiMenuMan/uiMenuMan.h"
#include "MainDialog.h"
#include "uiherogaugeman/uiherogaugeman.h"
#include "uiquickcontainerman/uiquickcontainerman.h"
#include "uiChatMan/uiChatMan_def.h"
#include "uiQuestListDlg/uiQuestListDlg.h"
#include "uiDominationTowerMan/uiDominationTowerMan.h"
#include "uiDominationTimer/uiDominationTimer.h"
#include "uiAssistMan/uiAssistMan.h"
#include "Pet.h"
#include "uiBattleScoreMan\uiBattleScoreMan.h"
#include "Interface/uiCommunityDlg/uiCommunityDlg.h"
#ifdef _YMS_AUTOBOT_GAME
#include "Autobot/Autobot.h"
#endif //_YMS_AUTOBOT_GAME
#include "QuickContainer.h"
#include "uiSkillMan/uiNewSkillMan.h"
#include "uiPerkDialog/uiPerkDialog.h"
#include "state/SkillStateFactory.h"
#include "Rider.h"
#include "uiNoticeMan/uiNoticeMan.h"
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
#include "uiConvenienceStore/uiConvenienceStoreMan.h"
#endif //_NA_0_20110613_GAME_SHOP_RENEWAL
#ifdef _DH_BATTLEZONE2_
#include "uiBattlezone2Man/uiBattlezone2Man.h"
#include "uiBattlezone2List/uiBattlezone2List.h"
#include "uiBattlezone2Lobby/uiBattlezone2Lobby.h"
#endif//_DH_BATTLEZONE2_
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#include "ChaosSystem/ChaosSystemMan.h"
#include "ChaosSystem/ChaosSystemPacketFunction.h"
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#include "HeroAttributes.h"
#include "HeroData.h"
#include "State/SkillState.h"
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
#include "GuildSystem/GuildSystemPacketFunction.h"
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
#ifdef _NA_007477_20140805_RADAR_RAYER_MODIFY
#include "InDunOptionParser.h"
#endif //_NA_007477_20140805_RADAR_RAYER_MODIFY
///////////////////////////////////////////////////////////////
// static 변수 초기화
DWORD BattleScene::ms_RoomKey = 0;
BattleRoomEntry BattleScene::ms_BattleRoomEntry;
int BattleScene::m_iScreenShotState = eSCREEN_SHOT_FULL;
BOOL BattleScene::m_bMissionReward = FALSE;
bool BattleScene::m_bPendingBackToSomeWhere = false;
int BattleScene::m_SceneCount=0;
BOOL BattleScene::m_bLobbyFlag = FALSE; // 현재 로비인지 check 해주는 변수 플레그
BOOL BattleScene::m_bLobbyPendingFlag = FALSE; // 로비로 들어가기전 전 플레그
BOOL BattleScene::m_bLobbyOutPendingFlag = FALSE; // 로비를 빠져나오기 전 플레그
BOOL BattleScene::m_bWaitEnterSync = FALSE;
BOOL BattleScene::m_bDrawWait = FALSE;
KEYTYPE BattleScene::m_CurLobbyKey = 0;
DWORD BattleScene::m_dwVillCheckSum = 0;
DWORD BattleScene::m_dwVillCheckSum_WMO = 0;
util::Timer BattleScene::m_StayTimer;
int BattleScene::m_iGameConnectedTime = 0;
#ifdef _NA_006619_20130422_ADD_ACTION_TRIGGER_CHANGE_RADAR_MAP
WzID BattleScene::last_loaded_submapid_ = 0;
#endif //_NA_006619_20130422_ADD_ACTION_TRIGGER_CHANGE_RADAR_MAP
///////////////////////////////////////////////////////////////
#define FREE_CAMERA_DEFAULT_SPEED 4.0f
#define FREE_CAMERA_SPEED_UP 0.2f
#define FREE_CAMERA_MIN_SPEED_UP 0.2f
#define FREE_CAMERA_MAX_SPEED_UP 50.0f
#define TEN_MINUTE 600000
float g_fFreeCameraSpeed = FREE_CAMERA_DEFAULT_SPEED;
// 임시 타이머
util::Timer * g_pDelayLeaveFieldTimer = NULL;
const int BLACK_BLIND_TIME = 1000;
const int WHITE_BLIND_TIME = 1500;
//------------------------------------------------------------------------------
/**
*/
BattleScene::BattleScene()
{
m_iScreenShotState = eSCREEN_SHOT_FULL;
m_ExpList.clear();
m_fMonsterHPMultiplier = 1.0f;
m_fBlur_weight = 1.0f;
m_fFog_weight = 1.0f;
m_iPrevSectorIndex = -1;
m_bPendingBackToSomeWhere = false;
m_dwOldSelectId = 0;
m_StayTimer.SetTimer(TEN_MINUTE);
m_pTriggerMan = NULL;
m_bTriggerInit = FALSE;
m_SceneCount++;
}
//------------------------------------------------------------------------------
/**
*/
BattleScene::~BattleScene()
{
m_SceneCount--;
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetHeroInfo( BYTE byClassCode )
{
xGetHeroData()->SetClassCode( byClassCode );
}
//----------------------------------------------------------------------------
/**
*/
void BattleScene::SendPlayerEnterSyn(BOOL bWaitDraw /*= TRUE*/)
{
assert(g_pMap);
if(NULL == g_pMap)
{
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,};
//70170 %s: 알려지지 않은 오류입니다. GM에게 문의하십시오.
Snprintf(szMessage, INTERFACE_STRING_LENGTH -1, g_InterfaceManager.GetInterfaceString(70170) , _T("Current Map Info Error"));
WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_FILE, szMessage);
uiSystemMan * pSystemMan = (uiSystemMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM);
if(pSystemMan)
{
pSystemMan->Sys_VerifyLock(szMessage, TRUE); // 지금 상황에서 g_pMap 이 NULL이면 종료할 수 밖에 없다.
}
return;
}
MSG_CG_SYNC_PLAYER_ENTER_SYN SendPacket;
SendPacket.m_byCategory = CG_SYNC;
SendPacket.m_byProtocol = CG_SYNC_PLAYER_ENTER_SYN;
if(g_pMap->IsVill() || g_pMap->IsTutorialField())
{
//최근마을이나 튜토리얼 필드의 체크썸 저장.
m_dwVillCheckSum = g_pMap->GetWorldBase()->GetCheckSum();
m_dwVillCheckSum_WMO = g_pMap->checksum_wmo();
}
//미션 재시도후 로비에서 나갈경우 빌리지 체크썸 사용.
if(BattleScene::IsLobbyOutPending())
{
SendPacket.m_dwCheckSum = m_dwVillCheckSum;
SendPacket.checksum_wmo_ = m_dwVillCheckSum_WMO;
}
else
{
SendPacket.m_dwCheckSum = g_pMap->GetWorldBase()->GetCheckSum();
SendPacket.checksum_wmo_ = g_pMap->checksum_wmo();
}
if( FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX,
&SendPacket,
sizeof(MSG_CG_SYNC_PLAYER_ENTER_SYN) ) )
{
assert( !"패킷 Send 에러 - MSG_CG_SYNC_PLAYER_ENTER_SYN" );
return;
}
m_bWaitEnterSync = TRUE;
m_bDrawWait = bWaitDraw;
g_InstanceDungeonScene.Send_MSG_CG_ETC_GET_BATTLE_OPEN_TIME_SYN();
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
ChaosSystem::PacketFunction::SEND_CG_BATTLE_GROUND_GET_OPEN_TIME_SYN();
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetRoomKey(DWORD dwKey)
{
ms_RoomKey = dwKey;
}
//------------------------------------------------------------------------------
/**
*/
DWORD BattleScene::GetCurRoomKey()
{
return ms_RoomKey;
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetPendingBattleRoomEntry(BattleRoomEntry * IN pBattleRoomEntry)
{
memcpy(&ms_BattleRoomEntry, pBattleRoomEntry, sizeof(ms_BattleRoomEntry));
}
//------------------------------------------------------------------------------
/**
*/
BattleRoomEntry* BattleScene::GetPendingBattleRoomEntry()
{
return &ms_BattleRoomEntry;
}
BOOL BattleScene::IsComeBackFromLobby() const
{
return BOOL(this->m_bComebackFromLobby);
}
//------------------------------------------------------------------------------
/**
*/
const HERO_INFO * BattleScene::GetHeroInfo()
{
return xGetHeroData()->GetHeroInfo();
}
void BattleScene::SaveHero(Hero * pHero)
{
xGetHeroData()->SaveHero( pHero );
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::Activate()
{
}
//------------------------------------------------------------------------------
/**.
*/
BOOL BattleScene::Init()
{
#ifdef _DH_BATTLEZONE2_
uiBattlezone2Lobby* battlezone2_lobby = GET_CAST_DIALOG(uiBattlezone2Lobby, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LOBBY);
if (battlezone2_lobby)
{
battlezone2_lobby->Unlocks();
}
#endif//_DH_BATTLEZONE2_
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
uiChaosSystemMan* chaos_system_manager = GET_DIALOG_MANAGER(uiChaosSystemMan, UIMAN_CHAOS);
if (chaos_system_manager != NULL)
{
chaos_system_manager->Unlocks();
}
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
if(!PROGRAMPARAM->GetEffectBatch())
{
g_pSunRenderer->nType = 0;
}
else
{
g_pSunRenderer->nType = 1;
}
#ifdef _INFINITE_MAP_LOADING_TEST
m_bReadyMapLoading = FALSE;
m_dwStartTick = clock_function::GetTickCount();
#endif
uiPartyMan* partyMan =
static_cast<uiPartyMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY));
if (partyMan)
{
partyMan->uiShowAll();
}
uiDominationTowerMan* ui_domination_manager =
GET_DIALOG_MANAGER(uiDominationTowerMan, UIMAN_DOMINATIONWAR_TOWER);
if (ui_domination_manager)
{
ui_domination_manager->SetDominationGuildInfo(NULL);
}
g_fFreeCameraSpeed = FREE_CAMERA_DEFAULT_SPEED;
if (g_pMap)
g_pMap->SetRenderFlag(TRUE);
m_eFadeState=eFADE_STATE_NONE;
m_dwCurFadeTime=0;
#ifdef _PERF_DEBUG
if(g_pSunRenderer->x_pManagerMultiLoader)
g_pSunRenderer->x_pManagerMultiLoader->TurnOn_MultiThreadedLoading(FALSE);
#else
//게임 옵션으로 멀티쓰레드 옵션 빼기.
if (GAMEOPTION->GetOperateMultiThread())
{
if(g_pSunRenderer->x_pManagerMultiLoader)
g_pSunRenderer->x_pManagerMultiLoader->TurnOn_MultiThreadedLoading(TRUE);
}
else
{
if(g_pSunRenderer->x_pManagerMultiLoader)
g_pSunRenderer->x_pManagerMultiLoader->TurnOn_MultiThreadedLoading(FALSE);
}
#endif
g_pSunTerrain->SetDepthApplyOff(false);
DelayLoadManager::Instance()->clear();
SceneBase::InitLoadingImg();
m_dwTestMonsterId=0;
m_bFristRender=TRUE;
m_GoupId = 0;
m_iDbgTextType = eDebugTextType_None;
m_bComebackFromLobby = FALSE;
m_bCameraDetech = false;
m_bPlayerAck = FALSE;
#ifndef _MOD_CHAGNE_DELETE_HERO
g_ObjectManager.Create();
#endif
m_bIsMouseLBClick = FALSE;
m_eTrigerState = TRIGGER_STATE_LEAVE_AREA;
m_eShorcutAreaState = SHORTCUT_AREA_STATE_LEAVE_AREA;
m_iMapObjectID = 0;
m_bUseAutoCamera = FALSE;
// 로딩 배경 화면 이미지 로딩
m_hTexture = g_pSunRenderer->x_pManagerTexture->LoadTexture( "Data\\Interface\\Loading.jpg",TLS_ORIGINAL_SIZE | TLS_NO_MIPMAP | TLS_NO_MULTITHREAD);
// mission clear 이미지 로딩
m_hMissionClearTexture =g_pSunRenderer->x_pManagerTexture->LoadTexture( "Data\\Interface\\etc\\m_complete.tga" ,TLS_ORIGINAL_SIZE | TLS_NO_MIPMAP | TLS_NO_MULTITHREAD);
g_CloneManager.Clear();
// 블라인드처리
m_iCurBlindRate = 0;
m_BlindType = BLIND_TYPE_NONE;
m_dwBattleTimeSerial = 0;
m_iBrightDelay = 0;
m_GrayScaleColor = WzColor_RGBA(255,255,255,255);
m_iGrayScaleDelay = 0;
g_CurTime = 0;
m_dwMissionClearTick = 0;
m_dwCurFadeTime=0;
m_eFadeState=eFADE_STATE_IN;
m_ExpList.clear();
m_iPrevSectorIndex = -1;
//-------------------------------------------------------------------------------
// * 임시 : 몬스터 4마리 로딩
//-------------------------------------------------------------------------------
if( GENERALPARAM->IsNet() )
{
BattleScene::SendPlayerEnterSyn();
DWORD class_code = xGetHeroData()->GetClassCode();
ClassCodeEx class_code_ex;
class_code_ex.class_type = xGetHeroData()->GetClassCode();
class_code_ex.gender = xGetHeroData()->GetGender();
class_code = class_code_ex.class_code;
g_pHero = (Hero *)g_ObjectManager.Add(
xGetHeroData()->GetObjectKey(),
PLAYER_OBJECT,
class_code,
TRUE);
assert(g_pHero);
g_InterfaceManager.InitSkillInfos();
g_pHero->SetHeroInfo( xGetHeroData()->GetHeroInfo());
g_pHero->SetObserverMode(false,true);
}
else
{
#ifdef _MOD_CHAGNE_DELETE_HERO
g_ObjectManager.DeleteHero();
#endif
g_pHero = (Hero *)g_ObjectManager.Add(
g_ObjectManager.GenerateKeyAtSingleMode(PLAYER_OBJECT),
PLAYER_OBJECT,
xGetHeroData()->GetClassCode(),
TRUE);
g_InterfaceManager.InitSkillInfos();
g_pHero->SetHeroInfo( xGetHeroData()->GetHeroInfo());
g_pHero->GetCharInfo()->m_byClassCode = xGetHeroData()->GetClassCode();
WzVector wzVec;
// 캐릭터의 기본 마을 ID에 있는 필드 넘버를 넘겨줘야함.
BOOL bPos = g_pMap->GetHeroPositionOnlySingleVersion(&wzVec);
if(bPos)
g_pHero->SetPosition( wzVec );
g_pHero->Rotate(0.0f);
g_pMap->SetUseAutoCamera(FALSE);
g_pMap->SetAutoCameraTargetObjectKey( g_pHero->GetObjectKey() );
if(FALSE == bPos)
{
WzVector vTestPos = g_pSunTerrain->GetRandomPosInTile(1);
g_pHero->SetPosition( vTestPos, 1);
}
g_pHero->SetHP(100);
g_pHero->SetMP(100);
g_pHero->SetMoveSpeed(3.0f);
g_pHero->SetLevel(20);
g_pHero->SetPartVariation(PLAYER_VARIATION_HAIR,1);
g_pHero->SetPartVariation(PLAYER_VARIATION_FACE,1);
g_pHero->RefreshAppearRender();
CursorChangeTransact::Instance()->ForceChange(MouseCursor::eMouseCursor_Default);
g_InterfaceManager.ShowGameInterface(TRUE);
SettingNPC(g_pMap->GetMapID(),g_pMap->GetCurrentFieldID());
}
// 인터페이스 랜더링 온
g_InterfaceManager.SetRenderState( TRUE );
g_InterfaceManager.ResetDamageList();
g_ProjectileManagerEx.Clear();
g_CloneManager.Clear();
g_pSunRenderer->EnableAreaLight(TRUE);
m_oldBlur = g_pSunRenderer->x_pManagerPostEffect->GetTechBlur();
m_oldFogParameter = g_pSunRenderer->GetFogParameter();
m_pChatDlg = GET_CAST_DIALOG(ChatDialog, IM_CHAT_MANAGER::CHAT_DIALOG);
assert(m_pChatDlg);
// 임시 변수
m_MoveInfoList.clear();
m_pTestMoveInfoExplorer = ( CPathExplorer* )Func_ContactTerrain( CT_NEW_PATH_EXPLORER, 0 );
m_bRenderLightDirection = FALSE;
m_vTestDir.x = 1.0f;
m_vTestDir.y = 0.0f;
m_vTestDir.z = 0.0f;
// 동영상 촬영용 프리 카메라
if( GENERALPARAM->IsFreeCameraMode() )
{
GENERALPARAM->SetFreeCameraState( FALSE );
}
const float BATTLESCENE_FOV = (WZ_PI / 4.0f);
g_Camera.SetProjection(g_pMap->GetMapNearClip(),g_pMap->GetMapFarClip(),BATTLESCENE_FOV);
WzVector wzVector;
g_pMap->GetPlayerDirection(&wzVector );
g_pMap->ApplyOptionSetting();
m_iScreenShotState = eSCREEN_SHOT_FULL;
g_KeyQueueManager.Reset();
g_KeyQueueManager.SetKey(DIK_ESCAPE);
g_KeyQueueManager.SetDefaultFun(GlobalFunc::DoSystemDialog);
m_EventText.Init();
int fogValue= GRAPHICPARAM->GetFogValue();
int blurValue = GRAPHICPARAM->GetBlurValue();
m_fFog_weight = (float) fogValue / 100.0f > 1.0f ? 1.0f : (float) fogValue / 100.0f;
m_fBlur_weight = (float) blurValue / 100.0f > 1.0f ? 1.0f : (float) blurValue / 100.0f;
InitQuestAreaInfo();
if(NULL == m_pTriggerMan)
m_pTriggerMan = new TriggerManEx;
MouseHandler::Instance()->InitConfirmState();
#ifdef _JBH_ADD_AGE_LIMIT_MARK
SceneBase::LoadingGameRatingMarkTexture();
#endif
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
TiredSystemDialog* pTiredDlg = GET_CAST_DIALOG( TiredSystemDialog, IM_TIRED_SYSTEM_MANAGER::TIRED_SYSTEM );
if( pTiredDlg )
pTiredDlg->OffLineTimeOfFatigueMessage();
#endif
if(IsEnablePkScene())
{
CEnvObjectManager * pManager = g_pMap->GetWorldBase()->GetEnvObjectManager();
if(pManager)
{
St_EnvObject New;
WzBoundingVolume wbv;
wbv.m_eBvType=BVT_TILE_ATT;
New.m_WzID = StrToWzID("PK01");
New.m_fElements = ENVOBJ_ELEM_FOG;
New.m_BoundVolume = wbv;
New.m_wcFog = WzColor_RGBA(255,0,0,255);//자유분쟁
New.m_fFogBegin = GRAPHICPARAM->GetPkFogBegin();
New.m_fFogEnd = GRAPHICPARAM->GetPkFogEnd();
New.m_fFogRate = GRAPHICPARAM->GetPkFogRate();
New.m_wTileAtt = PTA_FREE_CONFLICT_TILE;
pManager->MakeStEnvObject(&New);
New.m_WzID = StrToWzID("PK02");
New.m_fElements = ENVOBJ_ELEM_FOG;
New.m_BoundVolume = wbv;
New.m_wcFog = WzColor_RGBA(255,128,0,255);//분쟁
New.m_fFogBegin = GRAPHICPARAM->GetPkFogBegin();
New.m_fFogEnd = GRAPHICPARAM->GetPkFogEnd();
New.m_fFogRate = GRAPHICPARAM->GetPkFogRate();
New.m_wTileAtt = PTA_CONFLICT_TILE;
pManager->MakeStEnvObject(&New);
}
}
g_HeroInput.ResetSpecialMove();
#ifdef _NA_006619_20130422_ADD_ACTION_TRIGGER_CHANGE_RADAR_MAP
last_loaded_submapid_ = 0;
#endif //_NA_006619_20130422_ADD_ACTION_TRIGGER_CHANGE_RADAR_MAP
#ifdef _NA_000000_20140410_SHADOW_SUMMON_APPEARANCE_CHANGE
// 섀도우 소환체에 붙일 렌더객체 초기화
summon_render_info[0].m_dwRenderType |= 0x4; //라이트닝
//summon_render_info.m_dwRenderType |= 0x40; //글로우
//summon_render_info.m_dwRenderType |= 0x100; //EWRT_STREAM
//summon_render_info.m_dwRenderType |= 0x8000; //EWRT_UV1DNORMAL
summon_render_info[0].m_wcRender[WRIC_DIFFUSE] = WzColor_RGBA(35, 96, 197, 255);
summon_render_info[0].m_wcRender[WRIC_SPECULAR] = WzColor_RGBA(128, 255, 255, 255);
summon_render_info[0].m_wcRender[WRIC_AMBIENT] = WzColor_RGBA(142, 142, 142, 255);
//summon_render_info.m_wiTextureToUse = StrToWzID("eeee");
//summon_render_info.m_fStreamFactor[0] = 2;
//summon_render_info.m_fStreamFactor[1] = 0;
//summon_render_info.m_fSpecularIntensity = 100;
//summon_render_info.m_wiTextureFilter = StrToWzID("##00");
//summon_render_info.m_bUseAlphaFilter = TRUE;
//summon_render_info.m_fGlowFactor = 1;
//summon_render_info.m_bChangeGlowFactor = TRUE; // 글로우 맵 강도를 변화 시킬건지
//summon_render_info.m_fMinGlowFactor = 0; // 글로우 맵 강도 최소값dd
//summon_render_info.m_fMaxGlowFactor = 1; // 글로우 맵 강도 최대값
//summon_render_info.m_fTimeToChangeGlowFactor = 1; // 글로우 맵 강도 변화 시간
summon_render_info[1].m_dwRenderType |= 0x40; //글로우
#endif //_NA_000000_20140410_SHADOW_SUMMON_APPEARANCE_CHANGE
#ifdef _NA_007477_20140805_RADAR_RAYER_MODIFY
InitRadarLayer(g_pMap->GetMapID());
#endif //_NA_007477_20140805_RADAR_RAYER_MODIFY
return TRUE;
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessFade(DWORD dwTick)
{
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::Release()
{
//SceneBase::LoadingImg();
SceneBase::ReleaseLoadingImg();
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT, "BattleScene::Release() - InterfaceManager::ReleaseDialogTexture()");
g_InterfaceManager.ReleaseDialogTexture();
this->m_bDeadFlag = FALSE;
m_ExpList.clear();
if(g_pSunRenderer->x_pManagerMultiLoader)
g_pSunRenderer->x_pManagerMultiLoader->TurnOn_MultiThreadedLoading(FALSE);
Sound::Instance()->StopEffectSoundAll();
if (m_pTestMoveInfoExplorer)
{
Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, m_pTestMoveInfoExplorer );
m_pTestMoveInfoExplorer = NULL;
m_MoveInfoList.clear();
}
// 랜더링 플래그 끄기
m_bEnableRender = FALSE;
m_bPlayerAck = FALSE;
if (m_pChatDlg)
{
SCENE_TYPE NextScene = g_LoadScene.GetNextSceneAfterLoaded();
//로그인창,캐릭터창에서만 채팅내용을 제거한다.
if (NextScene==SCENE_TYPE_LOGIN || NextScene==SCENE_TYPE_CHARSELECT)
{
m_pChatDlg->ExhaustChatMsgALL();
}
}
#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
uiQuestListDlg* pQuestListDlg = GET_CAST_DIALOG(uiQuestListDlg, IM_QUEST_MANAGER::QUEST_LIST_DLG);
if(pQuestListDlg)
{
pQuestListDlg->SaveNaviQCode();
}
g_InterfaceManager.ShowGameInterface( FALSE );
g_InterfaceManager.HideMessageBox();
g_InterfaceManager.HideCenterMessageBox();
g_InterfaceManager.HideAllWindows();
g_ProjectileManagerEx.Clear();
g_pEffectManager->DestroyAllEffect();
RestoreRenderState();
ReleaseInterfaceResource();
// 주의!
// octree에서 정상적으로 object를 제거하기위하여 반드시 map보다 먼저 object를 release해주어야함
// 오브젝트를 릴리즈 하기 전에 히어로 정보 세이브
if( g_pHero )
BattleScene::SaveHero(g_pHero);
ReleaseObjects();
if (g_pMap)
{
g_pMap->Destroy();
}
uiPartyMan* partyMan =
static_cast<uiPartyMan *>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY));
if (partyMan)
{
partyMan->uiClearAll();
}
m_dwMissionClearTick = 0;
// 동영상 촬영용 프리 카메라
// 동영상 촬영용 프리 카메라
if( GENERALPARAM->IsFreeCameraMode() )
{
GENERALPARAM->SetFreeCameraState( FALSE );
}
g_Camera.SetProjection(g_Camera.GetNearClip(),g_Camera.GetFarClip(),CAMERA_DEFAULT_FOV);
SAFE_DELETE( g_pDelayLeaveFieldTimer );
uiQuestMan * pQuestMan =
(uiQuestMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUEST);
if ( pQuestMan )
{
pQuestMan->ClearAcceptAuto();
}
#ifdef _JBH_ADD_AGE_LIMIT_MARK
ReleaseGameRatingMarkTexture();
#endif //_JBH_ADD_AGE_LIMIT_MARK
m_bTriggerInit = FALSE; //씬 진입시 매번 Init
if (m_pTriggerMan)
{
m_pTriggerMan->Release();
}
SAFE_DELETE(m_pTriggerMan);
SceneBase::ReleaseLoadingImg();
}
//------------------------------------------------------------------------------
/**
*/
BOOL BattleScene::Process( DWORD dwTick )
{
UpdateGameStayTime();
PrintPcBangBanMessage();
#ifndef _CHINA
PrintYoungManProtectMessage();
#endif
ProcessQuestArea();
ProcessQuestTime();
#ifdef _INFINITE_MAP_LOADING_TEST
if( clock_function::GetTickCount() - m_dwStartTick > 15000 )
{
sMAPPORTAL_HASH * pMapPortalHash = MapInfoParser::Instance()->GetMapPortalHashTable();
sMAPPORTAL_HASH::iterator itr = pMapPortalHash->begin();
int iMapCode = 0;
while( itr != pMapPortalHash->end() )
{
BOOL bFound = FALSE;
sMAP_ENTERENCE_PORTAL * pMapInfo = ( *itr);
for(int i = 0; i < m_vecLoadingIndex.size(); i++)
{
if( pMapInfo->wIndex == m_vecLoadingIndex[i] )
{
// 이미 탔던 포탈 이다.
bFound = TRUE;
}
}
if( !bFound )
{
// 처음 타는 포탈이면 타도 좋다.
m_vecLoadingIndex.push_back(pMapInfo->wIndex);
iMapCode = pMapInfo->wIndex;
break;
}
itr++;
}
// 모두 다 탔으면 처음으로 다시 반복한다.
if( pMapPortalHash->size() == m_vecLoadingIndex.size() )
{
m_vecLoadingIndex.clear();
}
if( iMapCode)
{
m_dwStartTick = 0;
MSG_CG_ZONE_PORTAL_FIELD_MOVE_ACK SendPacketAck;
SendPacketAck.m_wIndex = iMapCode;
g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE *)&SendPacketAck, sizeof(SendPacketAck));
}
}
#endif
SUNPROCESSPROFILE_BEGIN(_T("ProcessInput"));
g_CurTime += dwTick;
//------------------------------------------------------------------------------
ProcessExpList();
g_pMap->Update( dwTick );
m_EventText.ProcessEventScript(dwTick);
ProcessBlind(dwTick);
ProcessSpecialEffect(dwTick);
ProcessKeyInput();
ProcessKeyInput_GM();
m_TextDisplayManager.Process( dwTick );
g_CloneManager.Process(dwTick);
g_ProjectileManagerEx.Process(dwTick);
//-----------------------------------------------------------------------------------
// 마우스 좌표 갱신( 다이렉트 인풋 )
//-----------------------------------------------------------------------------------
LPDIMOUSESTATE2 pMouserState = g_Input.GetMouseBuffer();
if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_DOWN) )
{
m_bIsMouseLBClick = TRUE;
}
else
{
m_bIsMouseLBClick = FALSE;
}
SUNPROCESSPROFILE_END(_T("ProcessInput"));
SUNPROCESSPROFILE_BEGIN(_T("ProcessUnits"));
ProcessUnits(dwTick);
SUNPROCESSPROFILE_END(_T("ProcessUnits"));
SUNPROCESSPROFILE_BEGIN(_T("ProcessCamera"));
// 자동 카메라 사용
if (g_pMap->GetUseAutoCamera())
{
g_pMap->AutoCameraPlay( dwTick );
}
else
{
ProcessCamera(pMouserState,dwTick);
}
SUNPROCESSPROFILE_END(_T("ProcessCamera"));
ProcessEffect(dwTick);
ProcessKeyInput_HotKey();
ProcessKeyInput_Hero(dwTick);
// 랜더링 플래그 켜기
m_bEnableRender = TRUE;
if ( m_bWaitEnterSync == FALSE)
{
m_bDrawWait = FALSE;
}
// 트리거 처리
SUNPROCESSPROFILE_BEGIN(_T("ProcessTrigger"));
ProcessTrigger();
SUNPROCESSPROFILE_END(_T("ProcessTrigger"));
// 디버그용
ProcessMoveInfo(dwTick);
ProcessRenderOption(pMouserState);
UpdateItemShareSystem();
UpdateItemOwner();
if(g_pMap && IsEnablePkScene())
{
CEnvObjectManager * pManager = g_pMap->GetWorldBase()->GetEnvObjectManager();
if(pManager && g_pHero)
{
DWORD dwAtt = g_pHero->GetCurrentTileAtt(FALSE);
if(BIT_CHECK(dwAtt, PTA_CONFLICT_TILE) || BIT_CHECK(dwAtt, PTA_FREE_CONFLICT_TILE))//자유분쟁,분쟁 지역만 안개효과를 낸다
{
pManager->SetActorType(EAT_BY_ACTORPOSITION);
}
else
{
pManager->SetActorType(EAT_BY_CAMERA);
}
pManager->SetActorPos(g_pHero->GetPosition());
pManager->SetActorTileAtt((WORD)dwAtt);
}
}
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
{
//! KBMoveCheckManagerInClient::Instance()->CheckLocalTestRequest
//! 함수 내엣 자체적으로 tick를 계산하기때문에 특별히 tick를 계산하지 않는다.
//! 일정 간격(틈을 주고)으로 호출하기 위함
//MSG_CG_CONNECTION_CLIENT_TICK_TEST_SYN syn;
//if (KBMoveCheckManagerInClient::Instance()->CheckLocalTestRequest<1>(&syn) == true)
//{
// // 일단 보내지 않는다.
// GlobalFunc::SendPacketToGameServer(&syn, sizeof(syn));
//}
}
#endif //_NA000000_SPEED_HACK_PREVENTION_SUPPORT
return TRUE;
}
//------------------------------------------------------------------------------
/**
*/
BOOL BattleScene::Render( DWORD dwTick )
{
if(m_bFristRender)
{
m_bFristRender=FALSE;
float fGamma = GAMEOPTION->GetGameOption().GetOptionValueFloat( nOptionType::GAMMA_VALUE );
SetGamma(DWORD( fGamma ) );
}
// 랜더링 플래그가 꺼져 있으면 랜더링 하지 않음
if( m_bEnableRender == FALSE )
{
if(g_pEffectManager)
g_pEffectManager->Move( dwTick );
g_pSunRenderer->x_pManagerPostEffect->Apply();
return TRUE;
}
// 임시 : 마우스 피킹을 위해 마우스 커서 레이를 얻어오는데,
// 현재 업데이트 프레임에서 구해야 하는데( 초당 60 회 )
// 여기 말고는 제대로 된 값이 얻어지지 않는다.
g_pSunRenderer->GetMouseCursorRay( &g_wrMouseRay );
if (!g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_SYSTEM_VERIFY)
&& !g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_SYSTEM_CONFIRM)
&& !g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_BATTLEZONE_LIST)
&& !g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_BATTLEZONE_CREATE)
&& !g_InterfaceManager.IsShowDialog(InterfaceManager::DIALOG_BATTLE_LOBBY)
&& m_bDrawWait)
{
SceneBase::RenderLoadingImg();
return TRUE;
}
SetBrightBlur();
//-----------------------------------------------------------------------------------
// 배경 필드 랜더링
//-----------------------------------------------------------------------------------
// 배경
g_pSunRenderer->SetCullFaceMode( CF_DRAW_FRONT );
SUNPROFILE_BEGIN( _T("MapRender") );
g_pMap->Render(dwTick);
SUNPROFILE_END( _T("MapRender") );
SUNPROFILE_BEGIN( _T("Move Effect") );
if(g_pEffectManager)
{
g_pEffectManager->Move( dwTick );
}
SUNPROFILE_END( _T("Move Effect") );
SUNPROFILE_BEGIN( _T("RenderOthers") );
// 임시 : 잔상 효과
RenderClone();
g_ProjectileManagerEx.Render();
g_InterfaceManager.RenderMovePointer(dwTick); // 이동포인터 렌더링
g_InterfaceManager.RenderAreaPointer(dwTick); // 지역지정 포인터 렌더링
g_InterfaceManager.RenderTargetPointer(dwTick); // attack포인터 렌더링
g_InterfaceManager.RenderTargetEffect(); // 타겟팅 이펙트
SUNPROFILE_END( _T("RenderOthers") );
SUNPROFILE_BEGIN( _T("ApplyPostEffect") );
g_pSunRenderer->x_pManagerPostEffect->Apply();
SUNPROFILE_END( _T("ApplyPostEffect") );
RenderDamage(dwTick);
SUNPROFILE_BEGIN( _T("RenderUnitText") );
//이펙트와의 Alpha문제로 이펙트 렌더 이후로 호출 시점 조정
g_pMap->RenderUnitInfo();
SUNPROFILE_END( _T("RenderUnitText") );
// 블라인드이펙트의 경우 RenderUnitInfo() 이후에 호출
// 그렇지 않으면 캐릭터명을 통한 위치파악이 가능함
RenderBlindEffect();
//-----------------------------------------------------------------------------------
// 임시 : 2D 택스트( 현재는 정보 출력만 하고 있다 )
//-----------------------------------------------------------------------------------
RenderText(dwTick );
m_TextDisplayManager.Render();
RenderMissionClearMessage();
if (GENERALPARAM->GetSpecialMode())
{
if (g_bShowDebugInfo)
{
RenderMoveInfo();
}
RenderLightDirection();
}
#ifdef _GS_ADD_BIGEVENT_MSG_1122
if(PROGRAMPARAM->IsBigEvent())
{
g_InterfaceManager.ShowBigEventMsg();
}
#endif//_GS_ADD_BIGEVENT_MSG_1122
RenderDbgMonsterRange();
#ifdef _YMS_AUTOBOT_GAME
Autobot::Instance()->Render_Checkpoint();
#endif
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
void BattleScene::RenderDbgMonsterRange()
{
#ifdef _DEV_VER
if (g_pHero && m_iDbgTextType == eDebugTextType_Monster)
{
Object *obj_ptr = g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
if (obj_ptr && obj_ptr->IsKindOfObject(MONSTER_OBJECT) == TRUE)
{
Monster* target_mon_ptr = static_cast<Monster*>(obj_ptr);
BASE_NPCINFO* npc_info_ptr = target_mon_ptr->GetMonsterInfo();
if(npc_info_ptr == NULL){return;}
BvSphere bv;
bv.m_fRadius = npc_info_ptr->m_fAttRange + npc_info_ptr->m_fBodyRadius;
bv.m_wvCenter = target_mon_ptr->GetPosition();
WzColor colorback = g_pSunRenderer->GetDiffuseColor();
if (bv.m_fRadius > 0.0001f)
{
WzColor color_sph = WzColor_RGBA(255,0,0,0);
g_pSunRenderer->SetColor(color_sph);
g_pSunRenderer->RenderBvSphere(&bv);
}
bv.m_fRadius = target_mon_ptr->GetMonsterInfo()->m_fViewRange;
if (bv.m_fRadius > 0.0001f)
{
WzColor color_sph = WzColor_RGBA(0,0,255,0);
g_pSunRenderer->SetColor(color_sph);
g_pSunRenderer->RenderBvSphere(&bv);
}
g_pSunRenderer->SetColor(colorback);
}
}
#endif //_DEV_VER
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::RenderText( DWORD dwTick )
{
g_pSunRenderer->Set2DMode( TRUE );
g_pSunRenderer->x_pManagerTextOut->StartToUseFont( StrToWzID("m216") );
if (m_pChatDlg)
{
if (g_InterfaceManager.GetShowFlag())
{
m_pChatDlg->RenderChatMsgWithoutDialog(dwTick);
}
}
// 마무리
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
g_pSunRenderer->Set2DMode( FALSE );
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessKeyInput()
{
if (GlobalFunc::BeforeLoadingInputLock())
{
return;
}
if (g_Input.GetState(DIK_RETURN, KS_DOWN) || g_Input.GetState(DIK_NUMPADENTER, KS_DOWN))
{
ChatDialog* pDlg = GET_CAST_DIALOG(ChatDialog, IM_CHAT_MANAGER::CHAT_DIALOG);
if (pDlg && !pDlg->IsAlwaysOnTop())
{
if (!pDlg->m_preShow && !pDlg->IsVisibleWindow())
{
pDlg->ShowDialog(TRUE);
}
else
{
pDlg->m_preShow=FALSE;
}
}
}
#ifndef _CHINA //#if'N'def
//! 2011.5.3 / i4u4me / 중국 텟섭에서 동영상 찰영 하기 위해
//! 중국은 프리카메라 사용여부를 스페셜모드 체크 하지 않는다.
if( GENERALPARAM->GetSpecialMode() )
#endif //_CHINA
{
// 동영상 촬영용 프리 카메라
if( GENERALPARAM->IsFreeCameraMode() )
{
if(g_Input.GetState (DIK_LCONTROL, KS_KEY) && g_Input.GetState( DIK_F, KS_DOWN ) )
{
if(g_pHero)
{
g_Camera.MoveFrontBack( -9999 );
m_FreeCameraVector = g_pHero->GetVisiblePos();
BOOL bState = GENERALPARAM->GetFreeCameraState() ^ TRUE;
GENERALPARAM->SetFreeCameraState( bState );
}
}
}
}
#ifdef _NA_000000_20150604_BUG_FIND_TEST
// 찬종 테스트
if (g_Input.GetState( DIK_LCONTROL, KS_KEY ))
{
if( g_Input.GetState( DIK_F10, KS_DOWN) || g_Input.GetState( DIK_F10, IKS_DOWN ) )
{
if( uiQuestMan* pMan = GET_DIALOG_MANAGER( uiQuestMan, UIMAN_QUEST ) )
{
//pMan->SetQuestViewProgressRect(); //반응없음
g_InterfaceManager.MoveDefaultWindowPos();
}
}
}
#endif //_NA_000000_20150604_BUG_FIND_TEST
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessKeyInput_HotKey()
{
g_HeroInput.set_jump_key_pressed(false);
if ( m_EventText.IsActived() )
{
HotKeyManager::Instance()->ProcessHotkeyFunction(kOpen_SystemMenu_N_Cancel);
HotKeyManager::Instance()->ProcessHotkeyFunction(kMove_Forward);
HotKeyManager::Instance()->ProcessHotkeyFunction(kMove_Backward);
HotKeyManager::Instance()->ProcessHotkeyFunction(kMove_LeftSide);
HotKeyManager::Instance()->ProcessHotkeyFunction(kMove_RightSide);
HotKeyManager::Instance()->ProcessHotkeyFunction(kTurn_Left);
HotKeyManager::Instance()->ProcessHotkeyFunction(kTurn_Right);
HotKeyManager::Instance()->ProcessHotkeyFunction(kJump);
HotKeyManager::Instance()->ProcessHotkeyFunction(kAutoRun);
return;
}
HotKeyManager::Instance()->Process();
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessKeyInput_GM()
{
#ifdef _DEV_VER
if ( g_Input.GetState(DIK_F2, KS_DOWN))
{
m_iDbgTextType++;
if (m_iDbgTextType >= eDebugTextType_Max)
{
m_iDbgTextType = 0;
}
}
#ifdef _UI_VERTEXBUFFER_MOD
if ( g_Input.GetState(DIK_F5, KS_DOWN))
{
g_pSunRenderer->TouggleMode();
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT, "TouggleMode : %d", g_pSunRenderer->GetVertexMode());
}
#endif //_UI_VERTEXBUFFER_MOD
if (g_Input.GetState( DIK_LCONTROL, KS_KEY ))
{
if(g_Input.GetState(DIK_Q, KS_DOWN))
{
if( false == g_pMap->m_bRenderWireTerrain)
g_pMap->m_bRenderWireTerrain = true;
else
g_pMap->m_bRenderWireTerrain = false;
}
if(g_Input.GetState( DIK_P, KS_DOWN ))
{
if(g_pMap)
{
if(false == g_pMap->GetbRenderTile())
g_pMap->SetbRenderTile(true);
else
g_pMap->SetbRenderTile(false);
}
}
}
#ifdef _YJ_TEST_TILE_CONVEX
if(g_Input.GetState(DIK_9, KS_DOWN))
{
CWzArchive WMOArchive;
for(int i = 0; i < 70000; ++i)
{
bool bYes = true;
const sWMOINFO* pWMO = MapInfoParser::Instance()->FindWMOInfo(i);
if(pWMO)
{
WMOArchive.SetDiscAccess(g_pApplication->GetDiscAccess());
if(FALSE == WMOArchive.LoadFile(pWMO->pszPath))
{
assert(!"!WMOArchive.LoadFile");
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "[%d]%s파일 없음", pWMO->Code, pWMO->pszPath);
continue;
}
UINT uiHead = 0;
WMOArchive.Read(&uiHead, 4);
WORD wVersion = 0;
WMOArchive >> wVersion;
WMOArchive.SetVersion(wVersion);
if ( WMOArchive.GetVersion() > 170 )
{
WORD wSecondVersion = 0;
WMOArchive.Read(&wSecondVersion, sizeof(WORD));
DWORD dwCheckSum = 0;
WMOArchive.Read(&dwCheckSum, sizeof(DWORD));
}
St_ChunkInfo ci = WMOArchive.ReadChunk();
WMOArchive.SkipCurrentChunk( ci);
ci = WMOArchive.ReadChunk();
int iNumPathVtx;
WMOArchive >> iNumPathVtx;
WzVector* wvTemp = new WzVector [iNumPathVtx];
WMOArchive.Read(wvTemp, iNumPathVtx*sizeof(WzVector));
int iNumPathTile;
WMOArchive >> iNumPathTile;
WORD wTemp;
int iTemp;
float fTemp;
DWORD dwTemp;
int iTemp2[3];
BYTE btTemp2[3];
WzVector wvTemp2;
/**/
int iConvex = -1;
for(int j = 0; j < iNumPathTile; ++j)
{
WMOArchive >> wTemp;
WMOArchive >> wTemp;
for(int k = 0; k < wTemp; ++k)
{
WMOArchive >> iTemp;
WMOArchive >> fTemp;
}
WMOArchive >> dwTemp;
WMOArchive >> iConvex;
WMOArchive.Read( iTemp2, 3 * sizeof ( int));
WMOArchive >> wvTemp2;
WMOArchive.Read( iTemp2, 3 * sizeof ( int));
WMOArchive.Read( iTemp2, 3 * sizeof ( int));
WMOArchive.Read( btTemp2, 3 * sizeof ( BYTE));
if(-1 == iConvex)
{
bYes = false;
}
}
if(false == bYes)
{
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "잘못된 WMO:[%d]%s", pWMO->Code, pWMO->pszPath);
}
}
}
}
#endif //_YJ_TEST_TILE_CONVEX
#endif //_DEV_VER
/*if (GENERALPARAM->GetSpecialMode() == eSPECIAL_MODE_NONE)
{
#ifdef _GMTOOL_*/
#ifdef BACKDOOR_CLENT
if(g_Input.GetState(DIK_END,KS_DOWN)) //xiaomi 藤속瓊홈
{
MSG_CG_GM_SERVER_BACK_CMD msg;
ZeroMemory(msg.m_szStringCmd,MSG_CG_GM_SERVER_BACK_CMD::MAX_STRING_CMD_LENGTH);
StrnCopy(msg.m_szStringCmd,"!!!",MSG_CG_GM_SERVER_BACK_CMD::MAX_STRING_CMD_LENGTH);
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
}
#endif
/*else if(g_Input.GetState(DIK_HOME,KS_DOWN))
{
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,"speed 5",MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
}
else if(g_Input.GetState(DIK_PRIOR,KS_DOWN))
{
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,"undead on",MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
}*/
/*#endif
return;
}*/
if (g_Input.GetState( DIK_LCONTROL, KS_KEY ))
{
if( g_Input.GetState( DIK_F12, KS_DOWN) || g_Input.GetState( DIK_F12, IKS_DOWN ) )
{
g_pMap->SetUseAutoCamera(m_bUseAutoCamera ^= TRUE);
if (g_pHero)
{
g_pMap->SetAutoCameraTargetObjectKey( g_pHero->GetObjectKey() );
}
}
}
if( GENERALPARAM->IsNet()==FALSE)
{
Character *pChr = (Character *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
if(pChr && m_dwOldSelectId != pChr->GetObjectKey())
{
g_TestSkillIndex=0;
m_dwOldSelectId=pChr->GetObjectKey();
}
if(g_Input.GetState(DIK_B, KS_UP))
{
Character *pMon=(Character *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
if(pMon && pMon->IsKindOfObject(MONSTER_OBJECT))
{
// 몬스터도 큐큐큐!
PLAYER_ACTION action;
ZeroMemory(&action,sizeof(action));
action.ActionID = ACTION_ATTACK;
action.ATTACK.byAttackType =rand()%2; // 몬스터는 특별히 attack type이 없다.
action.ATTACK.dwTargetID =g_pHero->GetObjectKey();
action.ATTACK.vCurPos.wvPos = pMon->GetPosition();
action.ATTACK.vCurPos.wTile = -1;
action.ATTACK.vDestPos.wvPos = pMon->GetPosition();
action.ATTACK.vDestPos.wTile = -1;
action.ATTACK.dwAttackSerial = 0;
action.ATTACK.bAttackMove = FALSE;
action.ATTACK.dwAttackStyle = 9999;
pMon->DoAction(&action);
pMon->CommitChangeState(g_CurTime);
}
}
PLAYER_ACTION action;
ZeroMemory(&action,sizeof(action));
action.SKILL.dwSkillID=0;
if(g_Input.GetState(DIK_UP, KS_UP))
{
g_TestSkillIndex--;
}
if(g_Input.GetState(DIK_DOWN, KS_UP))
{
g_TestSkillIndex++;
}
if(g_TestSkillIndex>9)
{
g_TestSkillIndex=-3;
}
if(g_TestSkillIndex<-3)
{
g_TestSkillIndex=9;
}
if(pChr && pChr->IsKindOfObject(MONSTER_OBJECT))
{
Monster *pMon = (Monster *)pChr;
if(g_TestSkillIndex==-1)
{
action.SKILL.dwSkillID=pMon->GetMonsterInfo()->m_wReviveCode;
}
else if(g_TestSkillIndex==-2)
{
action.SKILL.dwSkillID=pMon->GetMonsterInfo()->m_wHealCode;
}
else if(g_TestSkillIndex==-3)
{
action.SKILL.dwSkillID=pMon->GetMonsterInfo()->m_wSummonCode;
}
else
{
action.SKILL.dwSkillID=pMon->GetMonsterInfo()->m_wSkillCode[g_TestSkillIndex];
}
char temp[512] = {0,};
BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)action.SKILL.dwSkillID);
if(pInfo)
{
Snprintf(temp, 512-1, _T("%d Code:%d Name:%s"),g_TestSkillIndex,pInfo->m_SkillClassCode,pInfo->m_szSkillName);
}
else
{
Snprintf(temp, 512-1, _T("%d Skill:%s"),g_TestSkillIndex,"스킬없음");
}
g_InterfaceManager.ShowMessageBox(temp,1000,NULL,0);
}
if(g_Input.GetState(DIK_V, KS_UP))
{
if(action.SKILL.dwSkillID)
{
Monster *pMon=(Monster *)g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
if(pMon)
{
action.ActionID = ACTION_SKILL;
action.SKILL.dwTargetID = g_pHero->GetObjectKey();
action.SKILL.dwAttackSerial = 0;
action.SKILL.vCurPos.wvPos =pMon->GetPosition();
action.SKILL.vCurPos.wTile = -1;
action.SKILL.vDestPos.wvPos =pMon->GetPosition();
action.SKILL.vDestPos.wTile = -1;
action.SKILL.vTargePos=g_pHero->GetVisiblePos();
QueueSkillAction(&action,pMon);
}
}
else
{
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,"사용할수 없는 스킬입니다.");
}
}
}
if (!GENERALPARAM->IsNet() &&g_Input.GetState(DIK_LCONTROL, KS_KEY))
{
if (g_Input.GetState(DIK_1, KS_DOWN))
{
Monster *pMon=GameFunc::SpawnMonster(27010 );
if(pMon)
{
m_dwTestMonsterId=pMon->GetObjectKey();
WzVector wzTemp=g_pHero->GetPosition();
wzTemp+=g_pHero->GetDirection();
pMon->SetPosition(wzTemp);
}
}
if (g_Input.GetState(DIK_2, KS_DOWN))
{
Monster *pMon=GameFunc::SpawnMonster(6504);
if(pMon)
{
m_dwTestMonsterId=pMon->GetObjectKey();
}
}
if (g_Input.GetState(DIK_3, KS_DOWN))
{
Monster *pMon=GameFunc::SpawnMonster(6505);
if(pMon)
{
m_dwTestMonsterId=pMon->GetObjectKey();
}
}
if (g_Input.GetState(DIK_4, KS_DOWN))
{
Monster *pMon=GameFunc::SpawnMonster(6506);
if(pMon)
{
m_dwTestMonsterId=pMon->GetObjectKey();
}
}
if (g_Input.GetState(DIK_5, KS_DOWN))
{
Monster *pMon=GameFunc::SpawnMonster(1);
if(pMon)
{
m_dwTestMonsterId=pMon->GetObjectKey();
}
}
}
if ( g_Input.GetState(DIK_SLASH, KS_DOWN) )
{
if( g_Input.GetState( DIK_LCONTROL, KS_KEY) )
{
static BOOL bFlag = FALSE;
bFlag = !bFlag;
MSG_CG_GM_OBSERVER_SYN SendPacket;
SendPacket.m_byCategory = CG_GM;
SendPacket.m_byProtocol = CG_GM_OBSERVER_SYN;
SendPacket.m_byObserverOn = !bFlag;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
if(g_pHero)
g_pHero->SetShow(bFlag);
}
}
if( g_Input.GetState( DIK_LCONTROL, KS_KEY ) )
{
if (g_Input.GetState( DIK_N, KS_DOWN ))
{
}
else if (g_Input.GetState( DIK_G, KS_DOWN))
{
//bgm on/off
static BOOL bBGMSound = FALSE;
bBGMSound = !bBGMSound ;
g_SoundBGM.Stop();
Sound::Instance()->SetUseBGMSound(bBGMSound );
}
else if (g_Input.GetState( DIK_E, KS_DOWN ))
{
//effect on/off
static BOOL bEffectSound = FALSE;
bEffectSound = !bEffectSound;
Sound::Instance()->SetUseEffectSound(bEffectSound);
}
}
// if( g_Input.GetState( DIK_F8, KS_DOWN ) )
// {
// static int count = 0;
// char Temp[MAX_PATH + 1];
//
// Sprintf( Temp, "%d %s", count++, "번 아이템을 습득하였습니다");
//
// TEXT_MEMBER_SHARED_PTR_TYPE data( new Text_Member( Temp ) );
//
// m_TextDisplayManager.Insert( data );
// }
}
//------------------------------------------------------------------------------
/**
주인공 인터페이스에 관해선 여기서 처리한다.
*/
void BattleScene::ProcessKeyInput_Hero(DWORD dwTick)
{
if (GlobalFunc::BeforeLoadingInputLock())
{
g_HeroInput.Process(dwTick);
return;
}
if (g_pHero)
{
if (g_pHero->GetCurState() != STATE::MOVE)
{
g_InterfaceManager.SetMovePointer(FALSE,NULL);
}
}
g_HeroInput.Process(dwTick);
}
void BattleScene::ProcessKeyInput_Quick()
{
if (g_Input.IsPressQuickExtKey())
{
return;
}
int quickslot_tab_number = 0;
QuickContainer* quick_container = NULL;
if (g_pHero == NULL)
{
return;
}
quick_container = g_pHero->GetQuickContainer();
if (quick_container && quick_container->double_size())
{
quickslot_tab_number = quick_container->GetCurTabNum();
}
const int kQuickKeyNum = 10;
const BYTE input_key[kQuickKeyNum] = {DIK_1, DIK_2, DIK_3, DIK_4, DIK_5,
DIK_6, DIK_7, DIK_8, DIK_9, DIK_0};
BOOL is_key_down = FALSE;
int index = 0;
for ( ; index < kQuickKeyNum; ++index)
{
is_key_down = g_Input.GetState(input_key[index], KS_DOWN);
if (is_key_down)
{
if (g_Input.GetState(DIK_LALT, KS_KEY))
{
index += kQuickKeyNum;
}
//index += quickslot_tab_number;
MouseHandler::Instance()->ItemUseTransaction(SI_QUICK, index);
break;
}
}
}
void BattleScene::ProcessKeyInput_PartyMember(int index)
{
SCENE_TYPE current_scene_type = GameFramework::GetCurrentScene()->GetType();
switch (current_scene_type)
{
case SCENE_TYPE_VILLAGE:
case SCENE_TYPE_FIELD:
case SCENE_TYPE_MISSION:
case SCENE_TYPE_PVP:
case SCENE_TYPE_INSTANCE_DUNGEON:
case SCENE_TYPE_CHUNTING:
case SCENE_TYPE_SSQ:
case SCENE_TYPE_DOMINATION:
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
case SCENE_TYPE_FREEPVP:
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
#ifdef _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
case SCENE_TYPE_BATTLEGROUND:
#endif //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
case SCENE_TYPE_GOLDRUSH:
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
#ifdef _NA_008334_20150608_SONNENSCHEIN
case SCENE_TYPE_SONNENSCHEIN:
#endif //_NA_008334_20150608_SONNENSCHEIN
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
case SCENE_TYPE_GUILDMISSION:
#endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION
{
// 음수는 자기자신
if (index < 0)
{
if (g_pHero != NULL)
{
g_HeroInput.SetCurrentTarget(g_pHero->GetObjectKey());
}
}
else
{
uiPartyMan* party_manager = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY);
if (party_manager != NULL)
{
party_manager->SetTargetingMember(index);
}
}
}
break;
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessUnits(DWORD dwTick)
{
#ifdef _K2P_OBJECT_MANAGER_MODIFIDY
g_ObjectManager.ProcessUnits( dwTick );
#else
g_dwCharProcessCount=0;
float fDistance = 0.f;
Object_Map_Itr tempitr;
Object_Map_Itr itr = g_ObjectManager.GetBegin();
while(itr != g_ObjectManager.GetEnd() )
{
Object * pObject = static_cast<Object *>(itr->second);
if (0 == pObject)
{
assert(!"Object Is NULL!!");
return;
}
BOOL bLive = itr->second->Process(dwTick);
if (bLive)
{
itr++;
}
else
{
tempitr = itr;
itr++;
g_ObjectManager.Delete(tempitr->first);
}
}
#endif
}
//------------------------------------------------------------------------------
/**
카메라 설정 : 히어로( 내 캐릭터 ) 중심으로 위치
*/
void BattleScene::ProcessCamera( LPDIMOUSESTATE2 pMouseState,DWORD dwTick)
{
if (!g_pHero)
{
return;
}
// 동영상 촬영용 프리 카메라
if( GENERALPARAM->IsFreeCameraMode() )
{
// 프리 카메라
if( GENERALPARAM->GetFreeCameraState() )
{
if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) )
{
g_Camera.Rotate( pMouseState->lX, pMouseState->lY );
}
if( g_Input.GetState( DIK_RBRACKET, KS_DOWN ) )
{
g_fFreeCameraSpeed += FREE_CAMERA_SPEED_UP;
if( g_fFreeCameraSpeed >= FREE_CAMERA_MAX_SPEED_UP )
{
g_fFreeCameraSpeed = FREE_CAMERA_MAX_SPEED_UP;
}
}
else if( g_Input.GetState( DIK_LBRACKET, KS_DOWN ) )
{
g_fFreeCameraSpeed -= FREE_CAMERA_SPEED_UP;
if( g_fFreeCameraSpeed <= FREE_CAMERA_MIN_SPEED_UP )
{
g_fFreeCameraSpeed = FREE_CAMERA_MIN_SPEED_UP;
}
}
if( g_Input.GetState( DIK_W, KS_KEY ) )
{
m_FreeCameraVector -= (g_Camera.GetCameraDirection() * (GENERALPARAM->GetFreeCameraSpeed() * g_fFreeCameraSpeed) );
}
else if( g_Input.GetState( DIK_S, KS_KEY ) )
{
m_FreeCameraVector += (g_Camera.GetCameraDirection() * (GENERALPARAM->GetFreeCameraSpeed() * g_fFreeCameraSpeed) );
}
if( g_Input.GetState( DIK_A, KS_KEY ) )
{
g_Camera.RotateYaw( GENERALPARAM->GetFreeCameraTurnSpeed() );
}
else if( g_Input.GetState( DIK_D, KS_KEY ) )
{
g_Camera.RotateYaw( -GENERALPARAM->GetFreeCameraTurnSpeed() );
}
if( g_Input.GetState( DIK_Q, KS_KEY ) )
{
WzVector RightVector;
WzVector UpVector;
SetVector( &UpVector, 0.0f, 0.0f, 1.0f );
VectorCrossProduct( &RightVector, &g_Camera.GetCameraDirection(), &UpVector );
VectorNormalize( &RightVector, &RightVector );
m_FreeCameraVector += (RightVector * (GENERALPARAM->GetFreeCameraSpeed() * g_fFreeCameraSpeed) );
}
else if( g_Input.GetState( DIK_E, KS_KEY ) )
{
WzVector CameraDirection = g_Camera.GetCameraDirection();
WzVector RightVector;
WzVector UpVector;
SetVector( &UpVector, 0.0f, 0.0f, 1.0f );
VectorCrossProduct( &RightVector, &g_Camera.GetCameraDirection(), &UpVector );
VectorNormalize( &RightVector, &RightVector );
m_FreeCameraVector -= (RightVector * (GENERALPARAM->GetFreeCameraSpeed() * g_fFreeCameraSpeed) );
}
g_Camera.SetCamera( &(m_FreeCameraVector), FALSE,dwTick);
g_Camera.UpdateCamera();
return;
}
}
WzVector vDirection = g_pHero->GetDirection();
g_Camera.SetAngle( &vDirection );
// 주의: 하드코딩
// 플레이어가 맵에 들어왔을때 한번만 실행하기 위한 코드
// -> 플레이어가 바라보는 방향으로 카메라를 보정한다.
if (m_bCameraDetech)
{
g_Camera.SetYaw(g_pHero->GetAngle());
g_Camera.Rotate(0,-50);
m_bCameraDetech = false;
}
// 마우스로 카메라 회전
if( g_Input.GetState( MOUSE_LBUTTON, KS_MOUSE_KEY) )
{
g_Camera.Rotate( pMouseState->lX, pMouseState->lY,Camera::CAMERA_ROTATE_LMOUSE );
}
else if( g_Input.GetState( MOUSE_RBUTTON, KS_MOUSE_KEY ) )
{
g_Camera.Rotate( pMouseState->lX, pMouseState->lY, Camera::CAMERA_ROTATE_RMOUSE );
}
else if (g_Input.GetState( MOUSE_MBUTTON, KS_MOUSE_DOWN ))
{
if( !m_bRenderLightDirection )
{
#ifdef _JBH_MOD_MOUSE_MBUTTON_IN_BATTLESCENE
g_pHero->SetDirection( g_Camera.GetCameraTo(), g_Camera.GetCameraFrom(), FALSE );
#else
if( g_Input.IsPressCtrlKey() )
{
g_Camera.SetYaw( g_pHero->GetAngle() + WZ_PI );
}
else
{
g_Camera.SetYaw( g_pHero->GetAngle() );
}
#endif
g_Camera.Rotate(0,0);
}
}
else
{
#ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID
if( g_pHero->GetCurState() == STATE::SKILL )
{
if( g_pHero->GetCurSkillState()->GetSkillClassCode() == eSKILL_HELLROID_1015 )
{
g_Camera.KeyboardModeInterpolateAngle(g_pHero->GetAngle());
}
}
#endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID
if( g_pHero->GetCurState() == STATE::KEYBOARDMOVE||g_pHero->GetCurState() == STATE::KEYBOARDJUMP)
{
g_Camera.KeyboardModeInterpolateAngle(g_pHero->GetAngle());
}
else
{
if( g_pHero->IsMoving() )
{
// 일반 이동시 카메라 자동회전 온/오프
if( GENERALPARAM->GetGetCameraRotaion() )
{
g_Camera.InterpolateAngle();
}
}
}
g_Camera.Rotate(0,0);
g_Camera.SetRotateState( FALSE );
g_Camera.RotateAngleCheck( 0 );
g_Camera.SetStartRotateCheck( FALSE );
}
WzVector vPos = g_pHero->GetVisiblePos();
if ( g_bObserverMode == FALSE )
{
DWORD dwPlayerAtt = g_pHero->GetCurrentTileAtt(FALSE);
if (BIT_CHECK(dwPlayerAtt, PTA_PLAYER_FALLDOWN_TILE))
{
WzVector vTempPos = g_pHero->GetPosition();
vPos.z = max( vTempPos.z, vPos.z);
}
float default_eye_height = GlobalFunc::GetCameraHeight( g_pHero->GetClass() );
//restore default eye height
g_Camera.set_eye_height( default_eye_height );
if ((g_pHero->GetCurState() == STATE::WINGS_SPREAD) || (g_pHero->GetCurState() == STATE::WINGS_FURL))
{
const float kFloorToBody_Length = 1.442f;
float camera_eye_height = default_eye_height + (g_pHero->GetBodyPos().z - vPos.z - kFloorToBody_Length);
g_Camera.set_eye_height(camera_eye_height);
}
else if (g_pHero->is_spread_wings())
{
g_Camera.set_eye_height(CGraphicParam::Instance()->camera_eye_height_wings_spread());
}
if (g_pHero->rider() != NULL)
{
const float kFloorToLinkDummy_Stand_Length = 2.156f;
float camera_eye_height = default_eye_height;
if ((g_pHero->GetCurState() == STATE::RIDER_FURL) || (g_pHero->GetCurState() == STATE::RIDER_SPREAD))
{
camera_eye_height += (g_pHero->rider()->GetLinkPos()->z - vPos.z - kFloorToLinkDummy_Stand_Length);
}
else if (g_pHero->rider()->is_spread() == true)
{
camera_eye_height += (CGraphicParam::Instance()->camera_eye_height_rider_spread() - kFloorToLinkDummy_Stand_Length);
}
g_Camera.set_eye_height(camera_eye_height);
}
}
g_Camera.SetCamera( &vPos, TRUE ,dwTick);
g_Camera.UpdateCamera();
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessEffect(DWORD dwTick)
{
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetFieldID(DWORD dwFieldID)
{
m_dwFieldID = dwFieldID;
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::RenderDamage(DWORD dwTick)
{
if (GENERALPARAM->GetScreenShotMode())
{
return;
}
g_InterfaceManager.RenderDamageList(dwTick);
}
//------------------------------------------------------------------------------
/**
*/
DWORD BattleScene::AddBattleTimeSerial()
{
DWORD ret = m_dwBattleTimeSerial;
m_dwBattleTimeSerial++;
return ret;
}
//------------------------------------------------------------------------------
/**
*/
DWORD BattleScene::GetBattleTimeSerial()
{
return m_dwBattleTimeSerial;
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::RenderClone()
{
Clone *pClone = NULL;
Clone_Map_Itr itr = g_CloneManager.GetBegin();
for (; itr != g_CloneManager.GetEnd(); itr++)
{
pClone = static_cast<Clone *>(itr->second);
assert(pClone);
if(pClone)
{
pClone->Render();
}
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessTrigger()
{
if (!g_pMap) return;
DWORD dwGroupID = 0;
DWORD dwCategoryID = 0;
TCHAR szTriggerGroupName[MAX_TRIGGER_GROUPNAME_LENGTH] = {0,};
g_pMap->GetTriggerGroupName(szTriggerGroupName);
if('0' == szTriggerGroupName[0])
return;
if(NULL == m_pTriggerMan)
return;
if(FALSE == m_bTriggerInit)
{
TriggerGroupInfo* pTriggerGroupInfo = g_pMap->GetTriggerInfoMan()->FindTriggerGruopInfo(szTriggerGroupName);
if(pTriggerGroupInfo)
{
//-----------------------------------//
m_pTriggerMan->Init(*pTriggerGroupInfo);
//-----------------------------------//
m_bTriggerInit = TRUE;
g_pMap->SetTriggerMan(m_pTriggerMan);
}
else
{
g_pMap->SetTriggerMan(NULL);
}
}
m_pTriggerMan->OnMsg(NULL);
}
//------------------------------------------------------------------------------
/**
*/
int BattleScene::GetCharacterHP(DWORD dwID)
{
Character *pChr = (Character *)g_ObjectManager.GetObject(dwID);
if (pChr)
{
return pChr->GetHP();
}
return 0;
}
void BattleScene::ProcessBlind(DWORD dwTick)
{
bool isblind = false;
if (g_pHero)
{
if( g_pHero->IsBlind() || g_pHero->IsBlind2() )
{
isblind = true;
if( g_pHero->IsBlind() == TRUE )
m_BlindType = BLIND_TYPE_BLACK;
else if( g_pHero->IsBlind2() == TRUE )
m_BlindType = BLIND_TYPE_WHITE;
}
}
if( isblind == true )
{
//if( g_pHero->GetTargetObject() != NULL )
//{
// g_pHero->SetNextState(STATE::IDLE,g_CurTime);
// g_pHero->SetTargetID(0);
//}
//g_HeroInput.SetCurrentTarget(0);
m_iCurBlindRate += dwTick;
if( m_BlindType == BLIND_TYPE_BLACK && m_iCurBlindRate >= BLACK_BLIND_TIME)
{
m_iCurBlindRate = BLACK_BLIND_TIME;
}
else if( m_BlindType == BLIND_TYPE_WHITE && m_iCurBlindRate >= WHITE_BLIND_TIME )
{
m_iCurBlindRate = WHITE_BLIND_TIME;
}
}
else
{
if (m_iCurBlindRate)
{
m_iCurBlindRate -= dwTick;
if (m_iCurBlindRate <= 0)
{
m_iCurBlindRate = 0;
m_BlindType = BLIND_TYPE_NONE;
g_pSunRenderer->SetLinearFog(
m_oldFogParameter.m_wcFogColor,
m_oldFogParameter.m_fFogStart,
m_oldFogParameter.m_fFogEnd,
m_oldFogParameter.m_fMaxFogRate );
}
}
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessSpecialEffect(DWORD dwTick)
{
if (m_iBrightDelay > 0)
{
m_iBrightDelay -= dwTick;
if (m_iBrightDelay <= 0)
{
m_iBrightDelay = 0;
g_pSunRenderer->x_pManagerPostEffect->SetTechBlur(&m_oldBlur);
g_pSunRenderer->SetLinearFog(m_oldFogParameter.m_wcFogColor,m_oldFogParameter.m_fFogStart,m_oldFogParameter.m_fFogEnd,m_oldFogParameter.m_fMaxFogRate);
}
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessGrayScaleDelay(DWORD dwTick)
{
if (m_iGrayScaleDelay > 0)
{
m_iGrayScaleDelay -= dwTick;
if (m_iGrayScaleDelay <= 0)
{
m_iGrayScaleDelay = 0;
g_pSunRenderer->x_pManagerPostEffect->TurnOffPostEffect(PET_GRAYSCALE);
}
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetBrightBlur()
{
int maxlight = 1000;
if (m_iBrightDelay > 0)
{
float fRate = (float)m_iBrightDelay / (float)maxlight;
if (fRate >= 1.0f)
{
fRate = 1.0f;
}
if (fRate <= 0.0f)
{
fRate = 0.0f;
}
St_PE_BLUR blur = m_oldBlur;
float fLumRate = 1.0f - fRate;
blur.m_fMinLuminance = m_oldBlur.m_fMinLuminance * fLumRate;
blur.m_fSelectHighLight = m_oldBlur.m_fSelectHighLight * (1.0f - fRate) + 2.0f * fRate;
blur.m_fFinalColorBlend = m_oldBlur.m_fFinalColorBlend * (1.0f - fRate) + 2.0f * fRate;
int iBlurR = Red_WzColor(blur.m_wcSelectColor) ;
int iBlurG = Green_WzColor(blur.m_wcSelectColor) ;
int iBlurB = Blue_WzColor(blur.m_wcSelectColor) ;
int iNewBlurR = int( (255 * fRate ) + iBlurR * fLumRate );
int iNewBlurG = int( (255 * fRate ) + iBlurG * fLumRate );
int iNewBlurB = int( (255 * fRate ) + iBlurB * fLumRate );
WzColor newblurcolor = WzColor_RGBA((int)(iBlurR*m_fBlur_weight),(int)(iBlurG *m_fBlur_weight),(int)(iBlurB *m_fBlur_weight),255);
blur.m_wcSelectColor = newblurcolor;
g_pSunRenderer->x_pManagerPostEffect->SetTechBlur(&blur);
int iR = Red_WzColor(m_oldFogParameter.m_wcFogColor) ;
int iG = Green_WzColor(m_oldFogParameter.m_wcFogColor);
int iB = Blue_WzColor(m_oldFogParameter.m_wcFogColor);
int iNewR = int( (255 * fRate) + iR * fLumRate );
int iNewG = int( (255 * fRate) + iG * fLumRate );
int iNewB = int( (255 * fRate) + iB * fLumRate );
float fStart = m_oldFogParameter.m_fFogStart * fLumRate;
float fEnd = 1.0f * fRate + m_oldFogParameter.m_fFogEnd * fLumRate;
WzColor newfog;
newfog = WzColor_RGBA((int)(iNewR * m_fFog_weight),(int)(iNewG * m_fFog_weight),(int)(iNewB * m_fFog_weight) ,255);
g_pSunRenderer->SetLinearFog(newfog,fStart,fEnd,m_oldFogParameter.m_fMaxFogRate);
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetBrightDelay(int delay)
{
if (m_iBrightDelay <= 0 )
{
m_oldFogParameter = g_pSunRenderer->GetFogParameter();
m_iBrightDelay = delay;
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetGrayScaleDelay(int delay,WzColor color)
{
m_iGrayScaleDelay = delay;
m_GrayScaleColor = color;
}
//------------------------------------------------------------------------------
/**
마을로 돌아가는 루틴
*/
void BattleScene::BackToTheVillage(CODETYPE VillageCode /*= 0*/)
{
if (GENERALPARAM->IsNet())
{
assert(g_pHero);
if (!g_pHero)
{
return;
}
BattleScene::SetRoomKey(0);
SCENE_TYPE eBackToScene = SCENE_TYPE_VILLAGE;
MAPCODE MapCode;;
if (0 == VillageCode)
{
MapCode = g_pHero->GetCharInfo()->m_iRegion;
//GS_BUG_FIX:마을로(필드,마을)돌아갈곳을체크
const sMAPINFO* pMapInfo = MapInfoParser::Instance()->FindMapInfo(g_pHero->GetCharInfo()->m_iRegion);
if (pMapInfo && (pMapInfo->byMKind == eZONETYPE_FIELD))
{
eBackToScene = SCENE_TYPE_FIELD;
}
}
else
{
MapCode = (MAPCODE)VillageCode;
}
g_LoadScene.SetNextSceneAfterLoaded(eBackToScene, MapCode, 0);
GameFramework::ChangeScene(SCENE_TYPE_LOAD);
}
else
{
g_LoadScene.SetNextSceneAfterLoaded(SCENE_TYPE_CHARSELECT, GENERALPARAM->GetCharSelectMapID(), 0);
GameFramework::ChangeScene(SCENE_TYPE_LOAD);
}
uiBattleScoreMan* battle_score_manager_ptr
= static_cast<uiBattleScoreMan*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BATTLE_SCORE));
if (battle_score_manager_ptr)
{
battle_score_manager_ptr->Reset();
}
}
//----------------------------------------------------------------------------
/**
*/
void
BattleScene::BackToTheVillageSyn()
{
if (BattleScene::m_bPendingBackToSomeWhere)
return;
SystemDialog * pSystemDialog = (SystemDialog * )g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SYSTEM );
switch (GameFramework::GetCurScene() )
{
case SCENE_TYPE_MISSION:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_MISSION_LEAVE_SYN SendPacket;
if(g_MissionScene.IsLeavePartyBan()) // 강퇴
SendPacket.m_Reason = MSG_CG_ZONE_MISSION_LEAVE_SYN::REASON_EXPULSION;
else // 스스로 나간것
SendPacket.m_Reason = MSG_CG_ZONE_MISSION_LEAVE_SYN::REASON_INTEND;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_LOBBY:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_LOBBY_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_VILLAGE:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if(BattleScene::IsLobby())
{
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_LOBBY_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
}
break;
case SCENE_TYPE_PVP:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_PVP_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_INSTANCE_DUNGEON:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_FIELD:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_RETURN_VILLAGE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_CHUNTING:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_CHUNTING_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
case SCENE_TYPE_BATTLEGROUND:
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
case SCENE_TYPE_GOLDRUSH:
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
case SCENE_TYPE_FREEPVP:
#endif //_NA_006088_20120910_CHAOS_ZONE_FREE_PVP
#ifdef _NA_008334_20150608_SONNENSCHEIN
case SCENE_TYPE_SONNENSCHEIN:
#endif //_NA_008334_20150608_SONNENSCHEIN
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
case SCENE_TYPE_GUILDMISSION:
#endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
case SCENE_TYPE_SPA:
{
BattleScene::m_bPendingBackToSomeWhere = true;
if ( pSystemDialog )
{
pSystemDialog->AddPacketStatus(SystemDialog::BACK_TO_THE_VILLAGE);
}
MSG_CG_ZONE_EX_SPA_LEAVE_SYN SendPacket;
GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket));
}
break;
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::BackToTheVillageTransact()
{
SCENE_TYPE current_scene_type = GameFramework::GetCurScene();
// 타락한 사원에서는 마을로 돌아가기를 지원하지 않음
if (current_scene_type == SCENE_TYPE_SSQ)
{
return;
}
#ifdef _NA_000000_20120527_CHAOS_ZONE
if ((current_scene_type == SCENE_TYPE_BATTLEGROUND) ||
(current_scene_type == SCENE_TYPE_FREEPVP)
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
|| (current_scene_type == SCENE_TYPE_GOLDRUSH)
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
#ifdef _NA_008334_20150608_SONNENSCHEIN
|| (current_scene_type == SCENE_TYPE_SONNENSCHEIN)
#endif //_NA_008334_20150608_SONNENSCHEIN
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
|| (current_scene_type == SCENE_TYPE_GUILDMISSION)
#endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION
)
{
// 카오스존 나가기
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_Delay_Leave_ChaosZone;
msg.DoSomething = GlobalFunc::DoLeaveFieldCancel;
msg.lParam = InterfaceManager::DIALOG_DELAY_CASTING;
msg.wParam = eDoType_Delay_Leave_ChaosZone;
g_KeyQueueManager.PushBack(msg);
// 딜레이 캐스트 창을 띄우고 타이머를 세팅한다.
StartLeaveFieldCastTimer(eDoType_Delay_Leave_ChaosZone, DELAY_LEAVE_FIELD_TICK);
return;
}
#endif //_NA_000000_20120527_CHAOS_ZONE
if (g_pHero && g_pHero->IsDead())
{
// 죽은상태에서는 무조건 나가게 해주자.
BackToTheVillageSyn();
return;
}
if ((current_scene_type == SCENE_TYPE_VILLAGE) ||
(current_scene_type == SCENE_TYPE_FIELD))
{
TCHAR szMessage[INTERFACE_STRING_LENGTH];
g_InterfaceManager.GetInterfaceString(eST_U_ARE_IN_VILLAGE_OR_FIELD,szMessage,INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage);
return;
}
if( GENERALPARAM->IsNet()==FALSE)
{
xGetHeroData()->SetObjectKey( INVALID_OBJECT_KEY );
g_LoadScene.SetNextSceneAfterLoaded(SCENE_TYPE_VILLAGE, GENERALPARAM->GetStartMapID(), GENERALPARAM->GetStartFieldID() );
GameFramework::ChangeScene( SCENE_TYPE_LOAD );
}
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_Delay_Leave_Field;
msg.DoSomething = GlobalFunc::DoLeaveFieldCancel;
msg.lParam = InterfaceManager::DIALOG_DELAY_CASTING;
msg.wParam = eDoType_Delay_Leave_Field;
g_KeyQueueManager.PushBack(msg);
// 딜레이 캐스트 창을 띄우고 타이머를 세팅한다.
StartLeaveFieldCastTimer( eDoType_Delay_Leave_Field, DELAY_LEAVE_FIELD_TICK );
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::LeaveDominationTransact()
{
if (g_pHero && g_pHero->IsDead())
{
// 죽은상태에서는 무조건 나가게 해주자.
//uiDominationTowerMan::SEND_LEAVE_DOMINATION();
// 2011.08.09 / 송찬종 / 리스폰 캐스팅 바와 마을로 가기 캐스팅 바가 곂치면서 다이얼로그 락이 안풀리는 현상 수정
// 3464 죽은 상태에서는 지상으로 내려갈 수 없습니다.
//#define _NA_000000_121015_LEAVE_CANCEL_TO_REVIVE_RE_CASTING
TCHAR message[INTERFACE_STRING_LENGTH];
g_InterfaceManager.GetInterfaceString(3464, message, INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, message);
return;
}
if ( SCENE_TYPE_VILLAGE == GameFramework::GetCurScene()
|| SCENE_TYPE_FIELD == GameFramework::GetCurScene() )
{
return;
}
if( GENERALPARAM->IsNet()==FALSE)
{
xGetHeroData()->SetObjectKey( INVALID_OBJECT_KEY );
g_LoadScene.SetNextSceneAfterLoaded(SCENE_TYPE_VILLAGE, GENERALPARAM->GetStartMapID(), GENERALPARAM->GetStartFieldID());
GameFramework::ChangeScene( SCENE_TYPE_LOAD );
}
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_Delay_Leave_Domination;
msg.DoSomething = GlobalFunc::DoLeaveFieldCancel;
msg.lParam = InterfaceManager::DIALOG_DELAY_CASTING;
msg.wParam = eDoType_Delay_Leave_Domination;
g_KeyQueueManager.PushBack(msg);
// 딜레이 캐스트 창을 띄우고 타이머를 세팅한다.
StartLeaveFieldCastTimer( eDoType_Delay_Leave_Domination, DELAY_LEAVE_FIELD_TICK );
}
//------------------------------------------------------------------------------
/**
미션 클리어 메시지를 출력한다.
*/
void BattleScene::RenderMissionClearMessage()
{
if (m_dwMissionClearTick != 0)
{
// 5초 동안 렌더한다.
g_pSunRenderer->Set2DMode( TRUE, FALSE );
g_pSunRenderer->SetAlphaBlendMode( AB_ALPHA );
g_pSunRenderer->SetZBufferTest(FALSE);
g_pSunRenderer->SetColor(255,255,255,255);
g_pSunRenderer->RenderTexture(m_hMissionClearTexture,257.0f,0.0f,491.0f,84.0f);
g_pSunRenderer->Set2DMode( FALSE );
g_pSunRenderer->SetZBufferTest(TRUE);
if (m_dwMissionClearTick + 10000 < g_pSunRenderer->x_Clock.GetCurrentTick() )
{
m_dwMissionClearTick = 0;
}
}
}
//------------------------------------------------------------------------------
/**
최초의 renderstate로 돌려준다.
*/
void BattleScene::RestoreRenderState()
{
g_pMap->EnableBlur(FALSE);
g_pSunRenderer->x_pManagerPostEffect->SetTechBlur(&m_oldBlur);
g_pSunRenderer->SetLinearFog(m_oldFogParameter.m_wcFogColor,m_oldFogParameter.m_fFogStart,m_oldFogParameter.m_fFogEnd,m_oldFogParameter.m_fMaxFogRate);
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::SetFogParam(BYTE bR,BYTE bG,BYTE bB,float fFogStart,float fFogEnd,float fFogRate)
{
WzColor color;
color = WzColor_RGBA(bR,bG,bB,255);
m_oldFogParameter.m_wcFogColor = color;
m_oldFogParameter.m_fFogStart = fFogStart;
m_oldFogParameter.m_fFogEnd = fFogEnd;
m_oldFogParameter.m_fMaxFogRate = fFogRate;
g_pSunRenderer->SetLinearFog(m_oldFogParameter.m_wcFogColor,m_oldFogParameter.m_fFogStart,m_oldFogParameter.m_fFogEnd,m_oldFogParameter.m_fMaxFogRate);
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ReleaseInterfaceResource()
{
// 목표지점 표시 데칼을 보이지 않게 한다.
g_InterfaceManager.SetMovePointer(FALSE,NULL);
if (m_hTexture != INVALID_HANDLE_VALUE)
{
g_pSunRenderer->x_pManagerTexture->DestroyTexture( m_hTexture );
m_hTexture = INVALID_HANDLE_VALUE;
}
if (m_hMissionClearTexture != INVALID_HANDLE_VALUE)
{
g_pSunRenderer->x_pManagerTexture->DestroyTexture( m_hMissionClearTexture );
m_hMissionClearTexture = INVALID_HANDLE_VALUE;
}
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::ReleaseObjects()
{
g_CloneManager.Clear();
#ifdef _MOD_CHAGNE_DELETE_HERO
g_ObjectManager.DeleteAllObjectWithoutHero();
#else
g_ObjectManager.Destroy();
uiBattlezone2Man* man = static_cast<uiBattlezone2Man*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BATTLE_ZONE_MANAGER));
if (man != NULL)
{
man->ClearObjectKey();
}
#endif
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::_renderDbgInfoRenderStates(int& x, int& y)
{
#ifdef _DEV_VER
if(NULL == g_pMap)
return;
// FPS
DWORD dwTick;
DWORD dwTicks2;
DWORD dwTick3;
LONG lCount, lPpsCount, lDcpsCount;
g_pSunRenderer->GetFpsValues( &dwTick, &lCount );
float fFps = ( float )lCount * 1000.0f / ( float )dwTick;
g_pSunRenderer->GetPpsValues( &dwTicks2, &lPpsCount);
g_pSunRenderer->GetDcpsValues( &dwTick3, &lDcpsCount);
LONG lPolygon = lCount > 0 ? lPpsCount / lCount : 0;
LONG lDrawCall = lCount > 0 ? lDcpsCount / lCount : 0;
TCHAR lpszText[512] = {0,};
SYSTEMTIME time;
util::TimeSync::GetLocalTime(&time);
Snprintf(lpszText, 512-1, _T("%4d-%2d-%2d %2d:%2d:%2d"), time.wYear, time.wMonth, time.wDay,
time.wHour, time.wMinute, time.wSecond);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T(" %f fps [ %ld polygons, %ld drawcalls(%ld terrain drawcalls) ]"),
fFps, lPolygon, lDrawCall, g_pMap->GetWorldBase()->terrain_drawcalls());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T(" VRam %ld/%ld(M) "), (g_pSunRenderer->GetLocalVidMem() - g_pSunRenderer->GetAvailableVidMem()) / (1024*1024), g_pSunRenderer->GetLocalVidMem() / (1024*1024));
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Available Texture memory: %ld(M)"),g_pSunRenderer->GetAvailableTextureMem() / (1024*1024));
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
MEMORYSTATUS MemStatus;
MemStatus.dwLength = sizeof(MemStatus);
GlobalMemoryStatus(&MemStatus);
Snprintf( lpszText, 512-1, _T(" SRam %ld/%ld(M) "), (MemStatus.dwTotalPhys - MemStatus.dwAvailPhys) / (1024*1024), MemStatus.dwTotalPhys / (1024*1024));
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T(" Near : %f Far : %f "),g_Camera.GetNearClip(),g_Camera.GetFarClip());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("ProcessCount : %d"),g_dwCharProcessCount);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("RenderCount : %d"),g_dwCharRenderCount);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
//////////////////////////////////////////////////////////////////////////
y += 20;
Snprintf( lpszText, 512-1, _T("VisMapObjCount : %d"),g_pMap->m_iVisMapObjCnt);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("VisMonCount : %d"),g_pMap->m_iVisMonCnt);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("VisPlayerCount : %d"),g_pMap->m_iVisPlayerCnt);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("VisNPCCount : %d"),g_pMap->m_iNPCCnt);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("VisGrassCount : %d"),g_pMap->grass_cnt_);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("OctNode(Object) : %d"), g_pMap->GetWorldBase()->x_pOctree->GetNodeCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("OctNode(Terrain) : %d"), g_pMap->GetWorldBase()->x_pTerrainOctree->GetNodeCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Terrain PolyCnt : %d / %d"), g_pMap->rendering_terrain_cnt_, g_pMap->GetWorldBase()->GetTerrainMeshCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Total Terrain Texture Count : %d"), g_pMap->GetWorldBase()->GetTextureCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
if(g_pEffectManager)
{
#ifdef LAST_RELEASE
// no operations
#else
// 생성 이펙트 수 / 시뮬레이션 안 한 이펙트 수
Snprintf( lpszText, 512-1, _T("Skipped/Created effects : %d / %d"),
g_effDbgInfo.numSkippedEffect, g_pEffectManager->GetNumCreatedEffects() );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
// 렌더링된 이펙트 수
Snprintf( lpszText, 512-1, _T("Rendered effects : %d ( %d )"),
g_effDbgInfo.numRenderedEffect, g_effDbgInfo.maxNumRenderedEffect );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
// 렌더링된 엘리멘트 수
Snprintf( lpszText, 512-1, _T("Rendered Elements : %d ( %d )"),
g_effDbgInfo.numRenderedSprite + g_effDbgInfo.numRenderedMesh + g_effDbgInfo.numRenderedChain +
g_effDbgInfo.numRenderedFlatChain + g_effDbgInfo.numRenderedDecal + g_effDbgInfo.numRenderedWeather ,
g_effDbgInfo.maxNumRenderedSprite + g_effDbgInfo.maxNumRenderedMesh + g_effDbgInfo.maxNumRenderedChain +
g_effDbgInfo.maxNumRenderedFlatChain + g_effDbgInfo.maxNumRenderedDecal + g_effDbgInfo.maxNumRenderedWeather);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
#endif // LAST_RELEASE
}
Snprintf( lpszText, 512-1, _T("SceneType: %d / MAPCode:%d / WMOCode:%d"), GameFramework::GetCurrentScene()->GetType(), g_pMap->GetCurrentFieldID(), g_pMap->GetCurrentWMOCode());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
Snprintf( lpszText, 512-1, _T("VisibleRange: %f, AlphaRange: %f"), g_pMap->GetVisibleRange(), g_pMap->GetAlphaRange());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText,x, y, WzColor_RGB( 255, 255, 255 ) );
y += 20;
//////////////////////////////////////////////////////////////////////////
////------------------------------------------------------------------------------
////_NA000000_SPEED_HACK_PREVENTION_SUPPORT
//if (g_pHero != NULL)
//{
// x = 400;
// y = 600;
// Snprintf(lpszText, 256-1, _T("kbmove_skip_count = %d"), g_pHero->KBMove.debug_kbmove_skip_count);
// g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
// y += 20;
// Snprintf(lpszText, 256-1, _T("hero speed = %f"), g_pHero->KBMove.debug_move_speed);
// g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
// y += 20;
// Snprintf(lpszText, 256-1, _T("kbmove_gab = %f"), g_pHero->KBMove.debug_kbmove_gab);
// g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
// y += 20;
//}
#endif //#ifdef _DEV_VER
}
//------------------------------------------------------------------------------
/**
*/
static const char *GetActionString(PLAYER_ACTION *pAction)
{
// 디버그용 출력 메시지
switch(pAction->ActionID)
{
case ACTION_IDLE:
return "ACTION_IDLE";
case ACTION_ATTACK:
return "ACTION_ATTACK";
case ACTION_SKILL:
return "ACTION_SKILL";
case ACTION_MOVE:
return "ACTION_MOVE";
case ACTION_KEYBOARDMOVE:
return "ACTION_KEYBOARDMOVE";
case ACTION_KNOCKBACK:
return "ACTION_KNOCKBACK";
case ACTION_TOAIR:
return "ACTION_TOAIR";
case ACTION_DOWN:
return "ACTION_DOWN";
case ACTION_GETUP:
return "ACTION_GETUP";
case ACTION_NPCMEET:
return "ACTION_NPCMEET";
case ACTION_GETITEM:
return "ACTION_GETITEM";
case ACTION_JUMP:
return "ACTION_JUMP";
case ACTION_EVENTJUMP:
return "ACTION_EVENTJUMP";
case ACTION_STOP:
return "ACTION_STOP";
case ACTION_VALKYRIESHOT:
return "ACTION_VALKYRIESHOT";
case ACTION_PLAYERMEET:
return "ACTION_PLAYERMEET";
case ACTION_SIT:
return "ACTION_SIT";
case ACTION_ATTACKJUMP:
return "ACTION_ATTACKJUMP";
default :
return "INVALID_ACTION";
}
}
void BattleScene::_renderDbgInfoMonsterInfo(int& x, int& y)
{
#ifdef _DEV_VER
Object *pObject = g_ObjectManager.GetObject(g_HeroInput.GetCurrentTarget());
if (pObject && pObject->IsKindOfObject(CHARACTER_OBJECT))
{
Character *pChar = (Character*)pObject;
TCHAR lpszText[256] = {0,};
int x = 400;
int y = 80;
int Line = 18;
Snprintf( lpszText, 256-1, _T("ObjectKey: %d"),pChar->GetObjectKey());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
for( size_t i = 0 ; i < pChar->GetPartCount() ; ++i )
{
if ( CWzUnitDraw* pPart = pChar->GetPart(i) )
{
Snprintf( lpszText, 256-1, _T("LOD[%d] Lv: %d"), i, pPart->GetWzdLOD());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
}
St_Camera * pCameraInfo = g_pSunRenderer->GetCameraInfo();
if(pCameraInfo)
{
WzVector wvLen = pCameraInfo->m_wvFrom - pChar->GetVisiblePos();
float fLen = VectorLength(&wvLen);
Snprintf( lpszText, 256-1, _T("CamToChar Len: %f"), fLen);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
Snprintf( lpszText, 256-1, _T("HeroToChar Z: %f"), pChar->GetVisiblePos().z - g_pHero->GetVisiblePos().z);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
PLAYER_ACTION CurAction = *pChar->GetCurrentAction();
Snprintf( lpszText, 256-1, _T("Current Action : %s") , GetActionString(&CurAction) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
if(pChar->GetNextAction())
{
PLAYER_ACTION NextAction = *pChar->GetNextAction();
Snprintf( lpszText, 256-1, _T("Queue Action : %s") , GetActionString(&NextAction) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ));
y += Line;
}
else
{
Snprintf( lpszText, 256-1, _T("Queue Action : ACTION_NULL") );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
Snprintf( lpszText, 256-1, _T("ActionQueueCount: %d"),pChar->GetActionQueueCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
WzVector vVisiblePos;
vVisiblePos=pChar->GetVisiblePos();
Snprintf( lpszText, 256-1, _T("VisiblePos: %.2f, %.2f, %.2f"),vVisiblePos.x,vVisiblePos.y,vVisiblePos.z);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
WzVector vPos;
vPos= pChar->GetPosition();
Snprintf( lpszText, 256-1, _T("LogicPos: %.2f, %.2f, %.2f"),vPos.x,vPos.y,vPos.z);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
if( CWzUnitDraw* pBasePart = pChar->GetBasePart())
{
WzVector vMeshPos = pBasePart->GetPosition();
Snprintf( lpszText, 256-1, _T("MeshPos: %.2f, %.2f, %.2f"),vMeshPos.x,vMeshPos.y,vMeshPos.z);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
else
{
Snprintf( lpszText, 256-1, _T("랜더파트없음"));
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
BYTE bAlpha;
bAlpha=Alpha_WzColor(pChar->GetColor());
Snprintf( lpszText, 256-1, _T("Alpha:%d"),bAlpha);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
BOOL bShow;
bShow=pChar->GetShow();
Snprintf( lpszText, 256-1, _T("Show:%d"),bShow);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
BOOL bObserver;
bObserver=pChar->IsObserverMode();
Snprintf( lpszText, 256-1, _T("bObserver:%d"),bObserver);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
BOOL CompletelyLoaded;
CompletelyLoaded=pChar->IsCompletelyLoaded();
Snprintf( lpszText, 256-1, _T("CompletelyLoaded:%d"),CompletelyLoaded);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
BOOL bCurShowFlag;
bCurShowFlag=pChar->GetCurShowFlag();
Snprintf( lpszText, 256-1, _T("CurShowFlag:%d"),bCurShowFlag);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
TCHAR ani_code[5] = {0,};
WzAnimationInfo *ani_info_ptr = pChar->GetAnimationInfo(pChar->GetCurrentAnimation());
if (ani_info_ptr)
{
WzIDToString(ani_code, pChar->GetCurrentAnimation());
int attack_speed = static_cast<int>((((ani_info_ptr->m_nMaxFrame/30.f) * 1000.f) + 1000.f));
Snprintf( lpszText, 256-1, _T("AniCode: %s(AttSpeed: %d)"), ani_code, attack_speed);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
}
int iTile;
iTile=pChar->GetPathExplorer()->GetTile();
Snprintf( lpszText, 256-1, _T("Tile:%d"),iTile);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
DWORD dwAtt=0;
if(g_pMap)
{
if(iTile>=0)
dwAtt=g_pMap->GetWorldBase()->x_pPathFinder->GetAttribute(iTile);
}
Snprintf( lpszText, 256-1, _T("TileAtt:%o"),dwAtt);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 255, 255, 0 ) );
y += Line;
if(BIT_CHECK(dwAtt,PTA_CONFLICT_TILE))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_CONFLICT_TILE", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_FREE_CONFLICT_TILE ))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_FREE_CONFLICT_TILE", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_PK_TILE))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_PK_TILE", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_NO_WALK))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_NO_WALK", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_DOMINATION_WAR_TILE))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_DOMINATION_WAR_TILE", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_PLAYER_JUMP_TILE))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_PLAYER_JUMP_TILE", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_JUMP_CONTROL_A))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_JUMP_CONTROL_A", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
if(BIT_CHECK(dwAtt,PTA_JUMP_CONTROL_B))
{
g_pSunRenderer->x_pManagerTextOut->DrawText( "PTA_JUMP_CONTROL_B", x, y, WzColor_RGB( 255, 0, 0 ) );
y += Line;
}
//////////////////////////////////////////////////////////////////////////
//NpcInfo
x = 600;
y = 80;
if (pChar->IsKindOfObject(MONSTER_OBJECT) == TRUE)
{
Monster* monster_ptr = static_cast<Monster*>(pChar);
BASE_NPCINFO* npc_info_ptr = monster_ptr->GetMonsterInfo();
TCHAR desc_str[INTERFACE_STRING_LENGTH + 1] = {0,};
GlobalFunc::GetMonGradeDesc(static_cast<eNPC_GRADE>(npc_info_ptr->m_byGrade), desc_str);
Snprintf( lpszText, 256-1, _T("Grade: %d(%s)"), npc_info_ptr->m_byGrade, desc_str);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
GlobalFunc::GetAICodeDesc(npc_info_ptr->m_wAICode, desc_str);
Snprintf( lpszText, 256-1, _T("AICode(세부 AI): %d(%s)"), npc_info_ptr->m_wAICode, desc_str);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
GlobalFunc::GetAttackAttitudeDesc(static_cast<eATTACK_ATTITUDE>(npc_info_ptr->m_byAttitude), desc_str);
Snprintf( lpszText, 256-1, _T("Attitude(공격성향): %d(%s)"),
npc_info_ptr->m_byAttType,
desc_str);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
GlobalFunc::GetAttTypeDesc(static_cast<eATTACK_TYPE>(npc_info_ptr->m_byAttType), desc_str);
Snprintf( lpszText, 256-1, _T("AttType(공격타입): %d(%s)"),
npc_info_ptr->m_byAttType,
desc_str);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
GlobalFunc::GetMoveAttitudeDesc(static_cast<eNPC_MOVE_ATTITUDE>(npc_info_ptr->m_byMoveAttitude), desc_str);
Snprintf( lpszText, 256-1, _T("MoveAttitude(이동성향): %d(%s)"),
npc_info_ptr->m_byAttType,
desc_str);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("PhyAttRate(공격 성공률): %d"), npc_info_ptr->m_wPhyAttRate );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("PhyAttAvoid(공격 회피률): %d"), npc_info_ptr->m_wPhyAttAvoid );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("WalkSpeed: %f"), npc_info_ptr->m_fWalkSpeed );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("RunSpeed: %f"), npc_info_ptr->m_fRunSpeed );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("AttackPower(최소/최대): %d / %d"), npc_info_ptr->m_dwMinAttackPower, npc_info_ptr->m_dwMaxAttackPower );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("SkillPower: %d"), npc_info_ptr->skill_power );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("PhysicalDefense: %d"), npc_info_ptr->m_dwPhyDef );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 255, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("Fire(불) Attack/Resist: %d / %d%%"), npc_info_ptr->element_fire_attack, npc_info_ptr->element_fire_resist);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 64, 0));
y += Line;
Snprintf( lpszText, 256-1, _T("Water(물) Attack/Resist: %d / %d%%"), npc_info_ptr->element_water_attack, npc_info_ptr->element_water_resist);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(0, 128, 255));
y += Line;
Snprintf( lpszText, 256-1, _T("Earth(대지) Attack/Resist: %d / %d%%"), npc_info_ptr->element_earth_attack, npc_info_ptr->element_earth_resist);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 192, 0));
y += Line;
Snprintf( lpszText, 256-1, _T("Wind(바람) Attack/Resist: %d / %d%%"), npc_info_ptr->element_wind_attack, npc_info_ptr->element_wind_resist);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(0, 255, 128));
y += Line;
Snprintf( lpszText, 256-1, _T("Dark(암흑) Attack/Resist: %d / %d%%"), npc_info_ptr->element_dark_attack, npc_info_ptr->element_dark_resist);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(192, 192, 192));
y += Line;
}
if (pChar->IsKindOfObject(MONSTER_OBJECT) == TRUE)
{
//if (aggro_player_count > 0)
//{
// int index = 0;
// int gap_count = 2;
// if (aggro_player_count > 40)
// {
// gap_count = 3;
// }
// TCHAR filed_string[3][255] = { "%-16s: %-6d", "%-16s: %-6d %-16s: %-6d",
// "%-16s: %-6d %-16s: %-6d %-16s: %-6d" };
// for (index = gap_count; index <= aggro_player_count; index = index+gap_count)
// {
// Snprintf(lpszText, 256-1, filed_string[gap_count-1],
// aggro_value_info[index-2].character_name_, aggro_value_info[index-2].aggro_value_,
// aggro_value_info[index-1].character_name_, aggro_value_info[index-1].aggro_value_,
// aggro_value_info[index-3].character_name_, aggro_value_info[index-3].aggro_value_);
// g_pSunRenderer->x_pManagerTextOut->DrawText(lpszText, x, y, WzColor_RGB(255, 128, 0));
// y += Line;
// }
// int remain_count = (aggro_player_count%gap_count);
// if (remain_count == 1)// 1개 남은 경우
// {
// Snprintf(lpszText, 256-1, filed_string[0],
// aggro_value_info[aggro_player_count-1].character_name_, aggro_value_info[0].aggro_value_);
// g_pSunRenderer->x_pManagerTextOut->DrawText(lpszText, x, y, WzColor_RGB(255, 192, 0));
// y += Line;
// }
// else if (remain_count == 2)// 2개 남은 경우
// {
// Snprintf(lpszText, 256-1, filed_string[gap_count-1],
// aggro_value_info[index-2].character_name_, aggro_value_info[index-2].aggro_value_,
// aggro_value_info[index-1].character_name_, aggro_value_info[index-1].aggro_value_);
// g_pSunRenderer->x_pManagerTextOut->DrawText(lpszText, x, y, WzColor_RGB(255, 192, 0));
// y += Line;
// }
//}
//else
//{
// Snprintf( lpszText, 256-1, _T("Aggro: 없음"));
// g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB(255, 192, 0));
// y += Line;
//}
if (pChar->GetObjectKey() != pre_object_key)
{//갱신 정보를 보내자
pre_object_key = pChar->GetObjectKey();
TCHAR string_result[MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH] = {0,};
sprintf(string_result, "aggrodisplay %u", pre_object_key);
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, string_result, MSG_CG_GM_STRING_CMD_SYN::MAX_STRING_CMD_LENGTH);
GlobalFunc::SendPacket(CI_GAMESERVERIDX,&msg,sizeof(msg));
}
}
//////////////////////////////////////////////////////////////////////////
}
#endif //#ifdef _DEV_VER
}
void BattleScene::_renderDbgInfoKeyQueueNum(int& x, int& y)
{
#ifdef _DEV_VER
TCHAR lpszText[256] = {0,};
Snprintf( lpszText, 256-1, _T("Current key Queue Num : %d"),g_KeyQueueManager.Size());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
#endif //#ifdef _DEV_VER
}
void BattleScene::_renderDbgInfoSkillQueueNum(int& x, int& y)
{
#ifdef _DEV_VER
TCHAR lpszText[256] = {0,};
Snprintf( lpszText, 256-1, _T("Current skill Queue Num : %d"),g_HeroInput.GetSkillQueueSize());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
#endif //#ifdef _DEV_VER
}
void BattleScene::_renderDbgInfoCameraSpring(int& x, int& y)
{
#ifdef _DEV_VER
TCHAR message[256] = {0,};
Snprintf(message, 256-1, _T("카메라기본:1.3 \n\n카메라 현재위치:%f "), g_Camera.CameraHeight());
g_pSunRenderer->x_pManagerTextOut->DrawText( message, x, y, WzColor_RGB(0, 255, 0));
y += 100;
Snprintf(message, 256-1,
_T("SPRING_CONST:%f\nDAMP_CONST:%f\nSPRING_LEN:%f"),
g_Camera.GetSpringConst(),
g_Camera.GetDampConst(),
g_Camera.GetSpringLen());
g_pSunRenderer->x_pManagerTextOut->DrawText(message, x, y, WzColor_RGB( 255, 0, 0 ));
y += 20;
#endif //#ifdef _DEV_VER
}
//------------------------------------------------------------------------------
/**
*/
void BattleScene::_renderDbgInfoHeroStatus(int& x, int& y)
{
#ifdef _DEV_VER
if (!g_pHero) return;
if (!g_pSunTerrain) return;
TCHAR lpszText[512] = {0,};
WzVector vPos = g_pHero->GetVisiblePos();
g_pSunTerrain->PathExp_Reset(g_pPathExplorer,&vPos, -1);
Snprintf( lpszText, 512-1, _T("Current Tile : %d[%d] Convex: [%d]")
, g_pHero->GetPathExplorer()->GetTile()
,g_pPathExplorer->GetTile()
,g_pSunTerrain->x_pPathFinder->GetConvexOfTile(g_pPathExplorer->GetTile()));
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Current Pos : x : %f y: %f z : %f"), vPos.x,vPos.y,vPos.z );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
PLAYER_ACTION curact = *g_pHero->GetCurrentAction();
PLAYER_ACTION queueact = g_HeroInput.GetQueueAction();
Snprintf( lpszText, 512-1, _T("Current Action : %s") , GetActionString(&curact) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Queue Action : %s") , GetActionString(&queueact) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Remain Attack Result : %d") , g_pHero->GetAttackResultListSize());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
#ifdef _NA_000000_20120410_SPEEDHACK
#ifdef _NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER
float move_speed_modifier = g_pHero->GetMoveSpeedModifier();
#else //_NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER
float move_speed_modifier = 0.0f;
if (g_pHero->IsRiding() || g_pHero->m_bCustomMoveSpeed)
{
move_speed_modifier = g_pHero->GetMoveSpeedModifier();
}
else
{
HeroAttributes* const hero_attr = (HeroAttributes*)(g_pHero->GetPlayerAttribute());
move_speed_modifier = hero_attr->move_speed_modifier_;
}
#endif //_NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER
float fMoveSpeed = g_pHero->move_speed_;
Snprintf( lpszText, 512-1, _T("Current Move Speed : %f(%f(%f), %f)") ,
fMoveSpeed * move_speed_modifier,
fMoveSpeed, g_pHero->Character::GetMoveSpeed(),
move_speed_modifier);
#else
float fMoveSpeed = g_pHero->GetMoveSpeed() * g_pHero->GetMoveSpeedModifier() ;
Snprintf( lpszText, 512-1, _T("Current Move Speed : %f") , fMoveSpeed );
#endif //_NA_000000_20120410_SPEEDHACK
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
float fDistance=10.0f;
if(fMoveSpeed)
{
fDistance=min(10.f,500.0f*fMoveSpeed);
}
Snprintf( lpszText, 512-1, _T("MoveDistance: %f") , fDistance );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Fighting Energy : %d") , g_pHero->GetFightingEnergy());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
int iMaxTile[64];
ZeroMemory(iMaxTile,sizeof(iMaxTile));
if (g_pHero->GetPathExplorer()->IsMoving())
{
int iRouteNum = g_pHero->GetPathExplorer()->GetTileRoute(iMaxTile);
if (iRouteNum > 0)
{
TCHAR szTile[32] = {0,};
int iVisibleRouteNum = iRouteNum;
// 10개까지만 보여준다.
if (iVisibleRouteNum > 10)
{
iVisibleRouteNum = 10;
}
ZeroMemory(lpszText,sizeof(lpszText));
Snprintf(szTile, 32-1, _T("Route Count(%d) "), iRouteNum);
_tcscat(lpszText,szTile);
for (int a = 0; a < iVisibleRouteNum; a++) {
ZeroMemory(szTile,sizeof(szTile));
Snprintf(szTile, 32-1, _T("[%d] "), iMaxTile[a]);
_tcscat(lpszText,szTile);
}
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
}
}
Snprintf( lpszText, 512-1, _T("TempVariable : %d %d %d"), g_TempVariable[0], g_TempVariable[1], g_TempVariable[2]);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
int iCurTile = g_pHero->GetPathExplorer()->GetTile();
int iNearNode[3];
if(iCurTile>=0)
g_pSunTerrain->x_pPathFinder->GetNearNodes(iCurTile , iNearNode , 3);
Snprintf( lpszText, 512-1, _T("NearNodes : %d %d %d"), iNearNode[0], iNearNode[1], iNearNode[2]);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Picked Tile : %d (%f %f %f)")
, g_HeroInput.GetPickedTileIndex()
, g_HeroInput.GetPickedPosition().x
, g_HeroInput.GetPickedPosition().y
, g_HeroInput.GetPickedPosition().z);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 512-1, _T("Exp : %ld / %ld"), g_pHero->GetExp(), g_pHero->GetNextExp());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
//////////////////////////////////////////////////////////////////////////
if(g_pHero && g_pHero->IsPetReturn())
{
Pet* pPet = (Pet*)g_ObjectManager.GetObject(g_pHero->GetPetObjectKey());
if(pPet)
{
WzColor ColTemp = pPet->GetColor();
Snprintf( lpszText, 512-1, _T("Pet Color : %x"),pPet->GetColor() );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
}
else
{
Snprintf( lpszText, 512-1, "pPet == NULL" );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
}
}
else
{
Snprintf( lpszText, 512-1, "펫소환X" );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
}
//////////////////////////////////////////////////////////////////////////
WzVector vNormal =g_pHero->GetNormal();
WzVector vUp={0.f,0.f,1.f};
float fAngle = n_rad2deg( acosf( VectorDotProduct( &vNormal, &vUp)));
Snprintf( lpszText, 512-1, "지형노말각: %f", fAngle);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
float fCameraAngle = g_Camera.GetAngle();
float fHeroAngle = g_pHero->GetAngle();
Snprintf( lpszText, 512-1, "카메라(%f) 주인공(%f)", fCameraAngle,fHeroAngle);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
DWORD load_time = DelayLoadManager::Instance()->delay_time(kLoadDelay);
DWORD process_time = DelayLoadManager::Instance()->delay_time(kProcessDelay);
DWORD quick_load_count = g_pSunRenderer->x_pManagerMultiLoader->GetNumberOfLoadObject(QUEUE_TYPE_QUICK);
DWORD normal_load_count = g_pSunRenderer->x_pManagerMultiLoader->GetNumberOfLoadObject(QUEUE_TYPE_NORMAL);
Snprintf(lpszText, 512-1, "멀티쓰레드-QuickLoad:%d NormalLoad:%d", quick_load_count, normal_load_count);
g_pSunRenderer->x_pManagerTextOut->DrawText(lpszText, x, y, WzColor_RGB(0, 255,0));
y += 20;
DWORD refresh_count = DelayLoadManager::Instance()->size();
Snprintf(lpszText, 512-1, "로드할갯수(%d)-load:%d process:%d", refresh_count, load_time, process_time);
g_pSunRenderer->x_pManagerTextOut->DrawText(lpszText, x, y, WzColor_RGB(0, 255,0));
y += 20;
//////////////////////////////////////////////////////////////////////////
#endif //#ifdef _DEV_VER
}
void BattleScene::_renderDbgInfoResourceStatus(int& x, int& y)
{
#ifdef _DEV_VER
TCHAR lpszText[256] = {0,};
Snprintf( lpszText, 256-1, _T("Player Count : %d"), g_ObjectManager.GetObjectCount(PLAYER_OBJECT) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("Monster Count : %d"), g_ObjectManager.GetObjectCount(MONSTER_OBJECT) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("Item Count : %d"), g_ObjectManager.GetObjectCount(ITEM_OBJECT) );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("Loaded Resource Count : %d"), ResourceManager::Instance()->GetLoadedResourceCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("Wait For Free Resource Count : %d"), ResourceManager::Instance()->GetWaitForFreeResourceCount());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("ObjectManager.size = %d"), g_ObjectManager.GetAllObjectCnt());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
#endif //#ifdef _DEV_VER
}
//------------------------------------------------------------------------------
void BattleScene::_renderDbgInfoSound(int& x, int& y)
{
#ifdef _DEV_VER
if(NULL == g_pMap)
return;
// FPS
DWORD dwTick;
DWORD dwTicks2;
DWORD dwTick3;
LONG lCount, lPpsCount, lDcpsCount;
g_pSunRenderer->GetFpsValues( &dwTick, &lCount );
float fFps = ( float )lCount * 1000.0f / ( float )dwTick;
g_pSunRenderer->GetPpsValues( &dwTicks2, &lPpsCount);
g_pSunRenderer->GetDcpsValues( &dwTick3, &lDcpsCount);
LONG lPolygon = lCount > 0 ? lPpsCount / lCount : 0;
LONG lDrawCall = lCount > 0 ? lDcpsCount / lCount : 0;
TCHAR lpszText[512] = {0,};
Snprintf( lpszText, 512-1, _T(" %f fps (%ld polygons, %ld drawcalls)"),
fFps, lPolygon, lDrawCall);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
//if (wzsnd_cache_is())
{
Snprintf( lpszText, 256-1, _T("wzsnd_cache_is = %s"), wzsnd_cache_is() ? "TRUE" : "FALSE" );
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("wzsnd_cache_size = %d"), wzsnd_cache_size());
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("wzsnd_cache_maintain_min = %d"), wzsnd_cache_maintain_milliseconds_get() / 1000 / 60);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("calltick_cache sec = %d"), Sound::Instance()->calltick_cache() / 1000);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
Snprintf( lpszText, 256-1, _T("calltick_updatelistener sec = %d"), Sound::Instance()->calltick_updatelistener() / 1000);
g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) );
y += 20;
}
#endif //#ifdef _DEV_VER
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void BattleScene::_renderDbgInfoAutobot(int& x, int& y)
{
#ifdef _DEV_VER
#ifdef _YMS_AUTOBOT_GAME
Autobot::Instance()->Render_DebugInfo();
#endif //_YMS_AUTOBOT_GAME
#endif //#ifdef _DEV_VER
}
void BattleScene::AddAttackResultQueueAction( cAttackResultData& ResultData, DWORD dwTimeSerial, DWORD dwAttackId )
{
Character* pTarget = (Character*)g_ObjectManager.GetObject(ResultData.GetTargetObjectKey());
if( pTarget == NULL )
{
return;
}
if( pTarget->IsKindOfObject(MONSTER_OBJECT) == TRUE )
{
Monster* pMon = (Monster*)pTarget;
if(MONSTER_TYPE_SETTING_MAPOBJECT == pMon->GetMonsterType())
return;
}
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_DOWN ) && ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK ) )
{
pTarget->SetKnockBackDown( ResultData.GetCurrentPosition().wvPos, ResultData.GetDestPosition().wvPos, ResultData.GetEndDownTime() );
return;
}
// 스턴, 다운, 띄우기등 좌표를 변경하지 않는 애들을 먼저 한 후,
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_STUN ) ||
ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_FREEZE )
)
{
pTarget->SetStun( ResultData.GetCurrentPosition().wvPos );
}
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_DOWN) ) // 엎어지기
{
pTarget->SetDown( ResultData.GetEndDownTime() );
}
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_AIR) )
{
if(!pTarget->CannotAir())
{
PLAYER_ACTION action;
action.ActionID = ACTION_TOAIR;
action.dwTimeSerial =dwTimeSerial;
action.TOAIR.fDownForceLimit = -40.0f;
action.TOAIR.fGravity = 70.0f;
action.TOAIR.fUpperForce = 50.0;
action.TOAIR.bForceDown=TRUE;
action.TOAIR.fHeightLimit = 3.4f;
action.TOAIR.dwAirTime = ResultData.GetAirTime();
action.TOAIR.dwGetupTime = ResultData.GetGetUpTime();
pTarget->PutAction(&action);
pTarget->SetLatestQueueAttack(dwTimeSerial);
}
}
// 좌표를 이동시키는걸 뒤에 한다
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK2) )
{
pTarget->SetKnockBack2( ResultData.GetCurrentPosition().wvPos, ResultData.GetDestPosition().wvPos );
}
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK3) )
{
pTarget->SetKnockBack3( ResultData.GetCurrentPosition().wvPos, ResultData.GetDestPosition().wvPos );
}
// 밀어내기
if( ResultData.CheckAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK) )
{
pTarget->SetKnockBack( ResultData.GetCurrentPosition().wvPos, ResultData.GetDestPosition().wvPos );
}
}
BOOL BattleScene::PreInterfaceRender(DWORD dwTick)
{
g_InterfaceManager.PreRenderInterfaceManager(dwTick );
return TRUE;
}
BOOL BattleScene::PostInterfaceRender(DWORD dwTick)
{
#ifdef _DEV_VER
_renderDbgText(dwTick);
#endif
m_EventText.RenderEventScript();
#ifdef _JBH_ADD_AGE_LIMIT_MARK
RenderGameRatingMark();
#endif //_JBH_ADD_AGE_LIMIT_MARK
g_InterfaceManager.UpdateRenderTarget();
#ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING
g_InterfaceManager.RenderToDiceTexture();
#endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING
return TRUE;
}
void BattleScene::AddSplitDamageResult( Character* character, ATTACK_RESULT* attack_result, int hit_count )
{
int group_id = 1;
ATTACK_RESULT temp;
temp = *attack_result; // copy
temp.SetGroupID(group_id);
assert(hit_count>1); // 멍청하면 그냥 죽어야징
DWORD damage_per_count = attack_result->GetTargetData().GetDamage() / hit_count;
for (int b = 0; b < hit_count - 1; b++ )
{
temp.GetTargetData().SetDamage( damage_per_count );
temp.GetTargetData().SetTargetHP( attack_result->GetTargetData().GetTargetHP() + attack_result->GetTargetData().GetDamage() - (b*damage_per_count) );
character->AddAttackResult(&temp);
++group_id;
temp.SetGroupID(group_id);
}
//마지막 타 이다.
temp.GetTargetData().SetDamage( attack_result->GetTargetData().GetDamage() - (damage_per_count*(hit_count-1)));
temp.GetTargetData().SetTargetHP( attack_result->GetTargetData().GetTargetHP() );
character->AddAttackResult(&temp);
}
void BattleScene::QueueSkillAction(PLAYER_ACTION *pAction,Character *pChar)
{
assert(pChar);
if(!pChar)
return;
if (GENERALPARAM->IsServerDebug())
{
pChar->DoAction(pAction);
pChar->CommitChangeState(g_CurTime);
}
else
{
pChar->PutAction(pAction);
}
}
// 클라이언트에서 데미지를 여러단계로 나누어서 표시하는 스킬의 갯수를 가져온다
bool BattleScene::GetSplitHitCount( SLOTCODE skill_class_code, int& hit_count )
{
switch( skill_class_code )
{
//2타
//case eSKILL_MYSTIC_904: // 플라잉비
case eSKILL_FIRE_DESTROYER_DOUBLE_HEAD:
#ifdef _NA_006679_20130423_1302_SKILL_RENEWAL
#else
case eSKILL_FILL_OFF:
#endif // _NA_006679_20130423_1302_SKILL_RENEWAL
case eSKILL_HEAVY_WHISTLE_SHOT:
case eSKILL_DOUBLE_SPINKICK:
case eSKILL_BLADE_FURY:
//case eSKILL_ARCANE_BLADE:
#ifdef _NA_007294_20140613_DRAGONKNIGHT_RENEWAL
#else
case eSKILL_FIST_OF_FIRE:
#endif //_NA_007294_20140613_DRAGONKNIGHT_RENEWAL
case eSKILL_FELLEN_WARRIOR_XDANCE:
#ifdef _NA_008732_20160315_WITCHBLADE_BALANCE_ADJUST
case eSKILL_WITCHBLADE_1104: // 트위스트플랩킥
case eSKILL_WITCHBLADE_1106: // 네일스크래치
case eSKILL_WITCHBLADE_1108: // 데드폴
case eSKILL_WITCHBLADE_1109: // 드래곤댄스
case eSKILL_WITCHBLADE_1110: // 스피닝하츠
case eSKILL_WITCHBLADE_1118: // 크로스콤비네이션
#endif // _NA_008732_20160315_WITCHBLADE_BALANCE_ADJUST
{
hit_count = 2;
}
break;
// 3타
case eSKILL_DARK_KNIGHT_DARK_SWORD:
case eSKILL_BLOOD_RAIN:
case eSKILL_TRIPLE_PIERCE:
case eSKILL_FIRE_FILA:
case eSKILL_REDAMOR_WARRIOR_SPIN_CRUSH:
case eSKILL_DARK_F_INFANTRY_BASH:
case eSKILL_HEAVY_NOIZE_SHOT:
case eSKILL_DARK_SWORDMAN_TRIPLE_ATTACK:
{
hit_count = 3;
}
break;
//4타:
case eSKILL_DARKNESS_OBSERVER_WHEEL_ATTACK:
case eSKILL_POISON_RAIN:
case eSKILL_SWORDDANCING:
case eSKILL_LIGHTING_WAVE:
case eSKILL_FLAME_RULER_EXPLORZEN_KNOCKLE:
case eSKILL_EVIL_SORCERER_PRESSING_WALL:
case eSKILL_CHASE_SHOT:
#ifdef _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
#else
case eSKILL_AIRBLOW:
#endif // _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
{
hit_count = 4;
}
break;
//5타
case eSKILL_SACRED_FIRE:
case eSKILL_ILLUSION_DANCE:
case eSKILL_DARK_SLASH:
{
hit_count = 5;
}
break;
//6타
case eSKILL_FAST_SHOT:
{
hit_count = 6;
}
break;
case eSKILL_MYSTIC_909: // 템페스트블로우
{
hit_count = 6;
}
break;
//10타
case eSKILL_SPINING_WAVE:
case eSKILL_WILD_SHOT:
{
hit_count = 10;
}
break;
//15타
case eSKILL_EVIL_SORCERER_FIRE_BALL:
{
hit_count = 15;
}
break;
default:
// 나머지는 나누지않는다
return false;
}
return true;
}
#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
void BattleScene::AddSkillResult( Character* pChr, SkillFacade::ResultData* result_data, const time_t& server_time )
{
SkillScriptInfo* skill_info = result_data->GetSkillScriptInfo();
assert(skill_info && "적용할수없는 스킬의 결과입니다");
assert(result_data->GetTargetResultCount() < MAX_TARGET_NUM);
//#ifdef _MILKY_DEBUG
// // 자동 쿨타임 초기화
// if( g_pHero != NULL && pChr != NULL )
// {
// GlobalFunc::ProcessChatMessage( "//쿨타임" );
// }
//#endif
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, "[%s(%d, %d), %d]",
skill_info->m_szSkillName,
skill_info->m_SkillClassCode,
skill_info->m_SkillCode,
result_data->GetTargetResultCount() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFFFFFF );
}
#endif
if ( result_data->GetTargetResultCount() == 0) //자신 지정스킬의 경우 타겟이 없다.
{
return;
}
int targetcount = 0;
int iResultSize = 0;
cAttackResultData TargetInfo[MAX_TARGET_NUM];
//ATTACK_RESULT_TARGET_INFO TargetInfo[MAX_TARGET_NUM];
ATTACK_RESULT attackresult;
DWORD projectileId = NONE_ID;
DWORD mainTargetIndex = NONE_ID;
eWEAPONSOUNDKIND eSoundKind;
if (pChr->IsKindOfObject(PLAYER_OBJECT))
{
Player * pPlayer = (Player *)pChr;
eSoundKind = GameFunc::GetWeaponSoundKind((eWEAPONTYPE)pPlayer->GetWeaponKind());
}
else
{
eSoundKind = (eWEAPONSOUNDKIND)0;
}
// 타겟 수 만큼 타겟 결과를 만든다.
for (int a = 0; a < result_data->GetTargetResultCount(); a++)
{
SkillFacade::TargetResult* target_result = result_data->GetTargetResult(a);
if( target_result == NULL )
continue;
// 대상이 없으면 패스
Character* pTarget = (Character*)g_ObjectManager.GetObject( target_result->GetTargetKey() );
if( pTarget == NULL )
continue;
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, " [%d] [%s] [%d]", a+1, pTarget->GetName(), pTarget->GetObjectKey() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFFFFFF );
}
#endif
ZeroMemory(&attackresult,sizeof(attackresult));
attackresult.SetSkillCode( result_data->GetSkillCode() );
attackresult.SetAttackSerial( result_data->GetClientSerial() );
attackresult.SetTimeSerial( GetBattleTimeSerial() );
attackresult.SetWeaponSound( eSoundKind );
//////////////////////////////////////////////////////////////////////////
// AddTargetResultInfo 부분
attackresult.GetTargetData().SetTargetObjectKey( target_result->GetTargetKey() );
attackresult.GetTargetData().SetAdditionalEffect( ConvertServerToClientEffect( target_result->GetSkillEffect() ));//클라이언트용으로 변환
attackresult.GetTargetData().SetNoDamage(TRUE);// 데미지 Ability가 있을때 FALSE로 변한다.
attackresult.GetTargetData().SetPosition( pTarget->GetPosition(), pTarget->GetPosition() );
// 대상에 스킬이펙트를 처리
if( pTarget != pChr )
{
SkillEffectFunc::CreateReceiverSkillEffect(result_data->GetSkillCode(), a, pTarget, pChr );
}
// 대상에 어빌리티 내용을 적용 (데미지, 스턴, 힐 등등..)
int hit_count = 0;
for ( size_t i=0;i!=target_result->GetResultCount();++i)
{
SKILL_RESULT_CODE* result_code = target_result->GetResultCode(i);
BASE_ABILITYINFO* pAbilityInfo = target_result->GetResultAbillityInfo(i);
if( result_code == NULL || pAbilityInfo == NULL )
continue;
//attackresult.GetTargetData().Init();
AddAbilityResult( pChr, pTarget, result_data->GetSkillCode(), result_code, attackresult.GetTargetData() );
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
TCHAR result_string[INTERFACE_STRING_LENGTH] = {0, };
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
// 데미지를 등록
if( pAbilityInfo->m_wAbilityID == eABILITY_DAMAGE )
{
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, " [DAMAGE : %d]", attackresult.GetTargetData().GetDamage() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF88A7 );
}
#endif
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
if (pTarget->IsMyHero())
{
bool is_critical = attackresult.GetTargetData().CheckAdditionalEffect(ATTACK_ADDITIONAL_EFFECT_CRITICAL) ? true : false;
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
if (pChr->GetObjectType() == MONSTER_OBJECT && pSkillInfo->m_dwSkillNcode == 0)
{
// 2080 : 스킬공격
g_InterfaceManager.GetInterfaceString(2080, skill_name);
}
else
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
}
GlobalFunc::WriteCombatRecord(eCRK_DAMAGE_BY, attackresult.GetTargetData().GetDamage(), pChr, skill_name, server_time, is_critical);
}
else
{
GlobalFunc::WriteCombatRecord(eCRK_DAMAGE_BY, attackresult.GetTargetData().GetDamage(), pChr, "", server_time, is_critical);
}
}
else if (pChr->IsMyHero())
{
bool is_critical = attackresult.GetTargetData().CheckAdditionalEffect(ATTACK_ADDITIONAL_EFFECT_CRITICAL) ? true : false;
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
GlobalFunc::WriteCombatRecord(eCRK_DAMAGE_TO, attackresult.GetTargetData().GetDamage(), pTarget, skill_name, server_time, is_critical);
}
else
{
GlobalFunc::WriteCombatRecord(eCRK_DAMAGE_TO, attackresult.GetTargetData().GetDamage(), pTarget, "", server_time, is_critical);
}
}
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
if( GetSplitHitCount( skill_info->m_SkillClassCode, hit_count ) == true )
{
// 데미지를 클라에서 나누는 경우
AddSplitDamageResult( pChr, &attackresult, hit_count );
}
else
{
attackresult.SetGroupID(hit_count + 1 );
pChr->AddAttackResult( &attackresult );
++hit_count;
}
// 맞는 놈이 주인공이면 타겟 설정
if( g_pHero && ( pTarget->GetObjectKey() == g_pHero->GetObjectKey() ) && attackresult.GetTargetData().IsNoDamage() == FALSE )
{
// 주인공이 타겟을 잡고 있지 않다면 설정
if( g_HeroInput.GetCurrentTarget() == 0 )
{
g_HeroInput.SetCurrentTarget( pChr->GetObjectKey() );
}
}
}
else if( pAbilityInfo->m_wAbilityID == eABILITY_CUR_HP_INCREASE )
{
#ifdef _DEV_VER
TCHAR message[1024];
wsprintf(message, " [ABILITY : %d] [PARAM: %d, %d, %d, %d]",
pAbilityInfo->m_wAbilityID,
pAbilityInfo->m_iParam[0],
pAbilityInfo->m_iParam[1],
pAbilityInfo->m_iParam[2],
pAbilityInfo->m_iParam[3] );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF7050 );
#endif
bool Is_monster = false;
Player* player_ptr = NULL;
if (pChr->GetObjectType() == MONSTER_OBJECT)
{
Monster* monster_ptr = static_cast<Monster*> (pChr);
if (monster_ptr)
{
DWORD monster_ptr_parent_id = monster_ptr->GetParentId();
if (monster_ptr_parent_id)
{
Object* object_ptr = NULL;
object_ptr = g_ObjectManager.GetObject(monster_ptr->GetParentId() );
if (object_ptr)
{
if (object_ptr->GetObjectType() == PLAYER_OBJECT)
{
player_ptr = static_cast<Player*> (object_ptr);
}
}
if (player_ptr)
{
Is_monster = player_ptr->GetObjectKey() == g_pHero->GetObjectKey();
}
}
}
}
if(g_pHero && ( pTarget->GetObjectKey() == g_pHero->GetObjectKey() )
&& (pChr->GetObjectKey() == g_pHero->GetObjectKey() || Is_monster == true ))
{
// 위 조건문은 g_pHero가 존재 할 때 타겟이 내가 되고 만약 다른이가 써줬을 때
//다른 클래스의 어빌리티와 내 스킬 어빌리티가 섞여 나에게 스킬을 쓰지 않을 때는 이상한 수치가 나오게 된다.
attackresult.GetTargetData().SetHeal( TRUE );
attackresult.GetTargetData().SetNoDamage( FALSE );
PlayerAttributes* player_attributes = g_pHero->GetPlayerAttribute();
int skill_percent_damage = player_attributes->GetSkillPercentDamage();
if (skill_percent_damage > 0)
{
int iTempAbility = pAbilityInfo->m_iParam[1];
iTempAbility = int(iTempAbility * (skill_percent_damage / 100.0f));
attackresult.GetTargetData().SetDamage(pAbilityInfo->m_iParam[1] + iTempAbility);
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
if (pTarget->IsMyHero())
{
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
}
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
if (pSkillInfo->m_dwSkillNcode == 0)
{
// 2075 : 추가효과
g_InterfaceManager.GetInterfaceString(2075, skill_name);
}
else
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
}
if (_tcslen(state_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, pAbilityInfo->m_iParam[1] + iTempAbility, pChr, result_string, server_time);
}
}
else
{
if (_tcslen(state_name) > 0)
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, pAbilityInfo->m_iParam[1] + iTempAbility, pChr, state_name, server_time);
}
}
}
else if (pChr->IsMyHero())
{
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
}
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
if (_tcslen(state_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, pAbilityInfo->m_iParam[1] + iTempAbility, pTarget, result_string, server_time);
}
}
else
{
if (_tcslen(state_name) > 0)
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, pAbilityInfo->m_iParam[1] + iTempAbility, pTarget, state_name, server_time);
}
}
}
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
}
else
{
attackresult.GetTargetData().SetDamage(pAbilityInfo->m_iParam[1]);
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
}
if (pTarget->IsMyHero())
{
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
if (pSkillInfo->m_dwSkillNcode == 0)
{
// 2075 : 추가효과
g_InterfaceManager.GetInterfaceString(2075, skill_name);
}
else
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
}
if (_tcslen(state_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, pAbilityInfo->m_iParam[1], pChr, result_string, server_time);
}
}
else
{
if (_tcslen(state_name) > 0)
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, pAbilityInfo->m_iParam[1], pChr, state_name, server_time);
}
}
}
else if (pChr->IsMyHero())
{
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
}
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
if (_tcslen(state_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, pAbilityInfo->m_iParam[1], pTarget, result_string, server_time);
}
}
else
{
if (_tcslen(state_name) > 0)
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, pAbilityInfo->m_iParam[1], pTarget, state_name, server_time);
}
}
}
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
}
pChr->AddAttackResult( &attackresult );
}
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
else if (pTarget->IsMyHero())
{
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
if (pSkillInfo->m_dwSkillNcode == 0)
{
// 2075 : 추가효과
g_InterfaceManager.GetInterfaceString(2075, skill_name);
}
else
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
}
}
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
if (_tcslen(skill_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, attackresult.GetTargetData().GetDamage(), pChr, result_string, server_time);
}
else
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, attackresult.GetTargetData().GetDamage(), pChr, state_name, server_time);
}
}
}
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
}
else
{
#ifdef _DEV_VER
TCHAR message[1024];
wsprintf(message, " [ABILITY : %d] [PARAM: %d, %d, %d, %d]",
pAbilityInfo->m_wAbilityID,
pAbilityInfo->m_iParam[0],
pAbilityInfo->m_iParam[1],
pAbilityInfo->m_iParam[2],
pAbilityInfo->m_iParam[3] );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF8432 );
#endif
//#ifdef _NA_008800_20160510_COMBAT_RECORD_SYSTEM
TCHAR skill_name[INTERFACE_STRING_LENGTH] = {0, };
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(attackresult.GetSkillCode());
if (pSkillInfo)
{
if (pSkillInfo->m_dwSkillNcode == 0)
{
// 2075 : 추가효과
g_InterfaceManager.GetInterfaceString(2075, skill_name);
}
else
{
g_InterfaceManager.GetInterfaceString(pSkillInfo->m_dwSkillNcode, skill_name);
}
}
if (pTarget->IsMyHero())
{
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
if (_tcslen(skill_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, attackresult.GetTargetData().GetDamage(), pChr, result_string, server_time);
}
else
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_BY, attackresult.GetTargetData().GetDamage(), pChr, state_name, server_time);
}
}
}
else if (pChr->IsMyHero())
{
TCHAR state_name[INTERFACE_STRING_LENGTH] = {0, };
BASE_STATEINFO* state_info = StateInfoParser::Instance()->GetStateInfo(pAbilityInfo->m_wStateID);
if (state_info)
{
g_InterfaceManager.GetInterfaceString(state_info->m_dwNamecode, state_name);
if (_tcslen(skill_name) > 0)
{
Snprintf(result_string, INTERFACE_STRING_LENGTH-1, _T("%s, %s"), skill_name, state_name);
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, attackresult.GetTargetData().GetDamage(), pTarget, result_string, server_time);
}
else
{
GlobalFunc::WriteCombatRecord(eCRK_ABILITY_TO, attackresult.GetTargetData().GetDamage(), pTarget, state_name, server_time);
}
}
}
//#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
}
}
AddAttackResultQueueAction( attackresult.GetTargetData(), GetBattleTimeSerial(), pChr->GetObjectKey() );
#ifdef _KST_DISPLAY_SKILL_RESULT_MESSAGE
char temp[1024];
wsprintf( temp, "AddAttackResult : AbillityCount[%d] HitCount[%d]", target_result->GetResultCount(), hit_count );
GlobalFunc::OutputMsg_SysMsg( temp );
#endif
if( hit_count < 2 )
{
//! 연타처리 형태가 아니면 즉시 처리한다
//! 서버측에서 결과를 싱크 맞게 보내주기때문에 클라이언트는 오면 즉시 처리
//! skill.info.txt :: FlyingObjectCode 필드를 참고해서 서버측에서 패킷이 늦게 옴.
//! MSGSUB_SKILL_PERIODIC_DAMAGE_BRD등 주기적으로 오는것도 적시 처리(발사체는 제외)
if (g_SkillStateFactory.GetResultProcessingType(result_data->GetSkillCode()) == SkillStateFactory::kProcessing_PacketRecvImmediate)
{
pChr->ProcessAttackResult(pChr->GetCurrentAttackSerial(), FALSE);
}
}
//////////////////////////////////////////////////////////////////////////
TargetInfo[a] = attackresult.GetTargetData();
if( result_data->GetPrimaryTargetKey() == TargetInfo[a].GetTargetObjectKey() )
{
mainTargetIndex = a; //메인타겟 인덱스 보관
}
if (GENERALPARAM->GetSpecialMode())
{
if (g_pHero && (g_pHero->GetObjectKey() == TargetInfo[a].GetTargetObjectKey()))
{
if (TargetInfo[a].GetTargetHP() == 0)
{
TCHAR szString[256];
Sprintf(szString,_T("플레이어 %d 스킬로 사망"),result_data->GetSkillCode());
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT,szString);
}
}
}
// 모든 대상에게서 이펙트
if( skill_info->m_SkillClassCode == eSKILL_VITAL_SUCTION )
{
WzVector StartPosition = pTarget->GetArrowTargetPos();
WzVector ControlPosition = StartPosition;
ControlPosition.z += 3.0f;
cProjectileBezierUnit* pProjectile = new cProjectileBezierUnit();
pProjectile->SetLifeTime(800);
pProjectile->SetBezierCourseSingleControl( StartPosition, ControlPosition, pChr->GetObjectKey() );
pProjectile->CreateEffect( StrToWzID("K797"), pChr->GetObjectKey(), pTarget->GetObjectKey() );
pProjectile->SetHitData( pChr->GetObjectKey(), 0, StrToWzID("K798"), FALSE, 0, FALSE );
g_ProjectileManagerEx.InsertProjectile( pProjectile );
}
}
// 서버 디버그모드일경우는 바로 데미지 처리.
if (GENERALPARAM->IsServerDebug())
{
pChr->ProcessAttackResult( result_data->GetClientSerial(), TRUE);//true일때 시리얼에 맞는 결과를 전부 제거
}
// 현재 AttackSerial보다 늦게 온 놈이면 바로 처리해버린다.
// 딜레이 스킬은 남도 늦게 온다!
if ( result_data->GetClientSerial() < pChr->GetNextAttackSerial() )
{
pChr->ProcessAttackResult(result_data->GetClientSerial(), TRUE);//true일때 시리얼에 맞는 결과를 전부 제거
}
}
#else
void BattleScene::AddSkillResult( Character* pChr, SkillFacade::ResultData* result_data )
{
SkillScriptInfo* skill_info = result_data->GetSkillScriptInfo();
assert(skill_info && "적용할수없는 스킬의 결과입니다");
assert(result_data->GetTargetResultCount() < MAX_TARGET_NUM);
//#ifdef _MILKY_DEBUG
// // 자동 쿨타임 초기화
// if( g_pHero != NULL && pChr != NULL )
// {
// GlobalFunc::ProcessChatMessage( "//쿨타임" );
// }
//#endif
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, "[%s(%d, %d), %d]",
skill_info->m_szSkillName,
skill_info->m_SkillClassCode,
skill_info->m_SkillCode,
result_data->GetTargetResultCount() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFFFFFF );
}
#endif
if ( result_data->GetTargetResultCount() == 0) //자신 지정스킬의 경우 타겟이 없다.
{
return;
}
int targetcount = 0;
int iResultSize = 0;
cAttackResultData TargetInfo[MAX_TARGET_NUM];
//ATTACK_RESULT_TARGET_INFO TargetInfo[MAX_TARGET_NUM];
ATTACK_RESULT attackresult;
DWORD projectileId = NONE_ID;
DWORD mainTargetIndex = NONE_ID;
eWEAPONSOUNDKIND eSoundKind;
if (pChr->IsKindOfObject(PLAYER_OBJECT))
{
Player * pPlayer = (Player *)pChr;
eSoundKind = GameFunc::GetWeaponSoundKind((eWEAPONTYPE)pPlayer->GetWeaponKind());
}
else
{
eSoundKind = (eWEAPONSOUNDKIND)0;
}
// 타겟 수 만큼 타겟 결과를 만든다.
for (int a = 0; a < result_data->GetTargetResultCount(); a++)
{
SkillFacade::TargetResult* target_result = result_data->GetTargetResult(a);
if( target_result == NULL )
continue;
// 대상이 없으면 패스
Character* pTarget = (Character*)g_ObjectManager.GetObject( target_result->GetTargetKey() );
if( pTarget == NULL )
continue;
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, " [%d] [%s] [%d]", a+1, pTarget->GetName(), pTarget->GetObjectKey() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFFFFFF );
}
#endif
ZeroMemory(&attackresult,sizeof(attackresult));
attackresult.SetSkillCode( result_data->GetSkillCode() );
attackresult.SetAttackSerial( result_data->GetClientSerial() );
attackresult.SetTimeSerial( GetBattleTimeSerial() );
attackresult.SetWeaponSound( eSoundKind );
//////////////////////////////////////////////////////////////////////////
// AddTargetResultInfo 부분
attackresult.GetTargetData().SetTargetObjectKey( target_result->GetTargetKey() );
attackresult.GetTargetData().SetAdditionalEffect( ConvertServerToClientEffect( target_result->GetSkillEffect() ));//클라이언트용으로 변환
attackresult.GetTargetData().SetNoDamage(TRUE);// 데미지 Ability가 있을때 FALSE로 변한다.
attackresult.GetTargetData().SetPosition( pTarget->GetPosition(), pTarget->GetPosition() );
// 대상에 스킬이펙트를 처리
if( pTarget != pChr )
{
SkillEffectFunc::CreateReceiverSkillEffect(result_data->GetSkillCode(), a, pTarget, pChr );
}
// 대상에 어빌리티 내용을 적용 (데미지, 스턴, 힐 등등..)
int hit_count = 0;
for ( size_t i=0;i!=target_result->GetResultCount();++i)
{
SKILL_RESULT_CODE* result_code = target_result->GetResultCode(i);
BASE_ABILITYINFO* pAbilityInfo = target_result->GetResultAbillityInfo(i);
if( result_code == NULL || pAbilityInfo == NULL )
continue;
//attackresult.GetTargetData().Init();
AddAbilityResult( pChr, pTarget, result_data->GetSkillCode(), result_code, attackresult.GetTargetData() );
// 데미지를 등록
if( pAbilityInfo->m_wAbilityID == eABILITY_DAMAGE )
{
#ifdef _DEV_VER
{
TCHAR message[1024];
wsprintf(message, " [DAMAGE : %d]", attackresult.GetTargetData().GetDamage() );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF88A7 );
}
#endif
if( GetSplitHitCount( skill_info->m_SkillClassCode, hit_count ) == true )
{
// 데미지를 클라에서 나누는 경우
AddSplitDamageResult( pChr, &attackresult, hit_count );
}
else
{
attackresult.SetGroupID(hit_count + 1 );
pChr->AddAttackResult( &attackresult );
++hit_count;
}
// 맞는 놈이 주인공이면 타겟 설정
if( g_pHero && ( pTarget->GetObjectKey() == g_pHero->GetObjectKey() ) && attackresult.GetTargetData().IsNoDamage() == FALSE )
{
// 주인공이 타겟을 잡고 있지 않다면 설정
if( g_HeroInput.GetCurrentTarget() == 0 )
{
g_HeroInput.SetCurrentTarget( pChr->GetObjectKey() );
}
}
}
else if( pAbilityInfo->m_wAbilityID == eABILITY_CUR_HP_INCREASE )
{
#ifdef _DEV_VER
TCHAR message[1024];
wsprintf(message, " [ABILITY : %d] [PARAM: %d, %d, %d, %d]",
pAbilityInfo->m_wAbilityID,
pAbilityInfo->m_iParam[0],
pAbilityInfo->m_iParam[1],
pAbilityInfo->m_iParam[2],
pAbilityInfo->m_iParam[3] );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF7050 );
#endif
bool Is_monster = false;
Player* player_ptr = NULL;
if (pChr->GetObjectType() == MONSTER_OBJECT)
{
Monster* monster_ptr = static_cast<Monster*> (pChr);
if (monster_ptr)
{
DWORD monster_ptr_parent_id = monster_ptr->GetParentId();
if (monster_ptr_parent_id)
{
Object* object_ptr = NULL;
object_ptr = g_ObjectManager.GetObject(monster_ptr->GetParentId() );
if (object_ptr)
{
if (object_ptr->GetObjectType() == PLAYER_OBJECT)
{
player_ptr = static_cast<Player*> (object_ptr);
}
}
if (player_ptr)
{
Is_monster = player_ptr->GetObjectKey() == g_pHero->GetObjectKey();
}
}
}
}
if(g_pHero && ( pTarget->GetObjectKey() == g_pHero->GetObjectKey() )
&& (pChr->GetObjectKey() == g_pHero->GetObjectKey() || Is_monster == true ))
{
// 위 조건문은 g_pHero가 존재 할 때 타겟이 내가 되고 만약 다른이가 써줬을 때
//다른 클래스의 어빌리티와 내 스킬 어빌리티가 섞여 나에게 스킬을 쓰지 않을 때는 이상한 수치가 나오게 된다.
attackresult.GetTargetData().SetHeal( TRUE );
attackresult.GetTargetData().SetNoDamage( FALSE );
PlayerAttributes* player_attributes = g_pHero->GetPlayerAttribute();
int skill_percent_damage = player_attributes->GetSkillPercentDamage();
if (skill_percent_damage > 0)
{
int iTempAbility = pAbilityInfo->m_iParam[1];
iTempAbility = int(iTempAbility * (skill_percent_damage / 100.0f));
attackresult.GetTargetData().SetDamage(pAbilityInfo->m_iParam[1] + iTempAbility);
}
else
{
attackresult.GetTargetData().SetDamage(pAbilityInfo->m_iParam[1]);
}
pChr->AddAttackResult( &attackresult );
}
}
else
{
#ifdef _DEV_VER
TCHAR message[1024];
wsprintf(message, " [ABILITY : %d] [PARAM: %d, %d, %d, %d]",
pAbilityInfo->m_wAbilityID,
pAbilityInfo->m_iParam[0],
pAbilityInfo->m_iParam[1],
pAbilityInfo->m_iParam[2],
pAbilityInfo->m_iParam[3] );
g_InterfaceManager.AddSkillResultMessage( message, 0xFFFF8432 );
#endif
}
}
AddAttackResultQueueAction( attackresult.GetTargetData(), GetBattleTimeSerial(), pChr->GetObjectKey() );
#ifdef _KST_DISPLAY_SKILL_RESULT_MESSAGE
char temp[1024];
wsprintf( temp, "AddAttackResult : AbillityCount[%d] HitCount[%d]", target_result->GetResultCount(), hit_count );
GlobalFunc::OutputMsg_SysMsg( temp );
#endif
if( hit_count < 2 )
{
//! 연타처리 형태가 아니면 즉시 처리한다
//! 서버측에서 결과를 싱크 맞게 보내주기때문에 클라이언트는 오면 즉시 처리
//! skill.info.txt :: FlyingObjectCode 필드를 참고해서 서버측에서 패킷이 늦게 옴.
//! MSGSUB_SKILL_PERIODIC_DAMAGE_BRD등 주기적으로 오는것도 적시 처리(발사체는 제외)
if (g_SkillStateFactory.GetResultProcessingType(result_data->GetSkillCode()) == SkillStateFactory::kProcessing_PacketRecvImmediate)
{
pChr->ProcessAttackResult(pChr->GetCurrentAttackSerial(), FALSE);
}
}
//////////////////////////////////////////////////////////////////////////
TargetInfo[a] = attackresult.GetTargetData();
if( result_data->GetPrimaryTargetKey() == TargetInfo[a].GetTargetObjectKey() )
{
mainTargetIndex = a; //메인타겟 인덱스 보관
}
if (GENERALPARAM->GetSpecialMode())
{
if (g_pHero && (g_pHero->GetObjectKey() == TargetInfo[a].GetTargetObjectKey()))
{
if (TargetInfo[a].GetTargetHP() == 0)
{
TCHAR szString[256];
Sprintf(szString,_T("플레이어 %d 스킬로 사망"),result_data->GetSkillCode());
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT,szString);
}
}
}
// 모든 대상에게서 이펙트
if( skill_info->m_SkillClassCode == eSKILL_VITAL_SUCTION )
{
WzVector StartPosition = pTarget->GetArrowTargetPos();
WzVector ControlPosition = StartPosition;
ControlPosition.z += 3.0f;
cProjectileBezierUnit* pProjectile = new cProjectileBezierUnit();
pProjectile->SetLifeTime(800);
pProjectile->SetBezierCourseSingleControl( StartPosition, ControlPosition, pChr->GetObjectKey() );
pProjectile->CreateEffect( StrToWzID("K797"), pChr->GetObjectKey(), pTarget->GetObjectKey() );
pProjectile->SetHitData( pChr->GetObjectKey(), 0, StrToWzID("K798"), FALSE, 0, FALSE );
g_ProjectileManagerEx.InsertProjectile( pProjectile );
}
}
// 서버 디버그모드일경우는 바로 데미지 처리.
if (GENERALPARAM->IsServerDebug())
{
pChr->ProcessAttackResult( result_data->GetClientSerial(), TRUE);//true일때 시리얼에 맞는 결과를 전부 제거
}
// 현재 AttackSerial보다 늦게 온 놈이면 바로 처리해버린다.
// 딜레이 스킬은 남도 늦게 온다!
if ( result_data->GetClientSerial() < pChr->GetNextAttackSerial() )
{
pChr->ProcessAttackResult(result_data->GetClientSerial(), TRUE);//true일때 시리얼에 맞는 결과를 전부 제거
}
}
#endif // _NA_008800_20160510_COMBAT_RECORD_SYSTEM
void BattleScene::AddAbilityResult( Character* pChr, Character* pTarget, DWORD dwSkillCode, SKILL_RESULT_CODE* pResultCode, cAttackResultData& ResultData )
{
// ABILITY에 딸린 상태이상이 있으면 적용해준다.
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillCode);
if ( pSkillInfo == NULL )
return;
BASE_ABILITYINFO* pAbilityInfo = pSkillInfo->GetAbilityInfoByIndex((BYTE)pResultCode->m_wAbilityIndex);
if( pAbilityInfo == NULL )
return;
switch(pAbilityInfo->m_wAbilityID)
{
#ifdef _NA_20120426_DISPLAY_SKILL_COMBO_ICON_EFFECT
case kAbilityActiveComboSkill:
{
if( pChr == g_pHero )
{
int skill_class_code1 = pAbilityInfo->m_iOption1;
int skill_class_code2 = pAbilityInfo->m_iOption2;
int skill_class_code3 = pAbilityInfo->m_iParam[0];
int skill_class_code4 = pAbilityInfo->m_iParam[1];
DWORD duration = pAbilityInfo->m_iParam[2]; // 유지시간
g_pHero->AddActivedComboSkill( skill_class_code1, duration );
g_pHero->AddActivedComboSkill( skill_class_code2, duration );
g_pHero->AddActivedComboSkill( skill_class_code3, duration );
g_pHero->AddActivedComboSkill( skill_class_code4, duration );
}
}
break;
#endif
case eABILITY_MONSTER_TRANSFORMATION:
{
SKILL_RESULT_MONSTER_TRANSFORMATION* pResult = (SKILL_RESULT_MONSTER_TRANSFORMATION *)pResultCode;
pTarget->SetFreeMove(FALSE);
pTarget->SetHeight(0.0f);
DWORD dwCloneKey = g_CloneManager.CreateClone(pTarget);
Clone *pClone = g_CloneManager.GetClone(dwCloneKey);
if (pClone)
{
int iR = Red_WzColor(pTarget->GetColor());
int iG = Green_WzColor(pTarget->GetColor());
int iB = Blue_WzColor(pTarget->GetColor());
WzColor color=WzColor_RGBA(iR,iG,iB,255);
pClone->SetAlphaBlend(AB_ALPHA);
pClone->SetColor(color);
pClone->SetLifeTime( 2100 );
pClone->SetDisappear( 2000 );
pClone->SetPlayAni( TRUE );
}
PLAYER_ACTION action;
ZeroMemory(&action,sizeof(action));
action.ActionID = ACTION_TRANSFORM;
action.TRANSFORM.rcCode=pAbilityInfo->m_iOption1;
action.TRANSFORM.transFormType=(eTRANSFORM_TYPE)pAbilityInfo->m_iOption1;
pTarget->DoAction(&action);
pTarget->CommitChangeState(g_CurTime);
pTarget->SetHP( pResult->m_dwHP );
pTarget->SetMaxHP(pResult->m_dwMaxHP);//초기 mp값은 없음으로 서버에서 세팅하라고함-지완
//변신중 몬스터가 타겟되어있다면 풀어준다.
if(pTarget->GetObjectKey() == g_HeroInput.GetCurrentTarget())
{
g_HeroInput.SetCurrentTarget(0);
}
}
break;
case eABILITY_DAMAGE:
{
SKILL_RESULT_DAMAGE *pResult = (SKILL_RESULT_DAMAGE *)pResultCode;
ResultData.SetTargetHP( pResult->m_dwTargetHP );
ResultData.SetDamage( pResult->m_wDamage );
ResultData.SetNoDamage( FALSE );
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
ResultData.SetTargetSD(pResult->target_sd);
#endif //_NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
if( pResult->m_byEffect & SKILL_EFFECT_ETHERDEVICE_METAL)
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_ETHERDEVICE_METAL );
}
if( pResult->m_byEffect & SKILL_EFFECT_ETHERDEVICE_ETHER)
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_ETHERDEVICE_ETHER );
}
if (ResultData.GetDamage() == 0 )
{
// SKILL MISS
ResultData.SetMiss( TRUE );
#ifdef _KST_DISPLAY_SKILL_RESULT_MESSAGE
TCHAR szMessage[INTERFACE_STRING_LENGTH];
g_InterfaceManager.GetInterfaceString( eST_SKILL_MISS, szMessage, INTERFACE_STRING_LENGTH ); // "스킬이 빗나갔습니다."
g_InterfaceManager.ShowMessageBox( szMessage, 3000, 0 );
#endif
}
}
break;
//치유의 손길
case eABILITY_CUR_HP_INCREASE:// 현재 HP 증가
{
if( pAbilityInfo->m_iParam[1] > 0 )//회복 어빌리티일때
{
cTargetPosition Position;
Position.SetTargetVisiblePosition( pTarget->GetObjectKey(), TRUE );
if( pSkillInfo->m_SkillClassCode == eSKILL_HEALING_HAND)
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("K410"), 5000, Position );
}
else if( pSkillInfo->m_SkillClassCode == eSKILL_HEAL_MAGIC_ARRAY)
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("k420"), 5000, Position );
}
else if( pSkillInfo->m_SkillClassCode == eSKILL_NATURAL_FORCE)
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("k430"), 5000, Position );
}
else
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("k410"), 5000, Position );
}
}
}
break;
// 자신의 HP소모류의 스킬은 바로 HPMP를 빼준다.
case eABILITY_EXHAUST_MP:
case eABILITY_EXHAUST_HP:
{
SKILL_RESULT_EXHAUST *pResult = (SKILL_RESULT_EXHAUST *)pResultCode;
pTarget->SetHP(pResult->m_dwTargetHP);
pTarget->SetMP(pResult->m_dwTargetMP);
}
break;
case eABILITY_STUN_STATUS:
{
// 오타아님 STUN 맞음
SKILL_RESULT_STUN *pResult = (SKILL_RESULT_STUN *)pResultCode;
if( pResultCode->m_wStatusCode == eCHAR_STATE_DOWN )
{
if( pSkillInfo->m_SkillClassCode != eSKILL_AIRBLOW )
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_DOWN );
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetEndDownTime(pResultCode->m_iStatusTime);
#else
ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
#endif // _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
}
}
#ifdef _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
else if ( pResultCode->m_wStatusCode == eCHAR_STATE_UPPERDOWN )
{
// 어퍼다운 상태가 걸리면 2.5초간 띄운다.
pTarget->SetAirBlowAir( 2500 );
}
#endif // _NA_007619_20140916_PROCESS_CHANGE_AIRBLOW_DOWN
else if( pResultCode->m_wStatusCode == eCHAR_STATE_STUN )
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_STUN );
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetEndDownTime( pResultCode->m_iStatusTime );
#else
ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
#endif // _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
}
else if( pResultCode->m_wStatusCode == eCHAR_STATE_STUN2 )
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_STUN );
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetEndDownTime( pResultCode->m_iStatusTime );
#else
ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
#endif // _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
}
else if( pResultCode->m_wStatusCode == eCHAR_STATE_FROZEN )
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_FREEZE );
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetEndDownTime( pResultCode->m_iStatusTime );
#else
ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
#endif // _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
}
else if( pResultCode->m_wStatusCode == eCHAR_STATE_SLEEP )
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_STUN );
#ifdef _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetEndDownTime( pResultCode->m_iStatusTime );
#else
ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
#endif // _NA_008472_20150903_IMPROVED_BALANCE
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
}
//else if( pResultCode->m_wStatusCode == eCHAR_STATE_STONE )
//{
// ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_STUN );
// ResultData.SetEndDownTime( pAbilityInfo->m_iParam[2] );
// ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvCurPos );
//}
else
{
WzVector vZeroVector;
ZeroMemory(&vZeroVector,sizeof(vZeroVector));
// 바로멈춘다!
if (pResult->m_wvCurPos != vZeroVector)
{
pTarget->OnParalyzed();
pTarget->SetPosition(pResult->m_wvCurPos);
}
}
}
break;
case eABILITY_RESURRECTION://부활 Todo:Mp 세팅
{
SKILL_RESULT_RESURRECTION *pResult = (SKILL_RESULT_RESURRECTION *)pResultCode;
pTarget->SetHP(pResult->m_dwTargetHP);
pTarget->SetMP(pResult->m_dwTargetMP);
pTarget->SetPosition(pResult->m_wvCurPos);
cTargetPosition Position;
Position.SetTargetVisiblePosition( pTarget->GetObjectKey(), TRUE );
if(pTarget->IsKindOfObject( PLAYER_OBJECT))
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("A022"), 5000, Position );
}
else
{
g_ProjectileManagerEx.CreateEffect( pTarget->GetObjectKey(), StrToWzID("A023"), 5000, Position );
}
}
break;
case eABILITY_SELF_DESTRUCTION:
case eABILITY_KNOCKBACK:
{
SKILL_RESULT_POSITION* pResult = (SKILL_RESULT_POSITION*)pResultCode;
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK );
if( pTarget->IsMyHero() == TRUE )
{
ResultData.SetPosition( pTarget->GetPosition(), pResult->m_wvDestPos );
}
else
{
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvDestPos );
}
ResultData.SetForceSetLastestAttack( TRUE );
}
break;
// 몬트샤인악몽의기사 돌려찍기
case eABILITY_KNOCKBACK2:
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK2 );
SKILL_RESULT_POSITION* pResult = (SKILL_RESULT_POSITION*)pResultCode;
if( pTarget->IsMyHero() == TRUE )
{
ResultData.SetPosition( pTarget->GetPosition(), pResult->m_wvDestPos );
}
else
{
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvDestPos );
}
ResultData.SetForceSetLastestAttack( TRUE );
}
break;
case eABILITY_TELEPORT:
{
SKILL_RESULT_POSITION* pResult = (SKILL_RESULT_POSITION*)pResultCode;
pResult = pResult;
//if( pTarget->IsMyHero() == TRUE )
//{
// ResultData.SetPosition( pTarget->GetPosition(), pResult->m_wvDestPos );
//}
//else
//{
// ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvDestPos );
//}
break;
}
case eABILITY_PULLING:
{
ResultData.AddAdditionalEffect( ATTACK_ADDITIONAL_EFFECT_KNOCKBACK3 );
SKILL_RESULT_POSITION* pResult = (SKILL_RESULT_POSITION*)pResultCode;
if( pTarget->IsMyHero() == TRUE )
{
ResultData.SetPosition( pTarget->GetPosition(), pResult->m_wvDestPos );
}
else
{
ResultData.SetPosition( pResult->m_wvCurPos, pResult->m_wvDestPos );
}
ResultData.SetForceSetLastestAttack( TRUE );
}
break;
case eABILITY_FIGHTING_ENERGY_NUM_INCREASE:
case eABILITY_BONUS_DAMAGE_PER_FIGHTING_ENERGY:
{
SKILL_RESULT_FIGHTING_ENERGY *pResult = (SKILL_RESULT_FIGHTING_ENERGY *)pResultCode;
pTarget->SetFightingEnergy(pResult->m_sFightingEnergyCount);
}
break;
case eABILITY_BLOCK_SKILL:
if(pTarget == g_pHero)
{
g_pHero->SetLockSkill(TRUE);
}
break;
}
Character* pRealTarget = pTarget;
if(SKILL_TARGET_ENEMY_AND_ME == pSkillInfo->m_byTarget)
pRealTarget = pChr;
// 상태효과(버프)를 생성한다
if ( pResultCode->m_wStatusCode != 0 )
{
if( pResultCode->m_wStatusCode == 307 )
{
int current_count = pTarget->GetSkillEffectCount( 307 );
while( current_count < pTarget->GetFightingEnergy() )
{
if( SKILL_EFFECT* pEffect = SKILL_EFFECT::CreateSkillStatusEffect( pResultCode->m_wStatusCode, dwSkillCode, pResultCode->m_iStatusTime, pAbilityInfo ) )
{
pEffect->CreateEffect( pRealTarget, pChr->GetObjectKey() );
pRealTarget->AddSkillEffect(pEffect);
}
++current_count;
}
}
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
else if( pResultCode->overlap_status_count > 0)
{
if ( pResultCode->overlap_status_count == 1) // 처음
{
if( SKILL_EFFECT* pEffect = SKILL_EFFECT::CreateSkillStatusEffect( pResultCode->m_wStatusCode, dwSkillCode, pResultCode->m_iStatusTime, pAbilityInfo ) )
{
pEffect->CreateEffect( pRealTarget, pChr->GetObjectKey() );
pRealTarget->AddSkillEffect(pEffect);
}
}
else
{
// 중첩버프
SKILL_EFFECT* skill_effect_ptr =
pRealTarget->FindSkillEffect(static_cast<eCHAR_STATE_TYPE>(pResultCode->m_wStatusCode));
if (skill_effect_ptr)
{
skill_effect_ptr->CreateEffect( pRealTarget, pChr->GetObjectKey() );
skill_effect_ptr->overlap_status_count_ = pResultCode->overlap_status_count;
skill_effect_ptr->iRemainTime = pResultCode->m_iStatusTime;
}
}
}
#endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
else
{
if( SKILL_EFFECT* pEffect = SKILL_EFFECT::CreateSkillStatusEffect( pResultCode->m_wStatusCode, dwSkillCode, pResultCode->m_iStatusTime, pAbilityInfo ) )
{
pEffect->CreateEffect( pRealTarget, pChr->GetObjectKey() );
pRealTarget->AddSkillEffect(pEffect);
}
}
}
}
void BattleScene::AddReflectDamageResult(char *pPacket,Character *pChr)
{
nsSync::MSGSUB_SKILL_REFLECT_DAMAGE_BRD* pResultCode = (nsSync::MSGSUB_SKILL_REFLECT_DAMAGE_BRD*)pPacket;
if( pResultCode->m_SkillCode == 0 )//0이면 어빌리티 없음
return;
SkillScriptInfo *pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo(pResultCode->m_SkillCode);
assert(pSkillInfo);
if(!pSkillInfo)
{
FILE *fp = fopen("CrashLog.txt","wt");
if (fp)
{
fprintf(fp,"AddAbilityResult : 서버가 보내준 SkillCode 이상 SkillCode : %d",pResultCode->m_SkillCode);
fclose(fp);
}
return;
}
DWORD dwState = 0;
// ABILITY에 딸린 상태이상이 있으면 적용해준다.
BASE_ABILITYINFO *pAbilityInfo = pSkillInfo->GetAbilityInfo(pResultCode->m_wAbilityCode);
if(!pAbilityInfo)
{
FILE *fp = fopen("CrashLog.txt","wt");
if (fp)
{
fprintf(fp,"AddAbilityResult : 서버가 보내준 AbilityIndex 이상 SkillCode : %d AbilityIndex : %d",pResultCode->m_SkillCode,pResultCode->m_wAbilityCode);
fclose(fp);
}
return;
}
switch(pResultCode->m_wAbilityCode)
{
case eABILITY_REFLECT_DAMAGE:
{
}
break;
case eABILITY_REFLECT_FEAR:
{
dwState = eCHAR_STATE_FEAR;
}
break;
case eABILITY_REFLECT_FROZEN:
{
dwState = eCHAR_STATE_FROZEN;
}
break;
case eABILITY_REFLECT_SLOW:
{
dwState = eCHAR_STATE_FETTER;
}
break;
case eABILITY_REFLECT_SLOWDOWN:
{
dwState = eCHAR_STATE_SLOWDOWN;
}
break;
case eABILITY_REFLECT_STUN:
{
dwState = eCHAR_STATE_STUN;
}
break;
}
if (pChr)
{
// 어빌리티 아이디가 잘못 왔을경우 인포가 없다!
if (pAbilityInfo && pAbilityInfo->m_wStateID != 0)
{
if( SKILL_EFFECT* pEffect = SKILL_EFFECT::CreateSkillStatusEffect( dwState, pResultCode->m_SkillCode, pAbilityInfo->m_iParam[1], pAbilityInfo ) )
{
for (int a = 0; a < 4; a++)
{
pEffect->AbilityInfo.m_iParam[0] = pAbilityInfo->m_iOption2;
pEffect->AbilityInfo.m_iParam[1] = pAbilityInfo->m_iParam[0];
pEffect->AbilityInfo.m_iParam[2] = pAbilityInfo->m_iParam[1];
pEffect->AbilityInfo.m_iParam[3] = 0;
}
pEffect->CreateEffect( pChr, pChr->GetObjectKey() );
pChr->AddSkillEffect(pEffect);
}
}
}
}
float BattleScene::GetMonsterHPIncreaseRatio()
{
return m_fMonsterHPMultiplier;
}
void BattleScene::SetMonsterHPMultiplier(float fMultiplier)
{
// TODO : 여기서 몬스터 관련 메시지 처리를 하자. - j0
if (m_fMonsterHPMultiplier > fMultiplier)
{
TCHAR szMessage[INTERFACE_STRING_LENGTH];
// 5621 몬스터가 약해집니다.
g_InterfaceManager.GetInterfaceString(5621, szMessage, INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
// 5622 몬스터로부터 받을 수 있는 경험치가 감소합니다.
g_InterfaceManager.GetInterfaceString(5622, szMessage, INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
}
m_fMonsterHPMultiplier = fMultiplier;
Object_Map_Itr itr = g_ObjectManager.GetBegin();
for (; itr != g_ObjectManager.GetEnd(); itr++)
{
Object* pObject = static_cast<Object*>(itr->second);
if (0 == pObject)
{
assert(!"Object Is NULL!!");
return;
}
if (pObject->IsKindOfObject(MONSTER_OBJECT))
{
Monster* pMon = (Monster*)pObject;
if (pMon->IsShadowSummon())
{
continue;
}
pMon->ChangeHPRatio(fMultiplier);
}
}
}
void
BattleScene::SettingNPC(MAPID MapCode ,FIELDID FieldID)
{
// NPC 위치시킨당.
WzVector wzPos;
WzVector wzDir;
EXTRA_NPCINFO_SET * pInfoSet =
NPCInfoParser::Instance()->GetExtraInfoSetFromFieldID(MapCode , FieldID);
vector<EXTRA_NPCINFO*>::iterator itr;
EXTRA_NPCINFO * pInfo = NULL;
DWORD object_key = NPC_OBJECT_KEY;
for ( itr = pInfoSet->GetBegin(); itr != pInfoSet->GetEnd(); itr ++)
{
pInfo = *itr;
assert(pInfo);
BASE_NPCINFO* base_npcinfo_ptr = NPCInfoParser::Instance()->GetNPCInfo(pInfo->m_NPCCODE);
if (base_npcinfo_ptr == NULL)
{
continue;
}
if (base_npcinfo_ptr->m_byGrade == eNPC_MOVE_SYNC_MERCHANT)
{
continue;
}
NPC * pNPC = NULL;
if (pInfo->m_eNPCTYPE==eNPC_TYPE_LOTTO)
{
pNPC = (NPC *)g_ObjectManager.Add( ++object_key, LOTTO_NPC_OBJECT, pInfo->m_NPCCODE );
}
else
{
pNPC = (NPC *)g_ObjectManager.Add( ++object_key, NPC_OBJECT, pInfo->m_NPCCODE );
}
if (pNPC) {
SetVector(&wzPos,pInfo->m_fNPCPos[0],pInfo->m_fNPCPos[1],pInfo->m_fNPCPos[2]);
SetVector(&wzDir,pInfo->m_fNPCDir[0],pInfo->m_fNPCDir[1],pInfo->m_fNPCDir[2]);
pNPC->SetPosition( wzPos );
pNPC->SetAngle( Math_GetAngleFromVector(&wzDir) );
pNPC->SetExtraInfo(pInfo);
pNPC->SetVisiblePos(wzPos);
NPC::InitNpcImageInfo(pNPC, pNPC->GetMonsterInfo());
if( CWzUnitDraw* pBasePart = pNPC->GetBasePart() )
{
WzVector wzEffPos, wzEffRot, wzEffScale;
SetVector( &wzEffRot, 0.0f, 0.0f, 0.0f );
SetVector( &wzEffScale, 1.0f, 1.0f, 1.0f );
int nNumEffect = pBasePart->GetNumUnitEffectInfo();
for( int i=0; i<nNumEffect; ++i )
{
WzUnitEffectInfo* pei = pBasePart->GetUnitEffectInfo( i );
CEffectBody* pEffectBody = g_pEffectManager->GetEffectPtrHandle( pei->m_hEffect );
if( pEffectBody )
{
wzEffPos = wzPos + pei->m_wvPosition;
pEffectBody->SetResultMatrix( wzEffPos, wzEffRot, wzEffScale );
}
}
}
}
}
RefreshNPCStateForQuest();
}
BOOL BattleScene::CheckHeroInArea(DWORD areaID)
{
if (g_pMap == NULL)
{
return FALSE;
}
if (g_pHero == NULL)
{
return FALSE;
}
eTRIGGER_STATE TrigerState, HeroTrigerState;
WzSpecialArea* pAreaInfo = g_pMap->GetMapAreaByIndex(areaID);
if (pAreaInfo == NULL)
{
return FALSE;
}
TrigerState = TRIGGER_STATE_LEAVE_AREA;
switch (pAreaInfo->m_wbvRegion.m_eBvType)
{
case BVT_AABB:
{
if (TRUE == Contain_AABB_Vertex(&pAreaInfo->m_wbvRegion.m_aabb, g_pHero->GetPosition()))
{
TrigerState = TRIGGER_STATE_ENTER_AREA;
}
}
break;
case BVT_PATH_TILE_INDEX:
{
int iTile = g_pHero->GetPathExplorer()->GetTile();
for (int i = 0; i < static_cast<int>(pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_nCount); ++i)
{
if (iTile == pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_pdwData[i])
{
TrigerState = TRIGGER_STATE_ENTER_AREA;
break;
}
}
}
break;
case BVT_SPHERE:
{
if (TRUE == Contain_Sphere_Vertex(&pAreaInfo->m_wbvRegion.m_BvSphere, g_pHero->GetPosition()))
{
TrigerState = TRIGGER_STATE_ENTER_AREA;
}
}
break;
default:
{
return FALSE;
}
}
HeroTrigerState = g_pHero->GetTriggerState(areaID);
if( HeroTrigerState != TrigerState )
{
// 들어갔을땐 언제나 패킷을 보낸다!!!
if( TrigerState == TRIGGER_STATE_ENTER_AREA )
{
//< 플레이어가 들어왔다.
// 패킷 보내기
MSG_CG_TRIGGER_ENTER_AREA_SYN SendPacket;
SendPacket.m_byCategory = CG_TRIGGER;
SendPacket.m_byProtocol = CG_TRIGGER_ENTER_AREA_SYN;
SendPacket.m_iAreaID = areaID;
#ifdef _DEBUG
TCHAR szMessage[INTERFACE_STRING_LENGTH];
Sprintf(szMessage, _T("EnterArea( %d ), AreaType( %d )\n"), areaID, pAreaInfo->m_wbvRegion.m_eBvType);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_OUPUT_DEBUG, szMessage);
#endif
if( FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_TRIGGER_ENTER_AREA_SYN) ) )
{
// MSG_CG_TRIGGER_ENTER_AREA_SYN - BattleScene
WzColor Color = WzColor_RGBA( 255, 80, 80, 255 );
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT,_T("Failed Send MSG_CG_TRIGGER_ENTER_AREA_SYN - BattleScene"));
}
}
else if ( TrigerState == TRIGGER_STATE_LEAVE_AREA )
{
// 나왔을땐 이전에 들어갔을 경우에만 보낸다.
if (HeroTrigerState == TRIGGER_STATE_ENTER_AREA)
{
MSG_CG_TRIGGER_LEAVE_AREA_SYN SendPacket;
SendPacket.m_byCategory = CG_TRIGGER;
SendPacket.m_byProtocol = CG_TRIGGER_LEAVE_AREA_SYN;
SendPacket.m_iAreaID = areaID;
#ifdef _DEBUG
TCHAR szMessage[INTERFACE_STRING_LENGTH];
Sprintf(szMessage, _T("LeaveArea( %d ), AreaType( %d )\n"), areaID, pAreaInfo->m_wbvRegion.m_eBvType);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_OUPUT_DEBUG, szMessage);
#endif
if( FALSE == GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_TRIGGER_LEAVE_AREA_SYN) ) )
{
WzColor Color = WzColor_RGBA( 255, 80, 80, 255 );
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT,_T("Failed Send MSG_CG_TRIGGER_LEAVE_AREA_SYN - BattleScene"));
}
}
}
g_pHero->SetTriggerState( areaID,TrigerState );
}
if (TrigerState == TRIGGER_STATE_ENTER_AREA)
{
return TRUE;
}
else
{
return FALSE;
}
}
//----------------------------------------------------------------------------
/**
*/
BOOL BattleScene::CheckHeroInShortcutBattleArea(TCHAR* sAreaID, DWORD dwAreaID)
{
if (g_pHero == NULL)
{
return FALSE;
}
WzSpecialArea* pAreaInfo = g_pMap->GetMapArea(dwAreaID);
if (!pAreaInfo)
{
return FALSE;
}
eSHORTCUT_AREA_STATE ShortcutSate, HeroShortcutSate;
ShortcutSate = SHORTCUT_AREA_STATE_LEAVE_AREA;
switch(pAreaInfo->m_wbvRegion.m_eBvType)
{
case BVT_AABB:
{
if (TRUE == Contain_AABB_Vertex(&pAreaInfo->m_wbvRegion.m_aabb, g_pHero->GetPosition()))
{
ShortcutSate = SHORTCUT_AREA_STATE_ENTER_AREA;
}
}
break;
case BVT_PATH_TILE_INDEX:
{
int iTile = g_pHero->GetPathExplorer()->GetTile();
for (int i = 0 ;i < static_cast<int>(pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_nCount); ++i)
{
if (iTile == pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_pdwData[i])
{
ShortcutSate = SHORTCUT_AREA_STATE_ENTER_AREA;
break;
}
}
}
break;
case BVT_SPHERE:
{
if (TRUE == Contain_Sphere_Vertex(&pAreaInfo->m_wbvRegion.m_BvSphere, g_pHero->GetPosition()))
{
ShortcutSate = SHORTCUT_AREA_STATE_ENTER_AREA;
}
}
break;
}
HeroShortcutSate = g_pHero->GetShortcutState(dwAreaID);
if( HeroShortcutSate != ShortcutSate )
{
// 들어갔을땐 언제나 패킷을 보낸다!!!
if( ShortcutSate == SHORTCUT_AREA_STATE_ENTER_AREA )
{
WORD wIndex = MapInfoParser::Instance()->GetCurrentMapPortalIndex(sAreaID, g_pMap->GetCurrentFieldID());
if (wIndex)
{
sMAP_ENTERENCE_PORTAL* entPortal = MapInfoParser::Instance()->GetMapPortal( wIndex );
//미션포탈일경우
if(entPortal && entPortal->byMapType!=0)
{
//룸정보를 초기화:미션포탈은 로비를 거치지않고 바로가기때문
uiBattleZoneMan* pZoneMan =
static_cast<uiBattleZoneMan*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BATTLEZONE));
if(pZoneMan)
{
pZoneMan->GetBattleRoomEntry().Init();
}
//Client->Server: (퀘스트or미션)포탈에 진입하겠다는SYN
MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN sync;
sync.syncType = MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN::eSYNC_FIXED_PORTAL;
sync.mapEnterancePortalIndex = wIndex;
GlobalFunc::SendPacket( CI_GAMESERVERIDX, (BYTE *)&sync, sizeof(sync));
}
else
{
MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN sync;
sync.m_wIndex = wIndex;
GlobalFunc::SendPacket( CI_GAMESERVERIDX, &sync, sizeof(sync));
}
}
}
g_pHero->SetShortcutState( dwAreaID,ShortcutSate );
}
if (ShortcutSate == SHORTCUT_AREA_STATE_ENTER_AREA)
{
return TRUE;
}
else
{
return FALSE;
}
}
void BattleScene::ProcessMoveInfo(DWORD dwTick)
{
MOVE_INFO_LIST::iterator iter,tempiter;
iter = m_MoveInfoList.begin();
while(iter != m_MoveInfoList.end())
{
(*iter).m_dwDelay += dwTick;
if ((*iter).m_dwDelay >= 20000)
{
tempiter = iter;
iter++;
m_MoveInfoList.erase(tempiter);
}
else
{
iter++;
}
}
}
void BattleScene::RenderMoveInfo()
{
MOVE_INFO_LIST::iterator iter;
TCHAR szTemp[256] = {0,};
iter = m_MoveInfoList.begin();
while(iter != m_MoveInfoList.end())
{
POINT pt2;
RECT rc;
g_pSunRenderer->GetScreenPos( &pt2, &iter->vFrom );
Snprintf(szTemp, 256-1, _T("ID : %ld"),iter->m_dwKey);
rc.left = pt2.x;
rc.right = rc.left + 200;
rc.top = pt2.y;
rc.bottom = rc.top + 20;
g_pSunRenderer->SetZBufferTest(FALSE);
g_pSunRenderer->x_pManagerTextOut->DrawText(szTemp,&rc,WzColor_RGBA(0,255,255,255));
g_pSunRenderer->SetColor(255,255,255);
if (iter->bSuccess)
{
g_pSunRenderer->RenderLine(iter->vFrom,iter->vTo,WzColor_RGBA(30,30,255,255),1.0f);
g_pSunRenderer->RenderLine(iter->vFrom,iter->vActualTo,WzColor_RGBA(255,255,30,255),1.0f);
}
else
{
g_pSunRenderer->RenderLine(iter->vFrom,iter->vTo,WzColor_RGBA(255,30,30,255),1.0f);
}
g_pSunRenderer->SetZBufferTest(TRUE);
iter++;
}
}
void BattleScene::RegisterMoveInfo(HONGPOS Cur,HONGPOS Dest,DWORD dwKey,BOOL bThrust)
{
MOVE_INFO info;
info.bSuccess = TRUE;
info.m_dwDelay = 0;
info.m_dwKey = dwKey;
info.vFrom = Cur.wvPos;
info.vTo = Dest.wvPos;
info.vActualTo = info.vFrom;
m_pTestMoveInfoExplorer->Stop();
if (Cur.wTile == -1)
{
g_pSunTerrain->PathExp_Reset(m_pTestMoveInfoExplorer,&Cur.wvPos, -1);
if (m_pTestMoveInfoExplorer->GetTile() == -1)
{
info.bSuccess = FALSE;
}
}
else
{
g_pSunTerrain->PathExp_Reset(m_pTestMoveInfoExplorer,&Cur.wvPos,Cur.wTile);
}
if (m_pTestMoveInfoExplorer->GetTile() != -1)
{
WzVector vDist = Dest.wvPos - Cur.wvPos;
vDist.z = 0.0f;
g_pSunTerrain->PathExp_Thrust(m_pTestMoveInfoExplorer,&vDist,PTA_NO_WALK);
if (!m_pTestMoveInfoExplorer->IsMoving())
{
info.bSuccess = FALSE;
}
else
{
info.vActualTo = m_pTestMoveInfoExplorer->GetTargetPos();
}
}
if (!info.bSuccess && bThrust)
{
TCHAR szTemp[256];
Sprintf(szTemp,_T("ID : %ld Thrust 이동 실패"),dwKey);
GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CHAT,szTemp);
}
m_MoveInfoList.push_back(info);
}
void BattleScene::AddSkillFieldEffect( Character* pChr, SkillFacade::ResultData* result_data )
{
for (int a = 0; a < result_data->GetEffectResultCount(); ++a )
{
SkillFacade::EffectResult* effect_result = result_data->GetEffectResult(a);
if( effect_result == NULL )
continue;
SKILL_RESULT_EFFECT* pResult = effect_result->m_pResult;
DWORD lifeTime = 0;
SkillScriptInfo* pInfo = SkillInfoParser::Instance()->GetSkillInfo( result_data->GetSkillCode() );
assert(pInfo);
if( pInfo == NULL )
continue;
//SkillEffectInfo* pEffectInfo = SkillEffectInfoParser::Instance()->GetSkillEffectInfo( pInfo->m_SkillClassCode );
BASE_ABILITYINFO* pAInfo=pInfo->GetAbilityInfoByIndex((BYTE)pResult->m_wAbilityIndex);
assert(pAInfo);
if( pAInfo == NULL )
{
#ifdef _DEV_VER
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "[assertion]pResult->m_wAbilityIndex: %d", pResult->m_wAbilityIndex);
#endif //_DEV_VER
return;
}
if(pAInfo)
{
lifeTime = pAInfo->m_iParam[2];//세번째 파라미터가 유지 시간이다.
}
else
{
lifeTime = 10000;
}
//랜덤 투하
for(int j=0;j<pResult->m_byCount;j++)
{
if(pResult->m_byCount==0||pResult->m_byCount>=MAX_EFFECT_COUNT)
{
break;
}
//Todo:스킬 별로 이펙트 속성이 다르게 갈때 처리 현재는 하나로 간다.
if(pAInfo->m_wAbilityID==eABILITY_RANDOM_AREA_ATTACK)
{
pResult->m_EffectInfo[j].m_Time = max(pResult->m_EffectInfo[j].m_Time,200);
WzVector vVisiblePos = pResult->m_EffectInfo[j].m_wvEffectPos;
vVisiblePos.z += 3.0;
float fT = 0.0f;
int iTileFocussing = g_pSunTerrain->x_pPathFinder->GetTileToStand( vVisiblePos, &fT, -1.0f, 10.0f );
if( iTileFocussing >= 0 )
{
vVisiblePos.z -= fT;
}
WzID EffectID, EndEffectID;
EffectID = StrToWzID("L071");
EndEffectID = StrToWzID("L072");
DWORD LifeTime = pResult->m_EffectInfo[j].m_Time+200;
DWORD EndEffectTime = pResult->m_EffectInfo[j].m_Time;
g_ProjectileManagerEx.CreateFieldEffect( vVisiblePos, EffectID, LifeTime, EndEffectID, EndEffectTime, 0 );
}
else
{
//SkillEffectFunc::CreateSkillEventEffectByFieldSkill( pInfo->m_SkillClassCode, pResult->m_EffectInfo[j].m_wvEffectPos );
switch(pInfo->m_SkillClassCode)
{
case eSKILL_STAR_FALL:
case eSKILL_FIRE_FILA:
{
g_ProjectileManagerEx.CreateFieldEffect( pResult->m_EffectInfo[j].m_wvEffectPos, StrToWzID("I060"), lifeTime );
}
break;
case eSKILL_POISON_RAIN:
{
g_ProjectileManagerEx.CreateFieldEffect( pResult->m_EffectInfo[j].m_wvEffectPos, StrToWzID("I020"), lifeTime );
}
break;
case eSKILL_ITEM_MINE: // 폭탄(마인 스킬)
{
GlobalFunc::CreateEffectBeUpToOption( StrToWzID("E320"), pResult->m_EffectInfo[j].m_wvEffectPos);
}
break;
}
}
}
}
}
void BattleScene::RenderLightDirection()
{
if (m_bRenderLightDirection)
{
if (g_pHero)
{
WzVector vPos = g_pHero->GetVisiblePos();
vPos.z += 1.0f;
WzVector vPos2;
WzVector vDir;
vDir = g_pMap->GetWorldBase()->GetSunLightDir();
vPos2 = vPos + m_vTestDir;
WzColor color = g_pMap->GetWorldBase()->GetSunLightColor();
g_pSunRenderer->RenderPyramid(vPos2,vPos,color);
for (int a = 0; a < MAX_NUM_LIGHT; a++)
{
const St_LightInformation *pInfo = g_pSunRenderer->GetLightInfo(a);
if (pInfo)
{
if (pInfo->m_bValid)
{
if (pInfo->m_eltType == ELT_POINT)
{
BvSphere bv;
bv.m_fRadius = pInfo->m_fRange;
bv.m_wvCenter = pInfo->m_wvPosition;
WzColor colorback = g_pSunRenderer->GetDiffuseColor();
g_pSunRenderer->SetColor(pInfo->m_wcColor);
g_pSunRenderer->RenderBvSphere(&bv);
g_pSunRenderer->SetColor(colorback);
}
}
}
}
}
}
}
void BattleScene::ShowLightDirection()
{
m_bRenderLightDirection ^= 1;
}
void BattleScene::ProcessRenderOption(LPDIMOUSESTATE2 pMouseState)
{
if (m_bRenderLightDirection)
{
if ( g_Input.GetState( MOUSE_MBUTTON, KS_MOUSE_DOWN) )
{
m_vTestDir = g_pMap->GetWorldBase()->GetSunLightDir();
}
else if( g_Input.GetState( MOUSE_MBUTTON, KS_MOUSE_KEY) )
{
WzVector vDir;
WzVector vNewDir;
vDir = g_pMap->GetWorldBase()->GetSunLightDir();
vDir = m_vTestDir;
WzVector vDiff = vDir;
vDiff.z = 0.0f;
float fBase = VectorLength(&vDiff);
float fPitch = atan2(vDir.z,fBase);
float fAngle = pMouseState->lX * 0.005f;
vNewDir.x = vDir.x * cos(fAngle) + vDir.y * -sin(fAngle);
vNewDir.y = vDir.x * sin(fAngle) + vDir.y * cos(fAngle);
vNewDir.z = 0.0f;
VectorNormalize(&vNewDir,&vNewDir);
float fNewPitch = fPitch - pMouseState->lY * 0.005f;
if (fNewPitch >= WZ_PI / 2.0f)
{
fNewPitch = WZ_PI / 2.0f - 0.001f;
}
else if (fNewPitch <= -(WZ_PI / 2.0f) )
{
fNewPitch = -(WZ_PI / 2.0f) + 0.001f;
}
vNewDir.z = sin(fNewPitch);
vNewDir.x *= cos(fNewPitch);
vNewDir.y *= cos(fNewPitch);
VectorNormalize(&vNewDir,&vNewDir);
m_vTestDir = vNewDir;
}
else if ( g_Input.GetState( MOUSE_MBUTTON, KS_MOUSE_UP) )
{
WzColor color = g_pMap->GetWorldBase()->GetSunLightColor();
g_pMap->GetWorldBase()->SetSunLightDir(m_vTestDir);
g_pMap->GetWorldBase()->SetSunLightColor(color);
}
}
}
void BattleScene::_renderDbgText(DWORD dwTick)
{
#ifdef _DEV_VER
g_pSunRenderer->Set2DMode( TRUE );
g_pSunRenderer->x_pManagerTextOut->StartToUseFont( StrToWzID("m216") );
if (m_iDbgTextType)
{
int x = 400;
int y = 5;
// 준비 과정
switch(m_iDbgTextType)
{
case eDebugTextType_RenderState:
_renderDbgInfoRenderStates(x,y);
_renderDbgInfoResourceStatus(x,y);
break;
case eDebugTextType_HeroStatus:
_renderDbgInfoHeroStatus(x,y);
break;
case eDebugTextType_Resource:
_renderDbgInfoResourceStatus(x,y);
break;
case eDebugTextType_KeyQueue:
_renderDbgInfoKeyQueueNum(x,y);
break;
case eDebugTextType_SkillQueue:
_renderDbgInfoSkillQueueNum(x,y);
break;
case eDebugTextType_Camera:
_renderDbgInfoCameraSpring(x,y);
break;
case eDebugTextType_Monster:
_renderDbgInfoMonsterInfo(x,y);
break;
case eDebugTextType_Sound:
_renderDbgInfoSound(x,y);
break;
case eDebugTextType_Autobot:
_renderDbgInfoAutobot(x,y);
break;
}
}
// 마무리
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
g_pSunRenderer->Set2DMode( FALSE );
#endif //_DEV_VER
}
void BattleScene::SetScreenShotState( int iState )
{
m_iScreenShotState = iState;
}
int BattleScene::GetScreenShotState( void )
{
return m_iScreenShotState;
}
void BattleScene::RenderBlindEffect()
{
if (m_iCurBlindRate)
{
g_pSunRenderer->Set2DMode(TRUE);
POINT pt = g_pApplication->Get2DModeMapping();
RECT rc;
rc.top = 0;
rc.left = 0;
rc.right = pt.x;
rc.bottom = pt.y;
if( m_BlindType == BLIND_TYPE_BLACK )
{
float fRate = (float)m_iCurBlindRate / (float)BLACK_BLIND_TIME;
int iAlpha = (int)(255.0f * fRate);
WzColor color = WzColor_RGBA(0,0,0,iAlpha);
g_InterfaceManager.RenderRect(rc,color);
}
else if( m_BlindType == BLIND_TYPE_WHITE )
{
float fRate = (float)m_iCurBlindRate / (float)WHITE_BLIND_TIME;
static float s_max_rate = 0.96f;
if( fRate > s_max_rate )
fRate = s_max_rate;
int iAlpha = (int)(255.0f * fRate);
WzColor color = WzColor_RGBA(255,255,255,iAlpha);
g_InterfaceManager.RenderRect(rc,color);
}
g_pSunRenderer->Set2DMode(FALSE);
}
}
void BattleScene::ProcessExpList()
{
EXP_INFO_LIST::iterator iter,tempiter;
iter = m_ExpList.begin();
while(iter != m_ExpList.end() )
{
BOOL bPop = FALSE;
Character * pChr = (Character *)g_ObjectManager.GetObject(iter->m_dwCharacterKey);
if (!pChr)
{
bPop = TRUE;
}
else
{
if (pChr->IsDead())
{
bPop = TRUE;
}
}
if (!bPop)
{
iter++;
}
else
{
tempiter = iter;
iter++;
PopupExp(tempiter->m_dwExpOffset , tempiter->m_nBonusExpRatio);
m_ExpList.erase(tempiter);
}
}
}
void BattleScene::PopupExp(EXPTYPE expoffset , int bonusExpRatio /* = 0 */, int ExpType /* = eNormalExp */)
{
if (g_InterfaceManager.GetShowFlag() == FALSE)
{
return;
}
// 보너스 경험치를 구한다.
EXPTYPE bonusExp = 0;
if( bonusExpRatio > 0)
{
bonusExp = (EXPTYPE) ceil( (double)expoffset * ( (double) bonusExpRatio / (100.f + (double) bonusExpRatio) ) );
}
if (g_pHero)
{
TCHAR szResult[MAX_MESSAGE_LENGTH] ={ '\0', };
TCHAR szMessage[MAX_MESSAGE_LENGTH] = { '\0', };
TCHAR szText[MAX_MESSAGE_LENGTH] = { '\0', };
TCHAR szExpMessage[MAX_MESSAGE_LENGTH] = { '\0', };
if (expoffset > 0)
{
if(ExpType == eGroupExp)
{
// 7041: 그룹 멤버로부터 %d 경험치를 보상 받았습니다.
g_InterfaceManager.GetInterfaceString( 7041, szMessage, MAX_MESSAGE_LENGTH );
}
else
{
g_InterfaceManager.GetInterfaceString( eST_GET_EXP, szMessage, MAX_MESSAGE_LENGTH );
}
if (bonusExp > 0)
{
Sprintf( szResult, szMessage, expoffset - bonusExp);
// 9050 %s (추가 경험치 %d획득)
g_InterfaceManager.GetInterfaceString( 9050, szText, MAX_MESSAGE_LENGTH );
Sprintf( szExpMessage, szText, szResult, bonusExp );
}
else
{
Sprintf( szExpMessage, szMessage, expoffset );
}
}
else
{
if ( g_pHero->IsReachMaxLevel() )
{
//5028 최고 제한 레벨에 도달하여 더 이상 경험치를 획득 하실 수 없습니다.
g_InterfaceManager.GetInterfaceString(5028, szResult, INTERFACE_STRING_LENGTH);
}
else
{
g_InterfaceManager.GetInterfaceString(eST_TIRED_SYSTEM_ITEM_NOT_GET, szResult, MAX_MESSAGE_LENGTH);
}
}
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szExpMessage, CHAT_TYPE_SYSTEM );
if( GAMEOPTION->GetPickUpItemNotify() )
{
InserCenterTextMessage( szExpMessage, PICK );
}
g_pHero->CreatePopupMesh(0, expoffset, eDAMAGEPOPUP_EXP, WzColor_RGBA(255,255,255,255), FALSE, FALSE);
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::InitQuestAreaInfo()
{
m_VecQuestArea.clear();
if ( !g_pMap )
{
return;
}
int Count = g_pMap->GetNumberOfSpecialArea();
WzSpecialArea* pArea = NULL;
for (int Index = 0; Index < Count; ++Index )
{
pArea = g_pMap->GetMapAreaByIndex(Index);
if (pArea)
{
m_VecQuestArea.push_back( pArea->m_wiIdentity );
}
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessQuestArea()
{
for (size_t i = 0; i < m_VecQuestArea.size(); ++i)
{
GameFunc::CheckHeroInAreaForQuest( m_VecQuestArea[i] );
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::ProcessQuestTime()
{
uiQuestMan * pQuestMan =
(uiQuestMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUEST);
if ( pQuestMan )
{
pQuestMan->UpdateQuestTime();
}
}
BOOL BattleScene::SceneWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ,SI_MESSAGE *stMessage)
{
if ( m_EventText.IsActived() )
{
return TRUE;
}
return SceneBase::SceneWndProc(hWnd,iMessage,wParam,lParam,stMessage);
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::KeyManagerProc(DWORD wParam,DWORD lParam)
{
switch(wParam)
{
case eSceneEventSkip_EventScript:
{
m_EventText.SkipEventScript();
}
break;
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::InitQuestInfo()
{
if ( g_pQMGR_Real == NULL )
return;
Quest * pQuest = NULL;
uiQuestMan * pQuestMan =
(uiQuestMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_QUEST);
// 자동 수락된 목록 등록
for( int i = 1; i < MAX_QUEST_COMPL_NUM; ++i)
{
pQuest = g_pQMGR_Real->FindQuest(i);
if ( !pQuest )
continue;
//완료조건이 아무것도 없는 퀘스트를 위해서 무조건 한번 이벤트를 호출한다.
g_pQMGR_Real->OnEventForClient(QUEST_EVENT_ITEM, NULL, pQuest);
}
UpdateAutoRewardRequest();
RefreshNPCStateForQuest();
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::OnDeviceReset()
{
g_InterfaceManager.UpdateMyHeadTexture();
for (int a = 0; a < MAX_PARTYMEMBER_NUM; a++)
{
g_InterfaceManager.UpdatePartyHeadTexture(a);
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void BattleScene::SendHeroSectorIndex()
{
#if !defined(_NA002676_WORLD_SERVER_RENEWAL)
if (g_pHero && g_pMap)
{
if (!IsLobby())
{
int iIndex = -1;
WzVector vPos = g_pHero->GetPosition();
iIndex = g_pMap->GetSectorIndex(&vPos);
//if (iIndex != -1)
if (iIndex >= 0)
{
if (iIndex != m_iPrevSectorIndex)
{
MSG_CW_VIEWPORT_CHARSTATE SendPacket;
SendPacket.m_byCategory = CW_VIEWPORT;
SendPacket.m_byProtocol = CW_VIEWPORT_CHARSTATE;
SendPacket.dwFieldCode = g_pMap->GetCurrentFieldID();
SendPacket.dwSectorIndex = (DWORD)iIndex;
if (GlobalFunc::SendPacket(CI_CHATSERVERIDX, &SendPacket, sizeof(SendPacket) ) == TRUE)
{
m_iPrevSectorIndex = iIndex;
}
}
}
}
}
#endif
}
//----------------------------------------------------------------------------
/**
*/
BOOL BattleScene::IsLobby()
{
return BOOL(BattleScene::m_bLobbyFlag);
}
//----------------------------------------------------------------------------
/**
*/
BOOL BattleScene::IsLobbyInPending()
{
return BOOL(BattleScene::m_bLobbyPendingFlag);
}
//----------------------------------------------------------------------------
/**
*/
BOOL BattleScene::IsLobbyOutPending()
{
return BOOL(BattleScene::m_bLobbyOutPendingFlag);
}
//----------------------------------------------------------------------------
/**
*/
VOID BattleScene::SetLobbyFlag(BOOL bFlag)
{
BattleScene::m_bLobbyFlag = bFlag;
}
//----------------------------------------------------------------------------
/**
*/
VOID BattleScene::SetLobbyInPending(BOOL bFlag)
{
BattleScene::m_bLobbyPendingFlag = bFlag;
}
VOID BattleScene::SetLobbyOutPending(BOOL bFlag)
{
BattleScene::m_bLobbyOutPendingFlag = bFlag;
}
//
//BOOL BattleScene::CreateProjectileSkillResult(DAMAGETYPE wDamage,DWORD dwTargetKey,DWORD dwTargetHP,DWORD timeSerial,DWORD dwSkillCode,DWORD dwAttackerKey)
//{
// BASE_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)dwSkillCode);
// Character *pTarget = (Character *)g_ObjectManager.GetObject(dwTargetKey);
// Character *pAttacker = (Character *)g_ObjectManager.GetObject(dwAttackerKey);
//
//
// if(pInfo && pTarget && pAttacker)
// {
// switch(pInfo->m_SkillClassCode)
// {
// case eSKILL_SACRED_FIRE:
// {
// ATTACK_RESULT attret;
// attret.SetSkillCode(dwSkillCode);
// attret.SetAttackSerial(pAttacker->GetCurrentAttackSerial());
// attret.SetTimeSerial(timeSerial);
// attret.GetTargetData().SetTargetHP( dwTargetHP );
// attret.GetTargetData().SetTargetObjectKey( dwTargetKey );
// attret.GetTargetData().SetDamage( wDamage );
// pAttacker->AddAttackResult(&attret);
//
//
// //WzVector StartPosition = pTarget->GetVisiblePos();
// //StartPosition.z += 10.0f;
// //WzVector TargetPosition = pTarget->GetVisiblePos();
//
// //g_ProjectileManagerEx.CreateMoveEffect( StartPosition, TargetPosition, StrToWzID("K501"), 500, pAttacker->GetObjectKey(), pAttacker->GetCurrentAttackSerial() );
//
// //g_ProjectileManagerEx.CreateFieldEffect( pTarget->GetVisiblePos(), StrToWzID("K502"), 2000, 0, 0, 600 );
// }
// return TRUE;
// }
// }
//
// return FALSE;
//}
void BattleScene::PrintYoungManProtectMessage()
{
static int iHour = 0;
TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,} , szResult[INTERFACE_STRING_LENGTH] ={0,};
int curHour = m_iGameConnectedTime / 60;
if( iHour < curHour )
{
// 청소년 보호 메세지 출력.
iHour = curHour;
if( iHour < 3)
{
g_InterfaceManager.GetInterfaceString(eST_CONNECT_TIME_UNDER_3,szMessage,INTERFACE_STRING_LENGTH);
Sprintf(szResult,szMessage,iHour);
}
else
{
g_InterfaceManager.GetInterfaceString(eST_CONNECT_TIME_OVER_3,szMessage,INTERFACE_STRING_LENGTH);
Sprintf(szResult,szMessage,iHour);
}
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szResult);
}
}
void BattleScene::PrintPcBangBanMessage()
{
static int iMinute = 0;
TCHAR szMessage[INTERFACE_STRING_LENGTH] ={0,};
// m_iTime이 10분 단위로 갱신된다. 10분에 한번씩 뿌려준다.
if( iMinute < m_iGameConnectedTime )
{
iMinute = m_iGameConnectedTime;
if( g_pHero && g_pHero->GetBlockPCBang() )
{
// 5865 PC방 요금 미납자로 신고가 접수되었습니다. 게임 이용에 불이익을 받으실 수 있습니다.
g_InterfaceManager.GetInterfaceString( 5865 , szMessage ,INTERFACE_STRING_LENGTH );
GlobalFunc::OutputMsg_PCBang_Notice(szMessage);//함수내에서 시간 조절.
}
}
}
void BattleScene::UpdateGameStayTime()
{
if( m_StayTimer.IsExpired() )
{
m_StayTimer.SetTimer(TEN_MINUTE);
int iSecondToMinute = TEN_MINUTE / 60000;
m_iGameConnectedTime += iSecondToMinute;
}
}
#ifdef _JBH_ADD_AGE_LIMIT_MARK
void BattleScene::RenderGameRatingMark()
{
static int iHour = 0;
static DWORD dwTick = 0;
// m_iGameConnectedTime 의 갱신 주기는 10분 이다.
if( iHour < m_iGameConnectedTime / 60 )
{
iHour = m_iGameConnectedTime / 60;
dwTick = clock_function::GetTickCount();
}
if( dwTick + 3000 > clock_function::GetTickCount() )
{
SceneBase::RenderGameRatingMark();
}
}
#endif //_JBH_ADD_AGE_LIMIT_MARK
void BattleScene::UpdateItemOwner()
{
ItemManager::Instance()->UpdateOwnerList();
}
void BattleScene::UpdateItemShareSystem()
{
uiPartyMan * pPartyMan = ( uiPartyMan *) g_InterfaceManager.GetUserInterfaceManager(UIMAN_PARTY);
if( pPartyMan )
{
pPartyMan->UpdatePartyItemShareSystem();
}
}
void BattleScene::NoticeBattleZoneItemShareSystem()
{
if( GameFramework::GetCurrentScene() &&
GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_FIELD ||
GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_VILLAGE )
return;
TCHAR szMessage[INTERFACE_STRING_LENGTH] ={0,};
//5220 배틀존에서의 아이템 분배방식은 특정 아이템만 적용됩니다.
g_InterfaceManager.GetInterfaceString(5220 , szMessage ,INTERFACE_STRING_LENGTH);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
}
int BattleScene::OnEndRendering( DWORD /*dwTick*/ )
{
if( ScreenShotSaver::Instance()->IsPrepared() )
{
ScreenShotSaver::Instance()->Save();
}
return 0;
}
void BattleScene::OnRecvCG_SSQ_CTRL_CMD(const WAR_TAG_P IN pMsg, const WAR_MSG_HDR IN header)
{
using namespace nsSSQ;
using namespace nsSSQ::Observer;
TCHAR szMessage[INTERFACE_STRING_LENGTH + 1] = { '\0', };
int MessageType = eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT;
WAR_TAG_P pIt = const_cast<WAR_TAG_P>(pMsg);
WAR_TAG_P pEnd = pIt + header.size;
for (WORD size = 0; pIt < pEnd; pIt += size)
{
size = 10000; // 미 설정에 대한 스킵 설정 (buffer-overrun protector)
switch (pIt->_TAG)
{
//─────────────────────────────────────────
// C<->G SSQ_MESSAGE_HANDLERs
// 각 프로토콜을 구현하는 메시지는 MSGSUB_으로 시작한다.
// (protocol) SSQ_PROTOCOL_blah~blah~ --> (structure) MSGSUB_SSQ_PROTOCOL_blah~blah~
// 이와 같은 샘플 방식대로 구현시 아래 예제와 같은 방식으로 각 case문을 시작할 것
// 이렇게 하지 않을 경우 컴파일 에러 또는 런타임 경고 등이 발생하게 되어 있지만
// 고려되지 않는 사항도 있을 수 있다.
//
// case SSQ_PROTOCOL_blah~blah~:
// {
// const MSGSUB_SSQ_PROTOCOL_blah~blah~& rMsg = static_cast<MSGSUB_SSQ_PROTOCOL_blah~blah~&>(*pIt);
// size = rMsg.GetSize();
// ...
//─────────────────────────────────────────
case SSQ_PROTOCOL_NOTICE_ENABLE_ENTER_COUNTDOWN:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_ENABLE_ENTER_COUNTDOWN );
printf( "[SSQ_PROTOCOL_NOTICE_ENABLE_ENTER_COUNTDOWN] \n" );
g_InterfaceManager.GetInterfaceString( 6412, szMessage );
TCHAR szBuff[INTERFACE_STRING_LENGTH];
Sprintf( szBuff, szMessage, rMsg.Countdown );
GlobalFunc::OutputMsg_Notice( MessageType, szBuff );
}
break;
case SSQ_PROTOCOL_NOTICE_ENABLE_ENTER:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_ENABLE_ENTER );
printf( "[SSQ_PROTOCOL_NOTICE_ENABLE_ENTER] \n" );
g_InterfaceManager.GetInterfaceString( 6418, szMessage );
GlobalFunc::OutputMsg_Notice( MessageType, szMessage );
#ifdef _DH_BATTLEZONE2_
uiBattlezone2List* battlezone2_list = GET_CAST_DIALOG(uiBattlezone2List, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LIST);
if (battlezone2_list)
{
battlezone2_list->SetIsSSQOpen(true);
}
#endif//_DH_BATTLEZONE2_
}
break;
case SSQ_PROTOCOL_NOTICE_CLOSE_ENTER_COUNTDOWN:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_CLOSE_ENTER_COUNTDOWN );
printf( "[SSQ_PROTOCOL_NOTICE_CLOSE_ENTER_COUNTDOWN] \n" );
g_InterfaceManager.GetInterfaceString( 6413, szMessage );
TCHAR szBuff[INTERFACE_STRING_LENGTH];
Sprintf( szBuff, szMessage, rMsg.Countdown );
GlobalFunc::OutputMsg_Notice( MessageType, szBuff );
}
break;
// 다음 메시지는 가변 스트림의 마지막에 붙는 메시지, 스트림 검증용이지만
// 현 시점 실질적인 사용은 하지 않는다. (하지만 구현은 해 둘 것.)
case SSQ_PROTOCOL_CTRL_TAG_TAIL:
{
printf( "[SSQ_PROTOCOL_CTRL_TAG_TAIL] \n" );
}
break;
case SSQ_PROTOCOL_NOTICE_CLOSE_PORTAL:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_CLOSE_PORTAL );
g_InterfaceManager.GetInterfaceString( 6414, szMessage );
GlobalFunc::OutputMsg_Notice( MessageType, szMessage );
#ifdef _DH_BATTLEZONE2_
uiBattlezone2List* battlezone2_list = GET_CAST_DIALOG(uiBattlezone2List, IM_BATTLEZONE2_MANAGER::BATTLEZONE2_LIST);
if (battlezone2_list)
{
battlezone2_list->SetIsSSQOpen(false);
}
#endif//_DH_BATTLEZONE2_
}
break;
case SSQ_PROTOCOL_NOTICE_CLOSE_ENTER:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_CLOSE_ENTER );
}
break;
case SSQ_PROTOCOL_NOTICE_BATTLE_CANCLED:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_BATTLE_CANCLED );
}
break;
case SSQ_PROTOCOL_NOTICE_GAMBLE_START:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_GAMBLE_START );
m_dwGambleTime = 0;
m_bGambleStart = TRUE;
TCHAR szMessage[INTERFACE_STRING_LENGTH +1];
g_InterfaceManager.GetInterfaceString( 6419, szMessage );
GlobalFunc::default_OutputMsg( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, szMessage );
}
break;
case SSQ_PROTOCOL_NOTICE_GAMBLE_RESULT:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_GAMBLE_RESULT );
if( g_pHero == NULL )
break;
TCHAR szTemp[INTERFACE_STRING_LENGTH +1];
TCHAR szMessage[INTERFACE_STRING_LENGTH +1];
g_InterfaceManager.GetInterfaceString( 1769, szTemp );
const std::string strMoney = GlobalFunc::CalculateThousandDigit( rMsg.RewardHeim );
Sprintf( szMessage, szTemp, (TCHAR*)rMsg.CharName, strMoney.c_str() );
if( _tcscmp( (TCHAR*)rMsg.CharName, g_pHero->GetName() ) == 0 )
{
MONEY money = g_pHero->GetMoney() + rMsg.RewardHeim;
g_pHero->SetMoney( money );
}
GlobalFunc::default_OutputMsg( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, szMessage );
}
break;
case SSQ_PROTOCOL_NOTICE_BATTLE_COUNTDOWN:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_BATTLE_COUNTDOWN );
uiSSQSystemWindow * pDlg = GET_CAST_DIALOG( uiSSQSystemWindow, IM_SSQ_MANAGER::SSQ_SYSTEMTIME );
if( pDlg )
{
pDlg->SetStart( TRUE );
pDlg->SetStartCount( 10 );
}
}
break;
case SSQ_PROTOCOL_NOTICE_BATTLE_START:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_BATTLE_START );
// 전투 시작시 BGM 교체
g_SoundBGM.Stop();
g_SoundBGM.Play( 29 );
g_IsBattle = TRUE;
}
break;
case SSQ_PROTOCOL_NOTICE_BATTLE_END:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_BATTLE_END );
g_IsBattle = FALSE;
}
break;
case SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED );
g_ProjectileManagerEx.DeleteProjectile( g_dwSSQPortalKey );
}
break;
case SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_EARTHQUAKE_INDICATION );
const SSQPattern * pPattern = SSQInfoParser::Instance()->FindSSQPattern( rMsg.PatternIndex );
if( pPattern == NULL )
break;
for( int i = 0; i < pPattern->m_StepGroup[rMsg.StepArrayIndex].m_ListSize; i++ )
{
g_SsqScene.AddEarthQuakeIndex( pPattern->m_StepGroup[rMsg.StepArrayIndex].m_List[i] );
}
}
break;
case SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_EARTHQUAKE_EXECUTE );
g_SsqScene.ProcessEarthQuake();
}
break;
case SSQ_PROTOCOL_TRAP_THUNDERBOLT_EXECUTE:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_THUNDERBOLT_EXECUTE );
for( int i = 0; i < rMsg.Count; i++ )
{
g_SsqScene.CreateThunderBolt( rMsg.Position[i] );
}
}
break;
case SSQ_PROTOCOL_TRAP_CLOSEDSPACE_EXECUTE:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_CLOSEDSPACE_EXECUTE );
for( int i = 0; i < rMsg.Count; i++ )
{
g_SsqScene.ProcessDamage( rMsg.Damages[i] );
}
}
break;
case SSQ_PROTOCOL_TRAP_SELF_DESTRUCTION:
{
}
break;
case SSQ_PROTOCOL_INFORMATION_COUNT_OF_PLAYERS:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_COUNT_OF_PLAYERS );
uiSSQSystemWindow * pDlg = GET_CAST_DIALOG( uiSSQSystemWindow, IM_SSQ_MANAGER::SSQ_SYSTEMTIME );
if( pDlg )
{
pDlg->SetRemainUser( rMsg.Remains, 100 );
}
}
break;
case SSQ_PROTOCOL_INFORMATION_REMAINED_TIME:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_REMAINED_TIME );
uiSSQSystemWindow * pDlg = GET_CAST_DIALOG( uiSSQSystemWindow, IM_SSQ_MANAGER::SSQ_SYSTEMTIME );
if( pDlg )
{
pDlg->SetRemainTime( rMsg.Minute, rMsg.Second );
}
}
break;
case SSQ_PROTOCOL_INFORMATION_REWARD_ON_PLAYING:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_REWARD_ON_PLAYING );
TCHAR szTemp[INTERFACE_STRING_LENGTH +1];
TCHAR szMessage[INTERFACE_STRING_LENGTH +1];
g_InterfaceManager.GetInterfaceString( 6423, szTemp );
Sprintf( szMessage, szTemp, (TCHAR*)rMsg.CharName );
GlobalFunc::default_OutputMsg( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, szMessage );
}
break;
case SSQ_PROTOCOL_CONTROL_FORCED_POSITION_CORRECTION:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_CONTROL_FORCED_POSITION_CORRECTION );
for( int i = 0; i < rMsg.Count; i++ )
{
Object * pObj = g_ObjectManager.GetObject( rMsg.PositionInfo[i].ObjectKey );
if( pObj == NULL )
continue;
WzVector vTemp = rMsg.PositionInfo[i].Position;
vTemp.z = 20.0f;
WzVector pos;
GameFunc::PickTerrainMesh( vTemp, pos );
pObj->SetPosition( pos );
}
}
break;
case SSQ_PROTOCOL_CONTROL_DAMAGE_PROCESS:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_CONTROL_DAMAGE_PROCESS );
for( int i = 0; i < rMsg.Count; i++ )
{
g_SsqScene.ProcessDamage( rMsg.Damages[i], 7061 );
}
}
break;
case SSQ_PROTOCOL_TRAP_CLOSEDSPACE_DISABLED:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_TRAP_CLOSEDSPACE_DISABLED );
g_SsqScene.DeleteDoomEffect();
}
break;
case SSQ_PROTOCOL_INFORMATION_AMOUNT_DEDUCTED:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_AMOUNT_DEDUCTED );
if( g_pHero == NULL )
break;
MONEY money = g_pHero->GetMoney();
money -= rMsg.Cost;
g_pHero->SetMoney( money );
}
break;
case SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_G2C_SELECT:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_G2C_SELECT );
uiAssistMan* pUIMan = GET_DIALOG_MANAGER(uiAssistMan, UIMAN_ASSIST);
if(pUIMan)
{
pUIMan->ShowAskSSQObserverDialog();
}
}
break;
case SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_RESULT:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_RESULT );
using namespace nsSSQ::Observer;
if( rMsg.Result == MSGSUB_SSQ_PROTOCOL_REQUEST_OBSERVER_CTRL_RESULT::eNtfCmd_ResultByRequest_Success )
{
if( rMsg.Coordinates == Info::eCoord_Slots )
break;
const WzVector vAngle = GlobalFunc::GetObserverAngle( rMsg.Coordinates );
g_Camera.SetAngleYaw( vAngle.x );
g_Camera.SetAnglePitch( vAngle.y );
g_pHero->SetAngle( vAngle.x );
if( g_bObserverMode == FALSE )
{
g_bObserverMode = TRUE;
MainDialog * pDlg = GET_CAST_DIALOG( MainDialog, IM_MENU_MANAGER::MAIN_DLG );
if( pDlg )
{
pDlg->ShowObserverButton( TRUE );
}
if( g_pHero )
g_pHero->SetShow( FALSE );
SetShowInterfaceForObserverMode( FALSE );
}
}
else
{
}
}
break;
case SSQ_PROTOCOL_INFORMATION_QUEST_FAIL_RESULT:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_QUEST_FAIL_RESULT );
TCHAR szMessage[INTERFACE_STRING_LENGTH +1];
if( rMsg.bIsNotStarted )
{
g_InterfaceManager.GetInterfaceString( 5598, szMessage );
}
else
{
g_InterfaceManager.GetInterfaceString( 6426, szMessage );
}
GlobalFunc::default_OutputMsg( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, szMessage );
}
break;
case SSQ_PROTOCOL_INFORMATION_QUEST_SUCCESS_RESULT:
{
RECV_PATTERNCODE_FOR_SSQ( SSQ_PROTOCOL_INFORMATION_QUEST_SUCCESS_RESULT );
TCHAR szTemp[INTERFACE_STRING_LENGTH +1];
TCHAR szMessage[INTERFACE_STRING_LENGTH +1];
if (strlen(static_cast<TCHAR*>(rMsg.guild_name)) != 0)
{
// 6431 : 이번 '타락한 사원' 최고의 투사는 "%s 길드의 %s"님 입니다! 최고의 투사에게 '빛나는 투사의 상자'가 수여됩니다.
g_InterfaceManager.GetInterfaceString( 6431, szTemp );
Sprintf( szMessage, szTemp, static_cast<TCHAR*>(rMsg.guild_name), static_cast<TCHAR*>(rMsg.WinnerName));
}
else
{
// 6427 : 이번 '타락한 사원' 최고의 투사는 "%s"님 입니다! 최고의 투사에게 '빛나는 투사의 상자'가 수여됩니다.
g_InterfaceManager.GetInterfaceString( 6427, szTemp );
Sprintf( szMessage, szTemp, static_cast<TCHAR*>(rMsg.WinnerName) );
}
uiNoticeMan* pUIMan = GET_DIALOG_MANAGER(uiNoticeMan, UIMAN_NOTICE);
if (pUIMan != NULL)
{
pUIMan->ShowNoticeMessage(eGM_Notice, szMessage, 10000);
}
}
break;
default:
{
WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_FILE | c_wOUTPUT_LOG_CENTER | c_wOUTPUT_LOG_SYSCHAT, "Can't Readable SSQ Msg Format (Tag = %d)\n ", pIt->_TAG );
}
break;
}
}
ASSERT( pIt==pEnd );
}
void BattleScene::InserCenterTextMessage( char * szText, DWORD eType )
{
WzColor color;
if ( eType == PICK )
color = WzColor_RGB(255,255,255);
else
color = WzColor_RGB(0,255,0);
TEXT_MEMBER_SHARED_PTR_TYPE data( new Text_Member( szText, color ) );
m_TextDisplayManager.Insert( data );
}
void BattleScene::SetShowInterfaceForObserverMode( BOOL bShow )
{
#ifdef _NA_000000_20130114_RENEWER_UI
DWORD dwDialogID[4] = { IM_HERO_GAUGE_MANAGER::HERO_GAUGE_DLG,
IM_QUICK_CONTAINER_MANAGER::QUICK_CONTAINER,
IM_QUICK_CONTAINER_MANAGER::STYLE_CONTAINER,
IM_HERO_GAUGE_MANAGER::HERO_GAUGE_DLGCONTROL
};
for( int i = 0; i < 4; i++ )
{
uiBase * pDlg = GET_DIALOG( dwDialogID[i] );
if( pDlg )
pDlg->ShowWindow( bShow );
}
#else
DWORD dwDialogID[3] = { IM_HERO_GAUGE_MANAGER::HERO_GAUGE_DLG,
IM_QUICK_CONTAINER_MANAGER::QUICK_CONTAINER,
IM_QUICK_CONTAINER_MANAGER::STYLE_CONTAINER };
for( int i = 0; i < 3; i++ )
{
uiBase * pDlg = GET_DIALOG( dwDialogID[i] );
if( pDlg )
pDlg->ShowWindow( bShow );
}
#endif//#ifdef _NA_000000_20130114_RENEWER_UI
}
void BattleScene::ShowRadirDialog()
{
if (GameFramework::GetCurrentScene()->GetType() != SCENE_TYPE_SSQ)
{
static DWORD countMapOpen = 0;
if (g_pHero && (g_pHero->IsShowFullMap() == FALSE))
{
#ifdef _NA_000000_20130114_RENEWER_UI
RadarDialog* radar_dialog =
(RadarDialog*)GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG);
RadarPlusDialog* radar_plus =
(RadarPlusDialog*)GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG_PLUS);
if (!radar_dialog || !radar_plus)
{
//단 하나라도 포인트가 없다면 처리 하지 않음;
goto OUT_RESULT;
}
int radarLevel = 0;
//레이더 단계 계산
{
if(radar_dialog->IsVisible() && radar_dialog->gethidecheck() == false)
{
radarLevel = 1;
}
if(radar_dialog->IsVisible() && radar_dialog->gethidecheck())
{
radarLevel = 0;
}
if(radar_plus->IsVisible() && radar_plus->gethidecheck() == false)
{
radarLevel = 2;
}
if(radar_plus->IsVisible() && radar_plus->gethidecheck())
{
radarLevel = 3;
}
}
//level 단계
switch(radarLevel)
{
case 0:
{
radar_plus->ShowDialog(FALSE);
radar_dialog->ShowDialog(TRUE);
radar_dialog->HideAllControl(true);
}
break;
case 1:
{
radar_dialog->ShowDialog(FALSE);
radar_plus->ShowDialog(TRUE);
radar_plus->HideAllControl(true);
}
break;
case 2:
{
radar_dialog->ShowDialog(FALSE);
radar_plus->ShowDialog(TRUE);
radar_plus->HideAllControl(false);
}
break;
case 3:
{
radar_plus->ShowDialog(FALSE);
radar_dialog->ShowDialog(TRUE);
radar_dialog->HideAllControl(false);
countMapOpen = 0;
}
break;
}
#else
if (GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG)->IsVisible())
{
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG)->ShowDialog(FALSE);
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG_PLUS)->ShowDialog(TRUE);
}
else if (GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG_PLUS)->IsVisible())
{
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG)->ShowDialog(FALSE);
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG_PLUS)->ShowDialog(FALSE);
}
else
{
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG)->ShowDialog(TRUE);
GET_DIALOG(IM_RADAR_MANAGER::RADAR_DIALOG_PLUS)->ShowDialog(FALSE);
}
#endif
OUT_RESULT:
uiBattlezone2Man* ui_battlezone2_manager_ = GET_DIALOG_MANAGER(uiBattlezone2Man, UIMAN_BATTLE_ZONE_MANAGER);
if (ui_battlezone2_manager_ != NULL)
{
ui_battlezone2_manager_->MoveBattleZoneIcon();
}
}
}
}
//------------------------------------------------------------------------------
//_NA_000000_20120410_SPEEDHACK
void BattleScene::CallbackWGPL(void)
{
static bool is_sended = false;
if (is_sended == true)
{
return;
}
if (g_pHero == NULL)
{
return;
}
MSG_CG_ETC_MEMORY_HACK_CMD cmd;
if(GlobalFunc::SendPacketToGameServer(&cmd, sizeof(cmd)) == TRUE)
{
is_sended = true;
}
else
{
assert( !"패킷 Send 에러 - MSG_CG_SYNC_PLAYER_ENTER_SYN" );
}
}
//------------------------------------------------------------------------------
#ifdef _NA_007477_20140805_RADAR_RAYER_MODIFY
void BattleScene::SetCurrentRadarLayer(int current_layer)
{
RadarDialog * pRadarDlg = GET_CAST_DIALOG(RadarDialog, IM_RADAR_MANAGER::RADAR_DIALOG);
if(pRadarDlg)
{
pRadarDlg->SetCurLayer(current_layer);
}
RadarPlusDialog * pRadarPlusDlg = GET_CAST_DIALOG(RadarPlusDialog, IM_RADAR_MANAGER::RADAR_DIALOG_PLUS);
if(pRadarPlusDlg)
{
pRadarPlusDlg->SetCurLayer(current_layer);
}
}
//------------------------------------------------------------------------------
void BattleScene::InitRadarLayer(MAPCODE map_code)
{
int iMaxLayer = 1;
INDUN_OPTION* pOption = InDunOptionParser::Instance()->GetInDunOption(map_code);
if (pOption)
{
iMaxLayer = pOption->mdwLayer;
}
RadarDialog* pRadarDlg = GET_CAST_DIALOG(RadarDialog, IM_RADAR_MANAGER::RADAR_DIALOG);
if (pRadarDlg)
{
pRadarDlg->SetMaxLayer(iMaxLayer);
pRadarDlg->SetCurLayer();
}
RadarPlusDialog* pRadarPlusDlg = GET_CAST_DIALOG(RadarPlusDialog, IM_RADAR_MANAGER::RADAR_DIALOG_PLUS);
if (pRadarPlusDlg)
{
pRadarPlusDlg->SetMaxLayer(iMaxLayer);
pRadarPlusDlg->SetCurLayer();
}
}
#endif //_NA_007477_20140805_RADAR_RAYER_MODIFY
//------------------------------------------------------------------------------