티거의 개발 공간



마감되었습니다 :)


약 2년전에 이 블로그를 개설하기 위해서 초대장을 받으려고 여러 티스토리 블로거분들을 찾아서 댓글을 썼던게 기억에 남네요.

티스토리 블로그는 다른 블로그와는 다르게 초대장이 있어야만 개설이 가능해요.


과거에 받았던 티스토리 초대장 중에 2장이 남았더라구요. 굉장히 적은 양이지만,

티스토리 블로그로 이전하시고 싶으신 분들이나, 새롭게 티스토리에서 블로그를 시작하시고 싶으신 분들에게 배포하려고합니다.


초대장이 필요하신 분들은 댓글로 자신의 이메일 주소, 어떤 블로그를 개설할 것인지 적어주시면 2명에게 1장씩 전달해 드리겠습니다.


감사합니다

서버



위는 압축파일을 풀면 볼 수 있는 내용물입니다.

각 메모리 할당량에 따른 버킷으로 나뉘어 있으며, 자신이 원하는 할당량을 선택해 서버를 열 수 있습니다.



서버가 정상적으로 열리면 버킷 창에 위와 같은 문구가 나타납니다.

한 번 서버를 연 후에 같은 폴더에 'server.properties' 라는 파일이 생깁니다.

이 'server.properties' 라는 파일은 워드패드를 이용해 열어주시면 됩니다.



그럼 위와 같은 내용이 나타날 것이고, 한글로 설명을 적어놓은 것은 필자가 설명을 위해 추가한 내용입니다.


다운로드



1.11.2.z01

1.11.2.zip


위의 파일은 분할 압축으로 같은 폴더에 모두 다운로드 받아놓고 1.11.2.zip 파일을 열어 압축을 풀어 주셔야합니다!


서버



위는 압축파일을 풀면 볼 수 있는 내용물입니다.

각 메모리 할당량에 따른 버킷으로 나뉘어 있으며, 자신이 원하는 할당량을 선택해 서버를 열 수 있습니다.



서버가 정상적으로 열리면 버킷 창에 위와 같은 문구가 나타납니다.

한 번 서버를 연 후에 같은 폴더에 'server.properties' 라는 파일이 생깁니다.

이 'server.properties' 라는 파일은 워드패드를 이용해 열어주시면 됩니다.



그럼 위와 같은 내용이 나타날 것이고, 한글로 설명을 적어놓은 것은 필자가 설명을 위해 추가한 내용입니다.


다운로드


1.10.2.z01

1.10.2.zip



위의 파일은 분할 압축으로 같은 폴더에 모두 다운로드 받아놓고 1.10.2.zip 파일을 열어 압축을 풀어 주셔야합니다!


서버



위는 압축파일을 풀면 볼 수 있는 내용물입니다.

각 메모리 할당량에 따른 버킷으로 나뉘어 있으며, 자신이 원하는 할당량을 선택해 서버를 열 수 있습니다.



서버가 정상적으로 열리면 버킷 창에 위와 같은 문구가 나타납니다.

한 번 서버를 연 후에 같은 폴더에 'server.properties' 라는 파일이 생깁니다.

이 'server.properties' 라는 파일은 워드패드를 이용해 열어주시면 됩니다.



그럼 위와 같은 내용이 나타날 것이고, 한글로 설명을 적어놓은 것은 필자가 설명을 위해 추가한 내용입니다.


다운로드



1.8.z01

1.8.zip



위의 파일은 분할 압축으로 같은 폴더에 모두 다운로드 받아놓고 1.8.zip 파일을 열어 압축을 풀어 주셔야합니다!


서버



위는 압축파일을 풀면 볼 수 있는 내용물입니다.

각 메모리 할당량에 따른 버킷으로 나뉘어 있으며, 자신이 원하는 할당량을 선택해 서버를 열 수 있습니다.



서버가 정상적으로 열리면 버킷 창에 위와 같은 문구가 나타납니다.

한 번 서버를 연 후에 같은 폴더에 'server.properties' 라는 파일이 생깁니다.

이 'server.properties' 라는 파일은 워드패드를 이용해 열어주시면 됩니다.



그럼 위와 같은 내용이 나타날 것이고, 한글로 설명을 적어놓은 것은 필자가 설명을 위해 추가한 내용입니다.


다운로드



1.7.10.z01

1.7.10.zip



위의 파일은 분할 압축으로 같은 폴더에 모두 다운로드 받아놓고 1.7.10.zip 파일을 열어 압축을 풀어 주셔야합니다!


서버



위는 압축파일을 풀면 볼 수 있는 내용물입니다.

각 메모리 할당량에 따른 버킷으로 나뉘어 있으며, 자신이 원하는 할당량을 선택해 서버를 열 수 있습니다.



서버가 정상적으로 열리면 버킷 창에 위와 같은 문구가 나타납니다.

한 번 서버를 연 후에 같은 폴더에 'server.properties' 라는 파일이 생깁니다.

이 'server.properties' 라는 파일은 워드패드를 이용해 열어주시면 됩니다.



그럼 위와 같은 내용이 나타날 것이고, 한글로 설명을 적어놓은 것은 필자가 설명을 위해 추가한 내용입니다.


다운로드



1.5.2 Bukkit.z01

1.5.2 Bukkit.zip


위의 파일은 분할 압축으로 같은 폴더에 모두 다운로드 받아놓고 1.5.2 Bukkit.zip 파일을 열어 압축을 풀어 주셔야합니다!



형 변환


형 변환은 서로 상속된 클래스들을 타입으로 사용한 변수일 경우 형 변환이 가능하다. 예시를 들자면 실수형인 double과 float를 예시로 들 수 있다.

형 변환은 아래와 같이 가능하다.


1
2
float f = 1.0f;
double d = (double) f;
cs


float값을 double로 변환하여 변수로 저장시킨 것인데 2번째 줄이 형 변환 코드이다.

형식은 아래와 같다.


1
type1 value2 = (type1) value1;
cs


연산자


연산자는 크게 산술, 부호, 문자열, 비교, 논리, 비트 논리, 비트 이동, 대입, 증감, 삼항 연산자로 나뉜다.


산술 연산자


산술 연산자는 -,+,*,/,% 으로 총 5개의 연산자이며, 기본적인 사칙연산을 수행한다.


-는 뺄셈 연산

+는 덧셈 연산

*는 곱셈 연산

/는 나눗셈 연산

%는 나눗셈 후 나머지 연산


1
int i = 10 / 5;
cs


위처럼 나눗셈 연산 후 i에 대입이 가능하다.


부호 연산자


부호 연산자는 -와 +로 총 2개의 연산자이며, 실수의 부호를 결정하는데 사용한다.


1
2
int i = 20;
int d = -i; //d = -20
cs


위처럼 i는 양수 20을 대입하고 d는 i에 - 연산자를 사용하여 -20을 대입한다.


문자열 연산자


문자열 연산자는 +로 단 한개 뿐이다. 이 문자열 연산자는 두 개의 문자열을 이어 붙이는데 사용한다.


1
String name = "Hello, " + "World!";
cs


위처럼 두 개의 문자열을 +로 이어 붙여 name에 대입할 수 있다.


비교 연산자


비교 연산자는 ==, !=, >, >=, <, <= 로 총 6개의 연산자이며, 두 개의 값을 비교할 때 사용된다.


==는 비교 대상 둘이 같으면 true, 다르면 false를 반환하고

!=는 비교 대상 둘이 다르면 true, 같으면 false를 반환한다.

> 는 연산자의 좌측에 있는 값이 우측의 값보다 더 크다면 true, 더 작다면 false를 반환,

>= 는 연산자의 좌측에 있는 값이 우측의 값보다 더 크거나 같다면 true, 더 작다면 false를 반환한다.

< 는 연산자의 우측에 있는 값이 좌측의 값보다 더 크다면 true, 더 작다면 false를 반환,

<= 는 연산자의 우측에 있는 값이 좌측의 값보다 더 크거나 같다면 true, 더 작다면 false를 반환한다.


여기서 주의해야할 점은 ==나 !=는 실수형이 아닌 다른 모든 값들을 비교할 수 있지만

부등호인 >, >=, <, <= 는 실수형에서만 사용이 가능한 대소 비교 연산자들이다.


1
2
3
int i = 10;
int d = 5;
boolean bool = i > d;
cs


위의 예시는 i가 10이고 d가 5인 상태에서 i > d 는 참이므로 true를 반환한다.

따라서 bool의 값은 true이다.


논리 연산자


논리 연산자는 &&, &, ||, |, ^, ! 로 총 6개의 연산자이며, 두 개의 논리형을 구별한다.


&&와 &은 좌측과 우측에 있는 피연산자들이 모두 true일 경우에만 true를 반환하고 두 연산자의 역할은 같다.

||와 |은 좌측과 우측에 있는 피연산자들중 하나 이상이 true일 경우에만 true를 반환하고 두 연산자의 역할은 같다.

^ 는 좌측과 우측에 있는 두 피연산자의 논리가 반대여야 true를 반환한다.

! 는 논리 부정으로 뒤에 오는 피연산자의 논리의 반대 논리를 반환한다.


1
2
3
int i = 10;
int d = 5;
boolean bool = (i > d) ^ (i < d);
cs


위의 예시는 i가 10이고 d는 5이다. 이때 i > d는 참이므로 true, i < d 는 거짓이므로 false이다.

이때 논리 연산자인 ^으로 좌측과 우측 두 피연산자의 논리가 반대이므로 bool 은 true가 된다.


대입 연산자


대입 연산자는 =, +=, -=, *=, /=, %=, &=, !=, ^=, <<=, >>=, >>>= 로 총 12개의 연산자이다.


=는 우측의 값을 좌측에 대입한다.

+=는 우측의 값을 좌측의 값에 더한 후 좌측에 대입한다.

-=는 우측의 값을 좌측의 값에 뺀 후 좌측에 대입한다.

*=는 우측의 값을 좌측의 값에 곱한 후 좌측에 대입한다.

/=는 우측의 값을 좌측의 값에 나눈 후 좌측에 대입한다.

%=는 우측의 값을 좌측의 값에 나눈 후 나머지를 좌측에 대입한다.


아래는 비트 논리나 비트 이동에 사용되는 연산자이다.

(해당 강좌에서는 주로 다루지 않음.)


&=는 우측의 값을 좌측의 값에 & 연산을 실행 후 결과를 좌측에 대입한다.

!=는 우측의 값을 좌측의 값에 ! 연산을 실행 후 결과를 좌측에 대입한다.

^=는 우측의 값을 좌측의 값에 = 연산을 실행 후 결과를 좌측에 대입한다.

<<= 는 우측의 값을 좌측의 값에 << 연산을 실행 후 결과를 좌측에 대입한다.

>>= 는 우측의 값을 좌측의 값에 >> 연산을 실행 후 결과를 좌측에 대입한다.

>>>= 는 우측의 값을 좌측의 값에 >>> 연산을 실행 후 결과를 좌측에 대입한다.


1
2
int i = 10;
+= 5;
cs


위의 예시는 i가 10이고, 2번째 줄에서 += 대입 연산자를 이용해 10에 5를 더한 후 i에 대입한다.

따라서 i의 값은 15이다.


증감 연산자


증감 연산자는 ++, --로 총 2개의 연산자이다.


++는 좌측의 값에 1을 더한 후 좌측에 대입한다.

--는 좌측의 값에 1을 뺀 후 좌측에 대입한다.


1
2
int i = 10;
++;
cs


위의 예시는 i가 10이고, 2번째 줄에서 ++ 증감 연산자를 이용해 10에 1을 더한 후 i에 대입한다.

따라서 i의 값은 11이다.


삼항 연산자


삼항 연산자는 [ 조건식 ? 값1 : 값2 ] 라는 형식으로 조건식에 따라 반환되는 값이 다른 연산자이다.


[ 조건식 ? 값1 : 값2 ] 는 조건식이 true면 값1을 반환하고 false면 값2를 반환한다.


1
2
3
int i = 10;
int d = 5;
int result = (i > d) ? i : d;
cs


위의 예시는 i가 10이고 d가 5이다. 이 때 삼항 연산자의 조건식인 i > d는 참이므로 true이고 그에 따라서 i의 값이 반환된다.

따라서 result는 i의 값인 10이 된다.


비트 논리 연산자, 비트 이동 연산자


비트 논리 나 비트 이동 연산자는 암호화 파트가 아니라면 거의 사용하지 않으므로 다음에 알아본다.

월드에딧


월드에딧 플러그인은 건축에서 단순 작업이나 입체적인 모양을 구현할 때 쉽게 제작하도록 도와주는 플러그인이다.

이 플러그인을 연동하면 월드에딧에서의 첫번째 지점과 두번째 지점을 선택한 지역을 불러오는 등 월드에딧 기능을 자신의 플러그인에서 사용할 수 있게 된다.

우선 월드에딧을 연동하기 위해서는 사용하는 또는 사용하고자 하는 월드에딧 플러그인을 다운로드하여 자신의 버킷의 플러그인에 넣어두자, 

연동했을 때 주의점은 꼭 그 연동한 플러그인이 자신의 버킷의 플러그인안에 있어야하고 서버에 인식되어야한다. 그렇지 않다면 플러그인의 기능을 사용하려 하는데

플러그인을 찾을 수 없기에 오류가 발생한다.


연동



프로젝트에 라이브러리로 월드에딧을 추가하기 위해 Build Path에 들어간다.



위와 같은 윈도우에서 'Add External JARs' 를 눌러 월드에딧 파일을 추가한다.


이 단계를 거치면 자신의 프로젝트 안에서 월드에딧의 기능을 사용할 수 있게된다.




1
2
3
4
5
public WorldEditPlugin getWorldEdit() {
    Plugin p = Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
    if (p instanceof WorldEditPlugin) return (WorldEditPlugin) p;
    else return null;
}
cs


위의 메서드는 월드에딧 플러그인을 불러오는 메서드이다. 필자는 한번 사용할 때 onEnable() 메서드에 플러그인이 활성화 될 때 한번만 불러오게 한 후 변수에 저장해서

계속 사용한다.


1
Selection sel = getWorldEdit().getSelection(Player);
cs


위의 메서드를 호출하여 플레이어가 선택한 두 지점으로 정의된 구역을 받을 수 있다.

물론 이 정의된 구역으로 첫 번째 지점과 두 번째 지점 모두 구할 수 있다.


1
2
3
Selection sel = getWorldEdit().getSelection(Player);
Location pos1 = sel.getMaximumPoint();
Location pos2 = sel.getMinimumPoint();

cs


위처럼 pos1은 첫 번째 지점, pos2는 두 번째 지점이다.


1
2
3
4
Selection sel = getWorldEdit().getSelection(Player);
if(sel.contains(player.getLocation()){
    player.sendMessage("구역 안에 있습니다.");
}
cs


이런 식으로 위치값이 구역 안에 있는지도 파악 할 수 있다.


만약 플레이어에 의해서 정의된 구역 뿐만이 아닌 자신의 플러그인 상에서 구역을 정의하고 싶다면


1
2
3
Location loc1 = new Location(Bukkit.getWorld("world"), 0,0,0);
Location loc2 = new Location(Bukkit.getWorld("world"), 5,5,5);
CuboidSelection sel = new CuboidSelection(loc1.getWorld(), loc1, loc2);
cs


이렇게 새로운 구역을 정의할 수 있다.


1
getWorldEdit().setSelection(player, sel);
cs


위의 메서드는 플레이어가 정의한 구역을 플러그인 내부에서 임의로 교체할 수 있다.


이 이외에도 많은 기능들이 있지만 필자는 모든 내용을 이 게시글에서 다룰 수 없다.

필자는 많이 사용하는 기능들만 적어놓았고 아래 예시 프로젝트를 첨부했으니 참고바란다.