[CR] zz // OnPCKill 그룹 관련
OnPCKill에 대한 설명을 해드리겠습니다.
참고용 스크립트는 제가 묵향서버에서 사용했던 스크립트입니다.
설명은 스크립트 내에 중간중간에 주석을 넣어서 설명하겠습니다.
script OnPCKill {
set @sd, mysd();
set @id, myid();
/*
@kill 부분은 당연히 아실거라고 생각합니다.
우선 유저가 몬스터를 킬하게되면 OnPCKill 이라는 콜백 함수를 불러옵니다.
이 콜백함수가 불려오면서 @kill 이라는 임시변수에 저는 마지막에 잡은 몬스터의 id값을 받아옵니다.
get_lastkillmob_id() 이함수는 몬스터의 id값 즉 mob_db에있는 몬스터의 번호를 불러옵니다.
예를 들어 다람쥐의 번호가 5번일경우 5번인 다람쥐가 불려오는거죠.
*/
set @kill, get_lastkillmob_id(@mysd);
/*
이 부분은 파티가 있는지를 체크하는부분입니다. 저는 파티가 있고 없고의 여부가아닌
파티원이 몇명인지를 체크하고 조건을 나누어 주었습니다.
*/
set @party, party_member_count(@sd);
// 앞서 말했던거 처럼 저는 몇명인지를 체크합니다. 즉 파티는 2명이상으로 이루어집니다. 그래서 2이상이라는 조건을 주었구요.
if(@party >= 2)
{
/*
파티 멤버를 체크 하는 폴문입니다. 파티원 수만큼 폴문이 돌아갑니다.
*/
for(set @i, 0; @i < @party; set @i, @i+1)
{
/*
파티원 수만큼 돌아가며 파티원의 sd값과 id값을 구하기 위해 party_member의 함수를 사용하였습니다.
party_member의 함수는 sd값을 구해줍니다. 순서는 0부터 시작이고 0은 파티장입니다.
*/
set @party_sd, party_member(@sd, @i);
set @party_id, sd2id(@party_sd);
/*
쩔하는것을 방지하기위해 만든 부분입니다. 자신과 2이상 차이가 난다면.
몬스터를 잡은 사람을 제외한 승급차수가 2이상 차이나는 유저를 강제 로그아웃시킵니다.
*/
set @joblvck, get_joblevel(@sd) - get_joblevel(@party_sd);
if(@joblvck < 0)
{
set @joblvck, @joblvck * -1;
}
if(@joblvck >= 2)
{
for(set @i, 0; @i < 40; set @i, @i+1)
{
warp @party_sd, get_mapid(@party_sd), get_x(@party_id), get_y(@party_id);
}
}
/*
이 부분은 왜 있느냐? 하고 생각 하실껍니다.
참고로 cr에서 평민과 그룹을 한상태로 다른맵에서 몬스터를 사냥시 약 10%정도 더 들어오게됩니다.
cr의 취약점을 방지하기위해 만들었습니다.
만약 그룹에 평민이 있으면 평민 캐릭을 강제 로그아웃 시킵니다.
*/
if(get_job(@party_sd) == 0)
{
for(set @i, 0; @i < 40; set @i, @i+1)
{
warp @party_sd, get_mapid(@party_sd), get_x(@party_id), get_y(@party_id);
}
}
/*
이 부분은 이제 그룹후 사냥시 보상을 주게될경우 유령에게는 보상을 주지 않기 위해 만들었습니다.
*/
if(get_state(@party_sd) != 1)
{
/*
파티원이 잡은사람과 같은 맵에 있는지를 체크해줍니다.
*/
if(get_mapid(@sd) == get_mapid(@party_sd))
{
/*
계정변수를 임의로 수정해주는 함수를 쓴곳은 사냥에 관련된 퀘스트를 그룹 전체가 같이 수행할 수 있게 하기위해 만들었습니다.
*/
set @LV_QST, get_uservar_i(@party_sd, "$LV_QST");
set @LV_QSTZ, get_uservar_i(@party_sd, "$LV_QSTZ");
if(@LV_QST == @kill && @LV_QSTZ == 0)
{
set_uservar_i @party_sd, "LV_QSTZ", @LV_QSTZ + 1;
message @party_sd, 4, "[알림] 몬스터 퇴치 완료";
}
set @LV_QST2, get_uservar_i(@party_sd, "$LV_QST2");
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
if(@LV_QST2 == 1 && @LV_QSTZ2 < 100)
{
if(@kill == 200 || @kill == 201 || @kill == 202 || @kill == 203)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 선비족 " + @LV_QSTZ2 + " / 100";
}
}
else if(@LV_QST2 == 2 && @LV_QSTZ2 < 100)
{
if(@kill == 13011 || @kill == 13014)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 낙랑의장난감 " + @LV_QSTZ2 + " / 100";
}
}
else if(@LV_QST2 == 3 && @LV_QSTZ2 < 100)
{
if(@kill == 13012 || @kill == 13015)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 낙랑의동물 " + @LV_QSTZ2 + " / 100";
}
}
else if(@LV_QST2 == 4 && @LV_QSTZ2 < 100)
{
if(@kill >= 204 && @kill <= 211)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 흉노족 " + @LV_QSTZ2 + " / 100";
}
}
else if(@LV_QST2 == 5 && @LV_QSTZ2 < 100)
{
if(@kill == 2005 || @kill == 2006 || @kill == 2007 || @kill == 2008)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 비류성 " + @LV_QSTZ2 + " / 100";
}
}
else if(@LV_QST2 == 6 && @LV_QSTZ2 < 100)
{
if(@kill == 310 || @kill == 311 || @kill == 312 || @kill == 13017)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
set @LV_QSTZ2, get_uservar_i(@party_sd, "$LV_QSTZ2");
message @party_sd, 4, "[알림] 소연지봉 " + @LV_QSTZ2 + " / 100";
}
}
if(@LV_QSTZ2 == 100)
{
set_uservar_i @party_sd, "LV_QSTZ2", @LV_QSTZ2 + 1;
message @party_sd, 4, "[알림] 몬스터 군대 소탕 완료";
}
// 북해
set @bookha, get_uservar_i(@party_sd, "$bookha");
set @bookhamob, get_uservar_i(@party_sd, "$bookhamob");
if(@bookha == 1 && @bookhamob < 100 && @kill == 11189)
{
set_uservar_i @party_sd, "bookhamob", @bookhamob + 1;
set @bookhamob, get_uservar_i(@party_sd, "$bookhamob");
message @party_sd, 5, "* 북해퀘스트 * [ 얼음귀 " + @bookhamob + "/100 ]";
}
else if(@bookha == 2 && @bookhamob < 150 && @kill == 11190)
{
set_uservar_i @party_sd, "bookhamob", @bookhamob + 1;
set @bookhamob, get_uservar_i(@party_sd, "$bookhamob");
message @party_sd, 5, "* 북해퀘스트 * [ 북해록 " + @bookhamob + "/150 ]";
}
else if(@bookha == 3 && @bookhamob < 200 && @kill == 11191)
{
set_uservar_i @party_sd, "bookhamob", @bookhamob + 1;
set @bookhamob, get_uservar_i(@party_sd, "$bookhamob");
message @party_sd, 5, "* 북해퀘스트 * [ 북해룡 " + @bookhamob + "/200 ]";
}
else if(@bookha == 4 && @bookhamob < 1 && @kill == 11192)
{
set_uservar_i @party_sd, "bookhamob", @bookhamob + 1;
set @bookhamob, get_uservar_i(@party_sd, "$bookhamob");
message @party_sd, 5, "* 북해퀘스트 * [ 청빙룡 " + @bookhamob + "/1 ]";
}
//
// 억경드랍
/*
억경 드랍부분에 관한 부분입니다. 이부분은 제가 예전에 만들었다 너무 노답이여서
좀더 줄이고자 보완한 부분입니다. 급하게 수정해서 수정이 완벽히 끝나진 않았습니다.
*/
set @randtime, rand(1,100);
if(@randtime <= 5)
{
if(@kill == 200 || @kill == 201)
{
set @itemn$, "일억경";
set @item, 31223;
set @count, 1;
if(get_joblevel(@party_sd) >= 3)
{
set @count, 0;
}
}
else if(@kill == 13011 || @kill == 204 || @kill == 210 || @kill == 211 || @kill == 2005 || @kill == 2006)
{
set @itemn$, "일억경";
set @item, 31223;
set @count, 2;
if(get_joblevel(@party_sd) >= 3 && @kill == 13011)
{
set @count, 0;
}
}
else if(@kill == 13012 || @kill == 860 || @kill == 870)
{
set @itemn$, "일억경";
set @item, 31223;
set @count, 4;
if(get_joblevel(@party_sd) <= 2)
{
if(@kill == 860 || @kill == 870)
{
set @count, 0;
}
}
}
else if(@kill == 310 || @kill == 311 || @kill == 9806 || @kill == 890 || @kill == 891)
{
set @itemn$, "일억경";
set @item, 31223;
set @count, 6;
if(get_joblevel(@party_sd) <= 3 && @kill == 9806)
{
set @count, 0;
}
else if(get_joblevel(@party_sd) <= 2)
{
if(@kill == 890 || @kill == 891)
{
set @count, 0;
}
}
}
else if(@kill == 313 || @kill == 314 || @kill == 315)
{
set @itemn$, "십억경";
set @item, 20295;
set @count, 1;
&

행복e 님의 최근 댓글