BOOL CWndPiercing::OnDropIcon( LPSHORTCUT pShortcut, CPoint point ) { CWndBase* pWndFrame = pShortcut->m_pFromWnd->GetFrameWnd(); // 아이템이 인벤토리에서 왔는가? if( !(pShortcut->m_dwShortcut == SHORTCUT_ITEM) && !(pWndFrame->GetWndId() == APP_INVENTORY) ) return FALSE; if( g_pPlayer->m_Inventory.IsEquip( pShortcut->m_dwId ) ) { g_WndMng.PutString( prj.GetText(TID_GAME_EQUIPPUT), NULL, prj.GetTextColor(TID_GAME_EQUIPPUT) ); SetForbid( TRUE ); return FALSE; } CItemElem* pItemElem = (CItemElem*)g_pPlayer->GetItemId( pShortcut->m_dwId ); if(pItemElem == NULL) return FALSE; // 아이템( 방어구, 무기구 ) if( PtInRect(&m_Rect[0], point) ) { #if __VER < 9 // __ULTIMATE if( pItemElem->GetProp()->dwItemKind3 != IK3_SUIT ) { g_WndMng.PutString( prj.GetText(TID_PIERCING_POSSIBLE_ITEM), NULL, prj.GetTextColor(TID_PIERCING_POSSIBLE_ITEM) ); return FALSE; } #endif // __ULTIMATE // 4개 초과로 피어싱 할수 없음 #if __VER >= 12 // __EXT_PIERCING if( !pItemElem->IsPierceAble( NULL_ID, TRUE ) ) #else // __EXT_PIERCING if( pItemElem->GetPiercingSize() >= MAX_PIERCING_SUIT ) #endif // __EXT_PIERCING { g_WndMng.PutString( prj.GetText(TID_PIERCING_POSSIBLE), NULL, prj.GetTextColor(TID_PIERCING_POSSIBLE) ); return FALSE; } #ifdef __NEW_ITEM_VARUNA if( pItemElem->GetProp()->IsBaruna() ) { g_WndMng.PutString( prj.GetText(TID_PIERCING_POSSIBLE), NULL, prj.GetTextColor(TID_PIERCING_POSSIBLE) ); return FALSE; } #endif // __NEW_ITEM_VARUNA if( pItemElem->GetProp()->dwItemRare == 0xffffffff ) { g_WndMng.PutString( prj.GetText(TID_PIERCING_POSSIBLE_ITEM), NULL, prj.GetTextColor(TID_PIERCING_POSSIBLE_ITEM) ); return FALSE; } if( m_pItemElem[0] ) m_pItemElem[0]->SetExtra( 0 ); pItemElem->SetExtra( 1 ); m_pItemElem[0] = pItemElem; if( m_pItemElem[1] ) { m_pItemElem[1]->SetExtra( 0 ); m_pItemElem[1] = NULL; } if( m_pItemElem[2] ) { m_pItemElem[2]->SetExtra( 0 ); m_pItemElem[2] = NULL; } } else if( PtInRect(&m_Rect[1], point) ) { // 파워다이스 8, 10만 사용할수 있음 if( m_pItemElem[0] ) { #if __VER >= 8 //__Y_NEW_ENCHANT if( pItemElem->GetProp()->dwID != II_GEN_MAT_MOONSTONE && pItemElem->GetProp()->dwID != II_GEN_MAT_MOONSTONE_1 ) #else //__Y_NEW_ENCHANT if( pItemElem->GetProp()->dwID != II_GEN_MAT_DIE_EIGHT && pItemElem->GetProp()->dwID != II_GEN_MAT_DIE_TEN ) #endif //__Y_NEW_ENCHANT { g_WndMng.PutString( prj.GetText(TID_SBEVE_NOTUSEITEM), NULL, prj.GetTextColor(TID_SBEVE_NOTUSEITEM) ); return FALSE; } if( m_pItemElem[1] ) m_pItemElem[1]->SetExtra( 0 ); pItemElem->SetExtra( 1 ); m_pItemElem[1] = pItemElem; } } else if( PtInRect(&m_Rect[2], point) ) { if( m_pItemElem[0] ) { // 보조아이템은 상용화 아이템만 검사 if( pItemElem->GetProp()->dwID != II_SYS_SYS_SCR_PIEPROT ) { g_WndMng.PutString( prj.GetText(TID_SBEVE_NOTUSEITEM), NULL, prj.GetTextColor(TID_SBEVE_NOTUSEITEM) ); return FALSE; } if( m_pItemElem[2] ) m_pItemElem[2]->SetExtra( 0 ); pItemElem->SetExtra( 1 ); m_pItemElem[2] = pItemElem; } } return TRUE; }
BOOL CWndVendor::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult ) { if( message == 100 && nID == 100 ) { LPSHORTCUT pShortcut = (LPSHORTCUT)pLResult; if( pShortcut ) { CWndBase* pWndFrame = pShortcut->m_pFromWnd->GetFrameWnd(); if( pWndFrame->GetWndId() == APP_INVENTORY ) { CItemBase* pItemBase = m_pVendor->GetItemId( pShortcut->m_dwId ); if( pItemBase ) { if( pItemBase->IsQuest() ) return FALSE; if( pItemBase->GetProp()->dwItemKind3 == IK3_CLOAK && ( (CItemElem*)pItemBase )->m_idGuild != 0 ) return FALSE; //#if __VER >= 11 // __MA_VER11_05 // 케릭터 봉인 거래 기능 world,database,neuz // if( pItemBase->m_dwItemId == II_SYS_SYS_SCR_SEALCHARACTER ) // return FALSE; // 개인상점판매허용 //#endif // __MA_VER11_05 // 케릭터 봉인 거래 기능 world,database,neuz #if __VER >= 9 // __CSC_VER9_1 // ItemProp* pItemProp = pItemBase->GetProp(); CItemElem* pItemElem = (CItemElem*)pItemBase; if( pItemElem->IsFlag( CItemElem::expired ) ) return TRUE; /* if(pItemProp->dwItemKind3 == IK3_EGG && pItemElem->m_pPet) //사망한 펫은 거래 불가 { if(pItemElem->m_pPet->GetLife() <= 0) return FALSE; } */ #endif //__CSC_VER9_1 /* if( ((CItemElem*)pItemBase)->m_bCharged == 1 ) { g_WndMng.PutString( prj.GetText( TID_GAME_NOTTRADE ), NULL, prj.GetTextColor( TID_GAME_NOTTRADE ) ); return FALSE; } */ int iIndex = pShortcut->m_dwData - 100; if( 0 <= iIndex && iIndex < MAX_VENDITEM ) { if( m_pVendor->m_vtInfo.GetItem( iIndex ) != NULL ) return FALSE; if( IsUsingItem( pItemBase ) == FALSE && m_pVendor->IsActiveMover() && !m_pVendor->m_vtInfo.IsVendorOpen() ) { SAFE_DELETE( m_pWndRegVend ); m_pWndRegVend = new CWndRegVend; m_pWndRegVend->Initialize( this ); m_pWndRegVend->SetItem( iIndex, pItemBase ); } } } } // APP_INVENTORY } } else { if( nID == WIDC_OK ) { if( g_pPlayer->m_pActMover->IsFly() ) return TRUE; if( g_pPlayer->m_vtInfo.VendorIsVendor() == FALSE ) return TRUE; CWndEdit* pWndEdit = (CWndEdit*)GetDlgItem( WIDC_EDIT1 ); CString strVendor = pWndEdit->GetString(); strVendor.TrimLeft(); strVendor.TrimRight(); /*#if __VER >= 11 // __MOD_VENDOR // 매물 액수 총합 + 현재 소지금이 2억1천이 넘으면 경고띄우고 리턴시킴. int nGold = (int)g_pPlayer->GetTotalGold(); for( int iv = 0 ; iv < MAX_VENDITEM ; ++iv ) { CItemBase *pItemBase = g_pPlayer->m_vtInfo.GetItem( iv ); if( pItemBase == NULL ) continue; nGold += ((CItemElem*)pItemBase)->m_nCost * pItemBase->GetExtra(); } if( nGold <= 0 || 2100000000 <= nGold ) { g_WndMng.OpenMessageBox( _T(prj.GetText(TID_GAME_VENDOR_MAX_ALL_GOLD)), MB_OK, this ); return TRUE; } #endif*/ if( prj.IsInvalidName( strVendor ) #ifdef __RULE_0615 || prj.IsAllowedLetter( strVendor, TRUE ) == FALSE #endif // __RULE_0615 ) { g_WndMng.OpenMessageBox( _T( prj.GetText(TID_DIAG_0020) ) ); return TRUE; } g_WndMng.WordChange( strVendor ); // name #ifdef __RULE_0615 if( strVendor.GetLength() < 6 || strVendor.GetLength() > 32 ) #else // __RULE_0615 if( strVendor.GetLength() < 6 || strVendor.GetLength() >= 38 ) #endif // __RULE_0615 { g_WndMng.OpenMessageBox( _T( prj.GetText(TID_DIAG_0011) ) ); return TRUE; } CString strFormat = strVendor; if( !strVendor.IsEmpty() ) { pWndEdit->m_string = strFormat; pWndEdit->m_string.GetTextFormat(strFormat); } #if __VER >= 8 // __S8_VENDOR_REVISION CWndVendorConfirm* pBox = new CWndVendorConfirm; g_WndMng.OpenCustomBox( "", pBox ); pBox->SetVendorName( strFormat ); pBox->SetValue( prj.GetText( TID_GAME_VENDOR_START ) ); #else // __VER >= 8 // __S8_VENDOR_REVISION g_DPlay.SendPVendorOpen( (const char*)strFormat ); #endif // __VER >= 8 // __S8_VENDOR_REVISION CWndButton* pWndButton = (CWndButton*)GetDlgItem( WIDC_OK ); pWndButton->SetVisible( FALSE ); } else if( nID == WIDC_CANCEL || nID == WTBID_CLOSE ) { #if __VER >= 8 // __S8_VENDOR_REVISION if( g_pPlayer->m_vtInfo.IsVendorOpen() ) { CWndVendorConfirm* pBox = new CWndVendorConfirm; g_WndMng.OpenCustomBox( "", pBox ); pBox->SetValue( prj.GetText( TID_GAME_VENDOR_STOP ) ); return FALSE; } #endif // __VER >= 8 // __S8_VENDOR_REVISION Destroy( FALSE ); } else if( nID == WIDC_CHAT ) { BOOL bChattingRoom = FALSE; if( g_pPlayer->m_vtInfo.IsVendorOpen() ) { g_DPlay.SendOpenChattingRoom(); bChattingRoom = TRUE; } else if( g_pPlayer->m_vtInfo.GetOther() && g_Chatting.m_bState ) { bChattingRoom = TRUE; } if( bChattingRoom ) { #if __VER >= 11 // __MOD_VENDOR if(!m_pwndVenderMessage) { m_pwndVenderMessage = new CWndVendorMessage; if(m_pVendor->IsActiveMover()) m_pwndVenderMessage->m_nIsOwner = TRUE; #ifdef __FIX_WND_1109 m_pwndVenderMessage->Initialize( this ); #else // __FIX_WND_1109 m_pwndVenderMessage->Initialize( ); #endif // __FIX_WND_1109 } else { if(m_pwndVenderMessage->IsVisible()) m_pwndVenderMessage->SetVisible(FALSE); else m_pwndVenderMessage->SetVisible(TRUE); } #else SAFE_DELETE( m_pwndVenderMessage ); m_pwndVenderMessage = new CWndVendorMessage; #ifdef __FIX_WND_1109 m_pwndVenderMessage->Initialize( this ); #else // __FIX_WND_1109 m_pwndVenderMessage->Initialize( ); #endif // __FIX_WND_1109 #endif } } #if __VER >= 11 // __MOD_VENDOR else if(nID == WIDC_RESET) { CItemBase apItem_VT[MAX_VENDITEM]; /// vendor and trader share pointer array ZeroMemory( apItem_VT, sizeof( apItem_VT ) ); //if( g_pPlayer->m_vtInfo.IsVendorOpen() ) //{ for( int i = 0; i < MAX_VENDITEM; i++ ) { // 리스트를 클리어 한다. CItemBase* pItemBase = g_pPlayer->m_vtInfo.GetItem(i); if( pItemBase != NULL ) { if( pItemBase->m_dwObjId != 0 ) g_DPlay.SendUnregisterPVendorItem( i ); } } // 저장버퍼도 클리어 memset(g_Neuz.m_aSavedInven, 0, sizeof(g_Neuz.m_aSavedInven)); //} } #endif } return CWndNeuz::OnChildNotify( message, nID, pLResult ); }
BOOL CDbManager::RemoveItemInvenBank( CMover* pMover, int* nCountItem0, int* nCountItem1 ) { BOOL bResult = FALSE; SET_STRING::iterator it; for( it = m_RemoveItem_List.begin() ; it != m_RemoveItem_List.end() ; ++it ) { // Inven ItemProp* pItemProp = NULL; pItemProp = prj.GetItemProp( it->data() ); if( pItemProp ) { int nSize = pMover->m_Inventory.m_dwItemMax; CItemElem* pItemElem; for( int i = 0 ; i < nSize; i++ ) { pItemElem = pMover->m_Inventory.GetAtId( i ); if( pItemElem ) { ItemProp* pGetItemProp = prj.GetItemProp( pItemElem->m_dwItemId ); if( pGetItemProp && pGetItemProp->dwID == pItemProp->dwID ) { if( pItemElem->m_bItemResist || pItemElem->GetOption() || pItemElem->m_nResistAbilityOption ) { FILEOUT( "..\\RemoveItem.log", "IdPlayer = %07d, ItemName : %s %d/%d/%d", pMover->m_idPlayer, it->data(), pItemElem->GetOption(), pItemElem->m_bItemResist, pItemElem->m_nResistAbilityOption ); } pMover->m_Inventory.RemoveAtId( pItemElem->m_dwObjId ); if( prj.IsConvMode( REMOVE_ITEM_ALL_PAY ) ) { if( lstrcmp( it->data(), "천운의 스태프" ) == 0 ) (*nCountItem0)++; if( lstrcmp( it->data(), "파황의 스태프" ) == 0 ) (*nCountItem1)++; } // FILEOUT( "..\\RemoveItem.log", "PlayerName = %s, ItemName : %s", pMover->m_szName, it->data() ); bResult = TRUE; } } } // Bank nSize = pMover->m_Bank[0].m_dwItemMax; for( i = 0 ; i < nSize; i++ ) { pItemElem = pMover->m_Bank[0].GetAtId( i ); if( pItemElem ) { ItemProp* pGetItemProp = prj.GetItemProp( pItemElem->m_dwItemId ); if( pGetItemProp && pGetItemProp->dwID == pItemProp->dwID ) { if( pItemElem->m_bItemResist || pItemElem->GetOption() || pItemElem->m_nResistAbilityOption ) { FILEOUT( "..\\RemoveItem.log", "IdPlayer = %07d, ItemName : %s %d/%d/%d", pMover->m_idPlayer, it->data(), pItemElem->GetOption(), pItemElem->m_bItemResist, pItemElem->m_nResistAbilityOption ); } pMover->m_Bank[0].RemoveAtId( pItemElem->m_dwObjId ); if( prj.IsConvMode( REMOVE_ITEM_ALL_PAY ) ) { if( lstrcmp( it->data(), "천운의 스태프" ) == 0 ) (*nCountItem0)++; if( lstrcmp( it->data(), "파황의 스태프" ) == 0 ) (*nCountItem1)++; } // FILEOUT( "..\\RemoveItem.log", "PlayerName = %s, ItemName : %s", pMover->m_szName, it->data() ); bResult = TRUE; } } } } } return bResult; }
void CMover::Serialize( CAr & ar ) { CCtrl::Serialize( ar ); // 25 DWORD dwGold; if( ar.IsStoring() ) // STORING { ar << (u_short)m_dwMotion; ar << (u_char)m_bPlayer; ar << m_nHitPoint; ar << m_pActMover->GetState(); ar << m_pActMover->GetStateFlag(); ar << (u_char)m_dwBelligerence; #if __VER >= 15 // __PETVIS ar << m_dwMoverSfxId; #endif // __PETVIS if( m_bPlayer ) // PLAYER { ar.WriteString( m_szName ); ar << GetSex(); ar << (u_char)m_dwSkinSet; ar << (u_char)m_dwHairMesh; ar << m_dwHairColor; ar << (u_char)m_dwHeadMesh; ar << m_idPlayer; ar << (u_char)m_nJob; ar << (u_short)m_nStr; ar << (u_short)m_nSta; ar << (u_short)m_nDex; ar << (u_short)m_nInt; ar << (u_short)m_nLevel; ar << m_nFuel; ar << m_tmAccFuel; if( m_idGuild > 0 ) { ar << (u_char)1; ar << m_idGuild; ar << m_idWar; } else { ar << (u_char)0; } ar << m_idGuildCloak; if( m_idparty > 0 ) { ar << (u_char)1; ar << m_idparty; ar << m_idDuelParty; } else { ar << (u_char)0; } ar << (char)m_dwAuthorization; ar << m_dwMode; ar << m_dwStateMode; #ifdef __WORLDSERVER CItemElem* pItemElem = m_Inventory.GetAtId( m_dwUseItemId ); if( pItemElem ) ar << pItemElem->GetProp()->dwID; else ar << (OBJID)0; #else // __WORLDSERVER ar << m_dwUseItemId; #endif // __WORLDSERVER #if __VER >= 8 // __S8_PK if( m_dwPKTime > 0 ) #ifdef __WORLDSERVER ar << ( m_dwPKTime - GetTickCount() ); #else // __WORLDSERVER ar << m_dwPKTime; #endif // __WORLDSERVER else ar << m_dwPKTime; ar << m_nPKValue; ar << m_dwPKPropensity; ar << m_dwPKExp; #else // __VER >= 8 // __S8_PK ar << (u_short)m_nNumKill; ar << m_nSlaughter; #endif // __VER >= 8 // __S8_PK ar << m_nFame; ar << (u_char)m_nDuel; #if __VER >= 13 // __HONORABLE_TITLE // 달인 ar << m_nHonor; // 달인선택 #endif // __HONORABLE_TITLE // 달인 { int i; for( i = 0; i < MAX_HUMAN_PARTS; i ++ ) { ar << m_aEquipInfo[i].nOption; } } ar << m_nGuildCombatState; for( int j = 0 ; j < SM_MAX ; ++j ) ar << m_dwSMTime[j]; if( CObj::GetMethod() == METHOD_NONE ) { ar << (u_short)m_nManaPoint; ar << (u_short)m_nFatiguePoint; #if __VER >= 12 // __MOD_TUTORIAL ar << m_nTutorialState; #else // __MOD_TUTORIAL ar << (u_short)m_nFlightLv; #endif // __MOD_TUTORIAL ar << m_nFxp; dwGold = GetGold(); ar << dwGold; ar << m_nExp1; ar << m_nSkillLevel; ar << m_nSkillPoint; ar << m_nDeathExp; ar << m_nDeathLevel; DWORD dwJobLv[MAX_JOB] = {0, }; ar.Write( (void*)dwJobLv, sizeof(DWORD) * MAX_JOB ); ar << m_idMarkingWorld; ar << m_vMarkingPos; ar << m_nQuestSize; ar.Write( m_aQuest, sizeof(QUEST) * m_nQuestSize ); ar << m_nCompleteQuestSize; ar.Write( m_aCompleteQuest, sizeof(WORD) * m_nCompleteQuestSize ); #if __VER >= 15 // __IMPROVE_QUEST_INTERFACE ar << m_nCheckedQuestSize; ar.Write( m_aCheckedQuest, sizeof(WORD) * m_nCheckedQuestSize ); #endif // __IMPROVE_QUEST_INTERFACE ar << m_idMurderer; ar << (short)m_nRemainGP; ar << (short)0; { for( int i = 0; i < MAX_HUMAN_PARTS; i++ ) ar << m_aEquipInfo[i].dwId; } ar.Write( (void*)m_aJobSkill, sizeof(SKILL) * ( MAX_SKILL_JOB ) ); ar << (BYTE)m_nCheerPoint << m_dwTickCheer - GetTickCount(); ar << m_nSlot; for( int k = 0 ; k < 3 ; ++k ) ar << m_dwGoldBank[k]; for( k = 0 ; k < 3 ; ++k ) ar << m_idPlayerBank[k]; ar << m_nPlusMaxHitPoint; ar << m_nAttackResistLeft; ar << m_nAttackResistRight; ar << m_nDefenseResist; #if __VER >= 8 // __CSC_VER8_5 ar << m_nAngelExp; ar << m_nAngelLevel; #endif // __CSC_VER8_5 m_Inventory.Serialize( ar ); for( k = 0 ; k < 3 ; ++k ) m_Bank[k].Serialize( ar ); #if __VER >= 9 // __PET_0410 ar << GetPetId(); // 소환 중인 펫 인벤토리 위치 #endif // __PET_0410 #if __VER >= 11 // __SYS_POCKET m_Pocket.Serialize( ar ); #endif // __SYS_POCKET #ifdef __JEFF_9_20 ar << m_dwMute; #endif // __JEFF_9_20 #if __VER >= 13 // __HONORABLE_TITLE // 달인 for( int i = 0 ; i < MAX_HONOR_TITLE ; ++i ) { ar << m_aHonorTitle[i]; } #endif // __HONORABLE_TITLE // 달인 #if __VER >= 15 // __CAMPUS ar << m_idCampus; ar << m_nCampusPoint; #endif // __CAMPUS } else if( CObj::GetMethod() == METHOD_EXCLUDE_ITEM ) { # if defined (__WORLDSERVER) || defined(__CLIENT) ar.WriteString( m_vtInfo.GetTitle() ); # endif u_char uSize = 0; u_long uOffset = ar.GetOffset(); ar << uSize; for( u_char uParts = 0; uParts < MAX_HUMAN_PARTS; uParts++ ) { CItemElem* pItemElem = m_Inventory.GetEquip( uParts ); if( pItemElem ) { uSize++; ar << uParts; ar << (u_short)pItemElem->m_dwItemId; ar << pItemElem->m_byFlag; } } GETBLOCK( ar, pBlock, nBlockSize ); *(UNALIGNED u_char*)( pBlock + uOffset ) = uSize; #if __VER >= 9 // __PET_0410 DWORD dwPetId = NULL_ID; #ifdef __PET_1024 char* pszPetName = ""; #endif // __PET_1024 CItemElem* pItemElem = GetPetItem(); if( pItemElem ) { dwPetId = MAKELONG( (WORD)pItemElem->m_pPet->GetIndex(), (WORD)pItemElem->m_pPet->GetLevel() ); #ifdef __PET_1024 pszPetName = const_cast<char*>( pItemElem->m_pPet->GetName() ); #endif // __PET_1024 } ar << dwPetId; #ifdef __PET_1024 ar.WriteString( pszPetName ); #endif // __PET_1024 #endif // __PET_0410 } }
BOOL CWndGuildMerit::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult ) { if ( message == EN_RETURN ) { nID = WIDC_BUTTON1; } switch( nID ) { case WIDC_CHECK2: { CWndButton* pChk = (CWndButton*)GetDlgItem( WIDC_CHECK2 ); m_nItem = pChk->GetCheck(); if( m_nItem ) { if( g_pPlayer ) { CItemElem* pItemElem = NULL; for( int i=0; i<g_pPlayer->m_Inventory.GetMax() ; i++ ) { pItemElem = g_pPlayer->m_Inventory.GetAtId(i); if( pItemElem == NULL ) continue; if( pItemElem->GetProp()->dwItemKind3 == IK3_GEM ) { pItemElem->SetExtra( pItemElem->m_nItemNum ); m_wndctrlMerit.AddItem(pItemElem); } } } } else { m_wndctrlMerit.RestoreItem(); m_wndctrlMerit.ClearItem(); } } break; case WIDC_BUTTON1: // OK { CWndEdit *pWndEdit = (CWndEdit *)GetDlgItem( WIDC_EDIT1 ); m_nPenya = atoi( pWndEdit->GetString() ); // 문자열을 숫자로 변환. if( m_nPenya < 0 ) m_nPenya = 0; CGuild* pGuild = g_pPlayer->GetGuild(); if( pGuild ) { // 페냐가 공헌가능한지 검사. if( m_nPenya ) { CONTRIBUTION_RESULT cbResult = pGuild->CanContribute( 0, (DWORD)m_nPenya, g_pPlayer->m_idPlayer ); if( cbResult == CONTRIBUTION_OK ) // 페냐 공헌가능. g_DPlay.SendGuildContribution( 0, m_nPenya ); pGuild->MeritResultMsg( cbResult ); // 안내메시지. } //* // 공헌아이템 if( m_nItem ) { CONTRIBUTION_RESULT cbResult = pGuild->CanContribute( m_wndctrlMerit.GetTotalCount(), 0, g_pPlayer->m_idPlayer ); if( cbResult == CONTRIBUTION_OK ) // 아이템 공헌가능 g_DPlay.SendGuildContribution( 0, 0, 1); pGuild->MeritResultMsg( cbResult ); // 안내메시지. } /**/ } // pGuild Destroy(); } break; case 10000: case WIDC_BUTTON2: // NO m_wndctrlMerit.RestoreItem(); Destroy(); // 걍 창 닫고 나감. break; } return CWndNeuz::OnChildNotify( message, nID, pLResult ); }
void CCollectingWnd::OnInitialUpdate() { CWndNeuz::OnInitialUpdate(); #if __VER >= 11 // __SYS_COLLECTING // 여기에 코딩하세요 if(!g_pPlayer) return; CItemElem* pCollector = g_pPlayer->GetCollector(); if(pCollector) { char szTemp[64]; //CWndStatic* pBettery = (CWndStatic*)GetDlgItem( WIDC_STATIC5 ); CWndStatic* pLevel = (CWndStatic*)GetDlgItem( WIDC_STATIC3 ); CWndStatic* pPic1 = (CWndStatic*)GetDlgItem( WIDC_PIC1 ); CWndStatic* pPic2 = (CWndStatic*)GetDlgItem( WIDC_PIC2 ); LPWNDCTRL lpWndCtrl1 = GetWndCtrl( WIDC_STATIC1 ); LPWNDCTRL lpWndCtrl2 = GetWndCtrl( WIDC_STATIC2 ); LPWNDCTRL lpGauge = GetWndCtrl( WIDC_GAUGE ); CRect rect = GetClientRect(); CRect rectTemp; int nWidthClient= lpGauge->rect.Width(); int nMax = CCollectingProperty::GetInstance()->GetMaxBattery(); int nRatio = pCollector->m_nHitPoint / nMax; int nWidth = nWidthClient * nRatio; int nBtryRemain = pCollector->m_nHitPoint; if(nBtryRemain < 0) nBtryRemain = 0; m_BetteryRect = lpWndCtrl1->rect; m_LevelRect = lpWndCtrl2->rect; if(!m_pVBGauge) m_pApp->m_pd3dDevice->CreateVertexBuffer( sizeof( TEXTUREVERTEX2 ) * 3 * 6, D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, D3DFVF_TEXTUREVERTEX2, D3DPOOL_DEFAULT, &m_pVBGauge, NULL ); m_pTexGauEmptyNormal = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "GauEmptyNormal.bmp" ), 0xffff00ff ); m_pTexGauFillNormal = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "GauEmptyNormal.bmp" ), 0xffff00ff ); /*m_texGauEmptyNormal.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "GauEmptyNormal.bmp" ), 0xffff00ff, TRUE ); m_texGauEmptySmall.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "GauEmptySmall.bmp" ), 0xffff00ff, TRUE ); m_texGauFillNormal.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "GauEmptyNormal.bmp" ), 0xffff00ff, TRUE ); m_texGauFillSmall.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "GauEmptySmall.bmp" ), 0xffff00ff, TRUE ); */ wsprintf(m_pbufText, "%d / %d (%d%%)", nBtryRemain, nMax, nRatio * 100); m_nGWidth = nWidth; rect = lpGauge->rect; rectTemp = rect; rectTemp.right = rectTemp.left + nWidth; ClientToScreen( rectTemp ); //m_bVBGauge = m_pTheme->MakeGaugeVertex( m_pApp->m_pd3dDevice, &rect, 0x640010ff, m_pVBGauge, m_pTexGauFillNormal ); memset(szTemp, 0, 64); sprintf(szTemp, "%d / 5", pCollector->GetAbilityOption()); pLevel->SetTitle(szTemp); m_pTexBatt = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_ICON, _T( "Icon_ColBattery.tga" )), 0xffff00ff ); m_pTexLevel = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_ICON, _T( "Icon_ColLevel.tga" )), 0xffff00ff ); /* if(!m_pModel) m_pModel = new CModelObject; m_pModel = (CModelObject*)prj.m_modelMng.LoadModel( g_Neuz.m_pd3dDevice, OT_ITEM, pCollector->m_dwItemId ); m_pModel->InitDeviceObjects( g_Neuz.GetDevice() );*/ } // 윈도를 중앙으로 옮기는 부분. CRect rectRoot = m_pWndRoot->GetLayoutRect(); CRect rectWindow = GetWindowRect(); CPoint point( rectRoot.right - rectWindow.Width(), 110 ); Move( point ); #endif }
void CWndVendorCtrl::OnDraw( C2DRender* p2DRender ) { if( m_pMover == NULL ) return; CRect rect = GetClientRect(); int nWidth = rect.Width() / 32; int nHeight = rect.Height() / 32; int i; for( i = 0; i < MAX_VENDITEM; i++ ) { int x = i % 6; int y = i / 6; //p2DRender->RenderRect( CRect( x * 32 + 7, y * 32 + 11, x * 32 + 32 + 5, y * 32 + 32 + 9 ), 0xff00ffff ); CRect rectHittest = CRect( x * 32 + 7, y * 32 + 11, x * 32 + 32 + 5, y * 32 + 32 + 9 ); CPoint point = GetMousePoint(); if( rectHittest.PtInRect( point ) ) { if( CWndBase::m_GlobalShortcut.m_dwData ) { m_nCurSel = -1; CPoint ptx = CPoint(x * 32 + 7, y * 32 + 11); { m_pTex->Render( p2DRender, ptx ); } } } CItemBase* pItemBase = GetItem( i ); if( pItemBase ) { if( ((CItemElem*)pItemBase)->IsFlag( CItemElem::expired ) ) { pItemBase->GetTexture()->Render2( p2DRender, CPoint( x * 32 + 6, y * 32 + 10 ), D3DCOLOR_XRGB( 255, 100, 100 ) ); } else { pItemBase->GetTexture()->Render( p2DRender, CPoint( x * 32 + 6, y * 32 + 10 ) ); } CPoint point = GetMousePoint(); if( rectHittest.PtInRect( point ) ) { CPoint point2 = point; ClientToScreen( &point2 ); ClientToScreen( &rectHittest ); g_WndMng.PutToolTip_Item( pItemBase, point2, &rectHittest, APP_VENDOR ); } if( i == m_nCurSel ) p2DRender->RenderRect( CRect( x * 32 + 7, y * 32 + 11, x * 32 + 32 + 5, y * 32 + 32 + 9 ), 0xff00ffff ); CItemElem* pItemElem = (CItemElem*)pItemBase; if( pItemElem->GetProp()->dwPackMax > 1 ) { short nItemNum = pItemBase->GetExtra(); TCHAR szTemp[32]; _stprintf( szTemp, "%d", nItemNum ); CSize size = p2DRender->m_pFont->GetTextExtent( szTemp ); p2DRender->TextOut( x * 32 + 32 - size.cx+5, y * 32 + 32 - size.cy+12, szTemp, 0xff1010ff ); } } } }
void CWndVendorCtrl::OnDraw( C2DRender* p2DRender ) { if( m_pMover == NULL ) return; CRect rect = GetClientRect(); int nWidth = rect.Width() / 32; int nHeight = rect.Height() / 32; #if __VER >= 8 //__S8_VENDOR_REVISION int i; for( i = 0; i < MAX_VENDOR_REVISION; i++ ) #else //__S8_VENDOR_REVISION int i; for( i = 0; i < MAX_VENDITEM; i++ ) #endif //__S8_VENDOR_REVISION { int x = i % 2; int y = i / 2; int nX; int nY = y * 32 + 8 + y * 4; if( x == 0 ) nX = x * 32 + 15; else nX = 235; CRect rectHittest = CRect( nX, nY, nX + 180, nY + 32 ); CPoint point = GetMousePoint(); if( rectHittest.PtInRect( point ) ) { if( CWndBase::m_GlobalShortcut.m_dwData ) { m_nCurSel = -1; { CPoint ptx = CPoint(nX, nY); m_pTex->Render( p2DRender, ptx ); // 아이템 테두리 그리기 } } } CItemBase* pItemBase = GetItem( i ); if( pItemBase ) { // 툴팁 float fScal = 1.0f; CPoint point = GetMousePoint(); if( rectHittest.PtInRect( point ) ) { fScal = 1.15f; CPoint point2 = point; ClientToScreen( &point2 ); ClientToScreen( &rectHittest ); g_WndMng.PutToolTip_Item( pItemBase, point2, &rectHittest, APP_VENDOR ); } // 아이템 아이콘 if( ((CItemElem*)pItemBase)->IsFlag( CItemElem::expired ) ) pItemBase->GetTexture()->Render2( p2DRender, CPoint( nX, nY ), D3DCOLOR_XRGB( 255, 100, 100 ) ); else pItemBase->GetTexture()->Render2( p2DRender, CPoint( nX, nY ), D3DCOLOR_XRGB( 255, 255, 255 ), fScal, fScal ); // 아이템 이름, 판매가격 OnDrawItemInfo( p2DRender, ((CItemElem*)pItemBase), nX, nY ); if( i == m_nCurSel ) p2DRender->RenderRect( CRect( nX, nY, nX + 32, nY + 32 ), 0xff00ffff ); CItemElem* pItemElem = (CItemElem*)pItemBase; if( pItemElem->GetProp()->dwPackMax > 1 ) { short nItemNum = pItemBase->GetExtra(); TCHAR szTemp[32]; _stprintf( szTemp, "%d", nItemNum ); CSize size = p2DRender->m_pFont->GetTextExtent( szTemp ); p2DRender->TextOut( nX - 7 + 32 - size.cx+5, nY - 11 + 32 - size.cy+12, szTemp, 0xff1010ff ); } } } }
// // Action Message Process // 액션 메시지를 받아 처리한다. // 어떤 행위가 발생하는 시점에 대한 처리를 담당. // 최적화를 위해서 이미 설정되어 있는 상태면 중복 처리 하지 않음 // int CActionMover::ProcessActMsg1( CMover* pMover, OBJMSG dwMsg, int nParam1, int nParam2, int nParam3, int nParam4, int nParam5 ) { CModelObject* pModel = (CModelObject*)pMover->m_pModel; switch( dwMsg ) { // 평화모드 제자리에 서있어라! case OBJMSG_STAND: #ifdef __Y_INTERFACE_VER3 if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) || (GetMoveState() == OBJSTA_LMOVE) || (GetMoveState() == OBJSTA_RMOVE) ) // 전/후진중일때 제자리에 세운다. #else //__Y_INTERFACE_VER3 if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) ) // 전/후진중일때 제자리에 세운다. #endif //__Y_INTERFACE_VER3 { ResetState( OBJSTA_MOVE_ALL ); m_vDelta.x = m_vDelta.z = 0; if( pMover->IsFlyingNPC() ) { m_vDelta.y = 0; pMover->SetAngleX(0); } } if( GetMoveState() == OBJSTA_STAND ) return 0; if( GetMoveState() == OBJSTA_PICKUP ) return 0; if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( IsActDamage() ) return -3; if( IsDie() ) return -4; if( IsAction() ) return 0; SetMoveState( OBJSTA_STAND ); pMover->SetMotion( MTI_STAND ); RemoveStateFlag( OBJSTAF_ETC ); break; case OBJMSG_STOP: case OBJMSG_ASTOP: #ifdef __Y_INTERFACE_VER3 if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) || (GetMoveState() == OBJSTA_LMOVE) || (GetMoveState() == OBJSTA_RMOVE) ) // 전/후진중일때 제자리에 세운다. #else //__Y_INTERFACE_VER3 if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) ) // 전/후진중일때 제자리에 세운다. #endif //__Y_INTERFACE_VER3 { ResetState( OBJSTA_MOVE_ALL ); m_vDelta.x = m_vDelta.z = 0; if( pMover->IsFlyingNPC() ) { m_vDelta.y = 0; pMover->SetAngleX(0); } } pMover->ClearDest(); return 0; // ControlGround에서 키입력없을때 STOP을 부르는데 거기서 리턴값을 맞추기 위해 이렇게 했음. break; case OBJMSG_SITDOWN: if( GetStateFlag() & OBJSTAF_SIT ) return 0; // 이미 앉은모드면 리턴 - 플래그로 검사하지 말고 state로 직접검사하자. if( nParam3 == 0 ) { if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; if( IsAction() ) return 0; #ifdef __CLIENT if( pMover->IsActiveMover() && (pMover->m_dwReqFlag & REQ_USESKILL) ) return 0; // 서버로부터 useskill응답이 오기전까진 액션해선 안됨. #endif // __CLIENT } AddStateFlag( OBJSTAF_SIT ); SendActMsg( OBJMSG_STOP ); pMover->SetMotion( MTI_SIT, ANILOOP_CONT ); // 앉기 모션시작 SetMoveState( OBJSTA_SIT ); break; case OBJMSG_STANDUP: if( (GetStateFlag() & OBJSTAF_SIT) == 0 ) return 0; if( nParam3 == 0 ) { if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; if( IsAction() ) return 0; #ifdef __CLIENT if( pMover->IsActiveMover() && (pMover->m_dwReqFlag & REQ_USESKILL) ) return 0; // 서버로부터 useskill응답이 오기전까진 액션해선 안됨. #endif // __CLIENT } SetMoveState( OBJSTA_SIT ); AddStateFlag( OBJSTAF_SIT ); pMover->SetMotion( MTI_GETUP, ANILOOP_CONT ); break; case OBJMSG_PICKUP: if( IsSit() ) return 0; if( IsAction() ) return 0; if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; #ifdef __CLIENT if( pMover->IsActiveMover() ) { if( pMover->m_dwReqFlag & REQ_USESKILL ) return 0; // 서버로부터 useskill응답이 오기전까진 액션해선 안됨. if( pMover->m_dwReqFlag & REQ_MOTION ) return 0; // 서버로부터 모션 응답이 오기전까지 액션 금지. } #endif // __CLIENT if( GetMoveState() == OBJSTA_PICKUP ) return 0; // 이미 집고 있으면 추가로 실행되지 않게 . SetMoveState( OBJSTA_PICKUP ); pMover->SetMotion( MTI_PICKUP, ANILOOP_1PLAY, MOP_FIXED ); break; case OBJMSG_COLLECT: //if( IsSit() ) return 0; //if( IsAction() ) return 0; //if( IsActJump() ) return 0; //if( IsActAttack() ) return 0; //if( IsActDamage() ) return 0; //SetState( OBJSTA_ACTION_ALL, OBJSTA_COLLECT ); //pMover->SetMotion( MTI_COLLECT, ANILOOP_LOOP, MOP_FIXED ); //pMover->RemoveInvisible(); // 康 // 채집 ClearState(); ResetState( OBJSTA_ACTION_ALL ); SetState( OBJSTA_ACTION_ALL, OBJSTA_COLLECT ); //pMover->m_dwFlag |= MVRF_NOACTION; pMover->SetMotion( MTI_COLLECT, ANILOOP_LOOP, MOP_FIXED ); pMover->RemoveInvisible(); break; case OBJMSG_STUN: SetState( OBJSTA_ACTION_ALL, OBJSTA_STUN ); // 스턴은 어떤 상태에서도 걸릴 수 있으니 상태는 무조것 세팅하자. pMover->m_dwFlag |= MVRF_NOACTION; // 액션 금지 상태로 전환. pMover->m_wStunCnt = (short)nParam1; // 얼마동안이나 스턴상태가 되느냐. if( GetState() == OBJSTA_STAND ) pMover->SetMotion( MTI_GROGGY, ANILOOP_LOOP, MOP_FIXED ); // 아무것도 안하는 스탠딩 상태면 스턴 모션 내자. break; case OBJMSG_FALL: if( IsActJump() ) return 0; // 무적이면 여기서 리턴. if( pMover->m_dwMode & MATCHLESS_MODE ) return 0; pMover->m_dwFlag |= MVRF_NOACTION; // 액션 금지 상태로 전환. if( GetState() != OBJSTA_DMG_FLY ) { SetState( OBJSTA_DMG_ALL, OBJSTA_DMG_FLY ); pMover->SetMotion( MTI_DMGFLY, ANILOOP_LOOP, MOP_FIXED ); } break; // 전진해라! case OBJMSG_TURNMOVE: if( GetMoveState() == OBJSTA_FMOVE && (int)pMover->GetAngle() == nParam1 ) return 0; // 전진 상태이며 각도가 같으면 메시지 무효 if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans if( GetState() & OBJSTA_DMG_FLY_ALL ) // 날라가는 동작중이면 취소 return 0; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; pMover->SetAngle( (float)nParam1 ); if( pMover->IsFlyingNPC() ) pMover->SetAngleX( (float)nParam2 ); SendActMsg( OBJMSG_STOP_TURN ); SendActMsg( OBJMSG_FORWARD ); break; case OBJMSG_TURNMOVE2: if( GetMoveState() == OBJSTA_FMOVE && (int)pMover->GetAngle() == nParam1 ) return 0; // 전진 상태이며 각도가 같으면 메시지 무효 if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans if( IsAction() ) return 0; if( GetState() & OBJSTA_DMG_FLY_ALL ) // 날라가는 동작중이면 취소 return 0; if( IsActJump() ) return -1; // 점프거나 공격 상태면 메시지 무효 처리 if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; pMover->SetAngle( (float)nParam1 ); if( pMover->IsFlyingNPC() ) pMover->SetAngleX( (float)nParam2 ); SendActMsg( OBJMSG_STOP_TURN ); SendActMsg( OBJMSG_BACKWARD ); break; #ifdef __Y_INTERFACE_VER3 case OBJMSG_LFORWARD: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetMoveState() == OBJSTA_LMOVE ) return 0; // 이미 전진상태면 추가로 처리 하지 않음 if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetMoveState( OBJSTA_LMOVE ); if( IsStateFlag( OBJSTAF_WALK ) ) // 걷는모드 { pMover->SetMotion( MTI_WALK ); // 전투모드로 걷기 } else { if( pMover->SetMotion( MTI_RUN ) ) pModel->SetMotionBlending( TRUE ); } break; case OBJMSG_RFORWARD: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetMoveState() == OBJSTA_RMOVE ) return 0; // 이미 전진상태면 추가로 처리 하지 않음 if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetMoveState( OBJSTA_RMOVE ); if( IsStateFlag( OBJSTAF_WALK ) ) // 걷는모드 { pMover->SetMotion( MTI_WALK ); // 전투모드로 걷기 } else { if( pMover->SetMotion( MTI_RUN ) ) pModel->SetMotionBlending( TRUE ); } break; #endif //__Y_INTERFACE_VER3 case OBJMSG_FORWARD: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetMoveState() == OBJSTA_FMOVE ) return 0; // 이미 전진상태면 추가로 처리 하지 않음 if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetMoveState( OBJSTA_FMOVE ); if( IsStateFlag( OBJSTAF_WALK ) ) // 걷는모드 { pMover->SetMotion( MTI_WALK ); } else { if( pMover->SetMotion( MTI_RUN ) ) pModel->SetMotionBlending( TRUE ); } pMover->OnActFMove(); break; case OBJMSG_STOP_RUN: #ifdef __CLIENT if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetMoveState() == OBJSTA_STOP_RUN ) return 0; // 이미 전진상태면 추가로 처리 하지 않음 if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetMoveState( OBJSTA_STOP_RUN ); #endif break; // 후진해라! case OBJMSG_BACKWARD: if( IsActJump() ) return -1; // if jump, x if( IsActAttack() ) return -2; // 공격동작중이면 취소됨. if( IsActDamage() ) return -3; if( GetMoveState() == OBJSTA_BMOVE ) return 0; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetMoveState( OBJSTA_BMOVE ); pMover->SetMotion( MTI_WALK ); break; // 좌/우 턴 해라! case OBJMSG_LTURN: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetTurnState() == OBJSTA_LTURN ) return 0; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetTurnState( OBJSTA_LTURN ); break; case OBJMSG_RTURN: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetTurnState() == OBJSTA_RTURN ) return 0; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetTurnState( OBJSTA_RTURN ); break; case OBJMSG_STOP_TURN: if( GetTurnState() == 0 ) return 0; // 이미 턴 상태가 없다면 처리 안함 SetTurnState( 0 ); // 턴을 중지 break; // 피치를 들어올림. 비행몹의 경우만 사용. case OBJMSG_LOOKUP: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetTurnState() == OBJSTA_LOOKUP ) return 0; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetLookState( OBJSTA_LOOKUP ); break; case OBJMSG_LOOKDOWN: if( IsActJump() ) return -1; if( IsActAttack() ) return -2; if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( GetTurnState() == OBJSTA_LOOKDOWN ) return 0; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans SetLookState( OBJSTA_LOOKDOWN ); break; case OBJMSG_STOP_LOOK: if( GetLookState() == 0 ) return 0; SetLookState( 0 ); // 룩 중지 break; // 점프 case OBJMSG_JUMP: if( IsActJump() ) return 0; if( IsActAttack() ) return -2; if( IsActDamage() ) return -3; if( IsSit() ) return 0; // 리턴 0으로 해도 되나?. if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans #ifdef __CLIENT if( pMover->IsActiveMover() ) { if( pMover->m_dwReqFlag & REQ_USESKILL ) return 0; // 서버로부터 useskill응답이 오기전까진 점프해선 안됨. if( pMover->m_dwReqFlag & REQ_MOTION ) return 0; // 서버로부터 모션 응답이 오기전까지 점프 금지. } #endif // __CLIENT SendActMsg( OBJMSG_STOP_TURN ); SetJumpState( OBJSTA_SJUMP1 ); if( (GetState() & OBJSTA_COLLECT)== 0 ) pMover->SetMotion( MTI_JUMP1, ANILOOP_1PLAY ); pModel->SetMotionBlending( FALSE ); break; // 완드공격 case OBJMSG_ATK_MAGIC1: // 공격 1 { if( IsAction() ) return 0; if( IsSit() ) // 앉아있는상태였으면 해제 ResetState( OBJSTA_MOVE_ALL ); if( GetState() & OBJSTA_ATK_ALL ) return 0; // 이미 공격동작을 하고 있으면 취소. if( pMover->m_dwFlag & MVRF_NOATTACK ) return -1; // 공격금지 상태면 걍 리턴. if( pMover->IsMode( NO_ATTACK_MODE ) ) return -1; CMover* pHitObj = prj.GetMover( nParam1 ); if( IsInvalidObj( pHitObj ) ) return -1; if( pHitObj->IsDie() ) return -1; #ifdef __WORLDSERVER if( !g_eLocal.GetState( EVE_STEAL ) ) { if( pMover->IsSteal( pHitObj ) ) // pHitObj를 스틸하려하면 이공격은 무시. return -1; } #endif if( IsActDamage() ) ResetState( OBJSTA_DMG_ALL ); if( IsStateFlag( OBJSTAF_COMBAT ) == FALSE ) SendActMsg( OBJMSG_MODE_COMBAT ); SendActMsg( OBJMSG_STOP_TURN ); SendActMsg( OBJMSG_STAND ); SetState( OBJSTA_ATK_ALL, OBJSTA_ATK_MAGIC1 ); pMover->SetMotion( MTI_ATK1, ANILOOP_1PLAY ); // 완드동작이 없으므로 공격동작으로 대신함. pHitObj->SetJJim( pMover ); pMover->m_nAtkCnt = 1; // 카운트 시작. pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. } break; // 레인지공격 case OBJMSG_ATK_RANGE1: // 공격 1 { if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOATTACK ) return -1; // 공격금지 상태면 걍 리턴. if( pMover->IsMode( NO_ATTACK_MODE ) ) return -1; if( IsSit() ) // 앉아있는상태였으면 해제 ResetState( OBJSTA_MOVE_ALL ); if( GetState() & OBJSTA_ATK_ALL ) return 0; // 이미 공격동작을 하고 있으면 취소. CMover* pHitObj = prj.GetMover( nParam1 ); if( IsValidObj( (CObj*)pHitObj ) == FALSE ) return -1; if( pHitObj->IsDie() ) return -1; m_idTarget = (DWORD)nParam1; // 공격 타겟. #ifdef __WORLDSERVER if( !g_eLocal.GetState( EVE_STEAL ) ) { if( pMover->IsSteal( pHitObj ) ) // pHitObj를 스틸하려하면 이공격은 무시. return -1; } #endif if( GetDmgState() == OBJSTA_DMG ) // 피격 중 공격명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -1; if( IsStateFlag( OBJSTAF_COMBAT ) == FALSE ) SendActMsg( OBJMSG_MODE_COMBAT ); int nUseMotion = nParam2; // SendActMsg( OBJMSG_STOP_TURN ); // SendActMsg( OBJMSG_STAND ); SetState( OBJSTA_ATK_ALL, OBJSTA_ATK_RANGE1 ); pMover->SetMotion( nUseMotion, ANILOOP_1PLAY ); // 완드동작이 없으므로 공격동작으로 대신함. pHitObj->SetJJim( pMover ); // 공격이 시작되면 타겟에다가 내가 찜했다는걸 표시. pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. pMover->m_nAtkCnt = 1; // 카운트 시작. } break; // 공격 - 리턴값 -2는 클라로 부터 받은 명령을 완전 무시한다. case OBJMSG_ATK1: // 공격 1 case OBJMSG_ATK2: // 공격 2 case OBJMSG_ATK3: // 공격 3 case OBJMSG_ATK4: // 공격 4 { if( IsAction() ) return 0; if( pMover->m_dwFlag & MVRF_NOATTACK ) return -2; // 공격금지 상태면 걍 리턴. if( pMover->IsMode( NO_ATTACK_MODE ) ) return -2; #ifdef __CLIENT if( pMover->IsActiveMover() ) #endif { // 기본은 오른손 검사( 완드용 ) CItemElem* pItemElem = pMover->GetWeaponItem(); if( pItemElem && (pItemElem->GetProp()->dwItemKind3 == IK3_WAND || pItemElem->GetProp()->dwItemKind3 == IK3_BOW ) ) return -2; } CMover* pHitObj = prj.GetMover( nParam1 ); if( IsValidObj( (CObj*)pHitObj ) == FALSE ) return( -1 ); #ifdef __XUZHU if( pMover->IsPlayer() ) { int a = 0; } #endif // xuzhu m_idTarget = (DWORD)nParam1; // 공격 타겟. #ifdef __WORLDSERVER if( !g_eLocal.GetState( EVE_STEAL ) ) { if( pMover->IsSteal( pHitObj ) ) // pHitObj를 스틸하려하면 이공격은 무시. return -2; } #endif if( pHitObj->m_pActMover->IsDie() ) return( -1 ); if( GetState() & OBJSTA_ATK_ALL ) return( 0 ); // 이미 공격중이면 리턴 if( IsSit() ) // 앉아있는상태였으면 해제 ResetState( OBJSTA_MOVE_ALL ); if( GetDmgState() == OBJSTA_DMG ) // 피격 중 공격명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( IsStateFlag( OBJSTAF_COMBAT ) == FALSE ) SendActMsg( OBJMSG_MODE_COMBAT ); SendActMsg( OBJMSG_STOP_TURN ); // 공격할땐 턴을 정지시킴 SendActMsg( OBJMSG_STAND ); DWORD dwOption = MOP_SWDFORCE | MOP_NO_TRANS; #ifdef __XSLOW1018 int nMin, nTemp; pMover->GetHitMinMax( &nMin, &nTemp ); if( dwMsg == OBJMSG_ATK3 || dwMsg == OBJMSG_ATK4 ) if( pMover->GetLevel() >= 12 && pHitObj->GetHitPoint() < (int)(nMin * 1.5f) ) dwOption |= MOP_HITSLOW; #endif // xSlow1018 if( pMover->IsPlayer() ) pMover->m_fAniSpeed = pMover->GetAttackSpeed(); switch( dwMsg ) { case OBJMSG_ATK1: SetState( OBJSTA_ATK_ALL, OBJSTA_ATK1 ); pMover->SetMotion( MTI_ATK1, ANILOOP_1PLAY, dwOption ); // 최초 메시지 입력시 동작 설정 break; case OBJMSG_ATK2: SetState( OBJSTA_ATK_ALL, OBJSTA_ATK2 ); pMover->SetMotion( MTI_ATK2, ANILOOP_1PLAY, dwOption ); // 최초 메시지 입력시 동작 설정 break; case OBJMSG_ATK3: SetState( OBJSTA_ATK_ALL, OBJSTA_ATK3 ); pMover->SetMotion( MTI_ATK3, ANILOOP_1PLAY, dwOption ); // 최초 메시지 입력시 동작 설정 break; case OBJMSG_ATK4: SetState( OBJSTA_ATK_ALL, OBJSTA_ATK4 ); pMover->SetMotion( MTI_ATK4, ANILOOP_1PLAY, dwOption ); // 최초 메시지 입력시 동작 설정 break; } pMover->SetAngle( GetDegree( pHitObj->GetPos(), m_pMover->GetPos() ) ); pHitObj->SetJJim( pMover ); pMover->m_nAtkCnt = 1; // 카운트 시작. pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. m_objidHit = (OBJID)nParam1; // 타겟의 아이디. m_dwAtkFlags = (DWORD)LOWORD( (DWORD)nParam3 ); #ifdef __WORLDSERVER if( m_dwAtkFlags == 0 ) { if( pMover->GetAttackResult( pHitObj, dwOption ) ) // 공격 성공률을 얻는다. m_dwAtkFlags = AF_GENERIC; else m_dwAtkFlags = AF_MISS; } #else m_dwAtkFlags = AF_GENERIC; // 구조가 좀 이상한데. 클라에서는 명중판정을 하지 않으므로 무조건 평타명중으로 인정. #endif return( (int)m_dwAtkFlags ); break; } // 몬스터들의 특수공격. case OBJMSG_SP_ATK1: case OBJMSG_SP_ATK2: { CMover* pHitObj = prj.GetMover( nParam1 ); //nParam2; // 특수공격에 사용할 무기. 보통은 몬스터이므로 가상아이템이 들어온다. int nUseMotion = nParam3; // 사용할 모션. if( IsValidObj( (CObj*)pHitObj ) == FALSE ) return( -1 ); if( pHitObj->m_pActMover->IsDie() ) return( -1 ); if( GetState() & OBJSTA_ATK_ALL ) return( 0 ); // 이미 공격중이면 리턴 if( pMover->m_dwFlag & MVRF_NOATTACK ) return 0; // 공격금지 상태면 걍 리턴. if( GetDmgState() == OBJSTA_DMG ) // 피격 중 공격명령이면 피격 상태를 클리어 시킨다. ResetState( OBJSTA_DMG_ALL ); else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소 return -3; if( IsStateFlag( OBJSTAF_COMBAT ) == FALSE ) SendActMsg( OBJMSG_MODE_COMBAT ); SendActMsg( OBJMSG_STOP_TURN ); // 공격할땐 턴을 정지시킴 SendActMsg( OBJMSG_STAND ); DWORD dwOption = MOP_SWDFORCE /*| MOP_NO_TRANS*/; // 몬스터니까 공격동작도 모션트랜지션 되게 해봤다. SetState( OBJSTA_ATK_ALL, OBJSTA_SP_ATK1 ); pMover->SetMotion( nUseMotion, ANILOOP_1PLAY, dwOption ); // 최초 메시지 입력시 동작 설정 pMover->SetAngle( GetDegree( pHitObj->GetPos(), m_pMover->GetPos() ) ); pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. return 1; } break; // 전사들의 근접 전투스킬류 case OBJMSG_MELEESKILL: { if( IsAction() ) return -2; if( pMover->m_dwFlag & MVRF_NOATTACK ) return -2; // 공격금지 상태면 걍 리턴. CMover* pHitObj = prj.GetMover( nParam2 ); if( IsValidObj( pHitObj ) == FALSE ) return -2; #ifdef __WORLDSERVER if( GetState() & OBJSTA_ATK_RANGE1 ) ResetState( OBJSTA_ATK_RANGE1 ); if( GetState() & OBJSTA_ATK_ALL ) return -2; // 이미 공격중이면 리턴. 서버에선 씹히지 않게 하자. pMover->m_dwMotion = -1; // 나머지 경우는 간단하게 생각하기 위해 모두 클리어 시키고 스킬만 실행하자. ClearState(); // 상태 클리어하고 다시 맞춤,. #else // 이리저리 해보니 액티브 무버건 아니건 서버에서 신호오면 바로 시작하는게 좋을거 같애서 이렇게 함. pMover->m_dwMotion = -1; ClearState(); // 상태 클리어하고 다시 맞춤,. #endif SetState( OBJSTA_ATK_ALL, OBJSTA_ATK_MELEESKILL ); // 근접전투스킬상태 설정. DWORD dwMotion = (DWORD)nParam1; int nLoop = ANILOOP_1PLAY; int nSkill = pMover->GetActParam( 0 ); if( nSkill == SI_BLD_DOUBLESW_SILENTSTRIKE || nSkill == SI_ACR_YOYO_COUNTER ) nLoop = ANILOOP_CONT; #ifdef __CLIENT if( pMover->HasBuffByIk3( IK3_TEXT_DISGUISE ) ) dwMotion = MTI_ATK1; #endif pMover->SetMotion( dwMotion, nLoop, MOP_SWDFORCE | MOP_NO_TRANS | MOP_FIXED ); // 해당 동작애니 시작. pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. m_nMotionHitCount = 0; break; } // 마법사들의 마법스킬류. case OBJMSG_MAGICSKILL: case OBJMSG_MAGICCASTING: { if( IsAction() ) return -2; if( pMover->m_dwFlag & MVRF_NOATTACK ) return -2; // 공격금지 상태면 걍 리턴. CMover* pHitObj = prj.GetMover( nParam2 ); if( IsValidObj( pHitObj ) == FALSE ) return -2; #ifdef __WORLDSERVER if( GetState() & OBJSTA_ATK_ALL ) return -2; // 이미 공격중이면 리턴 #endif pMover->m_dwMotion = -1; ClearState(); // 상태 클리어하고 다시 맞춤. m_nCastingTime = nParam3 * 4; // ProcessAction은 서버/클라 호출 회수 동일하므로, SEC1 사용이 적당하지 않다. #if __VER >= 10 // __LEGEND // 9차 전승시스템 Neuz, World, Trans m_dwCastingEndTick = (DWORD)( GetTickCount() + nParam3 * 66.66F ); m_nCastingTick = (int)( nParam3 * 66.66F ); m_nCastingSKillID = nParam4; #endif //__LEGEND // 9차 전승시스템 Neuz, World, Trans if( m_nCastingTime > 0 ) // 캐스팅 타임이 있을때만... { m_nCount = 0; // 전체 캐스팅 타임은 동작1+동작2의 합이어야 하므로 여기서 카운터를 초기화 한다. SetState( OBJSTA_ATK_ALL, OBJSTA_ATK_CASTING1 ); // 캐스팅부터 시작 -> 발사모션. } else SetState( OBJSTA_ATK_ALL, OBJSTA_ATK_MAGICSKILL ); // 발사모션만. #ifdef __CLIENT if( dwMsg == OBJMSG_MAGICSKILL && pMover->HasBuffByIk3( IK3_TEXT_DISGUISE ) ) nParam1 = MTI_ATK1; #endif pMover->SetMotion( nParam1, ANILOOP_1PLAY, MOP_SWDFORCE | MOP_NO_TRANS | MOP_FIXED ); // 해당 동작애니 시작. pMover->OnAttackStart( pHitObj, dwMsg ); // 공격시작 핸들러. m_nMotionHitCount = 0; break; } //-------------------- 맞았다. case OBJMSG_DAMAGE: case OBJMSG_DAMAGE_FORCE: // 강공격에 맞았다. 날아감. { CMover* pAttacker = PreProcessDamage( pMover, (OBJID)nParam2, nParam4, nParam5 ); if( pAttacker == NULL ) return 0; if( dwMsg == OBJMSG_DAMAGE_FORCE ) // 강공격으로 들어왔을때 if( pMover->CanFlyByAttack() == FALSE ) // 날아가지 못하는 상태면. dwMsg = OBJMSG_DAMAGE; // 일반 데미지로 바꿈. // 실제 가격한 데미지를 리턴함. int nDamage = _ProcessMsgDmg( dwMsg, pAttacker, (DWORD)nParam1, nParam3, nParam4, nParam5 ); #if __VER >= 10 // __METEONYKER_0608 #ifdef __WORLDSERVER #if __VER >= 12 // __NEW_ITEMCREATEMON_SERVER if( pAttacker->IsPlayer() && CCreateMonster::GetInstance()->IsAttackAble( static_cast<CUser*>(pAttacker), pMover ) ) #endif // __NEW_ITEMCREATEMON_SERVER #endif // __WORLDSERVER pMover->PostAIMsg( AIMSG_DAMAGE, pAttacker->GetId(), nDamage ); #endif // __METEONYKER_0608 return nDamage; } break; // HP가 0이 된 순간 호출 case OBJMSG_DIE: { if( IsSit() ) // 앉아있는상태였으면 해제 ResetState( OBJSTA_MOVE_ALL ); ClearState(); // 죽을땐 다른 동작 하고 있던거 다 클리어 시켜버리자. m_vDelta.x = m_vDelta.z = 0; // 죽었으면 델타값 클리어. pMover->RemoveInvisible(); #ifdef __WORLDSERVER pMover->PostAIMsg( AIMSG_DIE, nParam2 ); #endif CMover *pAttacker = (CMover *)nParam2; if( pAttacker ) { if( pMover->IsPlayer() && pAttacker->IsPlayer() ) // 죽은놈과 죽인놈이 플레이어고 { #ifdef __WORLDSERVER if( pMover->m_nDuel == 1 && pMover->m_idDuelOther == pAttacker->GetId() ) // 둘이 듀얼중이었으면 { pMover->ClearDuel(); pAttacker->ClearDuel(); ((CUser*)pMover)->AddSetDuel( pMover ); ((CUser*)pAttacker)->AddSetDuel( pAttacker ); } else if( pMover->m_nDuel == 2 && pMover->m_idDuelParty == pAttacker->m_idparty ) { pMover->m_nDuelState = 300; CMover *pMember; CParty* pParty = g_PartyMng.GetParty( pMover->m_idparty ); if( pParty ) { int i; for( i = 0; i < pParty->m_nSizeofMember; i ++ ) { pMember = (CMover *)g_UserMng.GetUserByPlayerID( pParty->m_aMember[i].m_uPlayerId ); if( IsValidObj( pMember ) ) ((CUser*)pMember)->AddSetDuel( pMover ); } } CParty* pParty2 = g_PartyMng.GetParty( pMover->m_idDuelParty ); if( pParty2 ) { int i; for( i = 0; i < pParty2->m_nSizeofMember; i ++ ) { pMember = (CMover *)g_UserMng.GetUserByPlayerID( pParty2->m_aMember[i].m_uPlayerId ); if( IsValidObj( pMember ) ) ((CUser*)pMember)->AddSetDuel( pMover ); } } } #endif // __WORLDSERVER } if( pAttacker->IsNPC() ) // 공격자가 몹. { // 날때린몹의 어태커가 나일경우는 죽기전에 클리어시켜준다. if( pAttacker->m_idAttacker == pMover->GetId() ) // 공격한몹을 친사람이 나일경우는 스틸체크 해제. { pAttacker->m_idAttacker = NULL_ID; pAttacker->m_idTargeter = NULL_ID; } } } switch( nParam1 ) { #ifdef __BS_DEATH_ACTION case OBJMSG_DAMAGE: case OBJMSG_DAMAGE_FORCE: { int rAngle = 0; int rPower = 0; int nCase = rand() % 6; if( nCase < 3 ) { rAngle = -2; rPower = 10 + rand() % 50; } else if( nCase < 4 ) { rAngle = 10; rPower = 10 + rand() % 50; } else if( nCase < 5 ) { rAngle = 50; rPower = 10 + rand() % 50; } else { rAngle = rand() % 30; rPower = rand() % 200; } if( OBJMSG_DAMAGE_FORCE == nParam1 ) rPower += 50; CMover *pAttacker = (CMover *)nParam2; SetState( OBJSTA_DMG_ALL, OBJSTA_DMG_FLY ); pMover->SetMotion( MTI_DMGFLY, ANILOOP_CONT ); if( pAttacker ) { float faddPower = rPower * 0.01f; float faddAngle = (float)( rAngle ); DoDamageFly( pAttacker->GetAngle(), 100.0f + faddAngle, 0.05f + faddPower ); // 어태커가 보는쪽으로 날려보냄. } } break; #else case OBJMSG_DAMAGE_FORCE: // 강 공격으로 죽었다면 날아가서 죽기 { CMover *pAttacker = (CMover *)nParam2; SetState( OBJSTA_DMG_ALL, OBJSTA_DMG_FLY ); pMover->SetMotion( MTI_DMGFLY, ANILOOP_CONT ); if( pAttacker ) DoDamageFly( pAttacker->GetAngle(), 145.0f, 0.25f ); // 어태커가 보는쪽으로 날려보냄. } break; case OBJMSG_DAMAGE: // 걍 일반 데미지로 죽었다면 그냥 쓰러져 죽기 #endif default: SetState( OBJSTA_DMG_ALL, OBJSTA_DEAD ); pMover->SetMotion( MTI_DIE1, ANILOOP_CONT ); break; } if( !pMover->IsPlayer() ) // 몬스터일 경우. { #ifdef __WORLDSERVER m_nDeadCnt = 60*3; // 디폴트 - 3초 후에 없어짐. MoverProp *pProp = pMover->GetProp(); if( pProp ) { if( pProp->dwSourceMaterial != NULL_ID || pProp->dwClass == RANK_MATERIAL ) // 자원 몹이면.. { if( pProp->dwHoldingTime == NULL_ID ) Error( "%s 의 MoverProp::dwHoldingTime 값이 -1", pMover->GetName() ); m_nDeadCnt = (int)(60.0f * (pProp->dwHoldingTime / 1000.0f)); if( pProp->dwHoldingTime < 10000 ) // 10초 이하일때 Error( "dwHoldingTime : %d %s", pProp->dwHoldingTime, pMover->GetName() ); pMover->m_nCollectOwnCnt = PROCESS_COUNT * 40; CMover *pAttacker = (CMover *)nParam2; if( pAttacker ) pMover->m_idCollecter = pAttacker->GetId(); // 공격자가 소유자가 된다. } { if( pProp->dwSourceMaterial == NULL_ID && pProp->dwClass == RANK_MATERIAL ) // 자원몹인데 자원값이 없는경우 Error( "OBJMSG_DIE : %s %d", pMover->GetName(), pProp->dwSourceMaterial ); if( pProp->dwSourceMaterial != NULL_ID && pProp->dwClass != RANK_MATERIAL ) // 자원몹이 아닌데 자원값이 있는경우. Error( "OBJMSG_DIE 2 : %s %d", pMover->GetName(), pProp->dwSourceMaterial ); } } #endif // WorldServer } break; } case OBJMSG_APPEAR: SetState( OBJSTA_ACTION_ALL, OBJSTA_APPEAR ); pMover->SetMotion( MTI_APPEAR2, ANILOOP_1PLAY, MOP_FIXED | MOP_NO_TRANS ); break; //---- 모드전환 ------------------------ case OBJMSG_MODE_COMBAT: if( GetStateFlag() & OBJSTAF_COMBAT ) return 0; // 이미 전투모드면 리턴 if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; if( IsSit() ) return 0; if( IsAction() ) return 0; AddStateFlag( OBJSTAF_COMBAT ); // 전투모드로 서라가 아니고 전투모드로 바꿔라기땜에 서다 명령은 발생시키지 않는다. pMover->m_dwMotion = -1; // 같은 모션을 하라고 한거라 모션이 안바뀌므로 이렇게... pMover->SetMotion( MTI_STAND ); break; case OBJMSG_MODE_PEACE: if( (GetStateFlag() & OBJSTAF_COMBAT) == 0 ) return 0; if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; if( IsSit() ) return 0; if( IsAction() ) return 0; RemoveStateFlag( OBJSTAF_COMBAT ); pMover->m_dwMotion = -1; pMover->SetMotion( MTI_STAND ); break; case OBJMSG_MODE_WALK: if( IsSit() ) return 0; if( IsAction() ) return 0; if( GetStateFlag() & OBJSTAF_WALK ) return 0; // 이미 걷기모드면 리턴 AddStateFlag( OBJSTAF_WALK ); break; case OBJMSG_MODE_RUN: if( IsSit() ) return 0; if( IsAction() ) return 0; if( (GetStateFlag() & OBJSTAF_WALK) == 0 ) return 0; // RemoveStateFlag( OBJSTAF_WALK ); break; case OBJMSG_MODE_FLY: { if( nParam3 == 0 ) { if( IsSit() ) return 0; if( IsAction() ) return 0; if( IsActAttack() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans { CWorld* pWorld = pMover->GetWorld(); if( pWorld ) { int nAttr = pMover->GetWorld()->GetHeightAttribute( pMover->GetPos().x, pMover->GetPos().z ); // 이동할 위치의 속성 읽음. if( nAttr == HATTR_NOFLY ) // 비행 금지 지역에서 타려고 하면 못탄다. return 0; } } } AddStateFlag( OBJSTAF_FLY ); ItemProp *pItemProp = prj.GetItemProp( nParam1 ); // 빗자루 프로퍼티. if( pItemProp ) { if( pMover->m_nFuel == -1 ) // 초기값이면 pMover->m_nFuel = (int)pItemProp->dwFFuelReMax; // 빗자루 최대 연료량을 세팅. // -1일때만 세팅해야지 연료를 반쯤 쓰다가 빗자루를 바꿔도 새로 세팅 되지 않는다. } #ifndef __JEFF_9_20 #ifdef __WORLDSERVER if( pMover->IsPlayer() ) { ((CUser*)pMover)->SetFlyTimeOn(); } #endif // __WORLDSERVER #endif // __JEFF_9_20 ClearState(); #ifdef __CLIENT if( m_pMover == CMover::GetActiveMover() ) { m_pMover->GetWorld()->SetObjFocus( NULL ); // 비행직전에 기존타겟팅을 클리어해준다. g_Neuz.m_camera.Unlock(); g_WndMng.m_pWndTaskBar->OnCancelSkill(); // 비행직전엔 스킬바 사용 취소. } #endif CModel* pModel = prj.m_modelMng.LoadModel( D3DDEVICE, OT_ITEM, (DWORD) nParam1 ); #if __VER >= 14 // __WING_ITEM CModelObject* pModelObject = (CModelObject*)pModel; if( pModelObject->m_pBone ) { CString strMotion = pModelObject->GetMotionFileName( _T("stand") ); assert( strMotion != _T("") ); pModelObject->LoadMotion( strMotion ); } #endif // __WING_ITEM m_pMover->SetRide( pModel, (DWORD) nParam1 ); break; } case OBJMSG_MOTION: // 단순 모션 플레이 { if( IsSit() ) return 0; if( IsAction() ) return 0; if( IsActJump() ) return 0; if( IsActAttack() ) return 0; if( IsActDamage() ) return 0; if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴. #if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0; #endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans AddStateFlag( OBJSTAF_ETC ); // 단순 모션 플레이 상태 m_nMotionEx = nParam1; // 모션 인덱스 int nPlayMode = nParam2; // 루핑 모드. if( m_nMotionEx != -1 ) pMover->SetMotion( m_nMotionEx, nPlayMode, MOP_FIXED/* | MOP_SWDFORCE*/ ); pMover->RemoveInvisible(); } break; // 일반 액션. case OBJMSG_RESURRECTION: // 부활. ClearState(); SetState( OBJSTA_DMG_ALL, OBJSTA_RESURRECTION ); pMover->SetMotion( MTI_ASS_RESURRECTION, ANILOOP_1PLAY, MOP_FIXED ); break; #if defined(_DEBUG) && defined(__CLIENT) case OBJMSG_TEMP: { for( int i=0; i < 1; i ++ ) { CMover* pObj = new CMover; D3DXVECTOR3 vPos = pMover->GetPos(); pObj->SetPos( vPos ); pObj->SetIndex( g_Neuz.m_pd3dDevice, MI_AIBATT1, TRUE ); pObj->SetMotion( 0 ); g_WorldMng.Get()->AddObj( pObj, TRUE ); } } break; case OBJMSG_TEMP2: // 디버깅용 공격동작만 볼때. if( CMover::GetActiveMover()->IsAuthHigher( AUTH_GAMEMASTER ) ) // 영자 계정일때 { CObj *pObj = pMover->GetWorld()->GetObjFocus(); g_DPlay.SendCorrReq( pObj ); g_DPlay.SendError( FE_GENERAL, 0 ); } break; case OBJMSG_TEMP3: { #ifdef __XUZHU g_DPlay.SendError( 0, 0 ); #endif } break; #endif // defined(_DEBUG) && defined(__CLIENT) } return 1; }