void ZNetCharacter::OnUpdate(float fDelta) { if (m_bInitialized==false) return; if (!IsVisible()) return; float fTimeLapse = ZGetGame()->GetTime() - m_fLastValidTime; m_fLastValidTime = ZGetGame()->GetTime(); ZCharacter::OnUpdate(fDelta); // 실제 움직이는 부분은 module_movable 로 옮겨갔다 if(IsMoveAnimation()) // 애니메이션에 움직임이 포함된넘은 움직여줘야한다. { rvector origdiff=fDelta*GetVelocity(); rvector diff = m_AnimationPositionDiff.Ref(); diff.z+=origdiff.z; // rvector diff=m_RealPositionBefore-m_RealPosition; // mesh 의 위치 변화로 움직임판정 if(GetDistToFloor()<0 && diff.z<0) diff.z=-GetDistToFloor(); Move(diff); // debug /* mlog("%d pos : %3.3f %3.3f %3.3f ani-move : %3.3f %3.3f %3.3f\n", m_AniState_Lower, m_Position.x,m_Position.y,m_Position.z,diff.x,diff.y,diff.z); */ } UpdateHeight(fDelta); }
void ZSurvival::UpdateNavMeshWeight(float fDelta) { // NavMesh 가중치 업데이트 if ((ZGetGame()->GetTime() - m_fLastWeightTime) >= 1.0f) { #ifdef _DEBUG unsigned long int nLastTime = timeGetTime(); #endif RNavigationMesh* pNavMesh = ZGetGame()->GetWorld()->GetBsp()->GetNavigationMesh(); if (pNavMesh != NULL) { pNavMesh->ClearAllNodeWeight(); ZNPCObjectMap* pNPCObjectMap = ZGetObjectManager()->GetNPCObjectMap(); for(ZNPCObjectMap::iterator i = pNPCObjectMap->begin();i!=pNPCObjectMap->end();i++) { ZObject* pNPCObject = i->second; RNavigationNode* pNode = pNavMesh->FindClosestNode(pNPCObject->GetPosition()); if (pNode) { float fWeight = pNode->GetWeight() + 1.0f; pNode->SetWeight(fWeight); } } } m_fLastWeightTime = ZGetGame()->GetTime(); } }
void ZActor::CheckDead(float fDelta) { if (!CheckFlag(AF_MY_CONTROL)) return; if (!CheckFlag(AF_DEAD)) { if(m_pModule_HPAP->GetHP()<=0) { SetDeadTime(ZGetGame()->GetTime()); m_Animation.Input(ZA_EVENT_DEATH); SetFlag(AF_DEAD, true); MUID uidKiller = this->GetLastAttacker(); ZPostQuestPeerNPCDead(uidKiller, GetUID()); m_TaskManager.Clear(); } } else { if (!CheckFlag(AF_REQUESTED_DEAD)) { if (ZGetGame()->GetTime()-GetDeadTime() > GetNPCInfo()->fDyingTime) { MUID uidAttacker = GetLastAttacker(); if (uidAttacker == MUID(0, 0)) { uidAttacker = ZGetGameClient()->GetPlayerUID(); } ZPostQuestRequestNPCDead(uidAttacker, GetUID(), GetPosition()); SetFlag(AF_REQUESTED_DEAD, true); } } } }
float ZMapDesc::GetThisTime() { if(ZGetGame())//게임중이면 return ZGetGame()->GetTime(); float _time = (timeGetTime()-m_StartTime)/1000.f; return _time; }
bool ZSurvival::OnPeerNPCAttackMelee(MCommand* pCommand) { MUID uidOwner; pCommand->GetParameter(&uidOwner, 0, MPT_UID); ZGetGame()->OnPeerShot_Melee(uidOwner,ZGetGame()->GetTime()); return true; }
bool ZSurvival::OnPeerNPCAttackRange(MCommand* pCommand) { MUID uidOwner; pCommand->GetParameter(&uidOwner, 0, MPT_UID); MCommandParameter* pParam = pCommand->GetParameter(1); if(pParam->GetType()!=MPT_BLOB) return false; // 문제가 있다 ZPACKEDSHOTINFO *pinfo =(ZPACKEDSHOTINFO*)pParam->GetPointer(); rvector pos = rvector(pinfo->posx,pinfo->posy,pinfo->posz); rvector to = rvector(pinfo->tox,pinfo->toy,pinfo->toz); // rocket 테스트로 넣어봤다. ZObject* pOwner = ZGetGame()->m_ObjectManager.GetObject(uidOwner); MMatchItemDesc* pDesc = NULL; if(pOwner==NULL) return false; // 보통 치트키를 쓸경우... if( pOwner->GetItems() ) if( pOwner->GetItems()->GetSelectedWeapon() ) pDesc = pOwner->GetItems()->GetSelectedWeapon()->GetDesc(); if (pDesc) { if (pDesc->m_nWeaponType.Ref() == MWT_ROCKET) { rvector dir = to - pos; Normalize(dir); ZGetGame()->m_WeaponManager.AddRocket(pos,dir,pOwner); ZApplication::GetSoundEngine()->PlaySEFire(pDesc, pos.x, pos.y, pos.z, false); return true; } else if (pDesc->m_nWeaponType.Ref() == MWT_SKILL) { rvector dir = to - pos; Normalize(dir); ZSkill skill; skill.Init(pDesc->m_nGadgetID.Ref(), pOwner); ZApplication::GetSoundEngine()->PlaySEFire(pDesc, pos.x, pos.y, pos.z, false); ZGetGame()->m_WeaponManager.AddMagic(&skill, pos, dir, pOwner); return true; } } else return false; ZGetGame()->OnPeerShot_Range((MMatchCharItemParts)pinfo->sel_type,uidOwner,ZGetGame()->GetTime(),pos,to); return true; }
bool ZModule_PoisonDamage::Update(float fElapsed) { ZObject* pObj = MDynamicCast(ZObject, m_pContainer); if (!pObj) _ASSERT(0); else { // ������ ���� DAMAGE_DELAY if(ZGetGame()->GetTime()>m_fNextDamageTime) { m_fNextDamageTime+=DAMAGE_DELAY; // ������ �ް� �ִ� ����Ʈ ������ ������ ���������� ���� ���¿����� ���δ�.. if(pObj->IsDie()) { if( pObj->m_pVMesh->GetVisibility() < 0.5f ) {//����Ʈ�� Life Ÿ�ӵ� �����ϱ�... m_bOnDamage = false; return false; } } else //�����������.. { // ������� ������Ʈ�� ���⼭ �����Ϸ��������� ����� ������ �ȵ� �ϴ� �ּ�ó���Ѵ� // 5 * (1.f-fPR) �̺κж����� zitem.xml���� damage="1"�κκ��� damage="6"�� �ϴ� ���� //float fPR = 0; //float fDamage = 5 * (1.f-fPR) + (float)m_nDamage; pObj->OnDamaged(m_pOwner, pObj->GetPosition(), ZD_LIGHTNING, MWT_NONE, m_fDamage, 1); /*ZModule_HPAP *pModule = (ZModule_HPAP*)m_pContainer->GetModule(ZMID_HPAP); if(pModule) { pModule->OnDamage(m_pOwner,m_fDamage,1); // pObj->OnScream(); }*/ } } if(ZGetGame()->GetTime()>m_fNextEffectTime) { if(!pObj->IsDie()) { int nEffectLevel = GetEffectLevel()+1; m_fNextEffectTime+=EFFECT_DELAY * nEffectLevel; ZGetEffectManager()->AddEnchantPoison2( pObj ); } } } if(m_fNextDamageTime-m_fBeginTime>m_fDuration) { m_bOnDamage = false; return false; } return true; }
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 ZGameInput::GameCheckSequenceKeyCommand() { // 철지난 키 입력은 일단 제거한다. while(m_ActionKeyHistory.size()>0 && (ZGetGame()->GetTime()-(*m_ActionKeyHistory.begin()).fTime>MAX_KEY_SEQUENCE_TIME)) { m_ActionKeyHistory.erase(m_ActionKeyHistory.begin()); } if(m_ActionKeyHistory.size()) { for(int ai=0;ai<(int)m_SequenceActions.size();ai++) { ZKEYSEQUENCEACTION action=m_SequenceActions.at(ai); list<ZACTIONKEYITEM>::iterator itr=m_ActionKeyHistory.end(); itr--; bool bAction=true; for(int i=action.nKeyCount-1;i>=0;i--) { ZACTIONKEYITEM itm=*itr; if(i==0) { if(ZGetGame()->GetTime()-itm.fTime>action.fTotalTime) { bAction=false; break; } } if(itm.nActionKey!=action.pKeys[i].nActionKey || itm.bPressed!=action.pKeys[i].bPressed) { bAction=false; break; } if(i!=0 && itr==m_ActionKeyHistory.begin()) { bAction=false; break; } itr--; } if(bAction) { while(m_ActionKeyHistory.size()) { m_ActionKeyHistory.erase(m_ActionKeyHistory.begin()); } if(ai>=0 && ai<=3) // 덤블링 ZGetGame()->m_pMyCharacter->OnTumble(ai); } } } }
void ZCharacterManager::Clear() { while (!empty()) { ZCharacter* pCharacter = (*begin()).second; if( ZGetGame()->m_VisualMeshMgr.m_list.size() )//마지막 종료시는.. ZGetGame()->m_VisualMeshMgr.Del(pCharacter->m_nVMID.Ref()); delete pCharacter; erase(begin()); } }
bool ZSurvival::OnQuestCombatState(MCommand* pCommand) { char nState; pCommand->GetParameter(&nState, 0, MPT_CHAR); MQuestCombatState nCombatState = MQuestCombatState(nState); m_QuestCombatState = nCombatState; // 보관.. switch (nCombatState) { case MQUEST_COMBAT_PREPARE: { } break; case MQUEST_COMBAT_PLAY: { ZGetObjectManager()->GetNPCObjectMap()->ForceInvisibleNewNpc(false); ZGetEffectManager()->Clear(); ZGetEffectManager()->EnableDraw(true); ZGetGame()->m_WeaponManager.EnableRender(true); ZGetWorldItemManager()->EnableDraw(true); } break; case MQUEST_COMBAT_COMPLETED: { // 서바이벌이므로 마지막 섹터라도 포탈을 찍어야 한다. 그러나 마지막 반복의 막판이라면 포탈을 없게한다 if (!m_GameInfo.IsLastSectorInSurvival()) { if (ZGetGame()) { rvector portal_pos; int nCurrSectorIndex = m_GameInfo.GetCurrSectorIndex(); int nLinkIndex = m_GameInfo.GetMapSectorLink(nCurrSectorIndex); portal_pos = ZGetGame()->GetMapDesc()->GetQuestSectorLink(nLinkIndex); ZGetWorldItemManager()->AddQuestPortal(portal_pos); m_GameInfo.SetPortalPos(portal_pos); ZChatOutput(MCOLOR(ZCOLOR_CHAT_SYSTEM_GAME), ZMsg(MSG_GAME_OPEN_PORTAL)); m_tRemainedTime = timeGetTime() + PORTAL_MOVING_TIME; m_bIsRoundClear = true; } } } break; }; return true; }
void ZGameClient::OnClanMsg(const char* szSenderName, const char* szMsg) { char szText[512]; sprintf(szText, "%s(%s) : %s", ZMsg( MSG_CHARINFO_CLAN), szSenderName, szMsg); if ( ZGetGame()) { if ( (ZGetGame()->GetMatch()->GetMatchType() == MMATCH_GAMETYPE_DUEL) && !ZGetGame()->m_pMyCharacter->IsDie()) sprintf(szText, "%s(%s) : %s", ZMsg( MSG_CHARINFO_CLAN), szSenderName, ". . . . ."); } ZChatOutput(MCOLOR(ZCOLOR_CHAT_CLANMSG), szText); }
bool ZBrain::FindTarget() { MUID uidTarget = MUID(0,0); float fDist = FLT_MAX; for ( ZCharacterManager::iterator itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { // 죽은 놈은 관심없다. ZCharacter* pCharacter = (*itor).second; if ( pCharacter->IsDie()) continue; // 제외 목록에 들어간 캐릭터는 건너뜀 if ( ZGetGame()->IsExceptedFromNpcTargetting( pCharacter)) continue; // 거리를 구한다. float dist = MagnitudeSq( pCharacter->GetPosition() - m_pBody->GetPosition()); // 더 가까운 놈이면 이놈을 타겟으로 정한다. if ( dist < fDist) { fDist = dist; uidTarget = pCharacter->GetUID(); } } m_uidTarget = uidTarget; if ( uidTarget == MUID(0,0)) return false; return true; }
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; }
bool ZSurvival::OnSurvivalPrivateRanking(MCommand* pCmd) { if( 0 == pCmd ) return false; MTextArea* pWidgetRank = (MTextArea*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "SurvivalResult_MyRank"); MTextArea* pWidgetName = (MTextArea*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "SurvivalResult_MyName"); MTextArea* pWidgetPoint = (MTextArea*)ZApplication::GetGameInterface()->GetIDLResource()->FindWidget( "SurvivalResult_MyRankPoint"); if (!pWidgetRank || !pWidgetName || !pWidgetPoint) return false; pWidgetRank->Clear(); pWidgetName->Clear(); pWidgetPoint->Clear(); unsigned int nRank, nPoint; pCmd->GetParameter( &nRank, 0, MPT_UINT ); pCmd->GetParameter( &nPoint, 1, MPT_UINT ); char szText[128]; if (nRank != 0) sprintf(szText, "%d", nRank); else sprintf(szText, "--", nRank); pWidgetRank->AddText(szText, MCOLOR( 0xFFFFFFCC)); sprintf(szText, "%d", nPoint); pWidgetPoint->AddText(szText, MCOLOR( 0xFFFFFFCC)); pWidgetName->AddText(ZGetGame()->m_pMyCharacter->GetUserName(), MCOLOR( 0xFFFFFFCC)); return true; }
bool ZSurvival::OnQuestPlayerDead(MCommand* pCommand) { MUID uidVictim; pCommand->GetParameter(&uidVictim, 0, MPT_UID); ZCharacter* pVictim = ZGetCharacterManager()->Find(uidVictim); if(pVictim) { if (pVictim != ZGetGame()->m_pMyCharacter) { pVictim->Die(); // 여기서 실제로 죽는다 } pVictim->GetStatus().CheckCrc(); pVictim->GetStatus().Ref().AddDeaths(); if (pVictim->GetStatus().Ref().nLife > 0) pVictim->GetStatus().Ref().nLife--; pVictim->GetStatus().MakeCrc(); } //ZGetGame()->OnPeerDieMessage(pVictim, pAttacker); return true; }
void ZModule_HealOverTime::BeginHeal(MMatchDamageType type, int nHealAmount, int numHeal, MMatchItemEffectId effectId, int nItemId) { if (type != MMDT_HEAL && type != MMDT_REPAIR) { _ASSERT(0); return; } m_type.Set_CheckCrc(type); m_nEffectId = effectId; float fCurrTime = ZGetGame()->GetTime(); m_fBeginTime.Set_CheckCrc(fCurrTime); m_fHeal.Set_CheckCrc((float)nHealAmount); m_numHealDesire.Set_CheckCrc(numHeal); m_numHealDone.Set_CheckCrc(0); if (!m_bOnHeal.Ref()) { m_fNextHealTime.Set_CheckCrc(fCurrTime); } m_bOnHeal.Set_CheckCrc(true); m_nItemId = nItemId; Active(); }
void ZCharacterObject::EnChantMovingEffect(rvector* pOutPos,int cnt,ZC_ENCHANT etype,bool bDoubleWeapon) { int nRand = (GetEffectLevel()+1) * 3;//ÀÌÆåÆ® ¿É¼Ç¿¡ µû¶ó¼.. if( ZGetGame()->GetGameTimer()->m_dwUpdateCnt % nRand == 0 ) { if(cnt==0) { m_pVMesh->GetWeaponPos( pOutPos ); } float asf = (rand()%10)/10.f; rvector pos = pOutPos[0] + (pOutPos[1]-pOutPos[0]) * asf; DrawEnchantSub( etype , pos ); if(bDoubleWeapon) // ¾ç¼ÕÀÏ°æ¿ì { if(cnt==0) { m_pVMesh->GetWeaponPos( &pOutPos[2] ,true); } float asf = (rand()%10)/10.f; rvector pos = pOutPos[2] + (pOutPos[3]-pOutPos[2]) * asf; DrawEnchantSub( etype , pos ); } } }
bool ZSurvival::OnMovetoPortal(MCommand* pCommand) { char nCurrSectorIndex; unsigned char nCurrRepeatIndex; MUID uidPlayer; pCommand->GetParameter(&nCurrSectorIndex, 0, MPT_CHAR); pCommand->GetParameter(&nCurrRepeatIndex, 1, MPT_UCHAR); pCommand->GetParameter(&uidPlayer, 2, MPT_UID); // 포탈로 이동한 사람이 자신이면 여기서 실제로 다음 섹터로 이동 if (uidPlayer == ZGetGameClient()->GetPlayerUID()) { m_bIsRoundClear = false; ZGetQuest()->GetGameInfo()->ClearNPCKilled(); // 여기서 새로운 섹터로 이동 m_GameInfo.OnMovetoNewSector((int)(nCurrSectorIndex), nCurrRepeatIndex); // 나 새로운 섹터로 왔다고 메시지를 보낸다. ZPostQuestReadyToNewSector(ZGetGameClient()->GetPlayerUID()); // 나를 npc 타겟팅 후보에서 뺀다 ZGetGame()->ExceptCharacterFromNpcTargetting( ZGetGameInterface()->GetMyCharacter()); } else { // 해당 플레이어 이동 ZCharacter *pChar = ZGetCharacterManager()->Find(uidPlayer); if(pChar && m_CharactersGone.find(ZGetGameClient()->GetPlayerUID())==m_CharactersGone.end()) { // 내가 아직 이동하지 않은 경우 해당플레이어를 안보이게 만든다 pChar->SetVisible(false); ZGetEffectManager()->AddReBirthEffect(pChar->GetPosition()); // 해당 플레이어를 npc 타겟팅 후보에서 뺀다 ZGetGame()->ExceptCharacterFromNpcTargetting(pChar); } } // 이 캐릭터를 타겟으로 하는 탄환이 있으면 제거한다 ZGetGame()->m_WeaponManager.DeleteWeaponHasTarget( uidPlayer ); return true; }
void ZSurvival::OnGameDestroy() { if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return; Destroy(); ZGetEffectManager()->EnableDraw(true); ZGetGame()->m_WeaponManager.EnableRender(true); ZGetWorldItemManager()->EnableDraw(true); }
bool ZSurvival::OnSectorStart(MCommand* pCommand) { char nSectorIndex; unsigned char nRepeatIndex; pCommand->GetParameter(&nSectorIndex, 0, MPT_CHAR); pCommand->GetParameter(&nRepeatIndex, 1, MPT_UCHAR); m_bIsRoundClear = false; ZGetQuest()->GetGameInfo()->ClearNPCKilled(); // 만약 섹터가 틀리면 강제로 이동한다. if (m_GameInfo.GetCurrSectorIndex() != nSectorIndex || m_GameInfo.GetCurrRepeatIndex() != nRepeatIndex) { // 새로운 섹터로 이동 m_GameInfo.OnMovetoNewSector((int)nSectorIndex, nRepeatIndex); MoveToNextSector(); } // 모든 사람들을 보여준다. for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { i->second->SetVisible(true); } // npc의 타겟팅 후보 제외 목록을 비운다 ZGetGame()->ClearListExceptionFromNpcTargetting(); // 전 화면에서 남아있을 수 있는 탄을 제거한다 ZGetGame()->m_WeaponManager.Clear(); ZGetWorldItemManager()->Reset(); m_CharactersGone.clear(); // admin hide 이면 다시 옵저버를 활성화 MMatchObjCache* pObjCache = ZGetGameClient()->FindObjCache(ZGetMyUID()); if (pObjCache && pObjCache->CheckFlag(MTD_PlayerFlags_AdminHide)) { ZGetGameInterface()->GetCombatInterface()->SetObserverMode(true); } return true; }
void ZActor::PostBasicInfo() { DWORD nNowTime = GetGlobalTimeMS(); if (GetInitialized() == false) return; if(IsDie() && ZGetGame()->GetTime() - GetDeadTime()>5.f) return; int nMoveTick = (ZGetGameClient()->GetAllowTunneling() == false) ? PEERMOVE_TICK : PEERMOVE_AGENT_TICK; if ((int)(nNowTime - m_nLastTime[ACTOR_LASTTIME_BASICINFO]) >= nMoveTick) { m_nLastTime[ACTOR_LASTTIME_BASICINFO] = nNowTime; ZACTOR_BASICINFO pbi; pbi.fTime = ZGetGame()->GetTime(); pbi.uidNPC = GetUID(); pbi.posx = m_Position.x; pbi.posy = m_Position.y; pbi.posz = m_Position.z; pbi.velx = GetVelocity().x; pbi.vely = GetVelocity().y; pbi.velz = GetVelocity().z; pbi.dirx = GetDirection().x*32000.0f; pbi.diry = GetDirection().y*32000.0f; pbi.dirz = GetDirection().z*32000.0f; pbi.anistate = GetCurrAni(); ZPOSTCMD1(MC_QUEST_PEER_NPC_BASICINFO, MCommandParameterBlob(&pbi,sizeof(ZACTOR_BASICINFO))); ZBasicInfoItem Item; Item.info.position = m_Position; Item.info.direction = GetDirection(); Item.info.velocity = GetVelocity(); Item.fSendTime = Item.fReceivedTime = ZGetGame()->GetTime(); AddToHistory(Item); } }
void ZSurvival::MoveToNextSector() { ZCharacter *pMyChar = ZGetGame()->m_pMyCharacter; pMyChar->InitStatus(); // 새로운 월드로 이동!! ZGetWorldManager()->SetCurrent(m_GameInfo.GetCurrSectorIndex()); // 이번에 이동할 캐릭터의 위치 int nPosIndex = ZGetCharacterManager()->GetCharacterIndex(pMyChar->GetUID(), false); if (nPosIndex < 0) nPosIndex=0; ZMapSpawnData* pSpawnData = ZGetWorld()->GetDesc()->GetSpawnManager()->GetSoloData(nPosIndex); // 새 좌표로 이동 if (pSpawnData!=NULL && pMyChar!=NULL) { pMyChar->SetPosition(pSpawnData->m_Pos); pMyChar->SetDirection(pSpawnData->m_Dir); ZGetEffectManager()->AddReBirthEffect(pSpawnData->m_Pos); } // 유저 캐릭터를 보여주지 않는다 for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { i->second->SetVisible(false); } // 현재 npc, 앞으로 생성될 npc, 이펙트, 탄환 전부 숨긴다 (다음 섹터 시작할때까지) ZGetObjectManager()->GetNPCObjectMap()->SetVisibleAll(false); ZGetObjectManager()->GetNPCObjectMap()->ForceInvisibleNewNpc(true); ZGetEffectManager()->EnableDraw(false); ZGetWorldItemManager()->EnableDraw(false); ZGetGame()->m_WeaponManager.EnableRender(false); // ko수 동기화 ZModule_QuestStatus* pMod = (ZModule_QuestStatus*)pMyChar->GetModule(ZMID_QUESTSTATUS); if (pMod) { int nKills = pMod->GetKills(); ZGetScreenEffectManager()->SetKO(nKills); } }
bool ZMapSpawnManager::IsExistOtherCharacter(rvector pos) { if (ZGetGame() == NULL) return false; bool bExist = false; for (ZCharacterManager::iterator itor = ZGetGame()->m_CharacterManager.begin(); itor != ZGetGame()->m_CharacterManager.end(); ++itor) { if ((*itor).second == ZGetGame()->m_pMyCharacter) continue; rvector dis = pos - ((*itor).second)->GetPosition(); #define SPAWN_DIST 100.f if (Magnitude(dis) < SPAWN_DIST) { bExist = true; break; } } return bExist; }
bool ZGameInput::ShowCombatInputChat() { if( ZGetCombatInterface()->IsShowUI() && !ZGetCombatInterface()->IsShowResult() ) { // UI토글이 켜져 있을때만 채팅토글을 처리해준다. ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); if ((pCombatInterface) && (!pCombatInterface->IsChat()) && !ZGetGame()->IsReplay()) { MWidget* pWidget = ZGetGameInterface()->GetIDLResource()->FindWidget("112Confirm"); if (pWidget && pWidget->IsVisible()) return false; pCombatInterface->EnableInputChat(true); } } return true; }
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; }
bool ZRuleTeamDeathMatch2::OnCommand(MCommand* pCommand) { if (!ZGetGame()) return false; switch (pCommand->GetID()) { case MC_MATCH_GAME_DEAD: { MUID uidAttacker, uidVictim; pCommand->GetParameter(&uidAttacker, 0, MPT_UID); pCommand->GetParameter(&uidVictim, 2, MPT_UID); ZCharacter* pAttacker = ZGetGame()->m_CharacterManager.Find(uidAttacker); ZCharacter* pVictim = ZGetGame()->m_CharacterManager.Find(uidVictim); m_pMatch->AddTeamKills(pVictim->GetTeamID() == MMT_BLUE ? MMT_RED : MMT_BLUE); } break; } return false; }
bool ZEffectDash::Draw(unsigned long int nTime) { ZObject *pTarget = ZGetGame()->m_ObjectManager.GetObject(m_uid); if(pTarget) { ZObserver *pObserver = ZGetGameInterface()->GetCombatInterface()->GetObserver(); if(pObserver->IsVisible()) { rvector pos,dir; pTarget->GetHistory(&pos,&dir,ZGetGame()->GetTime()-pObserver->GetDelay()); m_Pos = pos; } else m_Pos = pTarget->GetPosition(); return ZEffectAniMesh::Draw(nTime); } /* if(m_pObj) { m_Pos = m_pObj->GetPosition(); } return ZEffectSlash::Draw(nTime); */ return false; }
void ZCharacterManager::OutputDebugString_CharacterState() { ZMyCharacter* pMyChar = ZGetGame()->m_pMyCharacter; if(pMyChar) { pMyChar->OutputDebugString_CharacterState(); } for(iterator i = begin(); i!=end(); i++) { ZCharacter* pCharacter = (*i).second; if(pCharacter&& (pCharacter!=pMyChar)) { pCharacter->OutputDebugString_CharacterState(); } } }
void ZCharacterManager::Delete(MUID uid) { iterator itor = find(uid); if (itor != end()) { ZCharacter* pCharacter = (*itor).second; ZGetObjectManager()->Delete((ZObject*)pCharacter); ZGetGame()->m_VisualMeshMgr.Del(pCharacter->m_nVMID.Ref()); delete pCharacter; pCharacter = NULL; erase(itor); } }