[01] - 스크립트에서 사용되는 메서드를 추가해보자. [출처] [01] - 스크립트에서 사용되는 메서드를 추가해보자. (@USFM - 메이플스토리 공식 카페) |작성자 enoch_rvn
안녕하세요~ 에녹입니다.
다름이아니라, 계속 스크립트라던지, 소스코드를 배포하는것보다는
그냥 강좌를 쓰는게 저한테도, 보는사람에게도 좋을것같아 한번 끄적여봅니당..
오늘 제가 여러분에게 가르쳐드릴것은 스크립트에서 사용되는 메서드를 추가해보는겁니다.
스크립트를 제작하시다보면, 제약적인것들이 많이 있습니다. 뭐 한 예를들어서
'상대방의 레벨을 보는방법? 상대방의 레벨과 플레이어의 레벨을 비교해보고싶은데..'
cm. 여기까지 적어두고 고민하게되는거죠. (아닌가 나만그런가..)
말나온김에, 예제로 상대방의 닉네임을 적으면, 상대방의 레벨을 볼수있는 메서드를 만들어보겠습니다.
준비물 :: 넷빈, 메모장
모든 상황은 1.2.220v ArcP@CK 기반으로 둡니다.

소스에 들어가시게되면, 많은 패키지들(왼쪽부분에 노란색 볏짚같이생긴거) 이 있는데
scripting 부분을 클릭하시고 NPCConversationManager.java 를 열어줍시다.
그리고 위와같이
Public Int hisLevel(String name) {
return c.hisLevel(name);
}
을 적어줍시다. 여기까지 따라하셨으면 분명히 에러가날것이에요.
그 에러의 이유를 찾기위해선, c 의 존재를 알아두셔야합니다.
c 는 MapleClient 즉 저 많은 패키지상자중 MapleClient.java 라는 소스코드를 참조하는겁니다.
여기서 더 깊이있게 들어가면 지루하고 재미없으니. 대충 설명해드리자면
c 는 MapleClient 라는 소스코드를 의미하는거고, MapleClient.hisLevel 이라는 메서드가 존재하지 않아서 나오는 오류입니다.
|
Public Int hisLevel(String name) 부분을 궁금해하시는분들이 분명히 있을거에요. 이것은 메서드의 이름은 hisLevel 이며, 숫자형을 반환받는 메서드라는 뜻이에요.
즉 반환받는 메서드는 무조건 숫자 값을 hisLevel이라는 메서드에게 돌려주어야해요. 눈치빠른 사람들은 대충 아시겠지만, return 의 존재 이유기도해요.
그렇다면, MapleClient 에 있는 hisLevel 이란 메서드도 숫자형이란 뜻이겠죠?
그리고 (String name) 이란 부분은, 바로 인자값이라는 부분이에요. 작업을 처리할때, 매번 다른 값을 넣어야하는 경우가 있어요. 쉽게 말하자면 저 부분은 이제 스크립트에서 다른사람의 닉네임을 작성할 곳이에요.
var targetLvl = cm.hisLevel("다른사람닉네임"); 을 적어줄때, ("다른사람닉네임") 부분이 바로 인자값을 받는부분이에요.
|
자, 여기서 궁금하실거에요. 왜 MapleClient 를 굳이 참조해서 MapleClient 를 타고 작업을 처리하는거지?
그냥 저기서 작업해버리면 안되나? 라고 묻는사람들이 계실거에요.
간단하게 생각하시면되요.
MapleClient 에서 처리해야 안전한 작업이 있기 때문이에요.
자, 그러면 MapleClient 에도 저 메서드를 추가해야겠죠?

public int hisLevel(String name) {
final ChannelServer ch = ChannelServer.getInstance(channel);
return ch.hisLevel(name);
}
자 이번에도 숫자형 메서드에요.
NPCScript어쩌구저쩌구Manager.java 에서의 hisLevel 메서드도 숫자형이고, 그 메서드에서 반환되야하는 값이 숫자형이여야 하기때문에 이 MapleClient 에서도 숫자형을 사용하는거에요.. 라고 말하면 복잡하네.. 흠..
아몰ㄹ랑
어찌됬든, 전에 썻던 hisLevel 메서드보다 뭔가 더 추가가되어있어요.
final ChannelServer ch = ChannelServer.getInstance(channel);
패키지(launch) - 소스(ChannelServer) 에 있는놈을 참고하겠다는거에요.
그리고 MapleClient 에서만 처리해야지 안전하다는 값이 저 channel 부분인데, 닥쳐 나도모르겠어
여튼, VB하다가 야매로 배운 저라서 자세하게 알려줄 순 없어요.
그리고 이놈도 숫자형 메서드라 값을 돌려줘야해요.
그럼 참조받은 ChannelServer 의 메서드를 반환해줘요.
return ch.hisLevel(name);
그말인 즉, 채널서버에서도 hisLevel 메서드를 만들어주어야하고, 거기에서도 거기서만 처리할 수 있는 무언가가 있겠죠?

public int hisLevel(String name) {
if (isMyChannelConnected(name)) {
return getPlayerStorage().getCharacterByName(name).getClient().getPlayer().getLevel();
} else {
return 0;
}
}
어우 뭔가 많아요.
하지만 걱정할거없어요. 정말 간단해요.
한글로 풀어보도록할게요!
만약에 (채널에 연결되어있으면(스크립트에서 받은 인자값이)) {
값을 반환합니다. 이름을통해참조(스크립트에서 받은 인자값).그캐릭터의클라이언트().그캐릭터의정보().그캐릭터의레벨();
} 연결되어있지 않으면 {
아무것도없는 0을 반환합니다;
}
오 간단하죠? 아닌가? 여튼
대충 이런 뜻이에요. 제가 어휘능력이 후달려서 정말 궁금하거나 이해안되는부분이있다면
덧글로 지적해주세요. 응답해드리겠나이다.
자 이제 빌드하고 적용하고 제대로 작동하는지 한번 봐야겠죠?
NPCScript어쩌구저쩌구에서 hisLevel(인자값) 으로 만들었으니
스크립트에서는
var hisLevel = cm.hisLevel("캐릭터이름");
cm.sendOk(hisLevel); 뭐 이런식으로 진행해야겠습니다!
자 적당한 npc를 찾아봅시다.

아 이년이 아닌데

자 소스코드보이시죠? 저희가 만든 hisLevel 메서드에요!

정상적으로 나오네요 ㅎㅎㅎㅎ
자 이것만 만들면 존ㄴ나 쓸데가없잖아요.
차라리 cm.getPlayer().getLevel() 쓰고말지.
이제 응용을해봅시다.

이부분은 알아서 이해해보도록해.
힌트를 주자면 cm.sendGetText 에서 받은값은 cm.getText() 에 저장이됭.
즉 우리가 만든 메서드에 적은 값을 받아오고, 되돌아오는값이 0이 아니면 상대방의 레벨으 ㄹ띄워주고
0이면 상대방이 없다고 뜨는거지.
왜 0이면 상대방이 없다고 뜨는지 이해가 안되면 위에 사진들의 소스를 한번씩 다시 읽어보도록 해.





나 이제 나가봐야해서 횡설수설하고 어휘력도 병ㅇㅅ.. 이라.. 이해좀해줘.
지적 달게받고 이해안되는것있으면 덧글로 질문해줘 형들!
그럼이만 뿅★
[출처] [01] - 스크립트에서 사용되는 메서드를 추가해보자. (@USFM - 메이플스토리 공식 카페) |작성자 enoch_rvn

원나소년 님의 최근 댓글
초보 개발자도 가능합니까? 아직 개발의 ㄱ자도 모르긴하는데.. 2016 06.07 구축하기 쉬운가용? 2016 06.02 흑 ㅜㅜ 팩을 구하고싶은데 ㅠㅠ 구글링하면 나오려나요?... 2016 06.02 라피스 해보고싶네요 정말 어떻게못하나요... 2016 05.31 하핳... 그런게임들은 프리서버 못하는건가요? 2016 05.31