• Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Upcoming Exilebuddy Maintenance (2.1.0)

    Discussion in 'Archives' started by pushedx, Dec 10, 2015.

    Thread Status:
    Not open for further replies.
    1. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      Exilebuddy will be down for maintenance at the launch of the 2.1.0 content update tomorrow.

      As with any big update, a new compatible version will be pushed as soon as we're comfortable the bot is as safe as possible and working. Given that a lot of minor patches are typically released in the first 24 hours, which require a new bot release if the client changes, we expect there to be a few days of downtime before a new Beta is pushed this weekend. Subsequently, updates may be sporadic throughout the first week of the content update, so EB might see additional downtime as the game stabilizes from changes once again.

      This is just a heads up post for anyone who is unfamiliar with our updates. Users will be compensated for any extended downtime.

      Thank you for reading!
       
    2. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      Update 1: Based on how maintenance has progressed so far today, we expect a Beta version to hopefully be user testable around Monday at earliest. In terms of updates to the bot/API required, the 2.1.0 Content update is essentially an expansion (as it literally includes stuff for the upcoming expansion), so downtime will be much longer than any of the other minor patches released after the 2.0.0 expansion was released. Further updates will be posted in this thread later Sunday, as we look at the current state of the bot and decide if it's ready to be user tested or not.

      Once again, we thank users for their patience, and you will be compensated for the extended downtime. :)
       
      ozgun311 likes this.
    3. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      Update 2: Maintenance is progressing well, but there's significantly more that still needs to be updated/tested before a beta can be made. As a result, there's no longer a specific ETA when the next beta will be built, but hopefully it'll happen sometime mid-late this week. Progress updates will be posted every few days to keep users informed.
       
    4. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      A Beta is planned for tomorrow, Wednesday Dec 16th (USA time). The preliminary patch notes are as follows:
      Code:
      * Updates for 2.1.0.1 - 2.1.0.7.
      * AssignPassivesTask will now attempt to close the reset passive dialog before skipping execution due to a full reset being present.
      * The GameData.MinimapIcon type has been removed.
      * NetworkObject.MinimapIcon has changed from a MinimapIcon type (now removed) to a DatMinimapIconWrapper type.
      * MissionMarker.Icon and MissionMarker.IsVisible removed. Use NetworkObject.MinimapIcon and NetworkObject.IsMinimapIconVisible instead.
      * MinimapIconComponent.Icon (MinimapIcon) replaced with MinimapIconComponent.MinimapIcon (DatMinimapIconWrapper)
      * PurchasePanel.SwitchToTab now implements waiting for contents like PreviousTab/NextTab.
      * WaitForPurchase now returns a bool to signal if waiting for the panel to load timed out or not. This is to mirror WaitForStash, as it was possible for infinite loops to occur on client hiccups.
      * PurchasePanel.Tabs changed to PurchasePanel.TabNames for consistency.
      * Various GuildStashPanel updates to ensure tabs are fully loaded before API functions return.
      * GuildStashPanel.IsOnLastTab and GuildStashPanel.IsOnFirstTab added.
      * GuildStashPanel.PreviousTab now checks IsOnFirstTab and GuildStashPanel.NextTab checks IsOnLastTab to prevent unnecessary waiting.
      * GuildStashPanel.WaitForGuildStash added to wait for the inital tab to load after opening.
      * GuildStashPanel.GoToLastTab added.
      * GuildStashPanel.GoToFirstTab and GuildStashPanel.GoToLastTab now fail after trying to change a tab page for 5s.
      * GuildStashPanel.CurrentTabItems added for consistency. It is an alias for GuildStashPanel.CurrentTabInventory.Items.
      * Inventory.Cols added as an alias for Inventory.Columns.
      * StashPanel.GoToFirstTab and StashPanel.GoToLastTab now fail after trying to change a tab page for 5s.
      * StashPanel.GoToLastTab added.
      * StashPanel.PreviousTab now checks IsOnFirstTab and StashPanel.NextTab checks IsOnLastTab to prevent unnecessary waiting.
      * StashPanel.IsOnLastTab added.
      * StashPanel.CurrentTabItems added for consistency. It is an alias for StashPanel.CurrentTabInventory.Items.
      * SkillGemHud.AreLevelIconsDisplayed changed from a function to a property.
      * The static location for The Ledge entrance should now be fixed in The Submerged Passage.
      * Removed the obsolete InGameState.AreLevelSkillGemIconsDisplayed function.
      * Removed the obsolete InGameState.ClearLevelSkillGemIcon function.
      * Fixed a possible infinite loop in SocialPanel.JoinPublicParty.
      * JoinPublicPartyError.TimedOut added to signal when SocialPanel.JoinPublicParty times out.
      * TradePanel.AcceptTrade added.
      * TradeActionError.CantAccept added.
      * Fixed a bug in Skill.ToString where it would check of it could be cast when the skill didn't belong to the player.
      * StoneAltar object wrapper added.
      * Added Item.IsTalismanType.
      * Added InventoryPanel.EquipSkillGemToNeck.
      * Skill.ToString no longer logs AllStats, too much clutter.
      * Fixed a bug where ObjectManager.TreeRoots would always return null due to the game object changing in types.
      * GemLeveler adds support for gems in the Neck slot.
      * HandleA2Q9 logic simplified some to not use quest data.
      * Added more dump scripts: DumpActiveSkills, DumpGrantedEffects, DumpGrantedEffectsPerLevel, DumpMinimapIcons, DumpNpcTalk.
      
      There's been no changes to the OldGrindBot implementation itself. OldRoutine has only had a few additions made for testing a few skills but it mostly remains unchanged as well. This update was solely focused on fully updating the API and becoming compatible with the new client for 2.1.0+. At this point, I do know OldRoutine is really outdated in terms of trying to support new skills and whatnot, but it's what we have in place for the time being.

      The FPS issue is still known and seems a lot better in some areas, and a lot worse in others. I do not have an explanation for it yet, but for now, we still have to live with this as a side effect of interacting with the new client. This game has changed too much (and will continue to change in unpredictable ways) to easily be able to track down the issues or try and change existing core aspects of the API; too much is dependent on everything else.

      At this point, we feel really comfortable with the updates in terms of hopefully not missing anything, so we'll be doing some last-pass testing before pushing a Beta on Wednesday. Please be aware though, several upcoming PoE patches have already been announced, so once again, we'll most likely see some additional downtime for them. Large updates like this are always rocky the first month or so, so we thank users for their patience.
       
    5. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      In addition, I've put together some code snippets from our extensive API (which is why client updates affect us more than others) which were used to test. This should give current/aspiring devs some more concrete direction in terms of figuring out where to start looking in the API to accomplish various things. These examples are not comprehensive, as there's a lot more in the API, but this covers a good set of functionality. EB provides API access to almost everything in the client, so there's more potential/opportunity for devs now than there has ever been before in EB's history. We hope to see more people take advantage of these things in the future. :)
      Code:
      [RewardPanel]
      
      // Check if the RewardPanel is open.
      if(LokiPoe.InGameState.RewardPanel.IsOpened)
      {
      }
      
      // List all items in the RewardPanel.
      foreach(var item in LokiPoe.InGameState.RewardPanel.Items)
      {
      	// ...
      }
      
      // Choose a reward by full name.
      var result = LokiPoe.InGameState.RewardPanel.Choose("Contagion");
      
      [PurchasePanel]
      
      // Check if the PurchasePanel is open.
      if(LokiPoe.InGameState.PurchasePanel.IsOpened)
      {
      }
      
      // Wait for contents to load when first opening the panel.
      LokiPoe.InGameState.RewardPanel.WaitForPurchase();
      
      // List all tabs in the PurchasePanel.
      foreach(var tab in LokiPoe.InGameState.PurchasePanel.TabNames)
      {
      	Log.InfoFormat("{0}", tab);
      }
      
      // Get the current tab's name
      var result = LokiPoe.InGameState.PurchasePanel.CurrentTabName;
      
      // Switch to a specific tab.
      var result = LokiPoe.InGameState.PurchasePanel.SwitchToTab("-2-");
      
      // Move to the previous tab.
      var result = LokiPoe.InGameState.PurchasePanel.PreviousTab();
      
      // Move to the next tab.
      var result = LokiPoe.InGameState.PurchasePanel.NextTab();
      
      // Update the current tab's items before accessing them. This is REQUIRED per tab.
      var result = LokiPoe.InGameState.PurchasePanel.UpdateCurrentTabItems();
      
      // Get a list of all items being sold
      foreach(var vi in LokiPoe.InGameState.PurchasePanel.CurrentTabItems)
      {
      	Log.InfoFormat("{0}{1}", vi.Item.FullName, vi.CanAfford ? "" : " (Unaffordable)");
      	foreach(var kvp in vi.Cost)
      	{
      		Log.InfoFormat("\t{0}x {1}", kvp.Value, kvp.Key);
      	}
      }
      
      [GuildStashPanel]
      
      // Check if the GuildStashPanel is open.
      if(LokiPoe.InGameState.GuildStashPanel.IsOpened)
      {
      }
      
      // Wait for contents to load when first opening the panel.
      LokiPoe.InGameState.GuildStashPanel.WaitForGuildStash();
      
      // Get the current tab's name
      var result = LokiPoe.InGameState.GuildStashPanel.CurrentTabName;
      
      // List all tabs in the GuildStashPanel.
      foreach(var tab in LokiPoe.InGameState.GuildStashPanel.TabNames)
      {
      	Log.InfoFormat("{0}", tab);
      }
      
      // Switch to a specific tab.
      var result = LokiPoe.InGameState.GuildStashPanel.SwitchToTab("2");
      
      // Move to the next tab.
      var result = LokiPoe.InGameState.GuildStashPanel.NextTab();
      
      // Move to the previous tab.
      var result = LokiPoe.InGameState.GuildStashPanel.PreviousTab();
      
      
      // Get information about the guild stash tab's inventory
      var inv = LokiPoe.InGameState.GuildStashPanel.CurrentTabInventory;
      Log.InfoFormat("Inventory Size: {0} x {1}", inv.Rows, inv.Cols);
      
      // Get information about the guild stash tab
      var tab = LokiPoe.InGameState.GuildStashPanel.CurrentTabInventoryTab;
      Log.InfoFormat("IsRemoveOnly: {0} IsGuild: {1} IsPremium: {2}", tab.IsRemoveOnly, tab.IsGuild, tab.IsPremium);
      
      // Get items in the current tab.
      foreach(var item in LokiPoe.InGameState.GuildStashPanel.CurrentTabItems)
      {
      	Log.InfoFormat("{0} {1}", item.FullName, item.HasInventoryLocation ? item.LocationTopLeft.ToString()  : "(no location)");
      }
      
      // Places the current cursor item into the tab.
      var result = LokiPoe.InGameState.GuildStashPanel.PlaceFromCursor();
      
      // Places the current cursor item into the tab at a location.
      var result = LokiPoe.InGameState.GuildStashPanel.PlaceFromCursor(3, 3);
      
      // Pickup an item to the cursor from the stash tab
      var items = LokiPoe.InGameState.GuildStashPanel.CurrentTabItems;
      var pi = items.FirstOrDefault(i => i.FullName == "Small Mana Flask");
      var result = LokiPoe.InGameState.GuildStashPanel.PickupToCursor(pi);
      
      // Split a stack in the stash tab
      var pi2 = items.FirstOrDefault(i => i.FullName == "Transmutation Shard");
      var result = LokiPoe.InGameState.GuildStashPanel.SplitStack(pi2, 3);
      
      // Merge a stack in the stash tab
      var pi3 = items.FirstOrDefault(i => i.FullName == "Transmutation Shard");
      var result = LokiPoe.InGameState.GuildStashPanel.MergeStack(pi3);
      
      [WorldPanel]
      
      // Check if the WorldPanel is open.
      if(LokiPoe.InGameState.WorldPanel.IsOpened)
      {
      }
      
      // Take a waypoint to a specific area by full id.
      var result = LokiPoe.InGameState.WorldPanel.TakeWaypoint("1_1_4_1", true, -1);
      
      // Go to the hideout
      var result = LokiPoe.InGameState.WorldPanel.GoToHideout();
      
      
      foreach(var ch in LokiPoe.SelectCharacterState.Characters)
      {
      	Log.InfoFormat("{0}  ({2})- {1}", ch.Name, ch.League, ch.Level);
      }
      
      [SkillGemHud]
      
      // Check to see if there are skill gems listed on the hud for leveling
      if(LokiPoe.InGameState.SkillGemHud.AreLevelIconsDisplayed)
      {
      }
      
      // Get the first skill gem on the HUD
      var item = LokiPoe.InGameState.SkillGemHud.FirstLevelSkillGemItem;
      
      // Check to see if the skill gem can be leveled.
      if(LokiPoe.InGameState.SkillGemHud.CanLevelFirstLevelSkillGem)
      {
      }
      
      // Level the first skill gem
      var result = LokiPoe.InGameState.SkillGemHud.LevelFirstLevelSkillGemIcon()
      
      // Clear the first skill gem
      var result = LokiPoe.InGameState.SkillGemHud.ClearFirstLevelSkillGemIcon()
      
      [ResurrectPanel]
      
      // Check if the ResurrectPanel is open.
      if(LokiPoe.InGameState.ResurrectPanel.IsOpened)
      {
      }
      
      // Resurrect to check point, then town.
      var result = LokiPoe.InGameState.ResurrectPanel.Resurrect
      
      // Resurrect to town.
      var result = LokiPoe.InGameState.ResurrectPanel.ResurrectToTown
      
      // Resurrect to checkpoint
      var result = LokiPoe.InGameState.ResurrectPanel.ResurrectToCheckPoint
      
      [SocialPanel]
      
      // Check if the SocialPanel is open.
      if(LokiPoe.InGameState.SocialPanel.IsOpened)
      {
      }
      
      // Know which tab is selected
      Log.InfoFormat("IsFriendsTabSelected: {0}", LokiPoe.InGameState.SocialPanel.IsFriendsTabSelected);
      Log.InfoFormat("IsGuildTabSelected: {0}", LokiPoe.InGameState.SocialPanel.IsGuildTabSelected);
      Log.InfoFormat("IsPartyTabSelected: {0}", LokiPoe.InGameState.SocialPanel.IsPartyTabSelected);
      Log.InfoFormat("IsPublicPartiesTabSelected: {0}", LokiPoe.InGameState.SocialPanel.IsPublicPartiesTabSelected);
      
      // List public parties
      foreach(var party in LokiPoe.InGameState.SocialPanel.PublicParties)
      {
      	Log.InfoFormat("{0}", party.Name);
      }
      
      // Switch to this tab.
      vae result = LokiPoe.InGameState.SocialPanel.SwitchToPartyTab();
      
      // Switch to this tab.
      vae result = LokiPoe.InGameState.SocialPanel.SwitchToPublicPartiesTab();
      
      // Join a public party
      vae result = LokiPoe.InGameState.SocialPanel.JoinPublicParty(LokiPoe.InGameState.SocialPanel.PublicParties.FirstOrDefault());
      
      // Leave the current party.
      vae result = LokiPoe.InGameState.SocialPanel.LeaveCurrentParty();
      
      // Accept/Decline party invites
      vae result = LokiPoe.InGameState.SocialPanel.HandlePendingPartyInvites(new string[]{"accname"}));
      
      // Attempt to visit the hideout of a party member.
      vae result = LokiPoe.InGameState.SocialPanel.VisitPartyMemberHideout("charname");
      
      [TradePanel]
      
      // Check if the TradePanel is open.
      if(LokiPoe.InGameState.TradePanel.IsOpened)
      {
      }
      
      // Mouse over the offered items so the trade can be accepted.
      var result = LokiPoe.InGameState.TradePanel.MouseOverOfferItem();
      
      // Can the trade be accepted yet.
      Log.InfoFormat("CanAcceptTrade: {0}", LokiPoe.InGameState.TradePanel.CanAcceptTrade);
      
      // Do we need to accept the trade
      Log.InfoFormat("NeedsToAcceptTrade: {0}", LokiPoe.InGameState.TradePanel.NeedsToAcceptTrade);
      
      // List the offer items.
      foreach(var item in LokiPoe.InGameState.TradePanel.OtherOffer)
      {
      	Log.InfoFormat("{1}x {0}", item.FullName, item.StackCount);
      }
      
      // Accept the trade
      var result = LokiPoe.InGameState.TradePanel.AcceptTrade();
      
      [NpcDialogPanel]
      
      // Check if the NpcDialogPanel is open.
      if(LokiPoe.InGameState.NpcDialogPanel.IsOpened)
      {
      }
      
      // Get the current window depth
      Log.InfoFormat("WindowDepth: {0}", LokiPoe.InGameState.NpcDialogPanel.WindowDepth);
      
      // List all dialog chocies
      foreach(var text in LokiPoe.InGameState.NpcDialogPanel.DialogChoices)
      {
      	Log.InfoFormat("{0}", text);
      }
      
      // Helper function for this dialog choice.
      var result = LokiPoe.InGameState.NpcDialogPanel.SellItems();
      
      // Helper function for this dialog choice.
      var result = LokiPoe.InGameState.NpcDialogPanel.PurchaseItems();
      
      // Helper function for this dialog choice.
      var result = LokiPoe.InGameState.NpcDialogPanel.Goodbye();
      
      [QuickFlaskPanel]
      
      // List all flasks
      foreach(var flask in LokiPoe.InGameState.QuickFlaskPanel.Flasks)
      {
      	Log.InfoFormat("{0} (0x{1:X})", flask.FullName, flask.BaseAddress.ToInt32());
      }
      
      // Use a flask in a specific slot.
      var result = LokiPoe.InGameState.QuickFlaskPanel.UseFlaskInSlot1();
      
      [SellPanel]
      
      // Check if the SellPanel is open.
      if(LokiPoe.InGameState.SellPanel.IsOpened)
      {
      }
      
      // List the items the player is selling.
      foreach(var item in LokiPoe.InGameState.SellPanel.PlayerOffer)
      {
      	Log.InfoFormat("{0} (0x{1:X})", item.FullName, item.BaseAddress.ToInt32());
      }
      
      // List the items the vendor is offering.
      foreach(var item in LokiPoe.InGameState.SellPanel.NpcOffer)
      {
      	Log.InfoFormat("{0} (0x{1:X})", item.FullName, item.BaseAddress.ToInt32());
      }
      
      // Accept the trade offer
      var result = LokiPoe.InGameState.SellPanel.Accept();
      
      // Cancel the trade offer
      var result = LokiPoe.InGameState.SellPanel.Cancel();
      
      [SkillBarPanel]
      
      // Check if the skill selector dialog is opened.
      Log.InfoFormat("IsSkillSelectorOpen: {0}", LokiPoe.InGameState.SkillBarPanel.IsSkillSelectorOpen);
      
      // Clears a specific skill slot.
      var result = LokiPoe.InGameState.SkillBarPanel.ClearSlot2();
      
      // Sets a skill slot.
      var result = LokiPoe.InGameState.SkillBarPanel.SetSlot(2, LokiPoe.InGameState.SkillBarPanel.Skills.FirstOrDefault(s => s.InternalName == "Move"));
      
      [InstanceManagerPanel]
      
      // Check if the InstanceManagerPanel is open.
      if(LokiPoe.InGameState.InstanceManagerPanel.IsOpened)
      {
      }
      
      // Get information about instances
      foreach(var instance in LokiPoe.InGameState.InstanceManagerPanel.Instances)
      {
      	Log.InfoFormat("{0} {1} {2} {3} {4}", instance.CanJoin, instance.Realm, instance.Created, instance.TimeLeft, string.Join(", ", instance.Players));
      }
      
      // Creates a new instance.
      var result = LokiPoe.InGameState.InstanceManagerPanel.JoinNew(-1);
      
      [CardTradePanel]
      
      // Check if the CardTradePanel is open.
      if(LokiPoe.InGameState.CardTradePanel.IsOpened)
      {
      }
      
      // Place the cursor into the panel.
      var result = LokiPoe.InGameState.CardTradePanel.PlaceCursorInto();
      
      // Picks up an item from the slot to the cursor.
      var result = LokiPoe.InGameState.CardTradePanel.PickupToCursor();
      
      // Trades the cards in.
      var result = LokiPoe.InGameState.CardTradePanel.Trade();
      
      [MapPanel]
      
      // Check if the MapPanel is open.
      if(LokiPoe.InGameState.MapPanel.IsOpened)
      {
      }
      
      // Places the cursor into the map device.
      var result = LokiPoe.InGameState.MapPanel.PlaceCursorIntoTopLeft();
      
      // Picks up an item from the map device.
      var result = LokiPoe.InGameState.MapPanel.PickupTopLeftToCursor();
      
      // Gets the item in a slot in the map device.
      Log.InfoFormat("ItemInTopLeftSlot: {0}", LokiPoe.InGameState.MapPanel.ItemInTopLeftSlot.FullName);
      
      // Activates the map device.
      var result = LokiPoe.InGameState.MapPanel.Activate();
      
      [MasterDevicePanel]
      
      // Check if the MasterDevicePanel is open.
      if(LokiPoe.InGameState.MasterDevicePanel.IsOpened)
      {
      }
      
      // Places the cursor into the device.
      var result = LokiPoe.InGameState.MasterDevicePanel.PlaceCursorIntoTopLeft();
      
      // Picks up an item from the device.
      var result = LokiPoe.InGameState.MasterDevicePanel.PickupTopLeftToCursor();
      
      // Gets the item in a slot in the device.
      Log.InfoFormat("ItemInTopLeftSlot: {0}", LokiPoe.InGameState.MasterDevicePanel.ItemInTopLeftSlot.FullName);
      
      // Activates the map device.
      var result = LokiPoe.InGameState.MasterDevicePanel.Activate();
      
      [InventoryPanel]
      
      // Check if the InventoryPanel is open.
      if(LokiPoe.InGameState.InventoryPanel.IsOpened)
      {
      }
      
      // Unequip a skill gem from a slot at a specific index.
      var result = LokiPoe.InGameState.InventoryPanel.UnequipSkillGemFromNeck(0);
      
      // Equip a skill gem to a slot at a specific index.
      var result = LokiPoe.InGameState.InventoryPanel.EquipSkillGemToNeck(0);
      
      
      [BanditPanel]
      
      if(LokiPoe.InGameState.BanditPanel.IsOpened)
      {
      }
      
      // Kill the bandit.
      var result = LokiPoe.InGameState.BanditPanel.KillBandit();
      
      // Help the bandit.
      var result = LokiPoe.InGameState.BanditPanel.HelpBandit();
      
       
    6. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      Beta #1182 is now being deployed via BuddyAuth. Please post any issues in the Support forums as usual.

      Users may want to consider downloading a clean copy rather than updating! Remember to add Talisman looting to your existing filters if you update. To do this, simply add a new pick filter with the Types set to "/Talismans/". The default item filter editor has this entry added already.

      Please keep in mind this is a Beta build. While we have tested and checked everything as thoroughly as possible, it is possible we missed somethings. Please do not bot unattended or Hardcore unless you know what you are doing!
       
    7. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      PoE 2.1.1 is about to be released. If by chance anything major changes again, I'll post in this thread that additional downtime will be expected.
       
    8. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
      Beta #1184 has been deployed via BuddyAuth! Please report any issues in the Support Forums.
       
    9. pushedx

      pushedx Moderator Moderator Buddy Core Dev

      Joined:
      Sep 24, 2013
      Messages:
      4,252
      Likes Received:
      290
      Trophy Points:
      83
    Thread Status:
    Not open for further replies.

    Share This Page