- script bg_pvp_round#control -1,{ OnInit: .minplayer2start = 1; // number of players to start this event automatically .winningscore = 2; // how many rounds to win .eventlasting = 20*60; // event last 20 minutes or the system abort itself .registerlasting = 5*60; // 5 minutes to join setarray .rewardwin, 501,10, 502,5, 503,3; // reward to winning team setarray .rewardlose, 501,5, 502,3, 503,1; // reward to losing team .rewardwinsize = getarraysize( .rewardwin ); .rewardlosesize = getarraysize( .rewardlose ); .teamname$[1] = "Red"; .teamname$[2] = "Blue"; bindatcmd "bgpvp", strnpcinfo(0)+"::OnCommand", 99, 100; end; OnCommand: if ( compare( .@atcmd_parameters$, "on" ) ) { if ( .start ) dispbottom "Battle Ground DeathMatch System already started."; else goto L_Start; } else if ( compare( .@atcmd_parameters$, "off" ) ) { if ( !.start ) dispbottom "Battle Ground DeathMatch System not yet start."; else { .gmname$ = strcharinfo(0); .start = 0; .skip = 1; awake strnpcinfo(0); end; } } else if ( !.start ) dispbottom "Battle Ground DeathMatch System is currently not running."; dispbottom "Use "+ .@atcmd_command$ +" on to start the event."; dispbottom "Use "+ .@atcmd_command$ +" off to abort this event"; end; OnStart: if ( getwaitingroomstate( 0, .rednpcname$ ) < .minplayer2start || getwaitingroomstate( 0, .bluenpcname$ ) < .minplayer2start ) announce "[ Battle Ground DeathMatch System ] Blue Team : "+ getwaitingroomstate( 0, .bluenpcname$ ) + "/" + .minplayer2start + ". Red Team : "+ getwaitingroomstate( 0, .rednpcname$ ) + "/" + .minplayer2start, bc_all, 0x00CED1; else awake strnpcinfo(0); end; OnClock0000: OnClock0200: OnClock0400: OnClock0600: OnClock0800: OnClock1000: OnClock1200: OnClock1400: OnClock1600: OnClock1800: OnClock2000: OnClock2200: L_Start: if ( .start ) end; announce "[ Battle Ground DeathMatch System ] Event is now Open ! Come to prontera to join !", bc_all, 0x00CED1; enablenpc .rednpcname$; enablenpc .bluenpcname$; donpcevent .rednpcname$ +"::OnStart"; donpcevent .bluenpcname$ +"::OnStart"; .start = 1; sleep .registerlasting * 1000; if ( !.start ) { delwaitingroom .rednpcname$; delwaitingroom .bluenpcname$; disablenpc .rednpcname$; disablenpc .bluenpcname$; announce "[ Battle Ground DeathMatch System ] "+ .gmname$ +" has aborted this Event !", bc_all, 0x00CED1; .skip = 0; end; } else if ( !getwaitingroomstate( 0, .rednpcname$ ) || !getwaitingroomstate( 0, .bluenpcname$ ) ) { delwaitingroom .rednpcname$; delwaitingroom .bluenpcname$; disablenpc .rednpcname$; disablenpc .bluenpcname$; announce "[ Battle Ground DeathMatch System ] One side has 0 player. Can not start the Event.", bc_all, 0x00CED1; .start = .skip = 0; end; } .start = 2; announce "[ Battle Ground DeathMatch System ] Battleground has started", bc_all, 0x00CED1; .red = waitingroom2bg( "bat_b01", 61,150, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead", .rednpcname$ ); copyarray .team1aid, $@arenamembers, $@arenamembersnum; .team1count = .life[1] = $@arenamembersnum; .blue = waitingroom2bg( "bat_b01", 327,150, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead", .bluenpcname$ ); copyarray .team2aid, $@arenamembers, $@arenamembersnum; .team2count = .life[2] = $@arenamembersnum; delwaitingroom .rednpcname$; delwaitingroom .bluenpcname$; disablenpc .rednpcname$; disablenpc .bluenpcname$; callsub L_setwall; bg_updatescore "bat_b01", 0, 0; bg_warp .red, "bat_b01", 61,150; bg_warp .blue, "bat_b01", 327,150; sleep 4000 * !.skip; mapannounce "bat_b01", "Kill all opponent team to gain 1 point, score "+ .winningscore +" points to win !", 0; sleep 2000 * !.skip; while (1) { for ( .@i = 5; .@i > 0; .@i-- ) { mapannounce "bat_b01", "["+ .@i +"]", 0; sleep 1000 * !.skip; } if ( .score[1] == .winningscore -1 && .score[2] == .winningscore -1 ) mapannounce "bat_b01", "Final Round start!", 0; else mapannounce "bat_b01", "Round "+ .round++ +" start!", 0; callsub L_delwall; .life[1] = .team1count; .life[2] = .team2count; sleep .eventlasting * 1000 * !.skip; bg_updatescore "bat_b01", .score[1], .score[2]; if ( .score[1] == .winningscore || .score[2] == .winningscore || !.winside ) break; .winside = 0; sleep 5000 * !.skip; callsub L_make_player_move; bg_warp .red, "bat_b01", 61,150; bg_warp .blue, "bat_b01", 327,150; callsub L_setwall; sleep 1000 * !.skip; } if ( .winside ) { mapannounce "bat_b01", " "+ .teamname$[ .winside ] +" side wins !", bc_all; callsub L_reward, .winside, .rewardwin, .rewardwinsize; callsub L_reward, ( .winside == 1 )? 2:1, .rewardlose, .rewardlosesize; } else if ( .start ) mapannounce "bat_b01", "[ Battle Ground DeathMatch System ] Time Out. Aborting the match.", bc_all; else mapannounce "bat_b01", "[ Battle Ground DeathMatch System ] "+ .gmname$ +" has aborted this Event !", bc_all, 0x00CED1; sleep 5000; callsub L_make_player_move; bg_warp .red, "prontera", 155,182; bg_warp .blue, "prontera", 158,182; bg_destroy .red; bg_destroy .blue; callsub L_delwall; deletearray .team1aid; deletearray .team2aid; .round = .winside = .skip = .score[1] = .score[2] = .team1count = .team2count = .life[1] = .life[2] = .start = 0; end; L_reward: .@size = getarraysize( getd(".team"+ getarg(0) +"aid") ); for ( .@i = 0; .@i < .@size; .@i++ ) for ( .@j = 0; .@j < getarg(2); .@j += 2 ) getitem getelementofarray( getarg(1), .@j ), getelementofarray( getarg(1), .@j +1 ), getd(".team"+ getarg(0) +"aid["+ .@i +"]" ); return; L_setwall: setwall "bat_b01", 58,153, 6, 6, 0, "bg_pvp_round_red_1"; setwall "bat_b01", 64,153, 6, 4, 0, "bg_pvp_round_red_2"; setwall "bat_b01", 64,147, 6, 2, 0, "bg_pvp_round_red_3"; setwall "bat_b01", 58,147, 6, 0, 0, "bg_pvp_round_red_4"; setwall "bat_b01", 324,153, 6, 6, 0, "bg_pvp_round_blue_1"; setwall "bat_b01", 330,153, 6, 4, 0, "bg_pvp_round_blue_2"; setwall "bat_b01", 330,147, 6, 2, 0, "bg_pvp_round_blue_3"; setwall "bat_b01", 324,147, 6, 0, 0, "bg_pvp_round_blue_4"; return; L_delwall: delwall "bg_pvp_round_red_1"; delwall "bg_pvp_round_red_2"; delwall "bg_pvp_round_red_3"; delwall "bg_pvp_round_red_4"; delwall "bg_pvp_round_blue_1"; delwall "bg_pvp_round_blue_2"; delwall "bg_pvp_round_blue_3"; delwall "bg_pvp_round_blue_4"; return; L_make_player_move: for ( .@j = 1; .@j <= 2; .@j++ ) { for ( .@i = 0; .@i < getd(".team"+ .@j +"count"); .@i++ ) { attachrid getd(".team"+ .@j +"aid["+ .@i +"]" ); setoption Option_Xmas | Option_Invisible, 0; pcblockmove getcharid(3), 0; } } return; OnRedQuit: callsub L_quit, 1, 2; OnBlueQuit: callsub L_quit, 2, 1; L_quit: percentheal 100, 100; setoption Option_Xmas | Option_Invisible, 0; pcblockmove getcharid(3), 0; while ( getd( ".team"+ getarg(0) +"aid["+ .@i +"]" ) != getcharid(3) && .@i < getd(".team"+ getarg(0) +"count") ) .@i++; deletearray getd( ".team"+ getarg(0) +"aid["+ .@i +"]" ), 1; setd ".team"+ getarg(0) +"count", getd(".team"+ getarg(0) +"count") -1; .life[ getarg(0) ]--; if ( !getd(".team"+ getarg(0) +"count") ) { mapannounce "bat_b01", "All "+ .teamname$[ getarg(0) ] +" team members has Quit !", bc_all, 0xff3333; // purposely use different color .score[ getarg(1) ] = .winningscore; .winside = getarg(1); .skip = 1; awake strnpcinfo(0); } else if ( !.life[ getarg(0) ] ) { .winside = getarg(1); mapannounce "bat_b01", " "+ .teamname$[ getarg(1) ] +" team has defeated the opponent team, "+ .teamname$[ getarg(1) ] +" team score a point !", bc_all; .score[ getarg(1) ]++; awake strnpcinfo(0); } end; OnRedDead: callsub L_dead, 1, 2; OnBlueDead: callsub L_dead, 2, 1; L_dead: .life[ getarg(0) ]--; if ( !.life[ getarg(0) ] ) { .winside = getarg(1); mapannounce "bat_b01", " "+ .teamname$[ getarg(1) ] +" team has defeated the opponent team, "+ .teamname$[ getarg(1) ] +" team score a point !", bc_all; .score[ getarg(1) ]++; awake strnpcinfo(0); } sleep2 1250; percentheal 100,100; if ( getcharid(4) ) { setoption Option_Xmas | Option_Invisible, 1; pcblockmove getcharid(3), 1; } end; } prontera,155,182,5 script Red side 100,{ end; OnInit: sleep 1; set getvariableofnpc( .rednpcname$, "bg_pvp_round#control" ), strnpcinfo(0); disablenpc strnpcinfo(0); end; OnStart: waitingroom "Red side", getvariableofnpc( .minplayer2start, "bg_pvp_round#control" ) +1, "bg_pvp_round#control::OnStart", 1; end; } prontera,158,182,5 script Blue side 100,{ end; OnInit: sleep 1; set getvariableofnpc( .bluenpcname$, "bg_pvp_round#control" ), strnpcinfo(0); disablenpc strnpcinfo(0); end; OnStart: waitingroom "Blue side", getvariableofnpc( .minplayer2start, "bg_pvp_round#control" ) +1, "bg_pvp_round#control::OnStart", 1; end; } bat_b01 mapflag battleground 2 bat_b01 mapflag nosave SavePoint bat_b01 mapflag nowarp bat_b01 mapflag nowarpto bat_b01 mapflag noteleport bat_b01 mapflag nomemo bat_b01 mapflag nopenalty bat_b01 mapflag nobranch bat_b01 mapflag noicewall