Jump to content

Playerbot (archive)


Recommended Posts

  • Replies 1.8k
  • Created
  • Last Reply

Top Posters In This Topic

Having problems sourcing botguy into the template...gives me an error stating Column count doesn't match value count at row 1. I am using newest PSDB. Would this be a problem with their database?

Here is one that works. I renamed him "the new guy" you can change him to whatever:

INSERT INTO `creature_template` VALUES
('99002','0','0','0','0','0','20','0','20','0','The New Guy','The Bot Recruiter',NULL,'80','80','85000','85000','5800','5800','1000','35','35','1','1','1','0','25000','25000','0','0','1','100','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','0','0','0','bot_giver');

hope this helps.

EDIT: When teleporting, everything spawns. Bots do not spawn to you. you have to resummon them.

Link to comment
Share on other sites

Thanks for your kind words. Its nice to give something back occasionally, rather than sitting back , letting you guys do all the work;)

I know the default: has 0 'cases' options before it. That was intentional. I was not quite sure which of the many loot methods required a need or greed roll. If none of the 'case' options apply, use the default:. Not the most conventional way of using a switch statement, I know. Also make sure that 'rollType' is changed to 'choice' in the second switch statement.

I do not use the git diff utility to produce patches on my local machine. I only use git diff to create the main playerbot patch, from github.

Patch creation

I create two parallel dir paths, with roots 'a' and 'b'. 'a' contains original files and 'b' contains the changed files. I use the standard linux diff utility.

diff -crB a/src/game b/src/game > my.patch

The output differs from the git diff, but both resulting patches work with the 'patch' utility. I agree my patches are more verbose, but they do work. The '!' character might throw some people. It is not erroneous, it signifies line change rather, than '+' line addition or '-' line subtraction.

I will make sure all future code submissions are contained within

hello world! [code] brackets

Cheers

Link to comment
Share on other sites

Here is one that works. I renamed him "the new guy" you can change him to whatever:

INSERT INTO `creature_template` VALUES
('99002','0','0','0','0','0','20','0','20','0','The New Guy','The Bot Recruiter',NULL,'80','80','85000','85000','5800','5800','1000','35','35','1','1','1','0','25000','25000','0','0','1','100','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','0','0','0','bot_giver');

hope this helps.

EDIT: When teleporting, everything spawns. Bots do not spawn to you. you have to resummon them.

Hi,

Are you using the recent submission on github? rrtn has only reversed the change I made in my last patch. To get the bots to spawn with you after teleport, PlayerbotAI.cpp requires the 'appendPackGUID' update.

Cheers blueboy

Link to comment
Share on other sites

I modified that line before compiling. still no bots appear with you. only tested with GM account tho. will test non gm shortly, and respond.

another small and very annoying glitch I found was with hunters. if the hunters' pet is in stables, they just continuously whistle.... calling their pet. you can whisper "stop" and he stops, but he also stops following. lol

Link to comment
Share on other sites

I modified that line before compiling. still no bots appear with you. only tested with GM account tho. will test non gm shortly, and respond.

another small and very annoying glitch I found was with hunters. if the hunters' pet is in stables, they just continuously whistle.... calling their pet. you can whisper "stop" and he stops, but he also stops following. lol

Hi,

Most strange. I usually use a player account to test. However I've just changed it to a 'gm' account,

I tried '.tele goldshire' with bots summoned. All arrive and npc are spawned too. I tested with '.start' with the same results. I think something else might be causing your conflict. Keep me posted.

My present system;

MaNGOS: 8847

SD2:1504

PSMDB 267

Latest playerbot from github

Latest auctionhousebot from github

& autobroadcast

I am not sure whether your hunter pet issue has anything to do with my recent pet feed patch. If your only pet is in the stables, the hunter may still try to summon it. Thus the whistling. It sound like a conditional statment needs to be added to the code, where pets are summoned ( if pet in stable do not summon). Occasionally bots go haywire, and the following usually shuts them up, '/w [bot] reset'. Hope this helps.

Link to comment
Share on other sites

on a non gm it seemed to work. however while running thru exodar, I jumped down, and the bot didnt follow, and kinda vanished. I had to relog to find him again. but as for porting, it seems to work fine.

Hi,

I gather from one of your previous posts that your running quite a few other patches. These maybe effecting the bots response. Try running the server with only playerbot. If that works, add the others one by one and see if there is any change.

Bots often disappear inside walls and trees, where you cannot follow. If they seem to get stuck, check that they aren't caught in combat. '/p orders' I have found that although there are no hostiles present, occasionally bot show up as being in combat. Don't logoff, just reset the bots '/p reset'.

Link to comment
Share on other sites

I modified that line before compiling. still no bots appear with you. only tested with GM account tho. will test non gm shortly, and respond.

another small and very annoying glitch I found was with hunters. if the hunters' pet is in stables, they just continuously whistle.... calling their pet. you can whisper "stop" and he stops, but he also stops following. lol

LordPsyan identified a problem with his hunter bot continually whistling. His hunter had a pet, but it was stabled. The hunter bot can not determine this and so it tries over and over again to summon the pet.

I have created a simple function 'bool HasPet(bot)' to query the character database, and determine whether the bot has a summonable pet or not. This function can be used in a conditional statement to prevent a summoning spell loop. I have created a patch for everyone to try out.

You will be pleased to see that I no longer use the standard linux diff utility to create my patches, but the git diff utility.

HasPet.patch

diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp
index 2f01602..f366c65 100644
--- a/src/game/PlayerbotHunterAI.cpp
+++ b/src/game/PlayerbotHunterAI.cpp
@@ -71,6 +71,17 @@ PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, Pl

PlayerbotHunterAI::~PlayerbotHunterAI() {}

+PlayerbotHunterAI::bool HasPet(Player* bot)
+{
+    QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM character_pet WHERE owner = '%u' AND slot = 

'%u'",bot->GetGUIDLow(),PET_SAVE_AS_CURRENT);
+
+    if(result)
+        return true; //hunter has current pet
+    else
+        return false;//hunter either has no pet or stabled
+}// end HasPet
+
+
void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget)
{
    PlayerbotAI* ai = GetAI();
@@ -280,7 +291,7 @@ void PlayerbotHunterAI::DoNonCombatActions()
    }

    // check for pet
-    if( PET_SUMMON>0 && !m_petSummonFailed )
+    if( PET_SUMMON>0 && !m_petSummonFailed && HasPet(m_bot))
    {
        // we can summon pet, and no critical summon errors before
        Pet *pet = m_bot->GetPet();
diff --git a/src/game/PlayerbotHunterAI.h b/src/game/PlayerbotHunterAI.h
index 774e3f8..3434112 100644
--- a/src/game/PlayerbotHunterAI.h
+++ b/src/game/PlayerbotHunterAI.h
@@ -16,6 +16,7 @@ class MANGOS_DLL_SPEC PlayerbotHunterAI : PlayerbotClassAI
    public:
        PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai);
        virtual ~PlayerbotHunterAI();
+        bool HasPet(Player* bot);

        // all combat actions go here
        void DoNextCombatManeuver(Unit*);

Can I apologise to PostgreSQL users. I am not sure whether the query formats are compatible? I use MySQL and have created the database query to work with my server. If there is anyone familiar with MySQL and PostgreSQL, maybe they can post a translation for others. Cheers

Link to comment
Share on other sites

updated mangos_botguy, new teleport fix & hunter pet call redundancy fix by blueboy

@blueboy - thanks again for contributing to this project

EDIT: disabled(not removed) hunter pet call redundancy fix for now cause it was interfering with other pet functions

Link to comment
Share on other sites

Sorry guys, I found a small fault in my HasPet function. If the pet dies the conditional statement where the function is used is too ridge to allow the hunter to revive it. I believe I have solved this by broadening the query of the 'character_pet' table in HasPet() function. I have tested thiis for only a short time, and it seems to work. I suggest you test the patch first yourselves before commiting to github.

HasPet update

diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp
index c9829d3..0ca2fff 100644
--- a/src/game/PlayerbotHunterAI.cpp
+++ b/src/game/PlayerbotHunterAI.cpp
@@ -73,7 +73,7 @@ PlayerbotHunterAI::~PlayerbotHunterAI() {}

bool PlayerbotHunterAI::HasPet(Player* bot)
{
-    QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM character_pet WHERE owner = '%u' AND slot = '%u'",bot->GetGUIDLow(),PET_SAVE_AS_CURRENT);
+    QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot = '%u')",bot->GetGUIDLow(),PET_SAVE_AS_CURRENT,PET_SAVE_NOT_IN_SLOT);

    if(result)
        return true; //hunter has current pet

Link to comment
Share on other sites

I have noticed a major glitch. in realms that allow dual faction parties, the bots still attack each other, even if both in the same party. but I think the problem goes deeper than that. I cannot hal party members of the opposit faction, nor res them. so not sure if its a core problem or not.

Link to comment
Share on other sites

added racial traits to rogue & fixed human trait

added new config option: PlayerbotAI.DisableBots

this allows you to disable the bots through the conf file. use the mangos_command_bot.sql to toggle security levels if you want to enable bots for different levels: player->mod->gm->admin

###################################################################################################################
# PLAYERBOTAI CONFIGURATION
#
#    PlayerbotAI.DisableBots
#        Disable the bot command and bot menu
#        Default: 0 - off
#                 1 - on
#
#    PlayerbotAI.DebugWhisper
#        Enable debug output by whispering master
#        Default: 0 - off
#                 1 - on
#
#    PlayerbotAI.FollowDistanceMin
#    PlayerbotAI.FollowDistanceMax
#        Min. and Max. follow distance for bots
#        Default: 0.5 / 1.0
###################################################################################################################

PlayerbotAI.DisableBots = 0
PlayerbotAI.DebugWhisper = 0
PlayerbotAI.FollowDistanceMin = 0.5
PlayerbotAI.FollowDistanceMax = 1.0

Link to comment
Share on other sites

* Fix the crash when a player is logging out with a dead bot and shows "player already has a corpse" in log.

* Fix a problem that bot is still lying on the ground with corpse after releasing. Now bot will release in ghost mode and invisiable.

* Now bot will summon Fly mount correctly when player summons a Fly mount, if player summons a regular mount, bot will do the same. Patch by yad02

I just pulled the source and went through the old problem: "player already has a corpse", and I found that Bot system did not reset m_deathTimer, which is the countdown timer shown on the screen after player dies and force to release when it hits 0. Mangos use this value to determine creating a corpse if the player releases his spirit or not. Therefore, Bot system did not set this value to 0 after creating a corpse, so when player is logging out with a dead bot, mangos is trying to create another corpse and crashes.

The Flymount support is originally made by yad02, I use it on my server for long time. I believe we can make a better one but I don't have time for it.

Link to comment
Share on other sites

Latest rev changed some things that breaks Playerbots. Creature.cpp

lordpsyan@samcclive:/opt/mangos$ git pull git://github.com/playerbot/mangos.git master
remote: Counting objects: 1471, done.
remote: Compressing objects: 100% (320/320), done.
remote: Total 1342 (delta 1106), reused 1227 (delta 1022)
Receiving objects: 100% (1342/1342), 562.59 KiB, done.
Resolving deltas: 100% (1106/1106), completed with 31 local objects.
Auto-merged src/game/Creature.cpp
CONFLICT (content): Merge conflict in src/game/Creature.cpp
Auto-merged src/game/Creature.h
Auto-merged src/game/NPCHandler.cpp
CONFLICT (content): Merge conflict in src/game/NPCHandler.cpp
Auto-merged src/game/Player.cpp
Auto-merged src/game/Player.h
Auto-merged src/game/QuestHandler.cpp
Automatic merge failed; fix conflicts and then commit the result.

I am not familiar enough with git to fix and commit this. if anyone wants to help me learn git, please send me a message

Link to comment
Share on other sites

@LordPsyan

You have downloaded playerbot from github, and it does not work with the latest MaNGOS core. Yes!. if it helps I will explain how I do it, it works!, if a little unorthodox.

I will be the first to admit that I am no expert at using git. My bro gave me a crash tutorial on his last visit from the States.

For each change to the playerbot I like to do a full server compilation (On my box it take approx one hour).

First, visit github/playerbot and determine from the commit history the latest version of MaNGOS core, at the time of the lastest playerbot commit. This is shown as a commit with a version in square brackets i.e [8898]. I use this as a yardstick for compatibility. Often changes made with the MaNGOS core will break playerbot, particularly if you use versions that differ greatly from that shown in the github/playerbot.

I create one large playerbot patch that I then merge with a clean download, pulled from github/mangos. If there is any compatibitly issues, they will show up when you try to apply the patch. I like to create a snapshot patch, for each change made to playerbot. I have them catalogued according to the MaNGOS version found above.

Scripts to Automatically create playerbot.patch (Sorry! I use a Linux box, so these are Bash scripts)

Originally I created the patch manually, as it required me to copy and paste the SHA HASH code for the appropriate MaNGOS version. I then developed two Bash scripts that would create the patch automatically. It takes about ten minutes, so you have plenty of time to go and make yourself a coffee.

Script 1 ** pbot.sh ** main script to run

#!/bin/bash -x
# create empty .git repository
mkdir playerbot
cd playerbot
git init
# get hash for latest mangos release [XXXX], associated with playerbot release
git pull git://github.com/playerbot/mangos.git master
../gethash.sh
# read hash into 'line' variable 
{
while read line
do
echo $line
done
} < hash.txt
# cleanup & remove unwanted .git repositiory
cd ..
rm -R playerbot
# create empty .git repository
mkdir playerbot
cd playerbot
git init
# pull mangos master branch
git pull git://github.com/mangos/mangos.git master
# change to mangos branch associated with hash
git checkout -b mangos $line
# add remote playerbot branch to compare with local mangos branch
git remote add playerbot git://github.com/playerbot/mangos.git
#merge remote branch with local branch
git pull playerbot master
# difference between merged local branch & mangos hash branch
git diff $line > playerbot.patch

Script 2** gethash.sh ** script called by pbot.sh

#!/bin/bash
[ -f "hash.txt" ] && rm hash.txt
git log --pretty=oneline > commit.txt
{
while read line
do
   echo $line > line.txt
   while read -r -n1 char
   do
       [ "$char" == "[" ] && exit
       echo -n $char >> hash.txt
   done < line.txt
       rm hash.txt
done
} < commit.txt

Patch is created and stored in a directory called playerbot.

To apply the created playerbot.patch, execute the following in the MaNGOS source root.

patch --dry-run -p1 < playerbot.patch // This will test the patch against the MaNGOS core without actually applying it. Check for conflicts?

patch -p1 < playerbot.patch // To apply and make changes.

@warrior

As far as my work is concerned, all but the following patch has been applied to github

GroupLoot Update (Change 'rollType' to 'choice' & remove switch group->GetLootMethod() statement to simplify)

diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp
index 1d15ab7..cf8c466 100644
--- a/src/game/PlayerbotMgr.cpp
+++ b/src/game/PlayerbotMgr.cpp
@@ -280,65 +280,49 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet)
            }
            return;
        }
-        case CMSG_LOOT_ROLL:
+
+    case CMSG_LOOT_ROLL:
+    {
+
+        WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1)
+        uint64 Guid;
+        uint32 NumberOfPlayers;
+        uint8 rollType;
+        p.rpos(0); //reset packet pointer
+        p >> Guid; //guid of the item rolled
+        p >> NumberOfPlayers; //number of players invited to roll
+        p >> rollType; //need,greed or pass on roll
+
+
+        for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it)
        {

-            WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1)
-            uint64 Guid;
-            uint32 NumberOfPlayers;
-            uint8 rollType;
-            p.rpos(0); //reset packet pointer
-            p >> Guid; //guid of the item rolled
-            p >> NumberOfPlayers; //number of players invited to roll
-            p >> rollType; //need,greed or pass on roll
-
-
-            for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it)
-                {
-
-                    uint32 choice = urand(0,2); //returns 0,1,or 2
-
-                    Player* const bot = it->second;
-                    if(!bot)
-                        return;
-
-                    Group* group = bot->GetGroup();
-                    if(!group)
-                        return;
-
-                    switch (group->GetLootMethod())
-                        {
-                        case GROUP_LOOT:
-                            // bot random roll
-                            group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice);
-                            break;
-                        case NEED_BEFORE_GREED:
-                            choice = 1;
-                            // bot need roll
-                            group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice);
-                            break;
-                        case MASTER_LOOT:
-                            choice = 0;
-                            // bot pass on roll
-                            group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice);
-                            break;
-                        default:
-                            break;
-                        }
-
-                    switch (rollType)
-                        {
-                        case ROLL_NEED:
-                            bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1);
-                            break;
-                        case ROLL_GREED:
-                            bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1);
-                            break;
-                        }
-
-                }
-        return;
+            uint32 choice = urand(0,2); //returns 0,1,or 2
+
+            Player* const bot = it->second;
+            if(!bot)
+                return;
+
+            Group* group = bot->GetGroup();
+            if(!group)
+                return;
+
+            group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice);
+
+            switch (choice)
+            {
+                case ROLL_NEED:
+                bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1);
+                break;
+    
+                case ROLL_GREED:
+                bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1);
+                break;
+            }
+
        }
+        return;
+    }


        /*

Hope this helps!

Link to comment
Share on other sites

pretty much exactly what I was looking for, cept I still don't know how to commit changes. I used mercurial (hg) for over a year, first with trinity, then with Infinity core. Committing with hg is simple, I just don't know the commands, or if I even have permission to make a change. I also am not sure, how to "add" files. for example...

hg add PlayerBotai.cpp (when playerbotai.cpp is already created.)

to add that when doing a diff and making a patch. knowing how to pull the patch from a repo is a great thing. thanks again.

Link to comment
Share on other sites

pretty much exactly what I was looking for, cept I still don't know how to commit changes. I used mercurial (hg) for over a year, first with trinity, then with Infinity core. Committing with hg is simple, I just don't know the commands, or if I even have permission to make a change. I also am not sure, how to "add" files. for example...

hg add PlayerBotai.cpp (when playerbotai.cpp is already created.)

to add that when doing a diff and making a patch. knowing how to pull the patch from a repo is a great thing. thanks again.

Like I said, I'm no expert and there are many that are. I have not yet got the courage to commit my code for the worry of messy up the github rep :huh: I have a good rapport with a senior member of this forum who kindly commits the patches I publish. It allows others to test the code before commiting, and reduces the number of commits, reducing possible code conflicts. Ask and I am sure someone will publish yours too ;)

Link to comment
Share on other sites

Hey :)

Greate job on the bot system.

can any of you tell me what is missed her?

../../../src/game/Creature.cpp:755: error: prototype for ‘void Creature::PrepareGossipMenu(Player*, uint32)’ does not match any in class ‘Creature’              
../../../src/game/Creature.h:509: error: candidate is: bool Creature::PrepareGossipMenu(Player*, uint32)                                                         
../../../src/game/Creature.cpp:882: error: no ‘void Creature::sendPreparedGossip(Player*)’ member function declared in class ‘Creature’                          
../../../src/game/Creature.cpp:899: error: no ‘void Creature::OnGossipSelect(Player*, uint32)’ member function declared in class ‘Creature’                      
../../../src/game/Creature.cpp:1029: error: no ‘void Creature::OnPoiSelect(Player*, const GossipOption*)’ member function declared in class ‘Creature’           
../../../src/game/Creature.cpp:1057: error: no ‘uint32 Creature::GetGossipTextId(uint32, uint32)’ member function declared in class ‘Creature’                   
../../../src/game/Creature.cpp:1072: error: no ‘uint32 Creature::GetNpcTextId()’ member function declared in class ‘Creature’                                    
../../../src/game/Creature.cpp:1083: error: no ‘const GossipOption* Creature::GetGossipOption(uint32) const’ member function declared in class ‘Creature’        
../../../src/game/Creature.cpp: In member function ‘virtual void Creature::SaveToDB(uint32, uint8, uint32)’:                                                     
../../../src/game/Creature.cpp:1260: warning: format not a string literal and no format arguments  

ty.

Link to comment
Share on other sites

Hey :)

Greate job on the bot system.

can any of you tell me what is missed her?

../../../src/game/Creature.cpp:755: error: prototype for ‘void Creature::PrepareGossipMenu(Player*, uint32)’ does not match any in class ‘Creature’              
../../../src/game/Creature.h:509: error: candidate is: bool Creature::PrepareGossipMenu(Player*, uint32)                                                         
../../../src/game/Creature.cpp:882: error: no ‘void Creature::sendPreparedGossip(Player*)’ member function declared in class ‘Creature’                          
../../../src/game/Creature.cpp:899: error: no ‘void Creature::OnGossipSelect(Player*, uint32)’ member function declared in class ‘Creature’                      
../../../src/game/Creature.cpp:1029: error: no ‘void Creature::OnPoiSelect(Player*, const GossipOption*)’ member function declared in class ‘Creature’           
../../../src/game/Creature.cpp:1057: error: no ‘uint32 Creature::GetGossipTextId(uint32, uint32)’ member function declared in class ‘Creature’                   
../../../src/game/Creature.cpp:1072: error: no ‘uint32 Creature::GetNpcTextId()’ member function declared in class ‘Creature’                                    
../../../src/game/Creature.cpp:1083: error: no ‘const GossipOption* Creature::GetGossipOption(uint32) const’ member function declared in class ‘Creature’        
../../../src/game/Creature.cpp: In member function ‘virtual void Creature::SaveToDB(uint32, uint8, uint32)’:                                                     
../../../src/game/Creature.cpp:1260: warning: format not a string literal and no format arguments  

ty.

Hi,

You haven't provided any information as to code versions? (i.e MaNGOS, SD2, or patches used). However you always begin troubleshooting compiler issues by asking the question, What has changed? The error shown above suggests that there is something missing from the Creature class, and there are several references to Gossip. I would always look in the http://www.manground.org/mangosChangelog.html?logpage=15 to see if the core has been changed. I see that commit [8900] Move most gossip related functions from Creature to Player class.

I would try using a version of MaNGOS prior to this, or edit the code of any patches used. Perhaps update these patches.

I don't know what database you use. I use http://svn.assembla.com/svn/psmdb_wotlk/ and they suggest which versions of MaNGOS & SD2 are compatible with the current db release (I'm using PSMDB:271 , MaNGOS: 8874 & SD2 1508). The current release of playerbot compiles fine with this

Hope this helps

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use