function script shuffle__ { .@static = getarg(0); .@range = getarg(1) +1 - .@static; .@count = getarg(3, 0); if ( .@range <= 0 ) return 0; if ( !.@count || .@count > .@range ) .@count = .@range; while ( .@i < .@count ) { .@r = .@save = rand( .@i, .@range -1 ) ; if ( !.@tmp1[.@i] ) { .@r = .@tmp1[.@r] ? .@tmp2[.@r] : .@r; .@tmp2[.@i] = .@r; .@tmp2[.@save] = .@i; .@tmp1[.@save] = 1; set getelementofarray( getarg(2), .@i ), .@r + .@static; if ( .@save < .@count ) set getelementofarray( getarg(2), .@save ), .@i + .@static; } .@i++; } return .@count; } /* },{ name: "KVM (Level 80 and up)" //must match the name in client files event: "bg_pvp::OnStart" minLevel: 1 maxLevel: 150 reward: { // useless ! should be done by npc scripting win: 0 loss: 0 draw: 0 } minPlayers: 2 // minimum amount of players to start maxPlayers: 10 // maximum amount of players. NOTE: actually 60 is correct ... 30x2 = 60 minTeamPlayers: 1 // try this to test delay_var: "BG_PVP_Tick" // char variable name that will store the delay for this match maxDuration: 1 // maximum duration in minutes ... this one also bugged fillDuration: 20 // time in seconds to wait for more applications when minimum has been reached pGameDuration: 20 // time to wait for players to confirm their attendence after queueing process has finished },{ */ - script bg_pvp -1,{ OnInit: .eventlasting = 3; // duration in minutes setarray .rewardwin, 501,10, 502,5, 503,3; // reward to winning team setarray .rewardlose, 501,5, 502,3, 503,1; // reward to losing team setarray .rewarddraw, 501,3, 502,1; // reward to both teams when draw .rewardwinsize = getarraysize( .rewardwin ); .rewardlosesize = getarraysize( .rewardlose ); .rewarddrawsize = getarraysize( .rewarddraw ); mapwarp "guild_vs3", "prontera",152,178; end; OnStart: // Note: the server pushed these variables for ( .@i = 0; .@i < $@bg_member_size; .@i++ ) { switch ( $@bg_member_type[.@i] ) { case 0: announce rid2name( $@bg_member[.@i] ) +" SOLO", bc_all; break; case 1: announce rid2name( $@bg_member[.@i] ) +" from GUILD ["+ getguildname( $@bg_member_group[.@i] ) +"]", bc_all; break; case 2: announce rid2name( $@bg_member[.@i] ) +" from PARTY ["+ getpartyname( $@bg_member_group[.@i] ) +"]", bc_all; break; } } // that's all I need for the battleground script to work, no need to use their 12 script commands .red = createbgid( "guild_vs3", 48,50, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead" ); .blue = createbgid( "guild_vs3", 52,50, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead" ); .teamname$[.red] = "Red"; .teamname$[.blue] = "Blue"; callfunc "shuffle__", 0, $@bg_member_size -1, .@r; .@modulus = rand(2); for ( .@i = 0; .@i < $@bg_member_size; .@i++ ) setbgid ( .@i % 2 == .@modulus )? .red : .blue, $@bg_member[ .@r[.@i] ]; .score[.red] = bg_get_data( .red, 0 ); .score[.blue] = bg_get_data( .blue, 0 ); bg_updatescore "guild_vs3", .score[.red], .score[.blue]; bg_warp .red, "guild_vs3", 48,50; bg_warp .blue, "guild_vs3", 52,50; sleep .eventlasting * 60000; if ( .score[.red] > .score[.blue] ) { mapannounce "guild_vs3", "- Red Team is victorious! -", bc_map; callsub L_reward, .red, .rewardwin, .rewardwinsize; callsub L_reward, .blue, .rewardlose, .rewardlosesize; } else if ( .score[.red] < .score[.blue] ) { mapannounce "guild_vs3", "- Blue Team is victorious! -", bc_map; callsub L_reward, .blue, .rewardwin, .rewardwinsize; callsub L_reward, .red, .rewardlose, .rewardlosesize; } else { // same score mapannounce "guild_vs3", "- The match has ended in a draw! -", bc_map; callsub L_reward, .red, .rewarddraw, .rewarddrawsize; callsub L_reward, .blue, .rewarddraw, .rewarddrawsize; } bg_match_over "KVM (Level 80 and up)"; bg_warp .red, "prontera",152,178; bg_warp .blue, "prontera",152,178; bg_destroy .red; bg_destroy .blue; .teamname$[.red] = .teamname$[.blue] = ""; .score[.red] = .score[.blue] = 0; .red = .blue = .winside = 0; end; L_reward: getbgusers getarg(0); for ( .@i = 0; .@i < $@arenamembersnum; .@i++ ) for ( .@j = 0; .@j < getarg(2); .@j += 2 ) getitem getelementofarray( getarg(1), .@j ), getelementofarray( getarg(1), .@j +1 ), $@arenamembers[.@i]; return; OnRedDead: callsub L_Dead, .red; OnBlueDead: callsub L_Dead, .blue; L_Dead: warp "Save", 0,0; .score[ getarg(0) ]--; bg_updatescore "guild_vs3", .score[.red], .score[.blue]; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); bg_leave; sleep2 1250; percentheal 100,100; end; OnRedQuit: callsub L_Quit, .red; OnBlueQuit: callsub L_Quit, .blue; L_Quit: .score[ getarg(0) ]--; bg_updatescore "guild_vs3", .score[.red], .score[.blue]; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); percentheal 100, 100; end; } guild_vs3 mapflag battleground 2 guild_vs3 mapflag nosave SavePoint guild_vs3 mapflag nowarp guild_vs3 mapflag nowarpto guild_vs3 mapflag noreturn guild_vs3 mapflag nomemo guild_vs3 mapflag noteleport guild_vs3 mapflag nopenalty guild_vs3 mapflag nobranch guild_vs3 mapflag noicewall /* },{ name: "KVM (Level 60~79)" //must match the name in client files event: "bg_emp::OnStart" minLevel: 1 maxLevel: 150 reward: { // useless ! should be done by npc scripting win: 0 loss: 0 draw: 0 } minPlayers: 2 // minimum amount of players to start maxPlayers: 10 // maximum amount of players. NOTE: actually 60 is correct ... 30x2 = 60 minTeamPlayers: 1 // try this to test delay_var: "BG_EMP_Tick" // char variable name that will store the delay for this match maxDuration: 1 // maximum duration in minutes ... this one also bugged fillDuration: 20 // time in seconds to wait for more applications when minimum has been reached pGameDuration: 20 // time to wait for players to confirm their attendence after queueing process has finished },{ */ // callfunc "shuffle", , , {, }; - script bg_emp -1,{ OnInit: .eventlasting = 3; // duration in minutes setarray .rewardwin, 501,10, 502,5, 503,3; // reward to winning team setarray .rewardlose, 501,5, 502,3, 503,1; // reward to losing team setarray .rewarddraw, 501,3, 502,1; // reward to both teams when draw .rewardwinsize = getarraysize( .rewardwin ); .rewardlosesize = getarraysize( .rewardlose ); .rewarddrawsize = getarraysize( .rewarddraw ); mapwarp "guild_vs3", "prontera",152,178; end; OnStart: // Note: the server pushed these variables for ( .@i = 0; .@i < $@bg_member_size; .@i++ ) { switch ( $@bg_member_type[.@i] ) { case 0: announce rid2name( $@bg_member[.@i] ) +" SOLO", bc_all; break; case 1: announce rid2name( $@bg_member[.@i] ) +" from GUILD ["+ getguildname( $@bg_member_group[.@i] ) +"]", bc_all; break; case 2: announce rid2name( $@bg_member[.@i] ) +" from PARTY ["+ getpartyname( $@bg_member_group[.@i] ) +"]", bc_all; break; } } // that's all I need for the battleground script to work, no need to use their 12 script commands .red = createbgid( "guild_vs3", 45,50, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead" ); .blue = createbgid( "guild_vs3", 55,50, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead" ); .teamname$[.red] = "Red"; .teamname$[.blue] = "Blue"; callfunc "shuffle__", 0, $@bg_member_size -1, .@r; .@modulus = rand(2); for ( .@i = 0; .@i < $@bg_member_size; .@i++ ) setbgid ( .@i % 2 == .@modulus )? .red : .blue, $@bg_member[ .@r[.@i] ]; bg_updatescore "guild_vs3", 0,0; bg_warp .red, "guild_vs3", 45,50; bg_warp .blue, "guild_vs3", 55,50; bg_monster .red, "guild_vs3",47,50, "--ja--", OBJ_B2, strnpcinfo(0)+"::OnRedDown"; bg_monster .blue, "guild_vs3",52,50, "--ja--", OBJ_A2, strnpcinfo(0)+"::OnBlueDown"; sleep .eventlasting * 60000; killmonsterall "guild_vs3"; if ( .winside == .red ) { mapannounce "guild_vs3", "- Red Team is victorious! -", bc_map; callsub L_reward, .red, .rewardwin, .rewardwinsize; callsub L_reward, .blue, .rewardlose, .rewardlosesize; } else if ( .winside == .blue ) { mapannounce "guild_vs3", "- Blue Team is victorious! -", bc_map; callsub L_reward, .blue, .rewardwin, .rewardwinsize; callsub L_reward, .red, .rewardlose, .rewardlosesize; } else { // time out mapannounce "guild_vs3", "- The match has ended in a draw! -", bc_map; callsub L_reward, .red, .rewarddraw, .rewarddrawsize; callsub L_reward, .blue, .rewarddraw, .rewarddrawsize; } sleep 5000; bg_match_over "KVM (Level 60~79)"; bg_warp .red, "prontera",152,178; bg_warp .blue, "prontera",152,178; bg_destroy .red; bg_destroy .blue; .teamname$[.red] = .teamname$[.blue] = ""; .red = .blue = .winside = 0; end; L_reward: getbgusers getarg(0); for ( .@i = 0; .@i < $@arenamembersnum; .@i++ ) for ( .@j = 0; .@j < getarg(2); .@j += 2 ) getitem getelementofarray( getarg(1), .@j ), getelementofarray( getarg(1), .@j +1 ), $@arenamembers[.@i]; return; OnRedDown: callsub L_EmpDown, .red, .blue; OnBlueDown: callsub L_EmpDown, .blue, .red; L_EmpDown: mapannounce "guild_vs3", strcharinfo(0) +" has destroyed "+ .teamname$[ getarg(0) ] +" Team's Emperium.", bc_map; .winside = getarg(1); awake strnpcinfo(0); end; OnRedDead: OnBlueDead: sleep2 1250; percentheal 100,100; end; OnRedQuit: callsub L_Quit, .red, .blue; OnBlueQuit: callsub L_Quit, .blue, .red; L_Quit: percentheal 100, 100; bg_leave; if ( bg_get_data( getarg(0), 0 ) ) end; mapannounce "guild_vs3", "All "+ .teamname$[ getarg(0) ] +" team members have quit!", bc_map, 0xFF3333; .winside = getarg(1); awake strnpcinfo(0); end; }