본문 바로가기
프로그래밍/Pawn

[PAWN/SAMP] 팀채팅 구현하기

by 알용 2012. 4. 15.
반응형

머리말

팀데스매치 모드를 제작하다보면 꼭 필요한 기능 중의 하나가 바로 팀채팅이다.
하지만, 많은 모드메이커들이 팀채팅 기능의 원리를 쉽게 파악하지 못한다.
흔히들 만만하고 익숙한 명령어로 </tchat A사이트!>와 같이 구현하곤 하는데 긴급한 상황에서 언제 명령어를 다 치고 있는가.
OnPlayerText 콜백함수를 이용해 간편하고 빠르게 사용할 수 있는 팀채팅 기능을 구현해보겠다.


머리말에서 소개했듯이 이 스크립트의 핵심은 바로 OnPlayerText 콜백이다.

OnPlayerText 는 플레이어가 말을 입력했을 때(채팅) 호출되는 콜백인데 아래와 같이 구현할 것이다.

예를 들어 팀원에게 "뒤로 빠져!" 라는 메시지를 보내고 싶거든 채팅창에

@뒤로 빠져!

라고 입력하면 되는데 전체채팅인지 팀채팅인지 구분하는 기호가 바로 맨 앞에 붙은 '@' 이다.

굳이 '@' 를 써야 하느냐, 그건 아니다.

#뒤로 빠져! 든 $뒤로 빠져! 든 본인이 편한 기호에 맞추어 코딩하면 된다.

코드를 소개한다.


  1. public OnPlayerText(playerid, text[])
  2. {
  3.         if( text[0] == '@' )
  4.         {
  5.                 if( strlen(text) == 1 )
  6.                         SendClientMessage(playerid, 0x99FFCCAA, "[힌트] @할말");
  7.                 else
  8.                 {
  9.                         new string[128];
  10.                         text[0] = ' ';
  11.                         format(string, sizeof(string), "[Team Chat] %s : %s", PlayerName(playerid), text);
  12.                         SendTeamMessage(GetPlayerTeam(playerid), 0x99934EFA, string);
  13.                 }
  14.                 return 0;
  15.         }
  16.         return 1;
  17. }


각 line 에 따른 주석을 밑에 달도록 하겠다.

1. 플레이어가 채팅을 했을 때 호출되는 콜백이고, 플레이어 번호와 입력한 문자열을 매개변수로 가져온다.
3. 플레이어가 입력한 말의 첫 문자가 @ 일 때의 조건문이다.
5. 문자열의 길이가 1일 때, 즉 플레이어가 @ 하나만 입력했을 경우인데 이 때는 메시지를 보내 팀채팅의 사용법을 알려준다.
9. 플레이어의 이름, 채팅 내용등을 저장할 변수이다.
10. 팀채팅을 하기 위해 사용했던 @ 문자는 제거해준다.
11. 플레이어의 이름과 입력한 말을 string 변수에 저장하고 있다.
     예를 들어 플레이어 이름이 Bob 이고 입력한 말이 "안녕" 이라면 Bob과 같은 팀의 소속원들에게는
     [Team Chat] Bob : 안녕
     이라고 메시지가 전달되게 된다.
12. 플레이어와 같은 팀에게 메시지를 전달하는 함수인데 사용자 정의 함수이므로 각자 환경에 맞게 제작해야 한다. 

반응형