Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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();

	}

}
Exemplo n.º 3
0
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);
			}
		}
	}
}
Exemplo n.º 4
0
float ZMapDesc::GetThisTime()
{
	if(ZGetGame())//게임중이면
		return ZGetGame()->GetTime();

	float _time = (timeGetTime()-m_StartTime)/1000.f;
	return _time;
}
Exemplo n.º 5
0
bool ZSurvival::OnPeerNPCAttackMelee(MCommand* pCommand)
{
	MUID uidOwner;
	pCommand->GetParameter(&uidOwner,	0, MPT_UID);

	ZGetGame()->OnPeerShot_Melee(uidOwner,ZGetGame()->GetTime());

	return true;
}
Exemplo n.º 6
0
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);
	}
}
Exemplo n.º 9
0
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);
			}
		}
	}
}
Exemplo n.º 10
0
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());
	}

}
Exemplo n.º 11
0
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;
}
Exemplo n.º 12
0
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);

}
Exemplo n.º 13
0
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;
}
Exemplo n.º 14
0
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;
}
Exemplo n.º 15
0
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;
}
Exemplo n.º 16
0
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;
}
Exemplo n.º 17
0
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 );
        }
    }
}
Exemplo n.º 19
0
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;
}
Exemplo n.º 20
0
void ZSurvival::OnGameDestroy()
{
	if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return;

	Destroy();
	
	ZGetEffectManager()->EnableDraw(true);
	ZGetGame()->m_WeaponManager.EnableRender(true);
	ZGetWorldItemManager()->EnableDraw(true);
}
Exemplo n.º 21
0
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;
}
Exemplo n.º 22
0
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);
	}
}
Exemplo n.º 23
0
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);
	}
}
Exemplo n.º 24
0
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;
}
Exemplo n.º 25
0
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;
}
Exemplo n.º 26
0
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;
}
Exemplo n.º 27
0
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;
}
Exemplo n.º 28
0
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;
}
Exemplo n.º 29
0
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();
		}
	}
}
Exemplo n.º 30
0
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);
	}
}