void ZGameClient::OnClanAnswerJoinAgreement(const MUID& uidClanAdmin, const char* szJoiner, const bool bAnswer) { if (!IsWaitingClanJoiningAgree()) return; if (ZGetGameClient()->GetPlayerUID() != uidClanAdmin) return; if (bAnswer) { if (IsUpperClanGrade(ZGetMyInfo()->GetClanGrade(), MCG_ADMIN)) { char szClanName[256]; sprintf(szClanName, ZGetMyInfo()->GetClanName()); ZPostRequestAgreedJoinClan(uidClanAdmin, szClanName, (char*)szJoiner); } } else { // 동의창 지워줘야 한다. ShowClanJoinerAgreeWaitFrame(false); m_uidRequestPlayer = MUID(0,0); ZApplication::GetGameInterface()->ShowMessage( MSG_CLAN_JOINER_AGREEMENT_REJECT ); } }
void ZGameClient::OnClanUpdateCharClanInfo(void* pBlob) { int nCount = MGetBlobArrayCount(pBlob); if (nCount != 1) return; MTD_CharClanInfo* pClanInfoNode = (MTD_CharClanInfo*)MGetBlobArrayElement(pBlob, 0); ZGetMyInfo()->SetClanInfo(pClanInfoNode->szClanName, pClanInfoNode->nGrade); ZGetMyInfo()->Serialize(); // 클랜정보가 변경되었다. if (ZGetGameClient()->IsConnected()) ZPostRequestClanMemberList(ZGetGameClient()->GetPlayerUID()); ZPlayerListBox *pList = GetProperClanListOutput(); if(pList) { if( !ZGetMyInfo()->IsClanJoined() ) { ZPlayerListBox* pWidget = (ZPlayerListBox*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget("LobbyChannelPlayerList"); if(pWidget) { pWidget->RemoveAll(); } } pList->RefreshUI(); } }
void ZShopEquipInterface::DrawCharInfoText() { // 현재 내 상태로 초기화 DrawCharInfoText(NULL, 0, ZGetMyInfo()->GetItemList()->GetEquipedTotalWeight(), ZGetMyInfo()->GetItemList()->GetMaxWeight(), ZGetMyInfo()->GetHP(), ZGetMyInfo()->GetAP(), 0, 0); }
void ZGameClient::OnClanAskSponsorAgreement(const int nRequestID, const char* szClanName, MUID& uidMasterObject, const char* szMasterName) { // 받을수 없는 상황이면 무시 if(!ZGetGameInterface()->IsReadyToPropose()) return; m_nRequestID = nRequestID; m_uidRequestPlayer = uidMasterObject; ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource(); MTextArea* pTextEdit = (MTextArea*)pResource->FindWidget("ClanSponsorAgreementConfirm_Textarea"); if (pTextEdit) { char szTemp[256]; ZTransMsg(szTemp, MSG_CLAN_SPONSOR_AGREEMENT_LABEL, 3, szMasterName, ZGetMyInfo()->GetCharName(), szClanName); pTextEdit->SetText(szTemp); } MWidget* pWidget = pResource->FindWidget("ClanSponsorAgreementConfirm"); if(pWidget!=NULL) { static ZCOUNTDOWN countDown = {30,"ClanSponsorAgreementConfirm_Remain", "ClanSponsorAgreementConfirm",OnClanAskSponsorAgreement_OnExpire}; countDown.nSeconds=30; // static 이므로 재설정 ZApplication::GetTimer()->SetTimerEvent(0, &OnTimer_CountDown, &countDown, true); pWidget->Show(true, true); } }
void ZGameClient::AnswerJoinerAgreement(bool bAnswer) { char szCharName[256]; sprintf(szCharName, ZGetMyInfo()->GetCharName()); ZPostAnswerJoinAgreement(m_uidRequestPlayer, szCharName, bAnswer); }
void ZGameClient::RequestCreateClan(char* szClanName, char** ppMemberCharNames) { // 클랜에 이미 가입되어 있으면 안된다. if (ZGetMyInfo()->IsClanJoined()) { ZChatOutput( ZMsg(MSG_CLAN_JOINED_ALREADY), ZChat::CMT_SYSTEM ); return; } // 로비에서만 신청할 수 있다. if (ZApplication::GetGameInterface()->GetState() != GUNZ_LOBBY) { ZChatOutput( ZMsg(MSG_MUST_EXECUTE_LOBBY) ); return; } m_nRequestID++; memset(&ClanSponsorsTicket, 0, sizeof(Clan_Sponsors_Ticket)); ClanSponsorsTicket.nRequestID = m_nRequestID; strcpy(ClanSponsorsTicket.szClanName, szClanName); for (int i = 0; i < CLAN_SPONSORS_COUNT; i++) { strcpy(ClanSponsorsTicket.szSponsorCharName[i], ppMemberCharNames[i]); } ZPostRequestCreateClan(GetPlayerUID(), m_nRequestID, szClanName, ppMemberCharNames, CLAN_SPONSORS_COUNT); }
void ZCharacterView::SetParts(MMatchCharItemParts nParts, unsigned int nItemID) { MMatchItemDesc* pItemDesc = MGetMatchItemDescMgr()->GetItemDesc(nItemID); if (pItemDesc == NULL) { if (nItemID != 0) return; } else { if (IsSuitableItemSlot(pItemDesc->m_nSlot, nParts) == false) return; if (pItemDesc->m_nResSex != -1) { if (pItemDesc->m_nResSex != int(ZGetMyInfo()->GetSex())) return; } } m_ItemSlots[nParts].m_nItemID = nItemID; if (nParts == MMCIP_PRIMARY) { ZChangeCharWeaponMesh(m_pTVisualMesh.GetVMesh(), m_ItemSlots[MMCIP_PRIMARY].m_nItemID); } else { u32 itemids[MMCIP_END]; for (int i = 0; i < MMCIP_END; i++) itemids[i] = m_ItemSlots[i].m_nItemID; ZChangeCharParts(m_pTVisualMesh.GetVMesh(), m_Info.nSex, m_Info.nHair, m_Info.nFace, itemids); } if( Enable_Cloth ) m_pTVisualMesh.m_pVisualMesh->ChangeChestCloth(0.9f,1); }
bool ZSurvival::OnSectorBonus(MCommand* pCommand) { MUID uidPlayer; unsigned long int nExpValue = 0; unsigned long int nAddedBP = 0; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&nExpValue, 1, MPT_UINT); pCommand->GetParameter(&nAddedBP, 2, MPT_UINT); int nAddedXP = GetExpFromTransData(nExpValue); int nExpPercent = GetExpPercentFromTransData(nExpValue); if(ZGetCharacterManager()->Find(uidPlayer) == ZGetGame()->m_pMyCharacter) { m_nRewardXP += nAddedXP; m_nRewardBP += nAddedBP; //ZGetScreenEffectManager()->AddExpEffect(nAddedXP); // 획득 경험치 표시 없애기 ZGetMyInfo()->SetLevelPercent(nExpPercent); ZGetScreenEffectManager()->SetGaugeExpFromMyInfo(); } return true; }
void ZRoomListBox::RequestSelStageJoin() { MUID uidChar = ZGetGameClient()->GetPlayerUID(); if (GetSelRoomUID() != MUID(0,0)) { if ( (ZGetMyInfo()->IsAdminGrade() == false) && (m_pMapInfo[m_Selection].bPrivate) ) { char szStageName[SMI_ROOMNAME_LENGTH] = ""; MUID uidStage = MUID(0,0); const sMapInfo* pSelRoomInfo = GetSelMapInfo(); if (pSelRoomInfo != NULL) { strcpy_safe(szStageName, pSelRoomInfo->room_name); uidStage = pSelRoomInfo->uidStage; } SetPrivateStageUID(uidStage); // 비밀방 ZApplication::GetGameInterface()->ShowPrivateStageJoinFrame(szStageName); } else { ZPostRequestStageJoin(uidChar, GetSelRoomUID()); // 공개방 ZApplication::GetGameInterface()->EnableLobbyInterface(false); } } }
void ZGameClient::OnClanMemberConnected(const char* szMember) { if (!strcmp(ZGetMyInfo()->GetCharName(), szMember)) return; char szMsg[256]; // ZTransMsg(szMsg, MSG_CLAN_MEMBER_CONNECTED, 1, szMember); ZTransMsg(szMsg, MSG_CLAN_MEMBER_CONNECTED, 1, szMember); ZChatOutput(MCOLOR(ZCOLOR_CHAT_CLANMSG), szMsg); }
void ZCombatQuestScreen::OnDraw(CCDrawContext* pDC) { ///////////////////////////////////////////// list<ZCharacter*> SortedCharacterList; for(ZCharacterManager::iterator itor = ZGetGame()->m_CharacterManager.begin(); itor != ZGetGame()->m_CharacterManager.end(); ++itor) { ZCharacter* pCharacter = (*itor).second; if (!pCharacter->IsVisible()) continue; SortedCharacterList.push_back(pCharacter); } SortedCharacterList.sort(CompareQuestScreenCharacter); /* int cnt = 0; for (list<ZCharacter*>::iterator itor = SortedCharacterList.begin(); itor != SortedCharacterList.end(); ++itor) { DrawPlayer(pDC, cnt, (*itor)); cnt++; } */ if ( ZGetQuest()->IsRoundClear()) { // 운영자 hide는 제외 bool bEventHide = false; if (ZGetMyInfo()->IsAdminGrade()) { CCMatchObjCache* pCache = ZGetGameClient()->FindObjCache(ZGetMyUID()); if (pCache && pCache->CheckFlag(CCTD_PlayerFlags_AdminHide)) bEventHide = true; } DWORD dwSec; DWORD dwCurrTime = timeGetTime(); if ( ZGetQuest()->GetRemainedTime() < dwCurrTime) dwSec = 0; else dwSec = (ZGetQuest()->GetRemainedTime() - dwCurrTime) / 1000; char szSec[ 10]; sprintf( szSec, "%d", dwSec); char szMsg[ 128]; ZTransMsg( szMsg, MSG_GAME_NEXT_N_MIN_AFTER, 1, szSec); pDC->SetFont( CCFontManager::Get("FONTa10_O2Wht")); pDC->SetColor(sColor(0xFFFFFFFF)); if (!bEventHide) TextRelative(pDC,400.f/800.f,500.f/600.f, szMsg, true); } }
void ZCharacterView::SetSelectMyCharacter() { ZMyInfo* pmi = ZGetMyInfo(); ZMyItemList* pil = ZGetMyInfo()->GetItemList(); u32 nWeaponID = GetVisualWeaponID(pil->GetEquipedItemID(MMCIP_MELEE), pil->GetEquipedItemID(MMCIP_PRIMARY), pil->GetEquipedItemID(MMCIP_SECONDARY), pil->GetEquipedItemID(MMCIP_CUSTOM1), pil->GetEquipedItemID(MMCIP_CUSTOM2)); u32 nItemids[MMCIP_END]; if(pmi) { for (int i = 0; i < MMCIP_END; i++) { nItemids[i] = pil->GetEquipedItemID(MMatchCharItemParts(i)); } InitCharParts(pmi->GetSex(), pmi->GetHair(), pmi->GetFace(), nItemids); } }
int ZShopEquipInterface::_CheckRestrictBringAccountItem() { // Return -1 : Error // 0 : No restriction // 1 : Sex restricted // 2 : Level restricted ZShopEquipListItem* pListItem = GetListCurSelItem("AccountItemList"); if (pListItem == NULL) return -1; if (pListItem->GetItemData()->GetHandleBringAccount()) { int nAIID = pListItem->GetItemData()->GetHandleBringAccount()->GetAIID(); ZMyItemNode* pMyItemNode = ZGetMyInfo()->GetItemList()->GetAccountItemByAIID(nAIID); if (!pMyItemNode) return 0; unsigned long nItemID = pMyItemNode->GetItemID(); MMatchItemDesc* pItemDesc = MGetMatchItemDescMgr()->GetItemDesc(nItemID); if (!pItemDesc) { if( ZGetGambleItemDefineMgr().GetGambleItemDefine(nItemID) ) { return 0; // 겜블 아이템은 존재만 확인하면 된다. } else { return -1; } } if ((pItemDesc->m_nResSex.Ref() != -1) && (ZGetMyInfo()->GetSex() != pItemDesc->m_nResSex.Ref())) return 1; // Sex restricted if (ZGetMyInfo()->GetLevel() < pItemDesc->m_nResLevel.Ref()) return 2; // Level restricted } return 0; // No Restriction }
bool ZChatCmdManager::DoCommand(char* szLine, ZChatCmdFlag nCurrFlag, unsigned long nInputFlag) { if ((szLine == 0) || (szLine[0] == 0)) return false; ZChatCmdArgvInfo ai; memset(&ai, 0, sizeof(ZChatCmdArgvInfo)); ZChatCmd* pCmd = MakeArgv(szLine, &ai); if (pCmd != NULL) { // 관리자 명령어일때 처리 if (pCmd->GetFlag() & CCF_ADMIN) { if ((nInputFlag & CIF_ADMIN) == false) return false; } // 테스트 명령어일때 처리 else if (pCmd->GetFlag() & CCF_TEST) { if ((nInputFlag & CIF_TESTER) == false) return false; } // Common if ( pCmd->GetFlag() & nCurrFlag) { pCmd->OnProc(szLine, ai.cargc, ai.cargv); return true; } // Admin else if ( (CIF_ADMIN & nInputFlag) && (pCmd->GetFlag() & CCF_ADMIN)) { if ( IsAdminGrade(ZGetMyInfo()->GetUGradeID()) ) { pCmd->OnProc(szLine, ai.cargc, ai.cargv); return true; } } // Test else if ( (CIF_TESTER & nInputFlag) && (pCmd->GetFlag() & CCF_TEST)) { pCmd->OnProc(szLine, ai.cargc, ai.cargv); return true; } } return false; }
bool ZSurvival::OnRefreshPlayerStatus(MCommand* pCommand) { // 운영자 hide는 제외 bool bAdminHide = false; if (ZGetMyInfo()->IsAdminGrade()) { MMatchObjCache* pCache = ZGetGameClient()->FindObjCache(ZGetMyUID()); if (pCache && pCache->CheckFlag(MTD_PlayerFlags_AdminHide)) bAdminHide = true; } if (!bAdminHide) { // 옵저버이거나 옵저버 예약상태를 푼다. ZGetGame()->ReleaseObserver(); // 죽어있으면 리스폰 if (ZGetGame()->m_pMyCharacter->IsDie()) { ZGetGame()->GetMatch()->RespawnSolo(); } } // 피와 총알을 채운다 for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { ZCharacter* pCharacter = i->second; if (!pCharacter->IsAdminHide()) pCharacter->InitStatus(); } ZGetGame()->CancelSuicide(); return true; }
void ZShopEquipInterface::SelectEquipmentTab(int nTabIndex) { if (nTabIndex == -1) nTabIndex = m_nEquipTabNum; ZIDLResource* pResource = GetIDLResource(); SetKindableItem( MMIST_NONE); // Set filter MComboBox* pComboBox = (MComboBox*)pResource->FindWidget( "Equip_AllEquipmentFilter"); if(pComboBox) { int sel = pComboBox->GetSelIndex(); ZMyItemList* pil = ZGetMyInfo()->GetItemList(); if ( pil) { pil->m_ListFilter = sel; pil->Serialize(); } } // EQUIPMENTLISTBOX MWidget* pWidget = pResource->FindWidget("EquipmentList"); if (pWidget != NULL) pWidget->Show(nTabIndex==0 ? true:false); pWidget = pResource->FindWidget("AccountItemList"); if (pWidget != NULL) pWidget->Show(nTabIndex==0 ? false:true); // 탭 버튼 MButton* pButton = (MButton*)pResource->FindWidget( "Equip"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } pButton = (MButton*)pResource->FindWidget( "SendAccountItemBtn"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } pButton = (MButton*)pResource->FindWidget( "BringAccountItemBtn"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } pButton = (MButton*)pResource->FindWidget( "BringAccountSpendableItemConfirmOpen"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } if ( nTabIndex == 0) { pButton = (MButton*)pResource->FindWidget( "Equip"); if (pButton) pButton->Show(true); pButton = (MButton*)pResource->FindWidget( "SendAccountItemBtn"); if (pButton) pButton->Show(true); } else if ( nTabIndex == 1) { pButton = (MButton*)pResource->FindWidget( "BringAccountItemBtn"); if ( pButton) pButton->Show( true); pButton = (MButton*)pResource->FindWidget( "BringAccountSpendableItemConfirmOpen"); if ( pButton) pButton->Show( false); } pButton = (MButton*)pResource->FindWidget("Equipment_CharacterTab"); if (pButton) pButton->Show( nTabIndex==0 ? false : true); pButton = (MButton*)pResource->FindWidget("Equipment_AccountTab"); if (pButton) pButton->Show( nTabIndex==1 ? false : true); // 탭 라벨 MLabel* pLabel; pLabel = (MLabel*)pResource->FindWidget("Equipment_FrameTabLabel1"); if ( pLabel) pLabel->Show( nTabIndex==0 ? true : false); pLabel = (MLabel*)pResource->FindWidget("Equipment_FrameTabLabel2"); if ( pLabel) pLabel->Show( nTabIndex==1 ? true : false); // 탭 리스트 MPicture* pPicture; pPicture = (MPicture*)pResource->FindWidget("Equip_ListLabel1"); if ( pPicture) pPicture->Show( nTabIndex==0 ? true : false); pPicture = (MPicture*)pResource->FindWidget("Equip_ListLabel2"); if ( pPicture) pPicture->Show( nTabIndex==1 ? true : false); // 프레임 탭 pPicture = (MPicture*)pResource->FindWidget("Equip_TabLabel"); MBitmap* pBitmap; if ( pPicture) { if ( nTabIndex == 0) pBitmap = MBitmapManager::Get( "framepaneltab1.tga"); else pBitmap = MBitmapManager::Get( "framepaneltab2.tga"); if ( pBitmap) pPicture->SetBitmap( pBitmap); } // 중앙은행 if (nTabIndex == 1) { ZGetMyInfo()->GetItemList()->ClearAccountItems(); ZGetMyInfo()->GetItemList()->SerializeAccountItem(); } // 아이템 슬롯 Enable/Disable for(int i = 0; i < MMCIP_END; i++) { ZItemSlotView* pItemSlot = (ZItemSlotView*)GetIDLResource()->FindWidget( GetItemSlotName( "Equip", i)); if( pItemSlot ) pItemSlot->EnableDragAndDrop( nTabIndex==0 ? true : false); } m_nEquipTabNum = nTabIndex; DrawCharInfoText(); }
// LoadMonsterBookInfo bool ZMonsterBookInterface::LoadMonsterBookInfo( void) { // 몬스터 도감 페이지 정보 리스트 삭제 if ( !m_mapMonsterBookPage.empty()) { for ( ZMonsterBookPageItr itr = m_mapMonsterBookPage.begin(); itr != m_mapMonsterBookPage.end(); itr++) delete (*itr).second; m_mapMonsterBookPage.clear(); } // NPC 정보를 구함 ZGetQuest()->Load(); CCQuestNPCCatalogue* pNPCCatalogue = ZGetQuest()->GetNPCCatalogue(); if ( pNPCCatalogue == NULL) return false; int nTotalItemCount = 0; int nTotalCollectItemCount = 0; m_nTotalPageNum = 0; for ( map<CCQUEST_NPC, CCQuestNPCInfo*>::iterator itr = pNPCCatalogue->begin(); itr != pNPCCatalogue->end(); itr++) { // 하드 코드 : 이벤트용 NPC인 경우엔 빼준다 if ( (*itr).first >= 100) continue; // 리스트 노드 생성 CCQuestNPCInfo* pNPCInfo = (*itr).second; ZMonsterBookPageInfo* pMonsterBookPageInfo = new ZMonsterBookPageInfo; pMonsterBookPageInfo->m_nID = (*itr).first; pMonsterBookPageInfo->m_strName = pNPCInfo->szName; pMonsterBookPageInfo->m_nGrade = (int)pNPCInfo->nGrade; pMonsterBookPageInfo->m_strDesc = pNPCInfo->szDesc; pMonsterBookPageInfo->m_nHP = pNPCInfo->nMaxHP; // 스킬 정보를 구함 for ( int i = 0; i < pNPCInfo->nSkills; i++) { ZSkillManager* pSkillMgr = ZGetApplication()->GetSkillManager(); map<int,ZSkillDesc*>::iterator itrSkill = pSkillMgr->find( pNPCInfo->nSkillIDs[ i]); if ( itrSkill != pSkillMgr->end()) { string strSkill = (*itrSkill).second->szName; pMonsterBookPageInfo->m_Skill.push_back( strSkill); } } // 드롭 아이템 목록을 구함 CCQuestDropSet* pDropItem = ZGetQuest()->GetDropTable()->Find( pNPCInfo->nDropTableID); if ( pDropItem) { // 드롭 아이템 갯수 int nDropItemCount = (int)pDropItem->GetQuestItems().size(); nTotalItemCount += nDropItemCount; // 수집한 아이템 갯수 int nCollectItemCount = 0; for ( set<int>::iterator itrItem = pDropItem->GetQuestItems().begin(); itrItem != pDropItem->GetQuestItems().end(); itrItem++) { ZDropItemInfo* pItemNode = new ZDropItemInfo; // 아이템을 획득한적이 있는지 검사 ZMyQuestItemMap::iterator itr = ZGetMyInfo()->GetItemList()->GetQuestItemMap().find( *itrItem); if ( itr != ZGetMyInfo()->GetItemList()->GetQuestItemMap().end()) { // 획득한 아이템 갯수 추가 nCollectItemCount++; // 아이템 정보를 구함 CCQuestItemDesc* pQItemDesc = GetQuestItemDescMgr().FindQItemDesc( *itrItem); if ( pQItemDesc) { pItemNode->m_strName = pQItemDesc->m_szQuestItemName; pItemNode->m_pIcon = ZGetGameInterface()->GetQuestItemIcon( *itrItem, false); } else { CCMatchItemDesc* pItemDesc = CCGetMatchItemDescMgr()->GetItemDesc( *itrItem); if ( pItemDesc) { pItemNode->m_strName = pItemDesc->m_pMItemName->Ref().m_szItemName; pItemNode->m_pIcon = GetItemIconBitmap( pItemDesc); } } } // 획득한 적이 없으면 ???로 표시 else { pItemNode->m_strName = "?????"; pItemNode->m_pIcon = CCBitmapManager::Get( "slot_icon_unknown.tga"); } // 노드 추가 pMonsterBookPageInfo->m_DropItem.push_back( pItemNode); } // 전체 수집한 아이템 갯수 추가 nTotalCollectItemCount += nCollectItemCount; // 페이지 달성률 구함 if ( nDropItemCount > 0) pMonsterBookPageInfo->m_fCompleteRate = (float)nCollectItemCount / (float)nDropItemCount * 100.0f; } // 노드 추가 m_mapMonsterBookPage.insert( ZMonsterBookPage::value_type( m_nTotalPageNum + 1, pMonsterBookPageInfo)); m_nTotalPageNum++; } // 전체 달성률 if ( nTotalItemCount > 0) m_fCompleteRate = (float)nTotalCollectItemCount / (float)nTotalItemCount * 100.0f; return true; }
void ZGameClient::OnAskAgreement(const MUID& uidProposer, void* pMemberNamesBlob, const MMatchProposalMode nProposalMode, const int nRequestID) { // 응답할 수 없는 상황이면 바로 거절한다. if ((IsWaitingRepliersAgreement()) || (!ZGetGameInterface()->IsReadyToPropose())) { char szCharName[MATCHOBJECT_NAME_LENGTH]; sprintf(szCharName, ZGetMyInfo()->GetCharName()); ZPostReplyAgreement(uidProposer, GetPlayerUID(), szCharName, nProposalMode, nRequestID, false); return; } char szMemberNames[MAX_REPLIER][256]; // 0 번째는 제안자 int nMemberCount = MGetBlobArrayCount(pMemberNamesBlob); if (nMemberCount < 1) return; for (int i = 0; i < nMemberCount; i++) { MTD_ReplierNode* pReplierNode = (MTD_ReplierNode*)MGetBlobArrayElement(pMemberNamesBlob, i); strcpy(szMemberNames[i], pReplierNode->szName); } m_nProposalMode = nProposalMode; m_nRequestID = nRequestID; m_uidRequestPlayer = uidProposer; ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource(); MTextArea* pTextEdit = (MTextArea*)pResource->FindWidget("ProposalAgreementConfirm_Textarea"); if (pTextEdit) { // 여기서 각각의 상황에 맞는 대사를 넣어줘야한다. char szTemp[256] = ""; char szMembers[256] = " ("; for (int i = 0; i < nMemberCount; i++) { strcat(szMembers, szMemberNames[i]); if (i != nMemberCount-1) strcat(szMembers, ", "); } strcat(szMembers, ")"); switch (nProposalMode) { case MPROPOSAL_LADDER_INVITE: { // ZTransMsg(szTemp, MSG_LADDER_REPLIER_AGREEMENT_LABEL, 1, szMemberNames[0]); ZTransMsg(szTemp, MSG_LADDER_REPLIER_AGREEMENT_LABEL, 1, szMemberNames[0]); strcat(szTemp, szMembers); } break; case MPROPOSAL_CLAN_INVITE: { // ZTransMsg(szTemp, MSG_CLANBATTLE_REPLIER_AGREEMENT_LABEL, 1, szMemberNames[0]); ZTransMsg(szTemp, MSG_CLANBATTLE_REPLIER_AGREEMENT_LABEL, 1, szMemberNames[0]); strcat(szTemp, szMembers); } break; }; pTextEdit->SetText(szTemp); } MWidget* pWidget = pResource->FindWidget("ProposalAgreementConfirm"); if(pWidget!=NULL) { static ZCOUNTDOWN countDown = {PROPOSAL_AGREEMENT_TIMEOUT_SEC, "ProposalAgreementConfirm_Remain", "ProposalAgreementConfirm", OnAskReplierAgreement_OnExpire}; countDown.nSeconds=PROPOSAL_AGREEMENT_TIMEOUT_SEC; // static 이므로 재설정 ZApplication::GetTimer()->SetTimerEvent(0, &OnTimer_CountDown, &countDown, true); pWidget->Show(true, true); } }
void ZGameClient::OnReplyAgreement(const MUID& uidProposer, const MUID& uidChar, const char* szReplierName, const MMatchProposalMode nProposalMode, const int nRequestID, const bool bAgreement) { if (!IsWaitingRepliersAgreement()) { m_AgreementBuilder.CancelProposal(); return; } ZNetAgreementBuilder::_BuildReplyResult nResult; nResult = m_AgreementBuilder.BuildReply(szReplierName, nProposalMode, nRequestID, bAgreement); if (nResult == ZNetAgreementBuilder::BRR_ALL_AGREED) // 모두 동의했을경우 { switch (nProposalMode) { case MPROPOSAL_LADDER_INVITE: { char szMember[MAX_LADDER_TEAM_MEMBER][MATCHOBJECT_NAME_LENGTH]; char* ppMember[MAX_LADDER_TEAM_MEMBER]; for(int i=0; i<MAX_LADDER_TEAM_MEMBER; i++) { ppMember[i] = szMember[i]; } int nCount = m_AgreementBuilder.GetReplierNames(&ppMember[1], MAX_LADDER_TEAM_MEMBER-1); // 자신도 넣는다. strcpy(szMember[0], ZGetMyInfo()->GetCharName()); nCount++; // 여기서 실제로 요청 ZPostLadderRequestChallenge(ppMember, nCount, 0); } break; case MPROPOSAL_CLAN_INVITE: { char szMember[MAX_CLANBATTLE_TEAM_MEMBER][MATCHOBJECT_NAME_LENGTH]; char* ppMember[MAX_CLANBATTLE_TEAM_MEMBER]; for(int i=0; i<MAX_CLANBATTLE_TEAM_MEMBER; i++) { ppMember[i] = szMember[i]; } int nCount = m_AgreementBuilder.GetReplierNames(&ppMember[1], MAX_CLANBATTLE_TEAM_MEMBER-1); // 자신도 넣는다. strcpy(szMember[0], ZGetMyInfo()->GetCharName()); nCount++; // Balance 옵션 int nBalancedMatching = 0; ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource(); MButton* pButton = (MButton*)pResource->FindWidget("BalancedMatchingCheckBox"); if ((pButton) && (pButton->GetCheck())) { nBalancedMatching = 1; } // 여기서 실제로 요청 ZPostLadderRequestChallenge(ppMember, nCount, nBalancedMatching); } break; }; ShowProposalWaitFrame(false); return; } else if (nResult == ZNetAgreementBuilder::BRR_DISAGREED) // 거절했을 경우 { ShowProposalWaitFrame(false); char temp[256] = ""; char szRejecter[64] = ""; // 거절한 사람 반환, 거절한 사람이 없을 경우는 그냥 마지막에 대답한 사람으로 정한다. if (!m_AgreementBuilder.GetRejecter(szRejecter)) strcpy(szRejecter, szReplierName); ZTransMsg(temp, MSG_LADDER_REPLIER_AGREEMENT_REJECT, 1, szRejecter); ZApplication::GetGameInterface()->ShowMessage(temp, NULL, MSG_LADDER_REPLIER_AGREEMENT_REJECT); } }
void ZGameClient::ReplyAgreement(const MUID& uidProposer, const MMatchProposalMode nProposalMode, bool bAgreement) { char szCharName[MATCHOBJECT_NAME_LENGTH]; sprintf(szCharName, ZGetMyInfo()->GetCharName()); ZPostReplyAgreement(uidProposer, GetPlayerUID(), szCharName, nProposalMode, m_nRequestID, bAgreement); }
bool ZGameInput::OnEvent(MEvent* pEvent) { int sel = 0; if ((ZGetGameInterface()->GetState() != GUNZ_GAME)) return false; if ( ZGetGameInterface()->GetGame() == NULL ) return false; MWidget* pMenuWidget = ZGetGameInterface()->GetIDLResource()->FindWidget("CombatMenuFrame"); if ((pMenuWidget) && (pMenuWidget->IsVisible())) return false; MWidget* pChatWidget = ZGetGameInterface()->GetIDLResource()->FindWidget("CombatChatInput"); if ((pChatWidget) && (pChatWidget->IsVisible())) return false; MWidget* p112ConfirmWidget = ZGetGameInterface()->GetIDLResource()->FindWidget("112Confirm"); if (p112ConfirmWidget->IsVisible()) return false; #ifndef _PUBLISH if (m_pInstance) { if (m_pInstance->OnDebugEvent(pEvent) == true) return true; } #endif ZMyCharacter* pMyCharacter = ZGetGameInterface()->GetGame()->m_pMyCharacter; if ((!pMyCharacter) || (!pMyCharacter->GetInitialized())) return false; //////////////////////////////////////////////////////////////////////////// switch(pEvent->nMessage){ case MWM_HOTKEY: { int nKey = pEvent->nKey; ZHOTKEY *hk=ZGetConfiguration()->GetHotkey(nKey); //if(ProcessLowLevelCommand(hk->command.c_str())==false) char buffer[256]; strcpy(buffer,hk->command.c_str()); ZApplication::GetGameInterface()->GetChat()->Input(buffer); // ConsoleInputEvent(hk->command.c_str()); }break; case MWM_LBUTTONDOWN: { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); if ( ZGetCombatInterface()->IsShowResult()) { if ( ((ZGetCombatInterface()->m_nReservedOutTime - timeGetTime()) / 1000) < 13) { if(ZGetGameClient()->IsLadderGame() || ZGetGameClient()->IsDuelTournamentGame()) ZChangeGameState(GUNZ_LOBBY); else ZChangeGameState(GUNZ_STAGE); return true; } } if (pCombatInterface->IsChat()) { pCombatInterface->EnableInputChat(false); } if (pCombatInterface->GetObserver()->IsVisible()) { pCombatInterface->GetObserver()->ChangeToNextTarget(); return true; } /* if ((pMyCharacter) && (pMyCharacter->IsDie())) //// 실서비스에서 스폰안되는 버그유발. 원인불명(_PUBLISH누락) 영구봉쇄. { // 혼자테스트할때 되살아나기 if(g_pGame->m_CharacterManager.size()==1) { #ifndef _PUBLISH ZGetGameInterface()->RespawnMyCharacter(); return true; #endif } }*/ if (ZGetGameInterface()->IsCursorEnable()) return false; } return true; case MWM_RBUTTONDOWN: { if (ZGetGameInterface()->GetCombatInterface()->IsChat()) { ZGetGameInterface()->GetCombatInterface()->EnableInputChat(false); } ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); if (pCombatInterface->GetObserver()->IsVisible()) { pCombatInterface->GetObserver()->NextLookMode(); } } return true; case MWM_MBUTTONDOWN: if (ZGetGameInterface()->GetCombatInterface()->IsChat()) { ZGetGameInterface()->GetCombatInterface()->EnableInputChat(false); } return true; case MWM_ACTIONRELEASED: { switch(pEvent->nKey){ case ZACTION_FORWARD: case ZACTION_BACK: case ZACTION_LEFT: case ZACTION_RIGHT: if (m_pInstance) m_pInstance->m_ActionKeyHistory.push_back(ZACTIONKEYITEM(ZGetGame()->GetTime(),false,pEvent->nKey)); return true; case ZACTION_DEFENCE: { if(ZGetGame()->m_pMyCharacter) ZGetGame()->m_pMyCharacter->m_statusFlags.Ref().m_bGuardKey = false; } return true; } }break; case MWM_ACTIONPRESSED: if ( !ZGetGame()->IsReservedSuicide()) // 자살 예정인 경우 대쉬를 할수없게 막는다 { switch(pEvent->nKey){ case ZACTION_FORWARD: case ZACTION_BACK: case ZACTION_LEFT: case ZACTION_RIGHT: case ZACTION_JUMP: if (m_pInstance) m_pInstance->m_ActionKeyHistory.push_back(ZACTIONKEYITEM(ZGetGame()->GetTime(),true,pEvent->nKey)); return true; case ZACTION_MELEE_WEAPON: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->ChangeWeapon(ZCWT_MELEE); } return true; case ZACTION_PRIMARY_WEAPON: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->ChangeWeapon(ZCWT_PRIMARY); } return true; case ZACTION_SECONDARY_WEAPON: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->ChangeWeapon(ZCWT_SECONDARY); } return true; case ZACTION_ITEM1: case ZACTION_ITEM2: { int nIndex = pEvent->nKey - ZACTION_ITEM1 + ZCWT_CUSTOM1; if ( !ZGetGame()->IsReplay()) { ZGetGameInterface()->ChangeWeapon(ZChangeWeaponType(nIndex)); } } return true; case ZACTION_COMMUNITYITEM1: mlog("Community Item1 Selected!\n"); return true; case ZACTION_COMMUNITYITEM2: mlog("Community Item2 Selected!\n"); return true; case ZACTION_PREV_WEAPON: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->ChangeWeapon(ZCWT_PREV); } return true; case ZACTION_NEXT_WEAPON: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->ChangeWeapon(ZCWT_NEXT); } return true; case ZACTION_RELOAD: { if ( !ZGetGame()->IsReplay()) ZGetGameInterface()->Reload(); } return true; case ZACTION_DEFENCE: { if ( ZGetGame()->m_pMyCharacter && !ZGetGame()->IsReplay()) ZGetGame()->m_pMyCharacter->m_statusFlags.Ref().m_bGuardKey = true; } return true; case ZACTION_TAUNT: // 틸다키 case ZACTION_BOW: case ZACTION_WAVE: case ZACTION_LAUGH: case ZACTION_CRY: case ZACTION_DANCE: { if ( ZGetGame()->IsReplay()) break; if ( MEvent::GetShiftState()) break; if(ZGetGameInterface()->GetCombatInterface()->GetObserverMode()) break; ZC_SPMOTION_TYPE mtype; if(pEvent->nKey == ZACTION_TAUNT) mtype = ZC_SPMOTION_TAUNT; else if(pEvent->nKey == ZACTION_BOW ) mtype = ZC_SPMOTION_BOW; else if(pEvent->nKey == ZACTION_WAVE ) mtype = ZC_SPMOTION_WAVE; else if(pEvent->nKey == ZACTION_LAUGH) mtype = ZC_SPMOTION_LAUGH; else if(pEvent->nKey == ZACTION_CRY ) mtype = ZC_SPMOTION_CRY; else if(pEvent->nKey == ZACTION_DANCE) mtype = ZC_SPMOTION_DANCE; else return true; if(ZGetGame()) ZGetGame()->PostSpMotion( mtype ); // ZPostSpMotion(mtype); } return true; case ZACTION_RECORD: { if ( ZGetGame() && !ZGetGame()->IsReplay()) ZGetGame()->ToggleRecording(); } return true; case ZACTION_MOVING_PICTURE: { // 동영상 캡쳐...2008.10.02 if (ZGetGameInterface()->GetBandiCapturer() != NULL) ZGetGameInterface()->GetBandiCapturer()->ToggleStart(); } return true; case ZACTION_TOGGLE_CHAT: { if(ZGetCombatInterface()->IsShowUI()) { // UI토글이 켜져 있을때만 채팅토글을 처리해준다. if (ZGetGame()) { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); ZGetSoundEngine()->PlaySound("if_error"); pCombatInterface->ShowChatOutput(!ZGetConfiguration()->GetViewGameChat()); } } } return true; case ZACTION_USE_WEAPON: case ZACTION_USE_WEAPON2: { return true; } case ZACTION_SENSITIVITY_INC: case ZACTION_SENSITIVITY_DEC: { int nPrev = ZGetConfiguration()->GetMouseSensitivityInInt(); float senstivity = Z_MOUSE_SENSITIVITY; if (pEvent->nKey == ZACTION_SENSITIVITY_INC) senstivity += 0.01f; else senstivity -= 0.01f; ZGetConfiguration()->SetMouseSensitivityInFloat(senstivity); int nNew = ZGetConfiguration()->GetMouseSensitivityInInt(); ZGetConfiguration()->ReserveSave(); ZChatOutputMouseSensitivityChanged(nPrev, nNew); return true; } } // switch } break; case MWM_KEYDOWN: { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); switch (pEvent->nKey) { case VK_F1: case VK_F2: case VK_F3: case VK_F4: case VK_F5: case VK_F6: case VK_F7: case VK_F8: if( pEvent->nKey == VK_F1 ) sel = 0; else if( pEvent->nKey == VK_F2 ) sel = 1; else if( pEvent->nKey == VK_F3 ) sel = 2; else if( pEvent->nKey == VK_F4 ) sel = 3; else if( pEvent->nKey == VK_F5 ) sel = 4; else if( pEvent->nKey == VK_F6 ) sel = 5; else if( pEvent->nKey == VK_F7 ) sel = 6; else if( pEvent->nKey == VK_F8 ) sel = 7; if(ZGetConfiguration()) { char* str = ZGetConfiguration()->GetMacro()->GetString( sel ); if(str) { if(ZApplication::GetGameInterface()) if(ZApplication::GetGameInterface()->GetChat()) ZApplication::GetGameInterface()->GetChat()->Input(str); } } return true; case VK_F9: if (ZIsLaunchDevelop()) { ZApplication::GetGameInterface()->GetScreenDebugger()->SwitchDebugInfo(); } else { // 애들이 어떻게 알고서 쓰길래 막음... -_-; // if (pEvent->bCtrl) // ZApplication::GetGameInterface()->GetScreenDebugger()->SwitchDebugInfo(); } return true; case VK_RETURN: case VK_OEM_2: { if (!ShowCombatInputChat()) return false; } return true; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'Y': case 'N': if (pCombatInterface->GetObserver()->IsVisible()) pCombatInterface->GetObserver()->OnKeyEvent(pEvent->bCtrl, pEvent->nKey); if (ZGetGameClient()->CanVote() || ZGetGameInterface()->GetCombatInterface()->GetVoteInterface()->GetShowTargetList() ) { ZGetGameInterface()->GetCombatInterface()->GetVoteInterface()->VoteInput(pEvent->nKey); } break; case VK_ESCAPE: // 메뉴를 부르거나 kick player를 취소한다 if (ZGetGameInterface()->GetCombatInterface()->GetVoteInterface()->GetShowTargetList()) { ZGetGameInterface()->GetCombatInterface()->GetVoteInterface()->CancelVote(); } else { ZGetGameInterface()->ShowMenu(!ZGetGameInterface()->IsMenuVisible()); ZGetGameInterface()->Show112Dialog(false); } return true; case 'M' : if ( ZGetGame()->IsReplay() && pCombatInterface->GetObserver()->IsVisible()) { if(ZGetGameInterface()->GetCamera()->GetLookMode()==ZCAMERA_FREELOOK) ZGetGameInterface()->GetCamera()->SetLookMode(ZCAMERA_MINIMAP); else ZGetGameInterface()->GetCamera()->SetLookMode(ZCAMERA_FREELOOK); } break; case 'T' : if(ZGetGame()->m_pMyCharacter->GetTeamID()==MMT_SPECTATOR && ZGetGame()->GetMatch()->IsTeamPlay() && pCombatInterface->GetObserver()->IsVisible()) { ZObserver *pObserver = pCombatInterface->GetObserver(); pObserver->SetType(pObserver->GetType()==ZOM_BLUE ? ZOM_RED : ZOM_BLUE); pObserver->ChangeToNextTarget(); } case 'H': if ( ZGetGame()->IsReplay() && pCombatInterface->GetObserver()->IsVisible()) { if ( ZGetGame()->IsShowReplayInfo()) ZGetGame()->ShowReplayInfo( false); else ZGetGame()->ShowReplayInfo( true); } break; case 'J': { #ifdef _CMD_PROFILE if ((pEvent->bCtrl) && (ZIsLaunchDevelop())) { #ifndef _PUBLISH ZGetGameClient()->m_CommandProfiler.Analysis(); #endif } #endif } break; #ifdef _DEBUG case 'K': { rvector pos = ZGetGame()->m_pMyCharacter->GetPosition(); pos.x+=1; ZGetGame()->m_pMyCharacter->SetPosition(pos); } break; case 'L': { rvector pos = ZGetGame()->m_pMyCharacter->GetPosition(); pos.x-=1; ZGetGame()->m_pMyCharacter->SetPosition(pos); } break; //case 'J': // { // ZGetGame()->m_pMyCharacter->GetPosition().z = ZGetGame()->m_pMyCharacter->GetPosition().z+1; // } // break; //case 'M': // { // ZGetGame()->m_pMyCharacter->GetPosition().z = ZGetGame()->m_pMyCharacter->GetPosition().z-1; // } // break; case 'U': { rvector pos = ZGetGame()->m_pMyCharacter->GetPosition(); pos.x = -3809; pos.y = -1330; pos.z = 100; ZGetGame()->m_pMyCharacter->SetPosition(pos); //ZGetGame()->m_pMyCharacter->GetPosition().x = -3809; //ZGetGame()->m_pMyCharacter->GetPosition().y = -1337.5; //ZGetGame()->m_pMyCharacter->GetPosition().z = 461; } break; #endif } } break; case MWM_CHAR: { ZMatch* pMatch = ZGetGame()->GetMatch(); if (pMatch->IsTeamPlay()) { switch(pEvent->nKey) { case '\'': case '\"': { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); pCombatInterface->EnableInputChat(true, true); } return true; }; } // for deutsch, spanish keyboard if (pEvent->nKey == '/') { if (!ShowCombatInputChat()) return false; } } break; case MWM_SYSKEYDOWN: { // alt+a ~ z(65~90) if(pEvent->nKey==90){ // Alt+'Z' // 모든 UI 감추기... by kammir 20081020 ZGetCombatInterface()->SetIsShowUI(!ZGetCombatInterface()->IsShowUI()); if (ZGetGame()) { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); ZGetSoundEngine()->PlaySound("if_error"); pCombatInterface->ShowChatOutput(ZGetCombatInterface()->IsShowUI()); } } } break; case MWM_MOUSEWHEEL: { if ( ZGetGame()->IsReplay()) break; int nDelta = pEvent->nDelta; if ( (ZGetMyInfo()->IsAdminGrade() && ZGetCombatInterface()->GetObserver()->IsVisible()) || (ZGetGameInterface()->GetScreenDebugger()->IsVisible()) || (!ZGetGameInterface()->m_bViewUI)) { ZCamera* pCamera = ZGetGameInterface()->GetCamera(); pCamera->m_fDist+=-(float)nDelta; pCamera->m_fDist=max(CAMERA_DIST_MIN,pCamera->m_fDist); pCamera->m_fDist=min(CAMERA_DIST_MAX,pCamera->m_fDist); break; } // if (nDelta > 0) ZGetGameInterface()->ChangeWeapon(ZCWT_PREV); // else if (nDelta < 0) ZGetGameInterface()->ChangeWeapon(ZCWT_NEXT); }break; case MWM_MOUSEMOVE: { if(ZGetGameInterface()->IsCursorEnable()==false) { return true; } } break; } // switch (message) return false; }
void ZShopEquipInterface::DrawCharInfoText(char* szShopOrEquip, int nReqLevel, int nNewWT, int nNewMaxWT, int nNewHP, int nNewAP, int nReqBounty, int nReqCash) { if (szShopOrEquip == NULL) { DrawCharInfoText("Shop", nReqLevel, nNewWT, nNewMaxWT, nNewHP, nNewAP, nReqBounty, nReqCash); DrawCharInfoText("Equip", nReqLevel, nNewWT, nNewMaxWT, nNewHP, nNewAP, nReqBounty, nReqCash); return; } if (0!=strcmp(szShopOrEquip, "Shop") && 0!=strcmp(szShopOrEquip, "Equip")) return; MTextArea* pTextArea[3]; char sz1[256], sz2[256], szTextArea[64]; const char* szRed = "^1"; const char* szGreen = "^2"; const char* szGray = "^9"; const char* szColor = NULL; // prefix에 따라서 "Shop_MyInfo1" "Shop_MyInfo2" "Shop_MyInfo3" "Equip_MyInfo1" "Equip_MyInfo2" "Equip_MyInfo3"의 이름을 구성 // (가로로 늘어놓은 TextArea 세개에 나눠서 표시하기 때문에..) for (int i=0; i<3; ++i) { sprintf(szTextArea, "%s_MyInfo%d", szShopOrEquip, i+1); pTextArea[i] = (MTextArea*)GetIDLResource()->FindWidget(szTextArea); if (NULL == pTextArea[i]) { _ASSERT(0); return; // 하나라도 못찾으면 리턴해버리자 } pTextArea[i]->Clear(); } // 첫번째 TextArea (레벨, 무게) szColor = szGray; if (nReqLevel > ZGetMyInfo()->GetLevel()) szColor = szRed; sprintf(sz1, "^9%s : %s%d ^9%s", ZMsg(MSG_CHARINFO_LEVEL), szColor, ZGetMyInfo()->GetLevel(), ZMsg(MSG_CHARINFO_LEVELMARKER)); pTextArea[0]->AddText(sz1); int nCurrMaxWT = ZGetMyInfo()->GetItemList()->GetMaxWeight(); sprintf(sz1, "^9%s : ", ZMsg(MSG_CHARINFO_WEIGHT)); szColor = (nNewWT > nNewMaxWT) ? szRed : szGray; sprintf(sz2, "%s%d", szColor, nNewWT); strcat(sz1, sz2); sprintf(sz2, "^9/%d", nCurrMaxWT); strcat(sz1, sz2); int nDiffMaxWT = nNewMaxWT - nCurrMaxWT; if (nDiffMaxWT != 0) { szColor = (nDiffMaxWT > 0) ? szGreen : szRed; sprintf(sz2, "%s%+d", szColor, nDiffMaxWT); strcat(sz1, sz2); } pTextArea[0]->AddText(sz1); // 두번째 TextArea (체력, 방어) sprintf(sz1, "^9%s : %d ", ZMsg(MSG_CHARINFO_HP), ZGetMyInfo()->GetHP()); int nDiffHP = nNewHP - ZGetMyInfo()->GetHP(); if (nDiffHP != 0) { szColor = (nDiffHP > 0) ? szGreen : szRed; sprintf(sz2, "%s%+d", szColor, nDiffHP); strcat(sz1, sz2); } pTextArea[1]->AddText(sz1); sprintf(sz1, "^9%s : %d ", ZMsg(MSG_CHARINFO_AP), ZGetMyInfo()->GetAP()); int nDiffAP = nNewAP - ZGetMyInfo()->GetAP(); if (nDiffAP != 0) { szColor = (nDiffAP > 0) ? szGreen : szRed; sprintf(sz2, "%s%+d", szColor, nDiffAP); strcat(sz1, sz2); } pTextArea[1]->AddText(sz1); // 세번째 TextArea (바운티, 캐시) sprintf(sz1, "^9%s : ", ZMsg(MSG_CHARINFO_BOUNTY)); szColor = (nReqBounty > ZGetMyInfo()->GetBP()) ? szRed : szGray; sprintf(sz2, "%s%d", szColor, ZGetMyInfo()->GetBP()); strcat(sz1, sz2); pTextArea[2]->AddText(sz1); sprintf(sz1, "^9%s : ", ZMsg(MSG_CHARINFO_CASH)); szColor = (nReqBounty > ZGetMyInfo()->GetECoins()) ? szRed : szGray; sprintf(sz2, "%s%d", szColor, ZGetMyInfo()->GetECoins()); strcat(sz1, sz2); pTextArea[2]->AddText(sz1); /* 보유 캐쉬는 캐쉬템 구입이 가능해질때 보여주자 sprintf(sz1, "^9%s : ", ZMsg(MSG_CHARINFO_CASH)); szColor = (nReqCash > ZGetMyInfo()->GetCash()) ? szRed : szGray; sprintf(sz2, "%s%d", szColor, ZGetMyInfo()->GetCash()); strcat(sz1, sz2); pTextArea[2]->AddText(sz1); */ }
// 아이템의 슬롯 정보에 따라 착용할 파츠를 골라준다 // 예를 들어 custom1에 이미 장착된 경우 custom2가 비어있으면 custom2를 골라주고, 둘다 장착중이면 custom1을 골라주는 식 MMatchCharItemParts ZShopEquipInterface::RecommendEquipParts(MMatchItemSlotType slot) { MMatchCharItemParts parts = MMCIP_END; if (slot == MMIST_RANGE) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_PRIMARY) == 0) { parts = MMCIP_PRIMARY; } else if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_SECONDARY) == 0) { parts = MMCIP_SECONDARY; } } else if (slot == MMIST_CUSTOM) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_CUSTOM1) == 0) { parts = MMCIP_CUSTOM1; } else if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_CUSTOM2) == 0) { parts = MMCIP_CUSTOM2; } } else if (slot == MMIST_FINGER) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_FINGERL) == 0) { parts = MMCIP_FINGERL; } else if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_FINGERR) == 0) { parts = MMCIP_FINGERR; } } else if (slot == MMIST_AVATAR) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_AVATAR) == 0) { parts = MMCIP_AVATAR; } } else if (slot == MMIST_COMMUNITY) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_COMMUNITY1) == 0) { parts = MMCIP_COMMUNITY1; } else if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_COMMUNITY2) == 0) { parts = MMCIP_COMMUNITY2; } } else if (slot == MMIST_LONGBUFF) { if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_LONGBUFF1) == 0) { parts = MMCIP_LONGBUFF1; } else if (ZGetMyInfo()->GetItemList()->GetEquipedItemID(MMCIP_LONGBUFF2) == 0) { parts = MMCIP_LONGBUFF2; } } if (parts == MMCIP_END) { parts = GetSuitableItemParts(slot); } return parts; }
bool ZShopEquipInterface::Equip(void) { static unsigned long int st_LastRequestTime = 0; ///< 막 누르는 것 방지 unsigned long int nNowTime = timeGetTime(); if ((nNowTime - st_LastRequestTime) < 1000) return false; st_LastRequestTime = nNowTime; ZShopEquipListItem* pListItem = GetListCurSelItem("EquipmentList"); if (!pListItem) { ZApplication::GetGameInterface()->ShowErrorMessage( MERR_NO_SELITEM ); return false; } // 갬블 아이템 if (ZSEIT_GAMBLE == pListItem->GetItemData()->GetType()) { ZShopEquipItem_Gamble* pWrapperGItem = (ZShopEquipItem_Gamble*)pListItem->GetItemData(); const ZGambleItemDefine* pGItemDesc = pWrapperGItem->GetDesc(); if (pGItemDesc) { // 이번에 캐시용 겜블아이템 추가로 수정 // 기존 일본 요청으로 퀘스트용 겜블아이템을 추가했었음 (1000100~1000199사이) // 퀘스트용 겜블아이템은 1000100에서 1000200로 제한한다 if( ZGetGameClient()->GetServerMode() != MSM_TEST && 1000100 <= pGItemDesc->GetGambleItemID() && pGItemDesc->GetGambleItemID() < 1000200) { ZApplication::GetGameInterface()->ShowErrorMessage( MERR_CANNOT_CAHNGE_THIS_ITEM ); } else { if (!pWrapperGItem->GetHandleSell()) { _ASSERT(0); return false; } ZPostRequestGamble( pWrapperGItem->GetHandleSell()->GetItemUID() ); ZPostRequestCharacterItemList( ZGetGameClient()->GetPlayerUID() ); } } } // 일반 아이템 if (ZSEIT_MATCH != pListItem->GetItemData()->GetType()) { return false; } ZShopEquipItem_Match* pWrappedZItem = (ZShopEquipItem_Match*)pListItem->GetItemData(); if (!pWrappedZItem->GetHandleSell()) { _ASSERT(0); return false; } MUID uidItem = pWrappedZItem->GetHandleSell()->GetItemUID(); MMatchItemDesc* pItemDesc = MGetMatchItemDescMgr()->GetItemDesc(ZGetMyInfo()->GetItemList()->GetItemID(uidItem)); if (!pItemDesc) return false; if (pItemDesc->m_nSlot == MMIST_NONE) return false; MMatchCharItemParts parts = RecommendEquipParts(pItemDesc->m_nSlot); if (parts == MMCIP_END) return false; WidgetHideDisableShow("Equip"); WidgetHideDisableShow("SendAccountItemBtn"); SetKindableItem( MMIST_NONE); return Equip(parts, uidItem); }
void ZObserver::OnDraw(MDrawContext* pDC) { if ( g_pGame->IsReplay() && !g_pGame->IsShowReplayInfo()) return; if ( m_pTargetCharacter == NULL) return; if ( ZGetCamera()->GetLookMode() == ZCAMERA_MINIMAP) return; if ( ZGetMyInfo()->IsAdminGrade()) { MFont *pFont=MFontManager::Get("FONTb11b"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont(pFont); MCOLOR backgroundcolor; if ( m_pTargetCharacter->GetTeamID() == MMT_RED) backgroundcolor = MCOLOR(100,0,0, 150); else if ( m_pTargetCharacter->GetTeamID() == MMT_BLUE) backgroundcolor = MCOLOR(0,0,100, 150); else backgroundcolor = MCOLOR(0,0,0, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( MGetWorkspaceWidth() / 2 - 170, MGetWorkspaceHeight() * (650.0f/800.0f) - 7, 340, 30); backgroundcolor = MCOLOR( 255,255,255, 255); pDC->SetColor( backgroundcolor); char szName[128]; sprintf_safe( szName, "%s (HP:%d, AP:%d)", m_pTargetCharacter->GetUserName(), m_pTargetCharacter->GetHP(), m_pTargetCharacter->GetAP()); TextRelative(pDC, 0.5f, 650.0f/800.0f, szName, true); } else if ( ZApplication::GetGame()->GetMatch()->GetMatchType() == MMATCH_GAMETYPE_DUEL) { char charName[3][100]; charName[0][0] = charName[1][0] = charName[2][0] = 0; float fMaxHP[ 2]={ 0.0f, 0.0f}, fMaxAP[ 2]={ 0.0f, 0.0f}; int nHP[ 2]={ 0, 0}, nAP[ 2]={ 0, 0}; bool bExistNextChallenger = false; bool bIsChampOserved = false; bool bIsChlngOserved = false; ZRuleDuel* pDuel = (ZRuleDuel*)ZGetGameInterface()->GetGame()->GetMatch()->GetRule(); for (ZCharacterManager::iterator itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { ZCharacter* pCharacter = (*itor).second; // Champion if (pCharacter->GetUID() == pDuel->QInfo.m_uidChampion) { strcpy_safe(charName[0], pCharacter->GetUserName()); fMaxHP[ 0] = pCharacter->GetProperty()->fMaxHP; fMaxAP[ 0] = pCharacter->GetProperty()->fMaxAP; if ( pCharacter->IsDie()) { nHP[ 0] = 0; nAP[ 0] = 0; } else { nHP[ 0] = pCharacter->GetHP(); nAP[ 0] = pCharacter->GetAP(); } if ( m_pTargetCharacter) { if ( pCharacter->GetUID() == m_pTargetCharacter->GetUID()) bIsChampOserved = true; } } // Challenger else if (pCharacter->GetUID() == pDuel->QInfo.m_uidChallenger) { strcpy_safe(charName[1], pCharacter->GetUserName()); fMaxHP[ 1] = pCharacter->GetProperty()->fMaxHP; fMaxAP[ 1] = pCharacter->GetProperty()->fMaxAP; if ( pCharacter->IsDie()) { nHP[ 1] = 0; nAP[ 1] = 0; } else { nHP[ 1] = pCharacter->GetHP(); nAP[ 1] = pCharacter->GetAP(); } if ( m_pTargetCharacter) { if ( pCharacter->GetUID() == m_pTargetCharacter->GetUID()) bIsChlngOserved = true; } } // Waiting else if (pCharacter->GetUID() == pDuel->QInfo.m_WaitQueue[0]) { strcpy_safe(charName[2], pCharacter->GetUserName()); bExistNextChallenger = true; } } float fRx = (float)MGetWorkspaceWidth() / 800.0f; float fRy = (float)MGetWorkspaceHeight() / 600.0f; int nWidth; float fPosy; float fLength; float fHeight; // HP fPosy = 10.0f*fRy; fLength = 163.0f*fRx; fHeight = 23.0f*fRy; pDC->SetColor( 255, 0, 0, 210); nWidth = (int)( (float)nHP[0] / fMaxHP[0] * fLength); pDC->FillRectangle( (193.0f+163.0f)*fRx-nWidth, fPosy, nWidth, fHeight); nWidth = (int)( (float)nHP[1] / fMaxHP[1] * fLength); pDC->FillRectangle( 444.0f*fRx, fPosy, nWidth, fHeight); // AP pDC->SetColor( 0, 50, 0, 170); pDC->FillRectangle( 218.0f*fRx, 37.0f*fRy, 150.0f*fRx, 5.0f*fRy); pDC->FillRectangle( 432.0f*fRx, 37.0f*fRy, 150.0f*fRx, 5.0f*fRy); pDC->SetColor( 0, 255, 0, 100); nWidth = (int)( (float)nAP[0] / fMaxAP[0] * 150.0f * fRx); pDC->FillRectangle( (218.0f+150.0f)*fRx-nWidth, 37.0f*fRy, nWidth, 5.0f*fRy); nWidth = (int)( (float)nAP[1] / fMaxAP[1] * 150.0f * fRx); pDC->FillRectangle( 432.0f*fRx, 37.0f*fRy, nWidth, 5.0f*fRy); // °ÔÀÌÁö ÇÁ·¹ÀÓ Ãâ·Â MBitmap* pBitmap = MBitmapManager::Get( "duel_score.tga"); if ( pBitmap) { pDC->SetBitmap( pBitmap); pDC->Draw( 167.0f*fRx, 0, 466.0f*fRx, 49.0f*fRx); } // À̸§ Ãâ·Â MFont *pFont = MFontManager::Get("FONTa10_O2Wht"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont( pFont); int nTime = GetGlobalTimeMS() % 200; if ( bIsChampOserved && (nTime < 100)) pDC->SetColor(MCOLOR(0xFFFFFF00)); else pDC->SetColor(MCOLOR(0xFFA0A0A0)); TextRelative(pDC, 0.34f, 0.026f, charName[0], true); if ( bIsChlngOserved && (nTime < 100)) pDC->SetColor(MCOLOR(0xFFFFFF00)); else pDC->SetColor(MCOLOR(0xFFA0A0A0)); TextRelative(pDC, 0.66f, 0.026f, charName[1], true); if ( bExistNextChallenger) { MBitmap* pBitmap = MBitmapManager::Get( "icon_play.tga"); if ( pBitmap) { pDC->SetBitmap( pBitmap); int nIcon = 20.0f*fRx; pDC->Draw( 646.0f*fRx, 0, nIcon, nIcon); pDC->Draw( 640.0f*fRx, 0, nIcon, nIcon); } pDC->SetColor( MCOLOR(0xFF808080)); TextRelative( pDC, 0.83f, 0.01f, charName[ 2], false); } ZGetCombatInterface()->DrawVictory( pDC, 162, 20, pDuel->QInfo.m_nVictory); } else if ( ZApplication::GetGame()->GetMatch()->GetMatchType() != MMATCH_GAMETYPE_DUEL) { char szName[128]; sprintf_safe(szName, "%s (HP:%d, AP:%d)", m_pTargetCharacter->GetUserName(), m_pTargetCharacter->GetHP(), m_pTargetCharacter->GetAP()); if ( m_pTargetCharacter->IsAdmin()) pDC->SetColor(MCOLOR(ZCOLOR_ADMIN_NAME)); else pDC->SetColor(MCOLOR(0xFFFFFFFF)); MFont *pFont = MFontManager::Get( "FONTb11b"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont( pFont); if ( ZApplication::GetGame()->GetMatch()->GetMatchType() == MMATCH_GAMETYPE_DEATHMATCH_TEAM2) TextRelative( pDC, 0.5f, 75.0f/800.0f, szName, true); else TextRelative( pDC, 0.5f, 50.0f/800.0f, szName, true); } // Ä«¸Þ¶ó Ç¥½Ã if ( !ZGetMyInfo()->IsAdminGrade()) { ZCamera *pCamera = ZGetGameInterface()->GetCamera(); const char *szModes[] = { "normal", "user", "free", "minimap" }; // TextRelative(pDC, 0.9f, 50.0f/800.0f, szModes[pCamera->GetLookMode()], true); char szFileName[ 50]; sprintf_safe( szFileName, "camera_%s.tga", szModes[pCamera->GetLookMode()]); pDC->SetBitmap( MBitmapManager::Get( szFileName)); float fGain = (float)MGetWorkspaceWidth() / 800.0f; pDC->Draw( (int)(720.0f * fGain), (int)(7.0f * fGain), (int)(64.0f * fGain), (int)(64.0f * fGain)); } // Admin ¿ÉÁ®¹öÀÏ °æ¿ì¿¡ ³²Àº Àοø¼ö Ç¥½Ã if ( ZGetMyInfo()->IsAdminGrade()) { // Àοø¼ö ±¸Çϱâ int nNumOfTotal=0, nNumOfRedTeam=0, nNumOfBlueTeam=0; ZCharacterManager::iterator itor; ZCharacter* pCharacter; for (itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { pCharacter = (*itor).second; if ( pCharacter->GetTeamID() == MMT_SPECTATOR) // ¿ÉÀú¹ö´Â –A´Ù continue; if(pCharacter->IsAdminHide()) continue; if ( (pCharacter->GetTeamID()==4) && ( !pCharacter->IsDie())) nNumOfTotal++; else if ( (pCharacter->GetTeamID()==MMT_RED) && ( !pCharacter->IsDie())) nNumOfRedTeam++; else if ( (pCharacter->GetTeamID()==MMT_BLUE) && ( !pCharacter->IsDie())) nNumOfBlueTeam++; } // ÆÀ À̹ÌÁö Ç¥½Ã float sizex = MGetWorkspaceWidth() / 800.f; float sizey = MGetWorkspaceHeight() / 600.f; char szText[128]; // ¹è°æ Ç¥½Ã MCOLOR backgroundcolor; if (ZApplication::GetGame()->GetMatch()->IsTeamPlay()) { backgroundcolor = MCOLOR(100,0,0, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( 700 * sizex, 37 * sizey, 85 * sizex, 22 * sizey); backgroundcolor = MCOLOR(0,0,100, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( 700 * sizex, 62 * sizey, 85 * sizex, 22 * sizey); // Àοø¼ö Ç¥½Ã backgroundcolor = MCOLOR(255,180,180, 255); pDC->SetColor(backgroundcolor); sprintf_safe( szText, "%s:%d", ZMsg( MSG_WORD_REDTEAM), nNumOfRedTeam); TextRelative( pDC, 0.92f, 40.0f/600.0f, szText, true); backgroundcolor = MCOLOR(180,180,255, 255); pDC->SetColor(backgroundcolor); sprintf_safe( szText, "%s:%d", ZMsg( MSG_WORD_BLUETEAM), nNumOfBlueTeam); TextRelative( pDC, 0.92f, 65.0f/600.0f, szText, true); } } CheckDeadTarget(); }
void ZShopEquipInterface::SelectShopTab(int nTabIndex) { if (nTabIndex == -1) nTabIndex = m_nShopTabNum; ZIDLResource* pResource = GetIDLResource(); // 프리미엄 샵 - 설정되는 국가대로 하나씩 지워나간다 #ifndef _DEBUG #if defined(LOCALE_BRAZIL) || defined(LOCALE_INDIA) || defined(LOCALE_US) || defined(LOCALE_JAPAN) || defined(LOCALE_KOREA) || defined(LOCALE_NHNUSA) { if ( nTabIndex == 2) return; } #endif #endif MWidget* pWidget = pResource->FindWidget("AllEquipmentList"); if (pWidget != NULL) pWidget->Show(nTabIndex==0 ? true : false); pWidget = pResource->FindWidget("MyAllEquipmentList"); if (pWidget != NULL) pWidget->Show(nTabIndex==1 ? true : false); pWidget = pResource->FindWidget("CashEquipmentList"); if (pWidget != NULL) pWidget->Show(nTabIndex==2 ? true : false); // Set filter MComboBox* pComboBox = (MComboBox*)pResource->FindWidget( "Shop_AllEquipmentFilter"); if(pComboBox) { int sel = pComboBox->GetSelIndex(); ZMyItemList* pil = ZGetMyInfo()->GetItemList(); if ( pil) { pil->m_ListFilter = sel; pil->Serialize(); } } // 버튼 설정 MButton* pButton = (MButton*)pResource->FindWidget( "BuyConfirmCaller"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } pButton = (MButton*)pResource->FindWidget( "SellConfirmCaller"); if ( pButton) { pButton->Show( false); pButton->Enable( false); } if ( nTabIndex == 0) { pButton = (MButton*)pResource->FindWidget( "BuyConfirmCaller"); if ( pButton) pButton->Show( true); } else if ( nTabIndex == 1) { pButton = (MButton*)pResource->FindWidget( "SellConfirmCaller"); if ( pButton) pButton->Show( true); } /* 수년전 만들다만 프리미엄 탭(캐쉬템) 코드임. 제거 예정 else if ( nTabIndex == 2) { pButton = (MButton*)pResource->FindWidget( "BuyCashConfirmCaller"); if ( pButton) pButton->Show( true); } */ pButton = (MButton*)pResource->FindWidget("AllEquipmentListCaller"); if (pButton != NULL) pButton->Show(nTabIndex!=0 ? true : false); pButton = (MButton*)pResource->FindWidget("MyAllEquipmentListCaller"); if (pButton != NULL) pButton->Show(nTabIndex!=1 ? true : false); pButton = (MButton*)pResource->FindWidget("CashEquipmentListCaller"); if (pButton != NULL) pButton->Show(nTabIndex!=2 ? true : false); // 구입, 판매 라벨 MPicture* pPicture; MBitmap* pBitmap; pPicture = (MPicture*)pResource->FindWidget("Shop_FrameTabLabel1"); if ( pPicture) pPicture->Show(nTabIndex==0 ? true : false); pPicture = (MPicture*)pResource->FindWidget("Shop_FrameTabLabel2"); if ( pPicture) pPicture->Show(nTabIndex==1 ? true : false); pPicture = (MPicture*)pResource->FindWidget("Shop_FrameTabLabel3"); if ( pPicture) pPicture->Show(nTabIndex==2 ? true : false); // 프레임 탭 pPicture = (MPicture*)pResource->FindWidget("Shop_TabLabel"); if ( pPicture) { if ( nTabIndex == 0) pBitmap = MBitmapManager::Get( "framepaneltab1.tga"); else if ( nTabIndex == 1) pBitmap = MBitmapManager::Get( "framepaneltab2.tga"); else if ( nTabIndex == 2) pBitmap = MBitmapManager::Get( "framepaneltab3.tga"); if ( pBitmap) pPicture->SetBitmap( pBitmap); } // 프리미엄 샵 - 설정되는 국가대로 하나씩 지워나간다 #ifndef _DEBUG #if defined(LOCALE_BRAZIL) || defined(LOCALE_INDIA) || defined(LOCALE_US) || defined(LOCALE_JAPAN) || defined(LOCALE_KOREA) || defined(LOCALE_NHNUSA) { pWidget = pResource->FindWidget( "Shop_TabLabelBg"); if ( pWidget) pWidget->Show( false); pWidget = pResource->FindWidget( "CashEquipmentListCaller"); if ( pWidget) pWidget->Show( false); pWidget = pResource->FindWidget( "Shop_FrameTabLabel3"); if ( pWidget) pWidget->Show( false); } #endif #endif m_nShopTabNum = nTabIndex; DrawCharInfoText(); }