leonardofan Posted November 25, 2018 Group: Members Topic Count: 15 Topics Per Day: 0.00 Content Count: 25 Reputation: 0 Joined: 01/15/15 Last Seen: March 2, 2021 Share Posted November 25, 2018 (edited) I would like to prevent the flood from coming out and entering the room //===== rAthena Script ======================================= //= Battleground: PVP //===== By: ================================================== //= AnnieRuru //===== Current Version: ===================================== //= 1.0 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= A simple battleground script: //= Kill players from the other team. //===== Additional Comments: ================================= //= 1.0 First version, edited. [Euphy] //============================================================ - script bg_pvp1#control1 -1,{ OnInit: .minplayer2start = 4; // minimum players to start (ex. if 3vs3, set to 3) .eventlasting = 10*60; // event duration before auto-reset (20 minutes * seconds) setarray .rewarditem[0], // rewards for the winning team: <item>,<amount>,... 7773, 30; end; OnStart: .@Guillaume = getwaitingroomstate( 0, .rednpcname$ ); .@Croix = getwaitingroomstate( 0, .bluenpcname$ ); if ( .@Guillaume < .minplayer2start || .@Croix < .minplayer2start ){ announce "Battleground 5v5 : "+.@Guillaume+"/5 Time Vermelho | "+.@Croix+"/5 Time Azul",13; end; } // create Battleground and teams .red = waitingroom2bg( "bat_c01", 58,124, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead", .rednpcname$ ); copyarray .team1aid, $@arenamembers, $@arenamembersnum; .team1count = .minplayer2start; .blue = waitingroom2bg( "bat_c01", 147,54, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead", .bluenpcname$ ); copyarray .team2aid, $@arenamembers, $@arenamembersnum; .team2count = .minplayer2start; delwaitingroom .rednpcname$; delwaitingroom .bluenpcname$; bg_warp .red, "bat_c01", 58,124; bg_warp .blue, "bat_c01", 147,54; .score[1] = .score[2] = .minplayer2start; bg_updatescore "bat_c01", .score[1], .score[2]; // match duration sleep .eventlasting * 1000; // end match, destroy Battleground, reset NPCs if ( .score[1] > .score[2] ) { mapannounce "bat_c01", "- Time Vermelho Ganhou! -", bc_map; callsub L_Reward, 1; } else if ( .score[1] < .score[2] ) { mapannounce "bat_c01", "- Time Azul Perdeu! -", bc_map; callsub L_Reward, 2; } else mapannounce "bat_c01", "- Terminou em Empate! -", bc_map; bg_warp .red, "prontera",156,182; bg_warp .blue, "prontera",156,182; bg_destroy .red; bg_destroy .blue; donpcevent .rednpcname$ +"::OnStart"; donpcevent .bluenpcname$ +"::OnStart"; end; L_Reward: for ( .@i = 0; .@i < getd(".team"+ getarg(0) +"count"); .@i++ ) getitem .rewarditem[0], .rewarditem[1], getd(".team"+ getarg(0) +"aid["+ .@i +"]" ); return; // "OnDeath" event OnRedDead: callsub L_Dead, 1; OnBlueDead: callsub L_Dead, 2; L_Dead: .score[ getarg(0) ]--; bg_updatescore "bat_c01", .score[1], .score[2]; 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; bg_leave; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); sleep2 1250; percentheal 100,100; end; // "OnQuit" event OnRedQuit: callsub L_Quit, 1; OnBlueQuit: callsub L_Quit, 2; L_Quit: .score[ getarg(0) ]--; bg_updatescore "bat_c01", .score[1], .score[2]; percentheal 100, 100; 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; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); end; } prontera,152,191,5 script Time Azul#bg_pvp1 4_M_CRU_SOLD,{ OnInit: sleep 1; set getvariableofnpc( .rednpcname$, "bg_pvp1#control1" ), strnpcinfo(0); OnStart: waitingroom "Battleground - 5v5", getvariableofnpc( .minplayer2start, "bg_pvp1#control1" ) +1, "bg_pvp1#control1::OnStart", 1; end; } prontera,159,191,3 script Time Vermelho#bg_pvp1 4_M_CRU_SOLD,{ OnInit: sleep 1; set getvariableofnpc( .bluenpcname$, "bg_pvp1#control1" ), strnpcinfo(0); OnStart: waitingroom "Battleground - 5v5", getvariableofnpc( .minplayer2start, "bg_pvp1#control1" ) +1, "bg_pvp1#control1::OnStart", 1; 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 Edited November 25, 2018 by Emistry Please use codebox Quote Link to comment Share on other sites More sharing options...
0 AnnieRuru Posted January 10, 2019 Group: Members Topic Count: 18 Topics Per Day: 0.00 Content Count: 2044 Reputation: 682 Joined: 10/09/12 Last Seen: December 20, 2020 Share Posted January 10, 2019 (edited) I'm quite sure I've made a lot bg_pvp script without waitingroom .... but I think better make a new one every time, after all I hardly see any good battleground script request recently // https://rathena.org/board/topic/117531-battleground-pvp-10-annieruru-help/ function script F_ShuffleNumbers { deletearray getarg(2); .@static = getarg(0); .@range = getarg(1) +1 - .@static; .@count = getarg(3, .@range); if (.@range <= 0 || .@count <= 0) return 0; if (.@count > .@range) .@count = .@range; for (.@i = 0; .@i < .@range; ++.@i) .@temparray[.@i] = .@i; for (.@i = 0; .@i < .@count; ++.@i) { .@rand = rand(.@range); set getelementofarray( getarg(2), .@i ), .@temparray[.@rand] + .@static; .@temparray[.@rand] = .@temparray[--.@range]; } return .@count; } prontera,155,185,5 script bg_pvp 1_F_MARIA,{ .minplayer2start = 1; // 1vs1 mes "bg_pvp"; if ( .start == true ) { mes "bg_pvp is on-going"; close; } while ( .aid[.@i] != getcharid(3) && .@i < .size ) ++.@i; if ( .@i < .size ) { mes "You already join the queue."; close; } select "join"; mes "you have to stick to this map"; close2; .aid[ .size++ ] = getcharid(3); for ( .@i = 0; .@i < .size; ++.@i ) { if ( !isloggedin( .aid[.@i] ) ) { deletearray .aid[.@i], 1; --.@i; --.size; } else { attachrid .aid[.@i]; if ( strcharinfo(3) != strnpcinfo(4) ) { deletearray .aid[.@i], 1; --.@i; --.size; } } } detachrid; if ( .size < .minplayer2start *2 ) { announce .size +" players join", bc_npc | bc_area; end; } .start = true; .red = bg_create( "bat_c01",53,128, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead" ); .blue = bg_create( "bat_c01",146,56, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead" ); callfunc "F_ShuffleNumbers", 0, .size -1, .@r; for ( .@i = 0; .@i < .size; ++.@i ) { attachrid .aid[ .@r[.@i] ]; bg_join ( .@i % 2 )? .red : .blue; } detachrid; deletearray .aid; .size = 0; bg_warp .red, "bat_c03", 53,128; bg_warp .blue, "bat_c03", 146,56; sleep 30000; // Match Duration if ( !.winside ) mapannounce "bat_c03", "Battle end as time out", bc_map; else if ( .winside == .red ) { mapannounce "bat_c03", "- Red side Won the match !", bc_map; callsub L_reward, .red; } else if ( .winside == .blue ) { mapannounce "bat_c03", "- Blue side Won the match !", bc_map; callsub L_reward, .blue; } bg_destroy .red; bg_destroy .blue; mapwarp "bat_c03", "prontera",150,185; .start = .winside = false; end; L_reward: bg_get_data getarg(0), 1; for ( .@i = 0; .@i < $@arenamemberscount; ++.@i ) getitem 501,1, $@arenamembers[.@i]; return; OnRedQuit: callsub L_Quit, .red, .blue, "Red"; OnBlueQuit: callsub L_Quit, .blue, .red, "Blue"; L_Quit: if ( bg_get_data( getarg(0), 0 ) ) end; mapannounce "bat_c03", "All "+ getarg(2) +" team members has Quit!", bc_map; .winside = getarg(1); awake strnpcinfo(0); end; OnRedDead: callsub L_Dead, .red, .blue, "Red"; OnBlueDead: callsub L_Dead, .lue, .red, "Blue"; L_Dead: bg_leave; if ( bg_get_data( getarg(0), 0 ) ) end; mapannounce "bat_c03", "All "+ getarg(2) +" team members has killed!", bc_map; .winside = getarg(1); awake strnpcinfo(0); sleep2 1250; percentheal 100,100; end; } bat_c03 mapflag battleground bat_c03 mapflag nosave SavePoint bat_c03 mapflag nowarp bat_c03 mapflag nowarpto bat_c03 mapflag noteleport bat_c03 mapflag nomemo bat_c03 mapflag nopenalty bat_c03 mapflag nobranch bat_c03 mapflag noicewall @leonardofan Edited January 10, 2019 by AnnieRuru Quote Link to comment Share on other sites More sharing options...
0 leonardofan Posted January 10, 2019 Group: Members Topic Count: 15 Topics Per Day: 0.00 Content Count: 25 Reputation: 0 Joined: 01/15/15 Last Seen: March 2, 2021 Author Share Posted January 10, 2019 http://prntscr.com/m5fm9v I'm using a yours that made some modifications, it is possible to add add a number of kills to determine if a team was champion or not instead of just dying and going to prontera? Sorry for my english, it is also possible to change this waiting room to some @bg and appear the functions to enter the BG from anywhere, it does not have to be anything so dynamic just do not need to stay in the chat is already great. //===== rAthena Script ======================================= //= Battleground: PVP //===== By: ================================================== //= AnnieRuru //===== Current Version: ===================================== //= 1.0 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= A simple battleground script: //= Kill players from the other team. //===== Additional Comments: ================================= //= 1.0 First version, edited. [Euphy] //============================================================ - script bg_pvp1#control1 -1,{ OnInit: .minplayer2start = 2; // minimum players to start (ex. if 3vs3, set to 3) .minlevel2start = 999; // level minimo .maxlevel2start = 999; // level maximo .eventlasting = 8*60; // event duration before auto-reset (20 minutes * seconds) setarray .rewarditem[0], // rewards for the winning team: <item>,<amount>,... 7773, 30; end; OnStart: .@Guillaume = getwaitingroomstate( 0, .rednpcname$ ); .@Croix = getwaitingroomstate( 0, .bluenpcname$ ); if ( .@Guillaume < .minplayer2start || .@Croix < .minplayer2start ){ announce "Batalha Campal 3v3 : "+.@Guillaume+"/3 Time Azul | "+.@Croix+"/3 Time Vermelho",bc_all | bc_blue; end; } // create Battleground and teams .red = waitingroom2bg( "bat_c01", 58,124, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead", .rednpcname$ ); copyarray .team1aid, $@arenamembers, $@arenamembersnum; .team1count = .minplayer2start; .blue = waitingroom2bg( "bat_c01", 147,54, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead", .bluenpcname$ ); copyarray .team2aid, $@arenamembers, $@arenamembersnum; .team2count = .minplayer2start; delwaitingroom .rednpcname$; delwaitingroom .bluenpcname$; bg_warp .red, "bat_c01", 58,124; bg_warp .blue, "bat_c01", 147,54; .score[1] = .score[2] = .minplayer2start; bg_updatescore "bat_c01", .score[1], .score[2]; // match duration sleep .eventlasting * 1000; // end match, destroy Battleground, reset NPCs if ( .score[1] > .score[2] ) { mapannounce "bat_c01", "- Time Vermelho Ganhou! -", bc_map | bc_blue; callsub L_Reward, 1; } else if ( .score[1] < .score[2] ) { mapannounce "bat_c01", "- Time Azul Perdeu! -", bc_map | bc_blue; callsub L_Reward, 2; } else mapannounce "bat_c01", "- Terminou em Empate! -", bc_map | bc_blue; bg_warp .red, "prontera",156,182; bg_warp .blue, "prontera",156,182; bg_destroy .red; bg_destroy .blue; donpcevent .rednpcname$ +"::OnStart"; donpcevent .bluenpcname$ +"::OnStart"; end; L_Reward: for ( .@i = 0; .@i < getd(".team"+ getarg(0) +"count"); .@i++ ) getitem .rewarditem[0], .rewarditem[1], getd(".team"+ getarg(0) +"aid["+ .@i +"]" ); return; // "OnDeath" event OnRedDead: callsub L_Dead, 1; OnBlueDead: callsub L_Dead, 2; L_Dead: .score[ getarg(0) ]--; bg_updatescore "bat_c01", .score[1], .score[2]; 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; bg_leave; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); sleep2 1250; percentheal 100,100; end; // "OnQuit" event OnRedQuit: callsub L_Quit, 1; OnBlueQuit: callsub L_Quit, 2; L_Quit: .score[ getarg(0) ]--; bg_updatescore "bat_c01", .score[1], .score[2]; percentheal 100, 100; 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; if ( !.score[ getarg(0) ] ) awake strnpcinfo(0); end; } prontera,165,186,3 script Time Azul#bg_pvp1 4_M_CRU_SOLD,{ end; OnInit: sleep 1; set getvariableofnpc( .rednpcname$, "bg_pvp1#control1" ), strnpcinfo(0); OnStart: waitingroom "Campal - 3v3", getvariableofnpc( .minplayer2start, "bg_pvp1#control1" ) +1, "bg_pvp1#control1::OnStart", 1, 0, getvariableofnpc( .minlevel2start, "bg_pvp1#control1" ), getvariableofnpc( .maxlevel2start, "bg_pvp1#control1" ); end; } prontera,165,183,3 script Time Vermelho#bg_pvp1 4_M_CRU_SOLD,{ end; OnInit: sleep 1; set getvariableofnpc( .bluenpcname$, "bg_pvp1#control1" ), strnpcinfo(0); OnStart: waitingroom "Campal - 3v3", getvariableofnpc( .minplayer2start, "bg_pvp1#control1" ) +1, "bg_pvp1#control1::OnStart", 1, 0, getvariableofnpc( .minlevel2start, "bg_pvp1#control1" ), getvariableofnpc( .maxlevel2start, "bg_pvp1#control1" ); 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 Quote Link to comment Share on other sites More sharing options...
0 AnnieRuru Posted January 10, 2019 Group: Members Topic Count: 18 Topics Per Day: 0.00 Content Count: 2044 Reputation: 682 Joined: 10/09/12 Last Seen: December 20, 2020 Share Posted January 10, 2019 (edited) you are using older rathena version, this one should work // https://rathena.org/board/topic/117531-battleground-pvp-10-annieruru-help/ function script F_ShuffleNumbers { deletearray getarg(2); .@static = getarg(0); .@range = getarg(1) +1 - .@static; .@count = getarg(3, .@range); if (.@range <= 0 || .@count <= 0) return 0; if (.@count > .@range) .@count = .@range; for (.@i = 0; .@i < .@range; ++.@i) .@temparray[.@i] = .@i; for (.@i = 0; .@i < .@count; ++.@i) { .@rand = rand(.@range); set getelementofarray( getarg(2), .@i ), .@temparray[.@rand] + .@static; .@range--; .@temparray[.@rand] = .@temparray[.@range]; } return .@count; } prontera,155,185,5 script bg_pvp 1_F_MARIA,{ .minplayer2start = 1; // 1vs1 mes "bg_pvp"; if ( .start == true ) { mes "bg_pvp is on-going"; close; } while ( .aid[.@i] != getcharid(3) && .@i < .size ) { .@i++; } if ( .@i < .size ) { mes "You already join the queue."; close; } select "join"; mes "you have to stick to this map"; close2; .aid[ .size ] = getcharid(3); .size++; for ( .@i = 0; .@i < .size; .@i++ ) { if ( !isloggedin( .aid[.@i] ) ) { deletearray .aid[.@i], 1; .@i--; .size--; } else { attachrid .aid[.@i]; if ( strcharinfo(3) != strnpcinfo(4) ) { deletearray .aid[.@i], 1; .@i--; .size--; } } } detachrid; if ( .size < .minplayer2start *2 ) { announce .size +" players join", bc_npc | bc_area; end; } .start = true; .red = bg_create( "bat_c01",53,128, strnpcinfo(0)+"::OnRedQuit", strnpcinfo(0)+"::OnRedDead" ); .blue = bg_create( "bat_c01",146,56, strnpcinfo(0)+"::OnBlueQuit", strnpcinfo(0)+"::OnBlueDead" ); callfunc "F_ShuffleNumbers", 0, .size -1, .@r; for ( .@i = 0; .@i < .size; .@i++ ) { attachrid .aid[ .@r[.@i] ]; bg_join ( .@i % 2 )? .red : .blue; } detachrid; deletearray .aid; .size = 0; bg_warp .red, "bat_c03", 53,128; bg_warp .blue, "bat_c03", 146,56; sleep 30000; // Match Duration if ( !.winside ) mapannounce "bat_c03", "Battle end as time out", bc_map; else if ( .winside == .red ) { mapannounce "bat_c03", "- Red side Won the match !", bc_map; callsub L_reward, .red; } else if ( .winside == .blue ) { mapannounce "bat_c03", "- Blue side Won the match !", bc_map; callsub L_reward, .blue; } bg_destroy .red; bg_destroy .blue; mapwarp "bat_c03", "prontera",150,185; .start = .winside = false; end; L_reward: bg_get_data getarg(0), 1; for ( .@i = 0; .@i < $@arenamemberscount; .@i++ ) getitem 501,1, $@arenamembers[.@i]; return; OnRedQuit: callsub L_Quit, .red, .blue, "Red"; OnBlueQuit: callsub L_Quit, .blue, .red, "Blue"; L_Quit: if ( bg_get_data( getarg(0), 0 ) ) end; mapannounce "bat_c03", "All "+ getarg(2) +" team members has Quit!", bc_map; .winside = getarg(1); awake strnpcinfo(0); end; OnRedDead: callsub L_Dead, .red, .blue, "Red"; OnBlueDead: callsub L_Dead, .lue, .red, "Blue"; L_Dead: bg_leave; if ( bg_get_data( getarg(0), 0 ) ) end; mapannounce "bat_c03", "All "+ getarg(2) +" team members has killed!", bc_map; .winside = getarg(1); awake strnpcinfo(0); sleep2 1250; percentheal 100,100; end; } bat_c03 mapflag battleground bat_c03 mapflag nosave SavePoint bat_c03 mapflag nowarp bat_c03 mapflag nowarpto bat_c03 mapflag noteleport bat_c03 mapflag nomemo bat_c03 mapflag nopenalty bat_c03 mapflag nobranch bat_c03 mapflag noicewall 1 hour ago, leonardofan said: it is possible to add add a number of kills to determine if a team was champion or not instead of just dying and going to prontera? I don't understand this sentence, but based on my past experience, most people would either asked for bg_pvp_round <--- just like the one in github, but instead end in 1 round, you have to fight multiple rounds, the team with win the most rounds wins bg_pvp_points <-- each team has 15 lives, the team that quickly lose 15 points first lose the match bg_pvp_leader <-- modification of bg_pvp_points, it just kill the leader earn extra points (somehow this script is the most popular one) btw, forget those scripts on these topic, the technique was too old and might not work on latest rathena. I just provide the link because I remember I did all those stuffs before and I usually always write a new one on request because I keep finding new techniques to write bg scripts =/ Edited January 10, 2019 by AnnieRuru Quote Link to comment Share on other sites More sharing options...
0 leonardofan Posted January 11, 2019 Group: Members Topic Count: 15 Topics Per Day: 0.00 Content Count: 25 Reputation: 0 Joined: 01/15/15 Last Seen: March 2, 2021 Author Share Posted January 11, 2019 works even better than I hoped it might have some blockage for who flooda coming in and out of the room? Quote Link to comment Share on other sites More sharing options...
0 AnnieRuru Posted January 11, 2019 Group: Members Topic Count: 18 Topics Per Day: 0.00 Content Count: 2044 Reputation: 682 Joined: 10/09/12 Last Seen: December 20, 2020 Share Posted January 11, 2019 (edited) lol... fixed 2 bugs for the script on that topic, although both are rare bug 1. if the player die purposely during the counting down [5],[4],[3],[2] ... the player is permanently stuck and can only recover by log out 2. there is still 1 player left in your team, and another team members logout, even though you are still alive but the script count as you lost that round that's why the more scripts I write, the more I get wiser XD bg_pvp_round.txt @leonardofan Edited January 11, 2019 by AnnieRuru Quote Link to comment Share on other sites More sharing options...
0 leonardofan Posted January 20, 2019 Group: Members Topic Count: 15 Topics Per Day: 0.00 Content Count: 25 Reputation: 0 Joined: 01/15/15 Last Seen: March 2, 2021 Author Share Posted January 20, 2019 On 11/01/2019 at 13:34, AnnieRuru said: lol ... consertou 2 bugs para o script sobre esse tópico, embora ambos sejam raros bug 1. se o jogador morrer propositalmente durante a contagem decrescente [5], [4], [3], [2] ... o jogador está permanentemente empacado e só pode recuperar efetuando logout 2. ainda resta 1 jogador em sua equipe, e outros membros da equipe efetuam logout, mesmo que você ainda esteja vivo, mas o script conta quando você perdeu essa rodada, é por isso que mais scripts eu escrevo , quanto mais eu fico mais sábio XD bg_pvp_round.txt @leonardofan http://prntscr.com/m9jhlb Quote Link to comment Share on other sites More sharing options...
0 AnnieRuru Posted January 20, 2019 Group: Members Topic Count: 18 Topics Per Day: 0.00 Content Count: 2044 Reputation: 682 Joined: 10/09/12 Last Seen: December 20, 2020 Share Posted January 20, 2019 sorry, if you are using very old emulator and don't want waitingroom, the only way is source edits I used to have setbgid source release ... Quote Link to comment Share on other sites More sharing options...
Question
leonardofan
I would like to prevent the flood from coming out and entering the room
Please use codebox
Link to comment
Share on other sites
7 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.