Voxel Horizon – 소유영역 처리

한참 복셀을 편집중인데 어떤놈이 와서 내가 쌓은 복셀조각을 파괴하거나 내가 복셀을 배치하려는 영역에다 지가 복셀을 쌓거나 하면 곤란하다.
그래서 그 방지대책을 세웠다.

1. owner가 설정되지 않은 복셀 오브젝트(4m x 4m x 4m)영역에 대해 한개의 복셀이라도 추가하면 행위자의 계정 serial이 owner serial로 등록된다.

2. owner serial이 등록된 오브젝트 영역에 대해서 다른 플레이어들은 일체의 편집행위를 할수 없다.

3. 여기저기 돌아다니면서 복셀 하나씩 배치하며 이른바 알박기를 하면 곤란하다. 이 또한 막아야 한다.

4. 그래서 계정당 편집 영역은 32m(w) x 256m(h) x 32m(d) 로 제한된다.

5. 새로 배치하는 복셀이 이전에 배치한 복셀들의 영역과 합쳐져서 32m x 256m x 32m를 넘길 경우 복셀 배치는 거부된다.

여기까지 서버에서 다 구현해놨고 테스트는 충분히 했다고 생각한다. 그런데 최근에 테스트 버전을 릴리즈 하면서 계속 신경이 쓰였다.

예를 들어보자. 어느 플레이어가 한참 복셀을 쌓다보니 최대 영역을 넘겨버렸고 그래서 서버는 복셀 추가를 거부하는 상황이다.
새로운 복셀을 추가하려면 기존에 쌓은 복셀들 일부를 제거해서 새로운 영역을 구축할 수 있게 해줘야한다. 아마도 현재 위치에서 가장 먼 복셀일것이다.
그런데 복셀을 여기저기 흩뿌리듯 배치를 해놔서 어떤 복셀을 제거해야 지금 당장 이 위치에 복셀을 배치할 수 있는지 모르겠다면?
혹은 어딘지 안다해도 32m나 뛰어가서 제거하고 오는게 너무 귀찮을수도 있다.

일단 생각할 수 있는 방법은 다음과 같다(난 이 방식이 너무 과다하게 친절하다고 생각한다).

– 너님이 현재까지 찍은 복셀들의 영역은 이만큼이고-> 그래픽으로 렌더링,
– 너님이 찍은 복셀오브젝트들은 이놈들이고 -> 그래픽으로 렌더링,
– ‘이중에 어느 복셀 오브젝트를 제거하면 지금 이 위치에 복셀을 배치할 수 있다’라고 보여주고 그 자리에서 선택할 수 있게 해줘야할 것이다.

그런데 이렇게 구현하려면 작업할게 너무 많다. UI 노가다만 해도 장난 아니고 영역렌더링, 플레이어가 소유하고 있는 복셀오브젝트를 특정짓는 렌더링, 제거할 오브젝트를 선택하는 방법 등등….
이렇게까지 해야하나?

그래서 일단은 실제로 구현은 다음과 같이 했다.

32m x 256m x 32m 영역 바깥의 위치에 새로운 복셀을 추가하려 할 경우

  1. 서버에서 거부. 클라이언트에 실패 통보.
  2.  클라이언트에서 에러메시지 출력.
  3. CTRL키를 누르고 복셀을 추가할 경우 새로운 좌표(복셀 추가를 요청한 위치)를 기준으로 소유영역을 갱신함. 당연히 플레이어는 영역 바깥의 복셀들에 대해선 소유권을 잃는다.
  4. “CTRL키를 누르고 복셀을 추가하면 새로운 복셀을 추가할 수 있습니다. 이 경우 당신의 소유영역은 현재 위치를 기준으로 갱신됩니다. 또한 소유영역 바깥의 복셀들은 더 이상 당신의 소유가 아닙니다. 따라서 다른 플레이어들이 소유영역 바깥의 복셀들을 편집할 수 있습니다.” – 라고 메시지 출력을 해야되는데 이건 귀찮아서 아직 처리 안했다.
  5. 소유영역이 갱신될때마다 클라이언트에 갱신된 소유영역의 정보를 보내줌. 클라이언트는 화면에 선으로 이루어진 박스를 렌더링.

 


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중