블로그 이미지
텅글, 스팀에서 L4D2 를 즐거하는 유저. L4D2에 대한 잡다한 정보들을 공유하고자 하는 유저로써... 그는 오늘도 스팀의 창작마당과 인터넷을 뒤집니다.

카테고리

이것 저것 요것 (22)
L4D2 플러그인 (6)
L4D2 scripts Addon (1)
L4D2 유용한 정보 (14)
L4D2 [연구실] (0)
Total
Today
Yesterday

최근에 올라온 글

최근에 달린 댓글

글 보관함

[레포데2] Sourcemod 어드민 설정 및 플러그인 넣기

Plugin 넣기 항목에서 확장됨.

 

 Sourcemod 게임들은 Sourcemod의 SourcePawn으로 플러그인을 만들 수 있습니다.

C언어만 알아도 누구나 만들 수 있습니다.

심지어 저도 만들 수 있죠!

 

※주의

이 글은 C언어를 약간이라도 안다는 것을 전제로한 글이며,

소스모드 플러그인을 만들고자 하는 사람을 위해 제가 생각하는 필요한 준비과정을 기록한 게시글입니다.

또한 글쓴이는 전문가가 아닙니다. 잘못된 정보가 있을 수 있습니다.

 

더보기
필수 사이트


Sourcemod 개발 시, 매우 많이 접속하게 될 사이트 입니다. 이를 통해 원활히 개발할 수 있습니다.

1. Sourcemod API: https://sm.alliedmods.net/new-api/
> 검색을 통해 소스모드에 존재하는 함수들의 기능 및 규칙을 알 수 있는 사이트입니다.

2. L4D2 Event 목록:
https://wiki.alliedmods.net/Left_4_Dead_2_Events

> L4D2 게임 내부에 존재하는 이벤트들을 알 수 있는 사이트입니다.

3. Alliedmodders Wiki:
https://wiki.alliedmods.net/Main_Page
> 소스폰 언어의 정보를 검색하는 사이트입니다.

4. Valve Developer Community: https://developer.valvesoftware.com/wiki/Main_Page
> 소스게임의 정보를 검색하는 사이트입니다.

5. VTavle Dumper: https://asherkin.github.io/vtable/
> 소스게임의 바이너리를 검색하는 사이트입니다.(?)

6. Sourcemod DownLoad: https://www.sourcemod.net/downloads.php?branch=stable
> 최신 Sourcemod를 다운받는 대표사이트입니다.

 

더보기
노트++ & Sourcemod


Sourcemod 개발 시, 쓰는 프로그램은 노트++로 충분하죠.
다만 노트++에 sourcemod 전용 문장 규칙 적용 방법과,  노트++ 사용방법을 안다면 더더욱 원활히 개발이 쉬워지죠.


1. 노트++가 깔린 내부 경로에 'sourcemod.xml' 을 넣습니다.

*/notepad++/plugins/APIs/sourcemod.xml (구버전)
*/notepad++/autoCompletion/sourcemod.xml (최신버전)



2. 다음 이미지와 같이 가져오기를 통해 'userDefineLang.xml' 적용시킵니다. 그 후 노트++을 다시 시작하면 적용된걸 볼 수 있습니다.

012


그 외 노트++내에서 컴파일하는 기능은 제가 해봤지만 별로 쓰이지 않으것 같으니, 필요한 분만 참조링크를 통해 적용하시기 바랍니다.

 

더보기
Sourcemod 폴더의 목적

 


Sourcemod 개발 시 폴더의 사용목적을 알아두면 파일정리 및 유지보수가 쉬워집니다.
제가 보기엔 보통은 이렇게 쓰이는것으로 보입니다.


1. bin: Sourcemod의 라이브러리가 있는 곳.
2. configs: Sourcemod 옵션을 설정하는 문서가 있는 곳.(예: Admin, mysql)
3. data: 특정 플러그인이 읽어들일 문서를 넣는 곳.
4. extension: Sourcemod 특정 게임의 확장 라이브러리를 넣는 곳.
5. gamedata: 특정 플러그인이 사용하는 시그니처 및 시리얼넘버를 넣는 곳.
6. logs: 서버의 로그가 저장되는 곳.
7. plugins: 플러그인 넣는 곳. 폴더를 추가해 분류가능.
8. scripting: 플러그인 소스코드인 sp파일을 두는곳, 컴파일 및 include 파일들이 존재.
9. translations: 특정 플러그인에서 사용하는 자막파일을 넣는 곳.




 

더보기
플러그인 컴파일

 

Sourcemod를 이용해 sp플러그인로 컴파일하는 방법입니다. 사진을 보면,
"scripting\" 에서 컴파일 또는 "scripting\abcd" 내부에 compile.exe와 spcomp.exe를 복붙하고 컴파일해도 가능합니다.
컴파일 후,  자동 생성되는 폴더이름은 compile로 동일합니다. (.dat는 무시할 것)

012

 

 

더보기

 

Sourcemod 플러그인 구조

 

제가 본 Sourcemod의 소스코드는 크게 [포함선언, 변수선언, 함수] 같은 맥락으로 이루어져 있다고 봅니다.
해당 코드는 맵시작 할 때, 플러그인이 시작될 때,  무기를 발사할 때 특정 로그 메시지를 출력합니다. 

//======== 정의 ========//
#define VERSION "0.0"

//======== 포함파일 선언 ========//
#include <sourcemod>
//#include <sdktools>
//#include <left4dhooks>

//======== 변수 선언 ========// 
bool g_bSwitch;

//======== Functions ========// 
// 해당 플러그인 정보. 없어도 됨.
public Plugin:myinfo =
{
	name = "My Plugin",
	author = "me",
	description = "Test Plugin.",
	version = VERSION
};

// 해당 플러그인이 시작될때 콜되는 함수.
public OnPluginStart()
{	
	g_bSwitch = !g_bSwitch;
	LogMessage("My Plugin OnPluginStart. [%b]", g_bSwitch); // 로그로 해당 메세지를 출력합니다.
	
	// 특정 이벤트 후크. Sourcemod API 참고.
	HookEventEx("weapon_fire", Event_WeaponFire, EventHookMode_Pre); 
}

// 맵이 시작될때.
public OnMapStart()
{
	g_bSwitch = !g_bSwitch;
	LogMessage("My Plugin OnMapStart. [%b]", g_bSwitch);
}

// (weapon_fire) 무기 발사 이벤트 함수. 자세한 정보는 이벤트 함수 사이트 참고.
Action Event_WeaponFire(Event hEvent, const char[] event_name, bool bDontBroadcast)
{
	int client = GetClientOfUserId( hEvent.GetInt("userid") );  // 해당 이벤트에 존재하는 userid 값을 저장.
	if( !IsFakeClient(client) ) // 해당 유저가 봇이 아닌가?
	{
		LogMessage("[%N] %s.", client, event_name); // 아니라면, 해당 유저의 이름과 해당 이벤트의 이름을 로그로 출력.
	}
	return Plugin_Continue;
}

 


 

플러그인 컴파일 Error & warning

 

컴파일시 Error, warning은 매우 다양한 상황에서 발생합니다.
주로 Error는 문법이 잘못된것이며, Warning은 치명적이진 않으나 최적화에 초점이 맞춰져있는 것으로 보입니다.
만약 여러 Error중 다음과 같은 Error문장이 발생할때,
"경로\*.sp(46)"은 해당 플러그인 소스코드의 몇번째 줄에 유효하지 않은 함수 또는 선언이 있으므로 문제가 있다는걸 의미합니다.
이 경우 46번줄을 문제해결 후, 재컴파일 해야합니다. 

01

 

더보기
여담

 

부족한 지식이지만, 과거 Sourcemod라는 것을 이용해 플러그인을 만들고 싶어한 기억이 떠올라 끄적여봤습니다.
유튜브에도 Sourcemod의 대한 강의가 있지만 프로그래밍은 역시 직접해봐야 늘기에.. 공부방법의 추천이라면,
제가 했던 방법으로 남들이 만들어 놓은 간단한 플러그인 소스코드를 가지고 분석하는 것이였습니다.

그 중 어떠한 플러그인들은 오래되어 구문법을 쓰기 때문에 그대로 카피하는것 보단, 되도록이면 신문법을 익히면서 배우는걸 추천드립니다. 예는 다음과 같으며, 다음 링크에서 구문들을 자세히 확인하실 수 있습니다.
(https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax)

// 같음
decl String:name[128];
new String:name[128];
char name[128]; // 이걸 씀

// 같음
new integer[4];
int integer[4]; // 이걸 씀

// 같음
new Float:flo[2];
float flo[2]; // 이걸 씀

public Action Event_WeaponFire(Event hEvent, const char[] event_name, bool bDontBroadcast)
{
	int client_a = GetClientOfUserId( GetEventInt(hEvent, "userid", -1) );
    int client_b = GetClientOfUserId( hEvent.GetInt("userid") );
    // 쓰는게 다르나, client_a 와 client_b 값은 같다
}
....


아마 글 몇개 더 쓸지도..

 

Posted by Riotshield
, |