Jump to content

Question

Posted

 

Recently some people showed me this video and i got interested in the system i'm creating it but i come across a problem when i log into the server again my party dissolves when i try to log into the server the party ends which package i need to modify?

 

 

No Carrier system @Rootware

 

 

 

how is it going :

 

 

Part 2

 

 

 

14 answers to this question

Recommended Posts

  • 0
Posted

im not sure but u need to create a boolean isNoCarrierMode() 

 

and find L2Party.java (propably) and surely it will have a check for disolve when logout packet enters

 

u can also check requestrestart, logout packets and add the check !isNoCarrierMode() , problem solved

  • 0
Posted
5 hours ago, Amenadiel said:

im not sure but u need to create a boolean isNoCarrierMode() 

 

and find L2Party.java (propably) and surely it will have a check for disolve when logout packet enters

 

u can also check requestrestart, logout packets and add the check !isNoCarrierMode() , problem solved

 

it's not that simple, cleanup() causes the player to be removed even adding a variable to check if the player is in a party it is removed when trying to enter/exit the game. In aCis 401 in the RequestGameStart package I believe that here is the problem for more than 3 clicks to log into the game I believe there is something else missing to succeed I will research a little more.

 

 

  • 0
Posted (edited)

Hello , in order to make the player to stay in party you need to add somewhere in cleanup()

 

if(player.isInParty())

player.savememo(is inparty)

if(playerisinparty and not pt leader)

player.getparty.getleader.sendmessage(your pt member this.getname() just logged off)

Player.savememo string type (player.getparty.getleader.getname())

if(player.ispartyleader()

player.getparty().getleader().givepartyto.playergetparty.getmembers.getoneplayer.

 

and then in enterworld

check if player has memo(inparty)

if it has use it to be added in party , if not you need to clean this memo after is used

world.getinstance.getplayer(playermemo.getplayerleadername).getactingplayer.sendmessage(your pt member just logged in game)

world.getinstance.getplayer(playermemo.getplayerleadername).getactingplayer.getparty.addmember(this)

 

you can use playermemo to check if player is in party when restarting , and save a memo with party leader or something like this...  up here is an ideea , you should also check if there are any members left when he is leaving party , the important thing is that you need to make player actualy leave party when logging out , and then when logs in again it needs to get added to party in order to don't have any client side issue

Edited by arm4729
  • 0
Posted
5 minutes ago, arm4729 said:

Hello , in order to make the player to stay in party you need to add somewhere in cleanup()

 

if(player.isInParty())

player.savememo(is inparty)

if(playerisinparty and not pt leader)

player.getparty.getleader.sendmessage(your pt member this.getname() just logged off)

Player.savememo string type (player.getparty.getleader.getname())

if(player.ispartyleader()

player.getparty().getleader().givepartyto.playergetparty.getmembers.getoneplayer.

 

and then in enterworld

check if player has memo(inparty)

if it has use it to be added in party , if not you need to clean this memo after is used

world.getinstance.getplayer(playermemo.getplayerleadername).getactingplayer.sendmessage(your pt member just logged in game)

world.getinstance.getplayer(playermemo.getplayerleadername).getactingplayer.getparty.addmember(this)

 

you can use playermemo to check if player is in party when restarting , and save a memo with party leader or something like this...  up here is an ideea , you should also check if there are any members left when he is leaving party , the important thing is that you need to make player actualy leave party when logging out , and then when logs in again it needs to get added to party in order to don't have any client side issue

 

yes i did practically that just take a look to add the system i created a task to calculate the time.

 


		public void addNoCarrier(int duration)
		{
			if (isInStoreMode())
				return;
			
			NoCarrierTaskManager.getInstance().add(this);
			setNoCarrier(true);
			broadcastCharInfo();
			setInvul(true);
			
			if (isInParty())
				getMemos().set("NoCarrierParty", System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(duration));
			else
				getMemos().set("NoCarrier", System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(duration));
		}
		

 

when a player joins a party it is stored :

 


    public Party(Player leader, Player target, LootRule lootRule)
    {
        super(leader);
        
        _members.add(leader);
        _members.add(target);
        
        leader.setParty(this);
        target.setParty(this);
        
        _lootRule = lootRule;

        leader.getMemos().set("NoCarrierPartyObjId", _partyObjId);
        target.getMemos().set("NoCarrierPartyObjId", _partyObjId);
        

 

EnterWorld

 


		if (player.getMemos().containsKey("NoCarrier") || player.getMemos().containsKey("NoCarrierParty") && player.getMemos().containsKey("NoCarrierPartyObjId"))
		{

 

 

when entering the game I created 3 checks to verify the object Id of the party and if it really was in the party, if it is in the party ok you receive the party again
    

public void updateNoCarrierParty(Player player)
    {
        player.sendPacket(new PartySmallWindowAll(player, this));
        // Add party to player.
        player.setParty(this);
        
        // Update icons.
        for (Player member : _members)
        {
            member.updateEffectIcons(true);
            member.broadcastUserInfo();
        }
        
        broadcastCreatureSay(new CreatureSay(SayType.PARTY, "[No Carrier]", "Player: " + player.getName() + " has logged in again."), player);
        
        if (_commandChannel != null) 
            player.sendPacket(ExOpenMPCC.STATIC_PACKET);
    }
    

 

  • 0
Posted (edited)

forget about that man 

add this in enterworld:

 

    private static void onEnterParty(Player activeChar){
        {
            if(PlayerMemo.getVar(activeChar, "Title") != null) 
            {
                activeChar.setTitle(PlayerMemo.getVar(activeChar, "Title"));
            }

            if(PlayerMemo.getVarInt(activeChar, "Party") != 0)
            {        
                int name = PlayerMemo.getVarInt(activeChar, "Party");
                Player leader = World.getInstance().getPlayer(name);
                if(leader != null)
                leader.sendMessage(activeChar.getName() + " your party member has connected back to game.");
                PlayerMemo.setVar(activeChar, "Party", 0, 0);
                if(leader != null)
                PlayerMemo.setVar(leader, "PartyLeft", 0, 0);
                if(leader !=null && leader.isInParty())
                    leader.getParty().addPartyMember(activeChar);
            }
                
        }
    }

 

and in player.java

this is how my cleanup() looks like

private synchronized void cleanup()
    {
        try
        {
            // Put the online status to false
            setOnlineStatus(false, true);
            
            // abort cast & attack and remove the target. Cancels movement aswell.
            abortAttack();
            abortCast();
            stopMove(null);
            setTarget(null);
            if(getTitle() != null)
            PlayerMemo.setVar(this, "Title", getTitle(), 0);
            broadcastUserInfo();
            if(isInParty())
            {
                if(getParty().getLeader() != this)
                {
                PlayerMemo.setVar(this, "Party", getParty().getLeaderObjectId(), 0);

                int name = PlayerMemo.getVarInt(this, "Party");
                Player player = World.getInstance().getPlayer(name);
                player.sendMessage(this.getName() + " your party member has been disconnected from the game.");
                Player leader = getParty().getLeader();
                PlayerMemo.setVar(leader, "PartyLeft", this.toString(), 0);
                }
                if(getParty().getLeader() == this)
                {
                    for(Player member : getParty().getMembers())
                    {
                        if(member == null)
                            continue;
                        
                        getParty().changePartyLeader(member.getName());
                        
                    }
                        
                PlayerMemo.setVar(this, "Party", getParty().getLeaderObjectId(), 0);

                int name = PlayerMemo.getVarInt(this, "Party");
                Player player = World.getInstance().getPlayer(name);
                player.sendMessage(this.getName() + " , your party member has been disconnected from the game.");
                Player leader = getParty().getLeader();
                PlayerMemo.setVar(leader, "PartyLeft", this.toString(), 0);
                }
            }

            // If a party is in progress, leave it
                        if (_party != null)
                            _party.removePartyMember(this, MessageType.DISCONNECTED);
                        
                        // If the Player has Pet, unsummon it
                        if (getPet() != null)
                            getPet().unSummon(this);
                        
            
            if (isFlying())
                removeSkill(SkillTable.getInstance().getInfo(4289, 1));
            
            // Stop all scheduled tasks
            stopAllTimers();
            
            // Cancel the cast of eventual fusion skill users on this target.
            for (Creature character : getKnownType(Creature.class))
                if (character.getFusionSkill() != null && character.getFusionSkill().getTarget() == this)
                    character.abortCast();
                
            // Stop signets & toggles effects.
            for (L2Effect effect : getAllEffects())
            {
                if (effect.getSkill().isToggle())
                {
                    effect.exit();
                    continue;
                }
                
                switch (effect.getEffectType())
                {
                    case SIGNET_GROUND:
                    case SIGNET_EFFECT:
                        effect.exit();
                        break;
                }
            }

            // If the Player has Pet, unsummon it
            if (getPet() != null)
                getPet().unSummon(this);
            
            // Handle removal from olympiad game
            if (OlympiadManager.getInstance().isRegistered(this) || getOlympiadGameId() != -1)
                OlympiadManager.getInstance().removeDisconnectedCompetitor(this);
            
            if (isInFightClubMode() || (getTeamFightGame() != null))
                TeamFights.logoutPlayer(this);
            
            // set the status for pledge member list to OFFLINE
            if (getClan() != null)
            {
                L2ClanMember clanMember = getClan().getClanMember(getObjectId());
                if (clanMember != null)
                    clanMember.setPlayerInstance(null);
            }
            
            // deals with sudden exit in the middle of transaction
            if (getActiveRequester() != null)
            {
                setActiveRequester(null);
                cancelActiveTrade();
            }
            
            // If the Player is a GM, remove it from the GM List
            if (isGM())
                AdminData.getInstance().deleteGm(this);
            
            // Check if the Player is in observer mode to set its position to its position before entering in observer mode
            if (isInObserverMode())
                setXYZInvisible(_savedLocation);
            
            // Oust player from boat
            if (getVehicle() != null)
                getVehicle().oustPlayer(this, true, Location.DUMMY_LOC);
            
            // Update inventory and remove them from the world
            getInventory().deleteMe();
            
            // Update warehouse and remove them from the world
            clearWarehouse();
            
            // Update freight and remove them from the world
            clearFreight();
            clearDepositedFreight();
            
            if (isCursedWeaponEquipped())
                CursedWeaponsManager.getInstance().getCursedWeapon(_cursedWeaponEquippedId).setPlayer(null);
            
            if (getClanId() > 0)
                getClan().broadcastToOtherOnlineMembers(new PledgeShowMemberListUpdate(this), this);
            
            if (isSeated())
            {
                final WorldObject object = World.getInstance().getObject(_throneId);
                if (object instanceof StaticObject)
                    ((StaticObject) object).setBusy(false);
            }
            
            
            
            // friends & blocklist update
            notifyFriends(false);
            getBlockList().playerLogout();
        }
        catch (Exception e)
        {
            _log.log(Level.WARNING, "Exception on deleteMe()" + e.getMessage(), e);
        }
    }
    

 

i did this many months ago , and as far i remember i think i edited something in l2gameclient.java .. and i don't remember where exactly i put settitle(DISCONNECTED/NO CARRIER) when "logging out" , as you can see there is a memo for title also up there..btw i never tested on live server .. people ask a hard money for this shit , if you are unable to get it done reply

also you can check this 

 

Edited by arm4729
  • Sad 1
  • 0
Posted
57 minutes ago, arm4729 said:

forget about that man 

add this in enterworld:

 

    private static void onEnterParty(Player activeChar){
        {
            if(PlayerMemo.getVar(activeChar, "Title") != null) 
            {
                activeChar.setTitle(PlayerMemo.getVar(activeChar, "Title"));
            }

            if(PlayerMemo.getVarInt(activeChar, "Party") != 0)
            {        
                int name = PlayerMemo.getVarInt(activeChar, "Party");
                Player leader = World.getInstance().getPlayer(name);
                if(leader != null)
                leader.sendMessage(activeChar.getName() + " your party member has connected back to game.");
                PlayerMemo.setVar(activeChar, "Party", 0, 0);
                if(leader != null)
                PlayerMemo.setVar(leader, "PartyLeft", 0, 0);
                if(leader !=null && leader.isInParty())
                    leader.getParty().addPartyMember(activeChar);
            }
                
        }
    }

 

and in player.java

this is how my cleanup() looks like

private synchronized void cleanup()
    {
        try
        {
            // Put the online status to false
            setOnlineStatus(false, true);
            
            // abort cast & attack and remove the target. Cancels movement aswell.
            abortAttack();
            abortCast();
            stopMove(null);
            setTarget(null);
            if(getTitle() != null)
            PlayerMemo.setVar(this, "Title", getTitle(), 0);
            broadcastUserInfo();
            if(isInParty())
            {
                if(getParty().getLeader() != this)
                {
                PlayerMemo.setVar(this, "Party", getParty().getLeaderObjectId(), 0);

                int name = PlayerMemo.getVarInt(this, "Party");
                Player player = World.getInstance().getPlayer(name);
                player.sendMessage(this.getName() + " your party member has been disconnected from the game.");
                Player leader = getParty().getLeader();
                PlayerMemo.setVar(leader, "PartyLeft", this.toString(), 0);
                }
                if(getParty().getLeader() == this)
                {
                    for(Player member : getParty().getMembers())
                    {
                        if(member == null)
                            continue;
                        
                        getParty().changePartyLeader(member.getName());
                        
                    }
                        
                PlayerMemo.setVar(this, "Party", getParty().getLeaderObjectId(), 0);

                int name = PlayerMemo.getVarInt(this, "Party");
                Player player = World.getInstance().getPlayer(name);
                player.sendMessage(this.getName() + " , your party member has been disconnected from the game.");
                Player leader = getParty().getLeader();
                PlayerMemo.setVar(leader, "PartyLeft", this.toString(), 0);
                }
            }

            // If a party is in progress, leave it
                        if (_party != null)
                            _party.removePartyMember(this, MessageType.DISCONNECTED);
                        
                        // If the Player has Pet, unsummon it
                        if (getPet() != null)
                            getPet().unSummon(this);
                        
            
            if (isFlying())
                removeSkill(SkillTable.getInstance().getInfo(4289, 1));
            
            // Stop all scheduled tasks
            stopAllTimers();
            
            // Cancel the cast of eventual fusion skill users on this target.
            for (Creature character : getKnownType(Creature.class))
                if (character.getFusionSkill() != null && character.getFusionSkill().getTarget() == this)
                    character.abortCast();
                
            // Stop signets & toggles effects.
            for (L2Effect effect : getAllEffects())
            {
                if (effect.getSkill().isToggle())
                {
                    effect.exit();
                    continue;
                }
                
                switch (effect.getEffectType())
                {
                    case SIGNET_GROUND:
                    case SIGNET_EFFECT:
                        effect.exit();
                        break;
                }
            }

            // If the Player has Pet, unsummon it
            if (getPet() != null)
                getPet().unSummon(this);
            
            // Handle removal from olympiad game
            if (OlympiadManager.getInstance().isRegistered(this) || getOlympiadGameId() != -1)
                OlympiadManager.getInstance().removeDisconnectedCompetitor(this);
            
            if (isInFightClubMode() || (getTeamFightGame() != null))
                TeamFights.logoutPlayer(this);
            
            // set the status for pledge member list to OFFLINE
            if (getClan() != null)
            {
                L2ClanMember clanMember = getClan().getClanMember(getObjectId());
                if (clanMember != null)
                    clanMember.setPlayerInstance(null);
            }
            
            // deals with sudden exit in the middle of transaction
            if (getActiveRequester() != null)
            {
                setActiveRequester(null);
                cancelActiveTrade();
            }
            
            // If the Player is a GM, remove it from the GM List
            if (isGM())
                AdminData.getInstance().deleteGm(this);
            
            // Check if the Player is in observer mode to set its position to its position before entering in observer mode
            if (isInObserverMode())
                setXYZInvisible(_savedLocation);
            
            // Oust player from boat
            if (getVehicle() != null)
                getVehicle().oustPlayer(this, true, Location.DUMMY_LOC);
            
            // Update inventory and remove them from the world
            getInventory().deleteMe();
            
            // Update warehouse and remove them from the world
            clearWarehouse();
            
            // Update freight and remove them from the world
            clearFreight();
            clearDepositedFreight();
            
            if (isCursedWeaponEquipped())
                CursedWeaponsManager.getInstance().getCursedWeapon(_cursedWeaponEquippedId).setPlayer(null);
            
            if (getClanId() > 0)
                getClan().broadcastToOtherOnlineMembers(new PledgeShowMemberListUpdate(this), this);
            
            if (isSeated())
            {
                final WorldObject object = World.getInstance().getObject(_throneId);
                if (object instanceof StaticObject)
                    ((StaticObject) object).setBusy(false);
            }
            
            
            
            // friends & blocklist update
            notifyFriends(false);
            getBlockList().playerLogout();
        }
        catch (Exception e)
        {
            _log.log(Level.WARNING, "Exception on deleteMe()" + e.getMessage(), e);
        }
    }
    

 

i did this many months ago , and as far i remember i think i edited something in l2gameclient.java .. and i don't remember where exactly i put settitle(DISCONNECTED/NO CARRIER) when "logging out" , as you can see there is a memo for title also up there..btw i never tested on live server ..

 

this piece of your code only throws disconnects message for party players and changes the party leader if the leader is disconnected this part is not what I'm talking about. You don't need to save every action in memo.

  • 0
Posted (edited)

yes man , that part of code as you can see is just before exiting the party , so when a players goes off world it would leave party... and thats fine let it leave the party , but before that save memo with leader of party.. to leader and to player... and then when enterworld use this :

 

add this in enterworld:

 

    private static void onEnterParty(Player activeChar){
        {
            if(PlayerMemo.getVar(activeChar, "Title") != null) 
            {
                activeChar.setTitle(PlayerMemo.getVar(activeChar, "Title"));
            }

            if(PlayerMemo.getVarInt(activeChar, "Party") != 0)
            {        
                int name = PlayerMemo.getVarInt(activeChar, "Party");
                Player leader = World.getInstance().getPlayer(name);
                if(leader != null)
                leader.sendMessage(activeChar.getName() + " your party member has connected back to game.");
                PlayerMemo.setVar(activeChar, "Party", 0, 0);
                if(leader != null)
                PlayerMemo.setVar(leader, "PartyLeft", 0, 0);
                if(leader !=null && leader.isInParty())
                  

Quote

 leader.getParty().addPartyMember(activeChar);


            }
                
        }
    }

to make the party leader add this player in party... i dont understand where is your problem , it throws disconnect messages and also is saving leaders obj id that msgs are more for debug ,you need memo because you will need it when entering world again the leader pt obj id to make it add you party again ..if you just leave the world and don't exit party at all , when you will log in again , server will know you are in party but client will not know , you will not see party chat or anything because party know you was there , but your client does not know that you are in party ..so to make it work without problems just exit party and enter again in party forcing leader of party to addpartymember you... 

 

maybe you should try with 3 people in party because if you try in 2 people , you save leader obj data after that code makesyou exit party , so when you exit party , the party disolve because can't stand with 1 member ... when you enter again in world that party is gone your party member he can't have party with himself..

Edited by arm4729
  • 0
Posted
28 minutes ago, arm4729 said:

yes man , that part of code as you can see is just before exiting the party , so when a players goes off world it would leave party... and thats fine let it leave the party , but before that save memo with leader of party.. to leader and to player... and then when enterworld use this :

 

add this in enterworld:

 

    private static void onEnterParty(Player activeChar){
        {
            if(PlayerMemo.getVar(activeChar, "Title") != null) 
            {
                activeChar.setTitle(PlayerMemo.getVar(activeChar, "Title"));
            }

            if(PlayerMemo.getVarInt(activeChar, "Party") != 0)
            {        
                int name = PlayerMemo.getVarInt(activeChar, "Party");
                Player leader = World.getInstance().getPlayer(name);
                if(leader != null)
                leader.sendMessage(activeChar.getName() + " your party member has connected back to game.");
                PlayerMemo.setVar(activeChar, "Party", 0, 0);
                if(leader != null)
                PlayerMemo.setVar(leader, "PartyLeft", 0, 0);
                if(leader !=null && leader.isInParty())
                  


            }
                
        }
    }

to make the party leader add this player in party... i dont understand where is your problem , it throws disconnect messages and also is saving leaders obj id that msgs are more for debug ,you need memo because you will need it when entering world again the leader pt obj id to make it add you party again ..if you just leave the world and don't exit party at all , when you will log in again , server will know you are in party but client will not know , you will not see party chat or anything because party know you was there , but your client does not know that you are in party ..so to make it work without problems just exit party and enter again in party forcing leader of party to addpartymember you... 

 

maybe you should try with 3 people in party because if you try in 2 people , you save leader obj data after that code makesyou exit party , so when you exit party , the party disolve because can't stand with 1 member ... when you enter again in world that party is gone your party member he can't have party with himself..

 

If you notice the @Rootware video when he relogs with the character and enters the game, his character doesn't disconnect at any time, he just stays there what I want to do and also restore the player's party that was disconnected.

I'm trying to restore the parties with the ObjectId I created when each player joins one in the game. I don't need to create a memo for leader/member/title/title color

 


			if (player.isInParty())
			{
				final Party oldParty = World.getInstance().getPartyByObjectId(player.getMemos().getInteger("NoCarrierPartyObjId"));
				if (oldParty != null)
					oldParty.updateNoCarrierParty(player);
			}
			

 

  • 0
Posted
26 minutes ago, Williams said:

 

If you notice the @Rootware video when he relogs with the character and enters the game, his character doesn't disconnect at any time, he just stays there what I want to do and also restore the player's party that was disconnected.

I'm trying to restore the parties with the ObjectId I created when each player joins one in the game. I don't need to create a memo for leader/member/title/title color

 


			if (player.isInParty())
			{
				final Party oldParty = World.getInstance().getPartyByObjectId(player.getMemos().getInteger("NoCarrierPartyObjId"));
				if (oldParty != null)
					oldParty.updateNoCarrierParty(player);
			}
			

 

As far as i noticed , you managed to make character don't dissapear from the world when you requestrestart... 

I was trying to help you make player get back into the party when reconnecting to the world..

About rootware video , he ask 300-400 euro for that , is not that simple he made pets / party mod also if you pay attention to chat , what other pt members say in chat he will see when relog , he did it other way .. this is best i can help you.. as you can see in the video character turcu , dont dissapear from the world , and gets back in party when client is reconnected.

 

  • 0
Posted
On 5/2/2022 at 12:52 AM, arm4729 said:

As far as i noticed , you managed to make character don't dissapear from the world when you requestrestart... 

I was trying to help you make player get back into the party when reconnecting to the world..

About rootware video , he ask 300-400 euro for that , is not that simple he made pets / party mod also if you pay attention to chat , what other pt members say in chat he will see when relog , he did it other way .. this is best i can help you.. as you can see in the video character turcu , dont dissapear from the world , and gets back in party when client is reconnected.

 

 

what I want you to understand is the following when I relog and try to enter again I need to click several times on "Start" when doing this my character that was NoCarrier in the game he is disconnected there for me to enter the error is that the lack of implementation of some package to check when entering the game

 

 

  • 0
Posted (edited)

because your player actor is set to other "client" , when you try to press start first time is attemp of double login with same character , when this happens your character is actually removed from the world and added again to your new "client" ,you can try mess around with L2GameClient.java ... because of some cache problems , i made characters restart and relog back in the world when they are using /unstuck , without having to press "start" or anything , just a 1 second blink of loading screen and your are back in town ... so i dont remember very well but im sure this part of code is responsable for your "start" button... so check your L2GameClient.java

mine is looking like this :

public Player loadCharFromDisk(int slot)
    {
        final int objectId = getObjectIdForSlot(slot);
        if (objectId < 0)
            return null;
        
        Player player = World.getInstance().getPlayer(objectId);
        if (player != null)
        {
            // exploit prevention, should not happens in normal way
            _log.severe("Attempt of double login: " + player.getName() + "(" + objectId + ") " + getAccountName());
            
            if (player.getClient() != null)
                player.getClient().closeNow();
            else
            
            World.getInstance().removePlayer(player); // force remove in case of crash during teleport
            
            return null;
        }
        
        player = Player.restore(objectId);
        if (player != null)
        {
            player.setRunning(); // running is default
            player.standUp(); // standing is default
            setState(GameClientState.IN_GAME);
            player.setOnlineStatus(true, false);
            World.getInstance().addPlayer(player);
        }
        else
            _log.severe("L2GameClient: could not restore in slot: " + slot);
        
        return player;
    }

 

i think somewhere here is your problem , but why you insist to not abortcast/attack etc ?  i mean what is the logic and why you spend time on making a disconnected player to keep attacking .. it doesen't help much the players... the thing with the party yes , if pvp dont ask again for pt when crit error but this is lame , anyway keep me updated if you manage to fiind any solution

Edited by arm4729
  • Like 1

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.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...