LOGIN • JOININ

EVENT OBJECT

[Tutorials/[Server] 2. Event system/Tutorial_Event01_EventObject]


1... 단일 실행 이벤트 예제 (CGEvent::Object::COnce)

정해진 시간에 단 1번만 실행되는 이벤트 객체입니다.

class CEventOnce : public CGEvent::Object::COnce
{
	virtual	bool ProcessEvent(_In_ const TIME::SYSTEM::POINT& /*_Time*/) override
	{
		printf("Event1(CGEvent::Object::COnce)이 실행되었습니다.\n");
		return true;
	}
};

‘CGEvent::Object::COnce’를 상속받아 CeventOnce 이벤트 클래스를 정의해 ProcessEvent 함수를 재정의 했습니다. 

// 1) Event객체를 생성한다.
auto	pEvent1	 = NEW<CEventOnce>();

// 2) 실행할 시간을 설정한다.(현재시간으로부터 7초후로 한다.)
pEvent1->SetEventTime(TIME::SYSTEM::NOW()+TIME::seconds(7));

// 3) Event를 등록한다.
pEvent1->Register();

1) ’ CEventOnce’클래스 객체를 생성합니다.

2) 실행할 시간을 정의한다. ‘현재시간+ 7시간’으로 정의했습니다

3) Event를 등록합니다. 



2... 시작과 끝에 실행하는 이벤트 예제(CGEvent::Object::CStartEnd)

예를 들어 6시에서 9시까지 경험치 2배 이벤트를 실현한다고 하면 6시에 경험치량을 2배로 올려주도록 서버 설정을 변경시켜주어야 합니다. 그리고 9시에 서버 설정을 다시 원상 복구 시켜주어야 합니다. 이렇게 시작과 끝에 각각 특정 실행을 해줘야 하는 이벤트일 경우 ‘CGEvent::Object::CStartEnd’ 클래스를 상속받아 사용하면 편리합니다.

class CEventStartEnd : public CGEvent::Object::CStartEnd
{
	virtual	bool ProcessEventStart(_In_ const TIME::SYSTEM::POINT& /*_Time*/)
	{
		printf("Event2(CGEvent::Object::CStartEnd)이 시작되었습니다.\n"); return true;
	}

	virtual	bool ProcessEventEnd(_In_ const TIME::SYSTEM::POINT& /*_Time*/)
	{
		printf("Event2(CGEvent::Object::CStartEnd)이 종료되었습니다.\n"); return true;
	}
};

1) ‘CGEvent::Object::CStartEnd’클래스를 상속 ‘CEventStartEnd’를 정의했습니다.

2) ‘ProcessEventStart’함수와 ‘ProcessEventEnd’함수를 재정의했습니다.

3) ‘ProcessEventStart’함수는 시작시간에 호출될 함수이며 ‘ProcessEventEnd’함수는 종료시간에 호출될 함수입니다.


// 1) Event객체를 생성한다.
auto	pEvent2	 = NEW<CEventStartEnd>();

// 2) 시작시간을 설정한다. (현재로부터 5초후)
pEvent2->SetEventStartTime(TIME::SYSTEM::NOW()+TIME::seconds(5));

// 3) 종료시간을 설정한다. (현재로부터 20초후)
pEvent2->SetEventEndTime(TIME::SYSTEM::NOW()+TIME::seconds(20));

// 4) Event를 등록한다.
pEvent2->Register();

1) ‘CEventStartEnd’ 객체를 생성했습니다. 

2) 시작 시간을 설정했습니다. (현재부터 5초) 

3) 종료 시간을 설정했습니다. (현재 시간으로부터 20초) 

4) 등록한다. 



3... 일정 간격마다 실행되는 이벤트 예제(CGEvent::Object::CIteration)

‘CGEvent::Object::CIteration’를 사용해 일정 시간마다 실행되는 이벤트를 손쉽게 만들수 있습니다.

(예를 들어 30분마다 리젠되는 몹, 혹은 매시간 20분에 실행되는 이벤트)

class CEventIteration : public CGEvent::Object::CIteration
{
	virtual	bool ProcessEventIteration(_In_ const TIME::SYSTEM::POINT& /*_Time*/)
	{
		printf("Event4(CGEvent::Object::CIteration)이 진행중입니다.\n"); 
		return true;
	}
};

여기서는 매시간 28분마다 실행되는 이벤트에 대한 예제입니다. 일단 ‘CGEvent::Object::CIteration’ 클래스를 상속받아 ‘ProcessEventIteration’ 함수를 재정의 했다 ‘ProcessEventIteration’함수는 일정시간마다 실행될 함수입니다.

// 1) Event객체를 생성한다.
auto	pEvent4	 = NEW<CEventIteration>();

// 2) 매시간 28분에 실행한다.
pEvent4->SetInterval(TIME::hours(1));
pEvent4->SetNextTime(TIME::SYSTEM::FUTURE(-1, -1, -1, 28));

// 3) Event를 등록한다.
pEvent4->Register();

1) ‘CEventIteration’클래스 객체를 생성했습니다.

2) 매시간 마다 실행되도록 하기 위해 실행 간격을 1시간으로 설정했습니다.

3) 최초 실행시간의 설정은 현재 현재시간 기준 다음 28분으로 설정했습니다.

4) 등록합니다.



4... 클래스 정의 없이 사용하기

앞에서의 예제들은 클래스를 재정의해서 만들었습니다. 하지만 매번 클래스를 재정의 할 필요 없이 호출가능한(Callable) 객체들(람다 (Lambda)함수, 정적함수, bind객체)를 사용해 구현할 수도 있습니다. 위에서 보여진 예제인 COnce, CStartEnd, CIteration, CStratEndIteration 모두 가능합니다.

CIteration을 람다 함수로 구현한 예제를 보자면

// 1) Event객체를 생성한다.
auto	pEvent4	 = NEW<CGEvent::Object::CIterationFunction<>>();

// 2) 매시간 28분에 실행한다.
pEvent4->SetInterval(TIME::hours(1));
pEvent4->SetNextTime(TIME::SYSTEM::FUTURE(-1, -1, -1, 28));

// 3) 실행할 함수를 설정한다.
pEvent4->SetIterationFunction([](const TIME::SYSTEM::POINT& /*_Time*/)
{
	printf("Event4(CGEvent::Object::CIteration)이 진행중입니다.\n");
	return true;
});

// 4) Event를 등록한다.
pEvent4->Register();

1) ‘CGEvent::Object::CIterationFunction<T>’ 클래스 객체를 생성했습니다. 

2) 실행간격과 실행시간을 설정합니다. 

3) 실행할 함수를 설정했습니다. (이 부분만 차이가 있다.) 

4) 등록합니다.