// http://herc.ws/board/topic/15915-a-battleground-idea-d/ prontera,150,185,5 script bg_assassination 1_F_MARIA,{ if ( .start ) { mes "battleground in progress..."; close; } .@it = queueiterator( .qid ); for ( .@aid = qiget(.@it); qicheck(.@it); .@aid = qiget(.@it) ) { if ( .@aid == getcharid(CHAR_ID_ACCOUNT) ) { mes "You already join the queue."; qiclear .@it; close; } } qiclear .@it; select "join"; mes "you have to stick to this map"; close2; queueadd .qid, getcharid(CHAR_ID_ACCOUNT); if ( queuesize(.qid) < .minplayer2start *2 ) { announce queuesize(.qid) +" players join", bc_npc | bc_area; end; } .start = true; .red = bg_create_team( "bat_c01", 53,128 ); .blue = bg_create_team( "bat_c01", 146,56 ); .qred = queue(); .qblue = queue(); queueopt .qred, QUEUEOPT_DEATH, strnpcinfo(NPC_NAME) +"::OnRedDead"; queueopt .qred, QUEUEOPT_LOGOUT, strnpcinfo(NPC_NAME) +"::OnRedQuit"; queueopt .qblue, QUEUEOPT_DEATH, strnpcinfo(NPC_NAME) +"::OnBlueDead"; queueopt .qblue, QUEUEOPT_LOGOUT, strnpcinfo(NPC_NAME) +"::OnBlueQuit"; .@it = queueiterator( .qid ); while ( .@num = qiget(.@it) ) .@aid[.@size++] = .@num; qiclear .@it; queuedel .qid; .qid = queue(); queueopt .qid, QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnQuitRegister"; queueopt .qid, QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnQuitRegister"; callfunc "F_ShuffleNumbers", 0, .@size -1, .@r; for ( .@i = 0; .@i < .@size; ++.@i ) { bg_join_team ( .@i % 2 )? .red : .blue, .@aid[ .@r[.@i] ]; queueadd ( .@i % 2 )? .qred : .qblue, .@aid[ .@r[.@i] ]; } bg_updatescore "bat_c01", 0, 0; bg_warp .red, "bat_c01", 53,128; bg_warp .blue, "bat_c01", 146,56; queueopt .qred, QUEUEOPT_MAPCHANGE, strnpcinfo(NPC_NAME) +"::OnRedMapChange"; queueopt .qblue, QUEUEOPT_MAPCHANGE, strnpcinfo(NPC_NAME) +"::OnBlueMapChange"; setwall "bat_c01", 54,122, 6, DIR_NORTHEAST, 0, "bg_pvp_leader_red"; setwall "bat_c01", 140,56, 6, DIR_NORTHEAST, 0, "bg_pvp_leader_blue"; if ( !.skip ) sleep 10000; bg_updatescore "bat_c01", .score[ .red ], .score[ .blue ]; while ( true ) { for ( .@i = 5; .@i > 0; --.@i ) { mapannounce "bat_c01", "["+ .@i +"]", bc_map; if ( !.skip ) sleep 1000; } if ( .score[ .red ] == .winningscore -1 && .score[ .blue ] == .winningscore -1 ) mapannounce "bat_c01", "Final Round start!", bc_map; else mapannounce "bat_c01", "Round "+ ++.round +" start!", bc_map; callsub L_SetLeader, .qred, "Red"; callsub L_SetLeader, .qblue, "Blue"; detachrid; delwall "bg_pvp_leader_red"; delwall "bg_pvp_leader_blue"; if ( !.skip ) sleep .eventlasting * 1000; deletearray .leader_aid; bg_updatescore "bat_c01", .score[ .red ], .score[ .blue ]; if ( .score[ .red ] == .winningscore || .score[ .blue ] == .winningscore || !.winside ) break; .winside = 0; if ( !.skip ) sleep 1000; bg_warp .red, "bat_c01", 53,128; bg_warp .blue, "bat_c01", 146,56; setwall "bat_c01", 54,122, 6, DIR_NORTHEAST, 0, "bg_pvp_leader_red"; setwall "bat_c01", 140,56, 6, DIR_NORTHEAST, 0, "bg_pvp_leader_blue"; } if ( .score[ .red ] > .score[ .blue ] ) { mapannounce "bat_c01", "- Red side wins !", bc_map; .@it = queueiterator( .qred ); while ( .@aid = qiget(.@it) ) getitem .rewarditem[0], .rewarditem[1], .@aid; qiclear .@it; } else if ( .score[ .blue ] > .score[ .red ] ) { mapannounce "bat_c01", "- Blue side wins !", bc_map; .@it = queueiterator( .qblue ); while ( .@aid = qiget(.@it) ) getitem .rewarditem[0], .rewarditem[1], .@aid; qiclear .@it; } else mapannounce "bat_c01", "Time Out. Aborting the match.", bc_map; sleep 5000; queuedel .qred; queuedel .qblue; bg_warp .red, "prontera", 145,182; bg_warp .blue, "prontera", 155,182; bg_destroy .red; bg_destroy .blue; .round = .winside = .skip = .start = 0; deletearray .score; end; OnQuitRegister: queueremove .qid, getcharid(CHAR_ID_ACCOUNT); end; OnInit: .minplayer2start = 1; // minimum players to start (ex. if 3vs3, set to 3). .winningscore = 2; // how many rounds to win .eventlasting = 2*60; // event duration before auto-reset (20 minutes * seconds) setarray .rewarditem[0], // rewards for the winning team: ,,... 501, 10; .qid = queue(); queueopt .qid, QUEUEOPT_LOGOUT, strnpcinfo(0)+"::OnQuitRegister"; queueopt .qid, QUEUEOPT_MAPCHANGE, strnpcinfo(0)+"::OnQuitRegister"; end; OnRedDead: callsub L_Dead, .qred, "Red", .blue; OnBlueDead: callsub L_Dead, .qblue, "Blue", .red; L_Dead: if ( .leader_aid[ getarg(0) ] == getcharid(CHAR_ID_ACCOUNT) ) { if ( killerrid == getcharid(CHAR_ID_ACCOUNT) ) mapannounce "bat_c01", "The target ["+ strcharinfo(PC_NAME) +"] From "+ getarg(1) +" Team has suicide !", bc_map; else if ( killerrid ) mapannounce "bat_c01", "The target ["+ strcharinfo(PC_NAME) +"] From "+ getarg(1) +" Team has assassinated by ["+ rid2name(killerrid) +"] !", bc_map; else mapannounce "bat_c01", "The target ["+ strcharinfo(PC_NAME) +"] From "+ getarg(1) +" Team has been killed !", bc_map; .winside = getarg(2); ++.score[ .winside ]; awake strnpcinfo(0); } sleep2 1250; percentheal 100,100; end; OnRedMapChange: OnRedQuit: callsub L_Quit, .red, "Red", .blue, .qred; OnBlueMapChange: OnBlueQuit: callsub L_Quit, .blue, "Blue", .red, .qblue; L_Quit: percentheal 100, 100; bg_leave; if ( !bg_get_data( getarg(0), 0 ) ) { mapannounce "bat_c01", "All "+ getarg(1) +" Team members has left the Game !", bc_map; .score[ getarg(2) ] = .winningscore; .skip = true; awake strnpcinfo(0); } else if ( .leader_aid[ getarg(3) ] == getcharid(CHAR_ID_ACCOUNT) ) { mapannounce "bat_c01", "The target ["+ strcharinfo(PC_NAME) +"] From "+ getarg(1) +" Team has left the Game !", bc_map; .winside = getarg(2); ++.score[ .winside ]; awake strnpcinfo(0); } end; L_SetLeader: .@it = queueiterator( getarg(0) ); while ( .@num = qiget(.@it) ) .@aid[.@c++] = .@num; qiclear .@it; .leader_aid[ getarg(0) ] = .@aid[ rand(.@c) ]; attachrid .leader_aid[ getarg(0) ]; addtimer 1, strnpcinfo(0) +"::OnSetTeam"+ getarg(1) +"Leader"; return; OnSetTeamRedLeader: callsub L_LeaderEffect, .qred, EF_RED_HIT; OnSetTeamBlueLeader: callsub L_LeaderEffect, .qblue, EF_BLUE_HIT; L_LeaderEffect: while ( .leader_aid[ getarg(0) ] == getcharid(CHAR_ID_ACCOUNT) ) { specialeffect getarg(1), AREA, getcharid(CHAR_ID_ACCOUNT); sleep2 1000; } end; } bat_c01 mapflag battleground 2 bat_c01 mapflag nosave SavePoint bat_c01 mapflag nowarp bat_c01 mapflag nowarpto bat_c01 mapflag noteleport bat_c01 mapflag nomemo bat_c01 mapflag nopenalty bat_c01 mapflag nobranch bat_c01 mapflag noicewall