- script bg_pvp#main FAKE_NPC,{
OnInit:
.minplayer2start = 5; // minimum players to start (ex. if 3vs3, set to 3)
.score2win = 50; // how many kills needed to win this game
.eventlasting = 20*60; // event duration before auto-reset (20 minutes * seconds)
setarray .rewardwin, Red_Potion, 10, Orange_Potion, 5, Yellow_Potion, 3; // reward to winning team
setarray .rewardlose, Red_Potion, 5, Orange_Potion, 3, Yellow_Potion, 1; // reward to losing team
mapwarp "guild_vs3", "prontera", 155,185;
.rewardwinsize = getarraysize( .rewardwin );
.rewardlosesize = getarraysize( .rewardlose );
end;
OnStart:
.start = true;
.red = bg_create_team( "guild_vs3", 13,50 );
.blue = bg_create_team( "guild_vs3", 86,50 );
.team[1] = .qred = queue();
.team[2] = .qblue = queue();
queueopt .qred, QUEUEOPT_DEATH, strnpcinfo(0)+"::OnRedDead";
queueopt .qred, QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnRedQuit";
queueopt .qred, QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnRedMapChange";
queueopt .qblue, QUEUEOPT_DEATH, strnpcinfo(0)+"::OnBlueDead";
queueopt .qblue, QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnBlueQuit";
queueopt .qblue, QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnBlueMapChange";
.@it = queueiterator( .rred );
for ( .@aid = qiget(.@it); qicheck(.@it); .@aid = qiget(.@it) ) {
bg_join_team .red, .@aid;
queueadd .qred, .@aid;
}
qiclear .@it;
.@it = queueiterator( .rblue );
for ( .@aid = qiget(.@it); qicheck(.@it); .@aid = qiget(.@it) ) {
bg_join_team .blue, .@aid;
queueadd .qblue, .@aid;
}
qiclear .@it;
queuedel .rred;
queuedel .rblue;
bg_warp .red, "guild_vs3", 13,50;
bg_warp .blue, "guild_vs3", 86,50;
.score[1] = .score[2] = .score2win;
bg_updatescore "guild_vs3", .score[1], .score[2];
sleep .eventlasting * 1000;
if ( .somebodyquit == 2 ) {
mapannounce "guild_vs3", "- Red Team is victorious! -", bc_map;
callsub L_Reward, .team[.winside], .rewardwin, .rewardwinsize;
}
else if ( .somebodyquit == 1 ) {
mapannounce "guild_vs3", "- Blue Team is victorious! -", bc_map;
callsub L_Reward, .team[.winside], .rewardwin, .rewardwinsize;
}
else if ( .score[1] > .score[2] ) {
mapannounce "guild_vs3", "- Red Team is victorious! -", bc_map;
callsub L_Reward, .team[.winside], .rewardwin, .rewardwinsize;
callsub L_Reward, ( .winside == 1 )? .team[2]:.team[1], .rewardlose, .rewardlosesize;
}
else if ( .score[1] < .score[2] ) {
mapannounce "guild_vs3", "- Blue Team is victorious! -", bc_map;
callsub L_Reward, .team[.winside], .rewardwin, .rewardwinsize;
callsub L_Reward, ( .winside == 1 )? .team[2]:.team[1], .rewardlose, .rewardlosesize;
}
else {
mapannounce "guild_vs3", "- The match has ended in a draw! -", bc_map;
callsub L_Reward, .team[.winside], .rewardlose, .rewardlosesize;
callsub L_Reward, ( .winside == 1 )? .team[2]:.team[1], .rewardlose, .rewardlosesize;
}
bg_destroy .red;
bg_destroy .blue;
queuedel .qred;
queuedel .qblue;
mapwarp "guild_vs3","prontera",155,185;
.team[1] = .team[2] = .score[1] = .score[2] = .red = .blue = .winside = .qred = .qblue = .somebodyquit = 0;
donpcevent "Blue Team#bg_pvp::OnInit";
donpcevent "Red Team#bg_pvp::OnInit";
.start = false;
end;
L_Reward:
.@it = queueiterator( getarg(0) );
for ( .@aid = qiget(.@it); qicheck(.@it); .@aid = qiget(.@it) ) {
for ( .@i = 0; .@i < getarg(2); .@i += 2 )
getitem getelementofarray( getarg(1), .@i ), getelementofarray( getarg(1), .@i +1 ), .@aid;
}
qiclear .@it;
return;
OnRedDead: callsub L_Dead, 1, 2;
OnBlueDead: callsub L_Dead, 2, 1;
L_Dead:
--.score[ getarg(0) ];
bg_updatescore "guild_vs3", .score[1], .score[2];
if ( !.score[ getarg(0) ] ) {
.winside = getarg(1);
awake strnpcinfo(0);
}
sleep2 1250;
percentheal 100,100;
end;
OnRedMapChange:
if ( @Queue_Destination_Map$ == "guild_vs3" ) end;
OnRedQuit:
callsub L_Quit, 1, "Red", 2;
OnBlueMapChange:
if ( @Queue_Destination_Map$ == "guild_vs3" ) end;
OnBlueQuit:
callsub L_Quit, 2, "Blue", 1;
L_Quit:
announce strcharinfo(0) +" from "+ getarg(1) +" team has Quit this match !", bc_map, C_RED;
.somebodyquit = getarg(0);
.winside = getarg(2);
awake strnpcinfo(0);
end;
}
prontera,160,185,5 script Blue Team#bg_pvp 4_M_JOB_KNIGHT1,{
callfunc "bg_pvp_register", "Blue", getvariableofnpc( .rblue, "bg_pvp#main" ), getvariableofnpc( .rred, "bg_pvp#main" );
end;
OnInit:
.@main$ = "bg_pvp#main";
set getvariableofnpc( .rblue, .@main$ ), queue();
queueopt getvariableofnpc( .rblue, .@main$ ), QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnQuit";
queueopt getvariableofnpc( .rblue, .@main$ ), QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnQuit";
end;
OnQuit:
queueremove getvariableofnpc( .rblue, "bg_pvp#main" ), getcharid(3);
end;
}
prontera,150,185,5 script Red Team#bg_pvp 4_M_JOB_KNIGHT2,{
callfunc "bg_pvp_register", "Red", getvariableofnpc( .rred, "bg_pvp#main" ), getvariableofnpc( .rblue, "bg_pvp#main" );
end;
OnInit:
.@main$ = "bg_pvp#main";
set getvariableofnpc( .rred, .@main$ ), queue();
queueopt getvariableofnpc( .rred, .@main$ ), QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnQuit";
queueopt getvariableofnpc( .rred, .@main$ ), QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnQuit";
end;
OnQuit:
queueremove getvariableofnpc( .rred, "bg_pvp#main" ), getcharid(3);
end;
}
function script bg_pvp_register {
.@main$ = "bg_pvp#main";
mes "["+ strnpcinfo(1) +"]";
if ( getvariableofnpc( .start, .@main$ ) ) {
mes "A match is in progress.";
close;
}
if ( queuesize( getarg(1) ) == getvariableofnpc( .minplayer2start, .@main$ ) ) {
mes "This team is full.";
close;
}
.@it = queueiterator( getarg(2) );
for ( .@aid = qiget(.@it); qicheck(.@it); .@aid = qiget(.@it) ) {
if ( .@aid == getcharid(3) ) {
mes "You already join the opposing team.";
qiclear .@it;
close;
}
}
qiclear .@it;
if ( queueadd( getarg(1), getcharid(3) ) == false ) {
mes "You already join this team";
close;
}
mes "Do you wish to join the "+ getarg(0) +" side ?";
next;
if ( select( "Yes", "No" ) == 2 ) close;
mes "Reminder: Once you sign up, you have to stay on this map, otherwise you'll forfeit the registration.";
close2;
if ( queuesize( getarg(1) ) == getvariableofnpc( .minplayer2start, .@main$ ) && queuesize( getarg(2) ) == getvariableofnpc( .minplayer2start, .@main$ ) )
donpcevent .@main$ +"::OnStart";
end;
}
guild_vs3 mapflag battleground 2
guild_vs3 mapflag nosave SavePoint
guild_vs3 mapflag nowarp
guild_vs3 mapflag nowarpto
guild_vs3 mapflag noteleport
guild_vs3 mapflag nomemo
guild_vs3 mapflag nopenalty
guild_vs3 mapflag nobranch
guild_vs3 mapflag noicewall