madarismenos Posted February 27, 2016 Share Posted February 27, 2016 (edited) Hello i Create one Easy code for your server's this is code for Fake player real time is have items and clan crest. He got the idea from the L2mafia, L2reality Soory for bad English Index: java/net/sf/l2j/gameserver/GameServer.java =================================================================== --- java/net/sf/l2j/gameserver/GameServer.java (revision 4) +++ java/net/sf/l2j/gameserver/GameServer.java (working copy) @@ -99,6 +99,7 @@ import net.sf.l2j.gameserver.instancemanager.games.MonsterRace; import net.sf.l2j.gameserver.model.L2Manor; import net.sf.l2j.gameserver.model.L2World; +import net.sf.l2j.gameserver.model.entity.FakeOnline; import net.sf.l2j.gameserver.model.entity.Hero; import net.sf.l2j.gameserver.model.olympiad.Olympiad; import net.sf.l2j.gameserver.model.olympiad.OlympiadGameManager; @@ -300,7 +301,7 @@ if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED) FishingChampionshipManager.getInstance(); - + FakeOnline.restoreFakePlayers(); Util.printSection("System"); TaskManager.getInstance(); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Index: java/net/sf/l2j/gameserver/model/L2Clan.java =================================================================== --- java/net/sf/l2j/gameserver/model/L2Clan.java (revision 4) +++ java/net/sf/l2j/gameserver/model/L2Clan.java (working copy) @@ -2186,7 +2186,7 @@ member.broadcastUserInfo(); } - private void checkCrests() + public void checkCrests() { if (_crestId != 0) { Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 4) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -3118,7 +3118,7 @@ L2GameClient client = _client; if (client != null) { - if (client.isDetached()) + if (client.isDetached()|| client.isFakePlayer()) client.cleanMe(true); else { @@ -8890,6 +8890,17 @@ _validBypass2.add(bypass); } + public boolean fakeplayer = false; + + public boolean getfakeplayer() + { + return fakeplayer; + } + public void setfakeplayer(boolean fake) + { + fakeplayer = fake; + } + public synchronized boolean validateBypass(String cmd) { for (String bp : _validBypass) Index: java/net/sf/l2j/gameserver/model/entity/FakeOnline.java =================================================================== --- java/net/sf/l2j/gameserver/model/entity/FakeOnline.java (revision 0) +++ java/net/sf/l2j/gameserver/model/entity/FakeOnline.java (revision 0) @@ -0,0 +1,92 @@ +package net.sf.l2j.gameserver.model.entity; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.sf.l2j.L2DatabaseFactory; +import net.sf.l2j.gameserver.LoginServerThread; +import net.sf.l2j.gameserver.model.L2Clan; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.model.itemcontainer.ItemContainer; +import net.sf.l2j.gameserver.network.L2GameClient; +import net.sf.l2j.gameserver.network.L2GameClient.GameClientState; + +/** + * @author FOFAS + * + */ +public class FakeOnline +{ + private static Logger _log = Logger.getLogger(FakeOnline.class.getName()); + //select fake player + private static final String LOAD_OFFLINE_STATUS = "SELECT * FROM fakeplayer"; + //insert fake player + private static final String SET_OFFLINE_STATUS = "INSERT INTO fakeplayer (charId) VALUES (?)"; + + public static void restoreFakePlayers() + { + int nfakeplayer = 0; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement stm = con.prepareStatement(LOAD_OFFLINE_STATUS); + ResultSet rs = stm.executeQuery(); + while (rs.next()) + { + L2PcInstance player = null; + try + { + L2GameClient client = new L2GameClient(null); + client.setFakePlayer(true); + player = L2PcInstance.restore(rs.getInt("charId")); + client.setActiveChar(player); + player.setOnlineStatus(true, false); + client.setAccountName(player.getAccountName()); + client.setState(GameClientState.IN_GAME); + player.setClient(client); + player.spawnMe(player.getX(), player.getY(), player.getZ()); + LoginServerThread.getInstance().addGameServerLogin(player.getAccountName(), client); + ItemContainer items = player.getInventory(); + items.restore(); + L2Clan clan = player.getClan(); + clan.checkCrests(); + player.setfakeplayer(true); + player.setOnlineStatus(true, true); + player.restoreEffects(); + player.broadcastUserInfo(); + nfakeplayer++; + } + catch (Exception e) + { + _log.log(Level.WARNING, "FakePlayer: Error loading trader: "+player,e); + if (player != null) + { + player.deleteMe(); + } + } + } + rs.close(); + stm.close(); + _log.info("Loaded: " +nfakeplayer+ " Fake player(s)"); + } + catch (Exception e) + { + _log.log(Level.WARNING, "FakePlayer: Error while loading FakePlayer: ",e); + } + } + + public static void setfakeplayers(L2PcInstance player) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement statement = con.prepareStatement(SET_OFFLINE_STATUS); + statement.setInt(1, player.getObjectId()); + statement.execute(); + statement.close(); + } + catch (Exception e) + {} + } +} Index: java/net/sf/l2j/gameserver/network/L2GameClient.java =================================================================== --- java/net/sf/l2j/gameserver/network/L2GameClient.java (revision 4) +++ java/net/sf/l2j/gameserver/network/L2GameClient.java (working copy) @@ -194,7 +194,7 @@ public void sendPacket(L2GameServerPacket gsp) { - if (_isDetached) + if (_isDetached || _isfakeplayer) return; getConnection().sendPacket(gsp); @@ -291,6 +291,18 @@ } } + private boolean _isfakeplayer = false; + + public boolean isFakePlayer() + { + return _isfakeplayer; + } + + public void setFakePlayer(boolean b) + { + _isfakeplayer = b; + } + public static void deleteCharByObjId(int objid) { if (objid < 0) @@ -489,6 +501,9 @@ public void closeNow() { _isDetached = true; // prevents more packets execution + + _isfakeplayer = true; + close(ServerClose.STATIC_PACKET); synchronized (this) { @@ -538,7 +553,7 @@ try { - if (getActiveChar() != null && !isDetached()) + if (getActiveChar() != null && !isDetached() || !isFakePlayer()) { setDetached(true); fast = !getActiveChar().isInCombat() && !getActiveChar().isLocked(); @@ -633,7 +648,7 @@ */ public boolean dropPacket() { - if (_isDetached) // detached clients can't receive any packets + if (_isDetached || _isfakeplayer) // detached clients can't receive any packets return true; // flood protection @@ -756,7 +771,7 @@ if (packet == null) // queue is empty return; - if (_isDetached) // clear queue immediately after detach + if (_isDetached || _isfakeplayer) // clear queue immediately after detach { _packetQueue.clear(); return; Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java (revision 62) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java (working copy) @@ -22,6 +22,7 @@ import com.l2jfresh.gameserver.handler.voicedcommandhandlers.BankingCmd; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.DMVoicedInfo; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Donator; +import com.l2jfresh.gameserver.handler.voicedcommandhandlers.FakePlayerOnline; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Leave; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.OnlinePlayers; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Pin; @@ -67,6 +68,7 @@ + registerHandler(new FakePlayerOnline()); } public void registerHandler(IVoicedCommandHandler handler) Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) @@ -0,0 +1,35 @@ +package com.l2jfresh.gameserver.handler.voicedcommandhandlers; + +import com.l2jfresh.gameserver.handler.IVoicedCommandHandler; +import com.l2jfresh.gameserver.model.actor.instance.L2PcInstance; +import com.l2jfresh.gameserver.model.custom.FakeOnline; + +/** + * @author FOFAS + * + */ +public class FakePlayerOnline implements IVoicedCommandHandler +{ + private static final String[] VOICED_COMMANDS = {"fakeplayer"}; + + @Override + public boolean useVoicedCommand(String command, L2PcInstance player, String target) + { + if (command.equalsIgnoreCase("fakeplayer")) + { + if (player != null) + { + FakeOnline.setfakeplayers(player); + player.setfakeplayer(true); + player.deleteMe(); + player.logout(); + } + } + return true; + } + @Override + public String[] getVoicedCommandList() + { + return VOICED_COMMANDS; + } +} Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) @@ -0,0 +1,35 @@ +package com.l2jfresh.gameserver.handler.voicedcommandhandlers; + +import com.l2jfresh.gameserver.handler.IVoicedCommandHandler; +import com.l2jfresh.gameserver.model.actor.instance.L2PcInstance; +import com.l2jfresh.gameserver.model.custom.FakeOnline; + +/** + * @author FOFAS + * + */ +public class FakePlayerOnline implements IVoicedCommandHandler +{ + private static final String[] VOICED_COMMANDS = {"fakeplayer"}; + + @Override + public boolean useVoicedCommand(String command, L2PcInstance player, String target) + { + if (command.equalsIgnoreCase("fakeplayer")) + { + if (player != null) + { + FakeOnline.setfakeplayers(player); + player.setfakeplayer(true); + player.deleteMe(); + player.logout(); + } + } + return true; + } + @Override + public String[] getVoicedCommandList() + { + return VOICED_COMMANDS; + } +} Edited February 27, 2016 by madarismenos Quote Link to comment Share on other sites More sharing options...
Solomun Posted February 27, 2016 Share Posted February 27, 2016 Thanks for share! Quote Link to comment Share on other sites More sharing options...
valentin Posted February 28, 2016 Share Posted February 28, 2016 only children headless implements,this command :/ a big mess to lie to your players bump! Quote Link to comment Share on other sites More sharing options...
'Baggos' Posted February 29, 2016 Share Posted February 29, 2016 only children headless implements,this command :/ a big mess to lie to your players bump! You're the first user of this code. So, do not try to be a smart. Btw, that's why lineage gonna be a missed game. Quote Link to comment Share on other sites More sharing options...
StinkyMadness Posted March 3, 2016 Share Posted March 3, 2016 Hello i Create one Easy code for your server's +/** + * @author FOFAS + * + */ ????????? Quote Link to comment Share on other sites More sharing options...
Luchito Posted March 12, 2016 Share Posted March 12, 2016 Thanks Brother Quote Link to comment Share on other sites More sharing options...
badangel3s Posted May 16, 2016 Share Posted May 16, 2016 Can you explain how it works? It creates player? Or just change the online players count? Quote Link to comment Share on other sites More sharing options...
MeLDevGree Posted May 16, 2016 Share Posted May 16, 2016 Can you explain how it works? It creates player? Or just change the online players count? this Quote Link to comment Share on other sites More sharing options...
PARKA Posted July 30, 2016 Share Posted July 30, 2016 it can be used for h5 l2jserver? Quote Link to comment Share on other sites More sharing options...
crosero Posted September 26, 2016 Share Posted September 26, 2016 Sql??? Where is it? Quote Link to comment Share on other sites More sharing options...
Rootware Posted September 26, 2016 Share Posted September 26, 2016 Bullshit. Only spawn players, like offline shop. Quote Link to comment Share on other sites More sharing options...
kallone Posted November 26, 2017 Share Posted November 26, 2017 DROP TABLE IF EXISTS `fakeplayer`; CREATE TABLE `fakeplayer` ( `obj_Id` decimal(11,0) NOT NULL DEFAULT '0', PRIMARY KEY (`obj_Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Quote Link to comment Share on other sites More sharing options...
pro3mad Posted February 4, 2018 Share Posted February 4, 2018 On 2/27/2016 at 8:20 AM, madarismenos said: Hello i Create one Easy code for your server's this is code for Fake player real time is have items and clan crest. He got the idea from the L2mafia, L2reality Soory for bad English Index: java/net/sf/l2j/gameserver/GameServer.java =================================================================== --- java/net/sf/l2j/gameserver/GameServer.java (revision 4) +++ java/net/sf/l2j/gameserver/GameServer.java (working copy) @@ -99,6 +99,7 @@ import net.sf.l2j.gameserver.instancemanager.games.MonsterRace; import net.sf.l2j.gameserver.model.L2Manor; import net.sf.l2j.gameserver.model.L2World; +import net.sf.l2j.gameserver.model.entity.FakeOnline; import net.sf.l2j.gameserver.model.entity.Hero; import net.sf.l2j.gameserver.model.olympiad.Olympiad; import net.sf.l2j.gameserver.model.olympiad.OlympiadGameManager; @@ -300,7 +301,7 @@ if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED) FishingChampionshipManager.getInstance(); - + FakeOnline.restoreFakePlayers(); Util.printSection("System"); TaskManager.getInstance(); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Index: java/net/sf/l2j/gameserver/model/L2Clan.java =================================================================== --- java/net/sf/l2j/gameserver/model/L2Clan.java (revision 4) +++ java/net/sf/l2j/gameserver/model/L2Clan.java (working copy) @@ -2186,7 +2186,7 @@ member.broadcastUserInfo(); } - private void checkCrests() + public void checkCrests() { if (_crestId != 0) { Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 4) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -3118,7 +3118,7 @@ L2GameClient client = _client; if (client != null) { - if (client.isDetached()) + if (client.isDetached()|| client.isFakePlayer()) client.cleanMe(true); else { @@ -8890,6 +8890,17 @@ _validBypass2.add(bypass); } + public boolean fakeplayer = false; + + public boolean getfakeplayer() + { + return fakeplayer; + } + public void setfakeplayer(boolean fake) + { + fakeplayer = fake; + } + public synchronized boolean validateBypass(String cmd) { for (String bp : _validBypass) Index: java/net/sf/l2j/gameserver/model/entity/FakeOnline.java =================================================================== --- java/net/sf/l2j/gameserver/model/entity/FakeOnline.java (revision 0) +++ java/net/sf/l2j/gameserver/model/entity/FakeOnline.java (revision 0) @@ -0,0 +1,92 @@ +package net.sf.l2j.gameserver.model.entity; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.sf.l2j.L2DatabaseFactory; +import net.sf.l2j.gameserver.LoginServerThread; +import net.sf.l2j.gameserver.model.L2Clan; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.model.itemcontainer.ItemContainer; +import net.sf.l2j.gameserver.network.L2GameClient; +import net.sf.l2j.gameserver.network.L2GameClient.GameClientState; + +/** + * @author FOFAS + * + */ +public class FakeOnline +{ + private static Logger _log = Logger.getLogger(FakeOnline.class.getName()); + //select fake player + private static final String LOAD_OFFLINE_STATUS = "SELECT * FROM fakeplayer"; + //insert fake player + private static final String SET_OFFLINE_STATUS = "INSERT INTO fakeplayer (charId) VALUES (?)"; + + public static void restoreFakePlayers() + { + int nfakeplayer = 0; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement stm = con.prepareStatement(LOAD_OFFLINE_STATUS); + ResultSet rs = stm.executeQuery(); + while (rs.next()) + { + L2PcInstance player = null; + try + { + L2GameClient client = new L2GameClient(null); + client.setFakePlayer(true); + player = L2PcInstance.restore(rs.getInt("charId")); + client.setActiveChar(player); + player.setOnlineStatus(true, false); + client.setAccountName(player.getAccountName()); + client.setState(GameClientState.IN_GAME); + player.setClient(client); + player.spawnMe(player.getX(), player.getY(), player.getZ()); + LoginServerThread.getInstance().addGameServerLogin(player.getAccountName(), client); + ItemContainer items = player.getInventory(); + items.restore(); + L2Clan clan = player.getClan(); + clan.checkCrests(); + player.setfakeplayer(true); + player.setOnlineStatus(true, true); + player.restoreEffects(); + player.broadcastUserInfo(); + nfakeplayer++; + } + catch (Exception e) + { + _log.log(Level.WARNING, "FakePlayer: Error loading trader: "+player,e); + if (player != null) + { + player.deleteMe(); + } + } + } + rs.close(); + stm.close(); + _log.info("Loaded: " +nfakeplayer+ " Fake player(s)"); + } + catch (Exception e) + { + _log.log(Level.WARNING, "FakePlayer: Error while loading FakePlayer: ",e); + } + } + + public static void setfakeplayers(L2PcInstance player) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement statement = con.prepareStatement(SET_OFFLINE_STATUS); + statement.setInt(1, player.getObjectId()); + statement.execute(); + statement.close(); + } + catch (Exception e) + {} + } +} Index: java/net/sf/l2j/gameserver/network/L2GameClient.java =================================================================== --- java/net/sf/l2j/gameserver/network/L2GameClient.java (revision 4) +++ java/net/sf/l2j/gameserver/network/L2GameClient.java (working copy) @@ -194,7 +194,7 @@ public void sendPacket(L2GameServerPacket gsp) { - if (_isDetached) + if (_isDetached || _isfakeplayer) return; getConnection().sendPacket(gsp); @@ -291,6 +291,18 @@ } } + private boolean _isfakeplayer = false; + + public boolean isFakePlayer() + { + return _isfakeplayer; + } + + public void setFakePlayer(boolean b) + { + _isfakeplayer = b; + } + public static void deleteCharByObjId(int objid) { if (objid < 0) @@ -489,6 +501,9 @@ public void closeNow() { _isDetached = true; // prevents more packets execution + + _isfakeplayer = true; + close(ServerClose.STATIC_PACKET); synchronized (this) { @@ -538,7 +553,7 @@ try { - if (getActiveChar() != null && !isDetached()) + if (getActiveChar() != null && !isDetached() || !isFakePlayer()) { setDetached(true); fast = !getActiveChar().isInCombat() && !getActiveChar().isLocked(); @@ -633,7 +648,7 @@ */ public boolean dropPacket() { - if (_isDetached) // detached clients can't receive any packets + if (_isDetached || _isfakeplayer) // detached clients can't receive any packets return true; // flood protection @@ -756,7 +771,7 @@ if (packet == null) // queue is empty return; - if (_isDetached) // clear queue immediately after detach + if (_isDetached || _isfakeplayer) // clear queue immediately after detach { _packetQueue.clear(); return; Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java (revision 62) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/VoicedCommandHandler.java (working copy) @@ -22,6 +22,7 @@ import com.l2jfresh.gameserver.handler.voicedcommandhandlers.BankingCmd; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.DMVoicedInfo; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Donator; +import com.l2jfresh.gameserver.handler.voicedcommandhandlers.FakePlayerOnline; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Leave; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.OnlinePlayers; import com.l2jfresh.gameserver.handler.voicedcommandhandlers.Pin; @@ -67,6 +68,7 @@ + registerHandler(new FakePlayerOnline()); } public void registerHandler(IVoicedCommandHandler handler) Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) @@ -0,0 +1,35 @@ +package com.l2jfresh.gameserver.handler.voicedcommandhandlers; + +import com.l2jfresh.gameserver.handler.IVoicedCommandHandler; +import com.l2jfresh.gameserver.model.actor.instance.L2PcInstance; +import com.l2jfresh.gameserver.model.custom.FakeOnline; + +/** + * @author FOFAS + * + */ +public class FakePlayerOnline implements IVoicedCommandHandler +{ + private static final String[] VOICED_COMMANDS = {"fakeplayer"}; + + @Override + public boolean useVoicedCommand(String command, L2PcInstance player, String target) + { + if (command.equalsIgnoreCase("fakeplayer")) + { + if (player != null) + { + FakeOnline.setfakeplayers(player); + player.setfakeplayer(true); + player.deleteMe(); + player.logout(); + } + } + return true; + } + @Override + public String[] getVoicedCommandList() + { + return VOICED_COMMANDS; + } +} Index: Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java =================================================================== --- Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) +++ Roar_gameserver/java/com/l2jfresh/gameserver/handler/voicedcommandhandlers/FakePlayerOnline.java (revision 0) @@ -0,0 +1,35 @@ +package com.l2jfresh.gameserver.handler.voicedcommandhandlers; + +import com.l2jfresh.gameserver.handler.IVoicedCommandHandler; +import com.l2jfresh.gameserver.model.actor.instance.L2PcInstance; +import com.l2jfresh.gameserver.model.custom.FakeOnline; + +/** + * @author FOFAS + * + */ +public class FakePlayerOnline implements IVoicedCommandHandler +{ + private static final String[] VOICED_COMMANDS = {"fakeplayer"}; + + @Override + public boolean useVoicedCommand(String command, L2PcInstance player, String target) + { + if (command.equalsIgnoreCase("fakeplayer")) + { + if (player != null) + { + FakeOnline.setfakeplayers(player); + player.setfakeplayer(true); + player.deleteMe(); + player.logout(); + } + } + return true; + } + @Override + public String[] getVoicedCommandList() + { + return VOICED_COMMANDS; + } +} where I can add this code ? Quote Link to comment Share on other sites More sharing options...
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.
Note: Your post will require moderator approval before it will be visible.