Syncope.T-*
728x90

tf2_msg.sp


저번에 썼던 걸 이어서 바로 해보죠 오늘은 자료를 올려두도록 하겠습니다 제가 만든 플러그인인데요 TF2전용이지만 뭐 다 사용가능할겁니다

이걸 예제로 삼아서 이 글을 읽어보시면 충분할겁니다.

// Command_say 의 후크 이벤트

public Action:Command_say(Client, args)
{

new String:Msg[256];
GetCmdArgString(Msg, sizeof(Msg));
Msg[strlen(Msg)-1] = '\0';

if(StrEqual(Msg[1], "!명령어", false))
{
Command_Menu(Client);
}
if(StrEqual(Msg[1], "!공지", false))
{
Command_Notice(Client);
}
}

Msg 란 변수에 실수 데이터 값을 저장했군요 sizeof는 자동 변환 장치라고 보시면됩니다. C언어에 포함된 내용이죠? 그 뭐랄까.. 이미지 포맷 변환 같은걸로 생각 해 두시면 되겠습니다 아규먼트 즉 인자를 전달받는 변수로 바꾼거죠.

그리고 그 밑으론 명령어를 입력받는 것으로 나타내어집니다 커맨드 활용방법은 저걸 보는것만으로도 알아서 하실수 있을거라 봅니다.

' false가 왜 들어가냐고 질문하시는 분들이 있을까봐 올립니다. False란 중복 방지가 안되게 해 놓은건데. 간혹 ES애서 이런걸 보실수 있을겁니다 중복으로 떠서 밑에 [Pending 중복숫자] 중복이 돼서 그 팝업을 끝내고나서도 그 중복숫자만큼 더 뜨죠. 그걸 방지 해주는게 바로 이 False 입니다 true로 바꾸면 당연히 반대로 되겠죠

자 이제 Menu 로 가봅시다 제가 정한 이벤트 이동은 Command_Menu 이군요.

' 왜 정할 이벤트 명 뒤에 (Client) 를 붙이느냐? 라는 질문에 답변을 하자면 이 Command_say 라는 후크 이벤트 안에 이미 Client 란 유저아이디가 잡혀있으니깐 Getuserid로 새로 잡을 필요가 없어 바로 유저아이디를 편하게 전달 하자는 겁니다. 뭐 이해 안되셔도 하다보면 이해가 가실겁니다

일단 이해했다고 치고 다음으로 넘어 가 봅시다.

' 여긴 Command_Menu 란 새로 만들어준 이벤트죠? 다들 아시고 게셨겠지만 ;;

public Command_Menu(Client)
{
new Handle:Panel = CreatePanel();
SetPanelTitle(Panel, "「오리 서버 명령어」");
DrawPanelText(Panel, "랭크: !rank,!top,!session");
DrawPanelText(Panel, "샷건: !shotgun");
DrawPanelText(Panel, "기록: !기록,!개인기록");
DrawPanelText(Panel, "트레일: !트레일켜기,!트레일끄기");
DrawPanelText(Panel, "음악: !노래");
DrawPanelText(Panel, "도박: !도박,rtd");
DrawPanelText(Panel, "공지사항: motd");
DrawPanelText(Panel, "Made By Duck");
DrawPanelItem(Panel, "닫기");
SendPanelToClient(Panel, Client, Panel_Info, 30);

CloseHandle(Panel);
}

' new Handle:Panel = CreatePanel(); 이 구문은 팝업 메뉴 패널을 만들어줄 핸들을 새로 만들어주는건데요. 핸들이라는 건 간단히 말해서 팝업 메뉴를 다룰수 있기위해 만들어주는 상수만을 취급하는 변수라고 보셔도 상관없습니다. 여기선 팝업메뉴를 패널이라고 부릅니다. 창이란 뜻으로 생각하셔도 좋습니다. 구문을 외울 필요는 없습니다. API에 다 있으니깐요. 그리고 밑으로 SetPanelTitle 로 패널의 타이틀을 정하는것과 DrawPanelText 로 Addline을 만들어 주는걸 볼 수 있습니다.

마지막엔 SendPanelToClient 라고 보이는데요 버튼 선택입니다. Text 제일 위에것부터 1번 2번 이렇게 나가는게 아니라 새로 제일밑으로 1번 2 번 만들어주는겁니다. Text는 그저 하얀 글씨의 줄 일 뿐이죠 Item 이란게 버튼을 만들어줍니다 번호를 생성해 주죠 그래서 1. 닫기 로 표시됩니다. 그 밑엔 핸들을 닫아주는 CloseHandle(변수이름); 이 보이는군요 Panel_Info 이벤트로 가 봅시다 그 옆에 있는 숫자는 열려질 시간입니다.

// Panel Info
public Panel_Info(Handle:Menu, MenuAction:Click, Parameter1, Parameter2)
{
//Nothing
new Handle:Panel = CreatePanel();

if(Click == MenuAction_Select)
{
// Nothing
}
CloseHandle(Panel);
}

' 여기선 버튼이 하나도 없는걸 발견하실수 있습니다 처음에 보신 분들이라면 어? 왜이러지 라고 의문을 던질수 있는데 그저 닫기라서 아무것도 넣지 않았습니다. 좀있다 버튼 넣는걸 따로 적어드리겠습니다. 자 봅시다. //nothing 이라고 주석을 달고 밑엔 그저 핸들을 닫게 해 놨군요 허전합니다. 하하.

public Command_Notice(Client)
{
new Handle:Panel = CreatePanel();
SetPanelTitle(Panel, "「오리 서버 공지사항」");
DrawPanelText(Panel, "레벨 모드 추가여");
DrawPanelText(Panel, "레벨x0.1 - 데미지 x 데미지레벨");
DrawPanelText(Panel, "비매너 관리부문 어드민 추가");
DrawPanelText(Panel, "주인장 : D_Duck");
DrawPanelText(Panel, "노는 어드민: Brave");
DrawPanelText(Panel, "비매너 관리자: 후니");
DrawPanelText(Panel, "Made By Duck");
DrawPanelItem(Panel, "닫기");
SendPanelToClient(Panel, Client, Panel_Info, 30);

CloseHandle(Panel);
}

' 요건 그냥 장식품.

자 버튼을 설명해야겠죠? 다음의 예문을 잘 보시면 됩니다.

이 이벤트를 Panel_info 로 생각 해 주 세요

Parameter 란 것은 파라미터 라는건데요. parameter1 은 버튼을 누른 사람의 유저아이디를 받아오는데 쓸것이고

파라미터2 는 버튼을 눌른 번호를 받아 와 줄것입니다. 자 예제를 따라 가 봅시다

public Panel_Info(Handle:Menu, MenuAction:Click, Parameter1, Parameter2)
{
new Handle:Panel = CreatePanel();
new Client = Parameter1;

if(Click == MenuAction_Select)
{
if(Parameter2 == 1)
{
// printtochatall 할말
}
if(Parameter2 == 8)
{
Command_MusicMenu2(Client);
}
CloseHandle(Panel);
}
}

' 새로운 패널을 만들어주고 나서 Client 란 C가 대문자란 변수를 Parameter1로 새로 생성 해 주었군요. 왜냐하면 전에 있던 이벤트에서 Client를 받아오지도 않았고 받아 와서도 안되는겁니다. 그 밑엔 if 조건문으로 If(Parameter2 == 1) 하면서 버튼이 1번일때 라는 예식을 세워줍니다. 8번은 닫기로 만들어놧군요 CloseHandle은 항상 마지막 if를 벗어나서 써 줍시다. 음... return 이라고 생각 해 주셔도 상관없습니다.

그럼 끝.

 


profile

Syncope.T-*

@Syncope

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...