|
출처: ◆GTA자료실◆ 원문보기 글쓴이: 밥먹었니
v 1.0 v 1.1 - Eraser 함수기능 향상, 본문내용 오류 수정 v 1.23 - 3차원 배열 사용, 일부 함수 알고리즘 수정, 함수 추가, 본문내용 추가.
그냥 대충 글만 올리니 못쓰시는 분이 있더군요 ㄷㄷㄷㄷㄷㄷ 그래서 자세히 적습니다.
Chatline.inc 란? 채팅창에 쓰일 수 있는 유용한 함수들을 모은 inc 파일 입니다. 잠깐 한눈팔다가 헬프내용이 위로 올라가는 불상사를 겪거나 유저끼리 약속한 내용을 까먹었는데 이미 위로 올라가 사라져버린 경우, 아주 유용하리라 생각됩니다.
사용 방법은? 우선 함수중 일부가 a_samp와 충돌하기에, 충돌되지 않도록 개조된 modified_samp.inc를 올립니다. 해당 파일을 INCLUDE 폴더에 집어넣으시고, chatline.inc를 사용할 pwn 파일에 아래의 수정을 가해주시면 inc파일을 정상적으로 사용할 준비가 된 것입니다. //#include <a_samp> //v1.23 #include <modified_samp> #include <chatline>
함수들은 무엇무엇이 있나? 또 어떻게 써야 하지? 빨간것은 기존함수에 새로 추가된 내용입니다.
* SendClientMessageToAll(color, const message[],bool:ischat=false) -> SendClientMessageToAll 로 채팅내용을 뿌리는 경우, 사용시 맨뒤에 true를 써주시면 채팅말로 취급합니다. 채팅말의 경우 채팅을 듣지 않은 사람에게는 메세지를 전달해 주지 않습니다. * SendClientMessage(playerid, color, const message[]) -> 그냥 쓰던대로만 쓰시면 됩니다. 잠깐 message내용을 가로채서 로그를 기록해둡니다. ** c_SendClientMessageToAll , c_SendClientMessage -> 원래 a_samp에 있던 함수입니다. 이걸로 보낸 내용은 기록해두지 않으니 조심. * LogClientMessage(playerid,const message[]) -> 로그에 기록하는 함수입니다. 임의로 쓸 필요 없이 inc에서 알아서 쓰니 신경쓰지 마세요. * CallBackMessage(playerid) -> 위에 올라가버린 10개의 채팅내용을 다시 불러옵니다. strcmp함수와 병용해서 쓰셔야 합니다. ex) if(strcmp(cmdtext,"/recall",true)==0){ CallBackMessage(playerid); return 1; } * CallBackMessageToAll() -> 위의 내용과 똑같으나 이건 모든 유저를 대상으로 하는 함수입니다. 별 쓸모는 없습니다. * TogglePlayerHearChat(playerid,toggle) -> 프리즈 하는 함수와 사용법이 비슷합니다. toggle에 1을 집어넣으면 채팅 듣기, 0을 집어넣으면 채팅 안듣기입니다. 명령어만 집중적으로 볼때 사용하면 좋으며 이역시 strcmp와 병용하셔야 합니다. --> rcon 메세지류는 필터되지 않습니다. (/pm, /rcon say) * IsPlayerHearChat(playerid) -> 해당 플레이어가 채팅을 듣고 있는지 확인하는 함수입니다. 이역시 어드민의 플레이어 감시용도 외에 별로 쓸일은 없습니다. * SendChatMessage(color,const message[]) -> 위의 SendClientMessageToAll의 맨끝에 true를 붙이면 호출되는 함수입니다. 그냥 직접 이함수를 쓰셔도 됩니다만 위에있는건 귀차니즘을 고려해서 만들었을 뿐입니다. * wiper(...) -> ,을 세퍼레이터로 하여 해당 플레이어들의 채팅창을 청소합니다. ex) wiper(3,7,10,24); -> 3,7,10,24번의 채팅창을 청소합니다. * wiperToAll() -> 위의 함수와 용도는 같으나 모든 플레이어를 대상으로 합니다. * Eraser(lines,...) ------- v1.1 -> 역시 청소하는 함수이나 줄수를 적어 해당 줄만큼만 청소할 수 있습니다. * EraserToAll(lines) -> 위의 함수와 용도는 같으나 모든 플레이어를 대상으로 합니다. * SendAdminMessage(COLOR,text[]) ------ v1.23 -> 서버에 있는 모든 어드민을 찾아 해당 메세지를 보냅니다. * EraserEx(playerid,...) ------ v1.23 -> 해당 플레이어의 특수한 줄만 청소합니다. ex) EraserEx(20,3,6,7); -> 20번 유저의 3번째, 6번째, 7번째 채팅창을 청소합니다. * EraserToAllEx(...) ------ v1.23 -> EraserEx와 같으나 모든 플레이어를 대상으로 합니다.
함수 짜증난다! 그냥 쓰는방법만 알려달라! 1. a_samp 충돌 안나게 인클루드하는 방법은 위에 써두었습니다. 2. OnPlayerText 에서 SendClientMessageToAll로 채팅을 퍼트리는 경우는 그 함수 뒷부분에 #if defined _chatline_included //v1.23 - 본문내용 추가. SendClientMessageToAll(GetPlayerColor(playerid),text,true); #else SendClientMessageToAll(GetPlayerColor(playerid),text); #endif 를 해주시고, 그냥 return 1; 로 채팅을 퍼트리는 경우는 해당 return 위에 #if defined _chatline_included //v1.23 - 본문내용 추가. LogClientMessage(playerid,text); #endif 를 적어주시면 됩니다. * 주의: OnPlayerText를 쓰지 않는 경우는 사용이 불가능합니다. 2. OnPlayerCommandText 에 해당 내용을 추가하세요. 그냥 대충 만든거니 안맞는경우 알아서 개조하세요. #if defined _chatline_included //v1.23 - 본문내용 추가.
if(strcmp(cmdtext,"/recall",true)==0){ CallBackMessage(playerid); return 1; } if(strcmp(cmdtext,"/hear",true)==0) { new tmp[256]; if(IsPlayerHearChat(playerid)) TogglePlayerHearChat(playerid,0); else TogglePlayerHearChat(playerid,1);
format(tmp,256,"*** 지금부터 플레이어 채팅내용을 %s",IsPlayerHearChat(playerid)? "듣습니다":"듣지 않겠습니다"); SendClientMessage(playerid,CHAT_COLOR_GREY,tmp); } if(strcmp(cmdtext,"/cls",true)==0) wiper(playerid); if(strcmp(cmd,"/clearchat",true)==0 && IsPlayerAdmin(playerid)) --------- v1.1 { new tmp[256]; new tmpstr[256]; for(;;) { tmp=strtok(cmdtext,idx); if(!strlen(tmp)) break; if(strval(tmp)==255) { wiperToAll(); SendClientMessage(playerid,CHAT_COLOR_GREY,"*** 모든 플레이어 채팅창을 청소했습니다."); break; } if(!IsPlayerConnected(strval(tmp)) continue; wiper(strval(tmp)); format(tmpstr,256,"*** %d번님의 채팅창을 청소했습니다.",strval(tmp)); SendClientMessage(playerid,CHAT_COLOR_GREY,tmpstr); } return 1; } #endif 이상입니다. 모든 함수를 풀파워로 쓴건 아니고 한 80%만 사용했습니다. 위의 내용을 그대로 배꼇다 가정하고 사용방법은 이렇습니다. /recall : 10칸전 내용을 다시 불러온다. /hear : 플레이어 채팅을 듣는다/듣지 않는다. 도움말만 집중적으로 볼 때 적합하다. /cls : 유저용 채팅창 청소. /clearchat : 어드민용 청소. /clearchat 1 3 4 5 3 이럴시 1,3,4,5,3의 채팅창 청소. 255를 넣을시 모든플레이어 채팅창 청소.
주의할점은 해당 inc를 사용할경우 모드용량이 엄청나게 늘어납니다. 컴파일시간도 왕창 길어집니다. 따라서 모든 chatfile.inc의존 함수에 #if !defined _chatline_included 를 추가해두시고 테스트 컴파일시는 #include <a_samp> //#include <modified_samp> //#include <chatline> 와 같이 처리해두시면 됩니다.
이상입니다. 문제나 태클은 댓글로 ㄱㄱ |