SpecialMove
GoW2 에서 SpecialMove 방식에 대해 설명한다.
함수
Pawn (GearPawn)
PlayerController (GearPC)
DoSpecialMove( … )
EndSpecialMove()
ClientToServerDoSpecialMove( … )
Server 함수
Server 에 있는 자신의 Pawn 에게 SpecialMove 를 수행하도록 한다. (이 과정에서 자신이 아닌 다른 Client 들에게 복제하라는 의도도 포함되어 있다.)
caller 가 Client 인 경우 그 Client 는 local 에서 SM 을 별도로 수행해야 한다.
caller 가 Server 인 경우는 없어야 한다. 한가지 예외가 있는데 caller 가 Server 함수이고 그 함수의 caller 가 Client 인 경우이다. 이 때에는 주인인 Client 를 제외하고 나머지에게 복제하려는 의도로 사용된다. (무언가 오류를 바로잡기 위해.. GearPlayerController:RoadieServerMove 를 참조. 여기에서만 사용된다.)
ServerToClientDoSpecialMove( … )
ServerDicateSpecialMove( … )
(반드시) Server 에서 SM 을 시작하기 위한 함수
caller 가 Server 인 녀석에 대해서 복제가 고려되어 있는 함수
caller 가 Client 일 수는 없다!!
caller 가 Server 인 경우 local 에서 SM 을 수행하고 그로인해 자동으로 다른 Client 들에게 복제된다.
Pawn.ServerEndSpecialMove 와 시나리오가 비슷하다.
정책
SpecialMove 사이의 연결
SM 에서 다른 SM 으로 연결하는 방식은 크게 두가지가 있다. 편의상 기존 SM 을 OldSM, 새로운 SM 을 NewSM 이라 칭하겠다.
이 두가지 방식을 정의하는 것은 GearSpecialMove 클래스의 CanOverrideMoveWith, CanOverrideSpecialMove, CanChainMove 함수를 구현함으로써 가능하다.
CanOverrideMoveWith 는 OldSM 에서 정의하며, 파라메터로 들어오는 NewSM 로 대체 (override) 해도 괜찮은지를 정의한다.
CanOverrideSpecialMove 는 NewSM 에서 정의하며, 파라메터로 들어오는 OldSM 을 이것으로 대체 (override) 해도 괜찮은지를 정의한다.
CanChainMove 는 OldSM 에서 정의하며, 파라메터로 들어오는 NewSM 을 이어서 수행 (pending) 할지를 정의한다.
그리고 override 를 우선적으로 검사하고 만족하지 못할 경우에 pending 을 검사한다.
이에 관한 로직은 GearPawn::DoSpecialMove 에서 참조할 수 있다.