Jump to content

Playerbot


Recommended Posts

[

i tried to use ur code for my warrior and sins im a noob i suck but i got this

.\\..\\src\\game\\playerbot\\PlayerbotWarriorAI.cpp(278): error C2065: 'LastSpellTank' : undeclared identifier

That's not that you're a noob. It's just I did not tell, that you had to edit your PlayerbotWarriorAI.h.

At the end of that file, there is a line which should be changed from

uint32 SpellSequence;

to:

uint32 SpellSequence,LastSpellTank;

Then it should at least compile, I removed a lot from the other code.

I uploaded the PlayerbotWarrior.AI.cpp I'm currently testing with to pastebin: http://pastebin.com/njrgbxza

Link to comment
Share on other sites

  • Replies 799
  • Created
  • Last Reply

Top Posters In This Topic

Then perhaps you can set a further subcommand to combat orders. Such as telling the priest

.bot co heal holy Target

Just automate it based on which talent tree has the most talents. Keep the user (and more complicated orders) out of it :)

<edit> to be clear, I would base this on actual talents, not on the playerbot's talent spec settings. talent spec is in no way a required command, after all. Plus it's better to base it on actual talents than on 'supposedly future' talents.</edit>

Link to comment
Share on other sites

@Mookjin Thanks for the help. I was thinking of fixing it in a similar way but I would rather just have them use it based on rage due to the fact that heroic strike can be cast along with other spells since it is a on next hit ability. However if there isn't another way to do that I would probably use a solution like that.

I also put what code I have so far on pastebin

PlayerbotWarriorAI.h = http://pastebin.com/9hJejSSH

PlayerbotWarriorAI.cpp = http://pastebin.com/3Vdk5HHy

It seems to work pretty well but there are some things I would like to fix such as only taunting when the target isn't on the tank, fixing heroic strike, and like Kennumen suggested changing what rotation to use based upon which talent tree has the most points in it. I would change the talent point code but like I said earlier I'm still learning the basics of c++ and I haven't been able to find out how to check the talent points etc.

Link to comment
Share on other sites

PlayerbotWarriorAI.h = http://pastebin.com/9hJejSSH

PlayerbotWarriorAI.cpp = http://pastebin.com/3Vdk5HHy

It seems to work pretty well but there are some things I would like to fix such as only taunting when the target isn't on the tank, fixing heroic strike, and like Kennumen suggested changing what rotation to use based upon which talent tree has the most points in it. I would change the talent point code but like I said earlier I'm still learning the basics of c++ and I haven't been able to find out how to check the talent points etc.

Hmm... pastebin's a lot worse than I remember (course it beats the code tag hands down as it stands).

The reason your heroic strike is never called is because it's at the end of a long list of IFs, which I think are somewhat broken - it should really only try one action per CASE. Either an IF should come with a break or be followed by an else-if. I imagine the server catches the bot trying to do 5 spells in 5 milliseconds and only does the first, so functionally it's OK but it's messy nonetheless. Anyway, move your heroic strike to/near the front of the CASE and you'll have more luck. You want it to always be called when you have 80+ rage, as it stands it's only called if you have 80+ rage AND all the IF's before it are false.

As for counting the talents per tree, it appears (after a quick glance) this code does not exist. If you're up for it, check out GetTalents() in Player.h/cpp and ApplyActiveTalentSpec() in PlayerbotAI.h/cpp for some good clues. These function(s) should of course go in PlayerbotAI.h/cpp because all classes would use them - just use a generic tree 0/1/2 and have the ones calling this function figure out that 0 = arcane, 1 = frost, 2 = fire (for example).

Link to comment
Share on other sites

Maybe there could be different rotations used depending on if you have a bot set to aggressive, defensive, or passive.

Taking Priest as the example, aggressive would load up a spell rotation that focuses primarily on damage while defensive might use more buffs/debuffs and passive would focus more on healing.

Might also be nice if the spell rotations were stored in some sort of table so they could somehow be edited to use spells the bot owner prefers. Maybe with something like a rotation command, where the spell IDs would be entered, separated by commas and then stored for that bot in the database. rotation could also be further defined by adding the bot mode as a flag, so you'd use something like :

.bot botname rotation -aggressive spellID1,spellID2,spellID3...

to enter the spells used for when the bot is set to aggressive mode. Of course the flags could be abbreviated, aggressive = a, defensive = d, and passive = p.

Link to comment
Share on other sites

Thanks for the reply Kennumen. Yeah the code is a mess and I forgot I had moved the heroic strike/cleave code to the bottom like that. I did as you said and changed the code to break out each time an if statement is met and the problem is even if i set the code to ai->GetRageAmount() > 110, which if my understanding is correct should never be true, the bots still spam heroic strike and do nothing else.

I changed the code on pastebin.com to try to show what I changed. I moved the heroic strike/cleave code outside the case statements also trying to again see if that would help, no luck. Sorry again for my noobishess in all of this but I hate to give up on it. :)

Link to comment
Share on other sites

@kennuman:

That's a good Idea with the heroic strike before all the IF's. I will test this in my code.

The Idea to make the rotation/role of the bot based on the talents set really good.

Also I think it should be possible to change it, if you just want the pala to heal instead of DD

(of course he could not be such a good healer due to the "wrong" talents set)

@Corzarium:

Had a small look over your code, and I think it could be that the problems lies in line number 196.

else if (HEROIC_STRIKE > 0 && ai->GetRageAmount() > 110 && ai->GetAttackerCount() <= 2 && ai->CastSpell(HEROIC_STRIKE, *pTarget))

As far as I know (correct me anybody if I'm wrong here) All Stuff in the round brackets "( )" will be executed in an "if"-clause to check if it's true or false.

So here the Spell will be executed and returns a TRUE if he has enough rage and the spell will be done.

Try to change it to this, I hope that helps and stops the spamming

else if (HEROIC_STRIKE > 0 && ai->GetRageAmount() > 110 && ai->GetAttackerCount() <= 2 )

{

ai->CastSpell(HEROIC_STRIKE, *pTarget);

out << " > Heroic Strike > ";

}

Link to comment
Share on other sites

Maybe there could be different rotations used depending on if you have a bot set to aggressive, defensive, or passive.

Taking Priest as the example, aggressive would load up a spell rotation that focuses primarily on damage while defensive might use more buffs/debuffs and passive would focus more on healing.

Might also be nice if the spell rotations were stored in some sort of table so they could somehow be edited to use spells the bot owner prefers. Maybe with something like a rotation command, where the spell IDs would be entered, separated by commas and then stored for that bot in the database. rotation could also be further defined by adding the bot mode as a flag, so you'd use something like :

.bot botname rotation -aggressive spellID1,spellID2,spellID3...

to enter the spells used for when the bot is set to aggressive mode. Of course the flags could be abbreviated, aggressive = a, defensive = d, and passive = p.

I like this, in theory. Of course, defensive (with the connotations to pets) could probably be worded better.

But in practice I see problems. First there's more or less one 'ideal' rotation. So once it's that ideal a player could only worsen it - and if he does improve it, it merits inclusion in Playerbot. Personally I use bots with classes I haven't and probably don't want to play, so finding that rotation would require quite a bit of research. Per bot. After that, I'd have to look up all of the appropriate spellIDs. Per bot.

I'm all for customization but it seems this should be automated, using a system based on combat orders and talents.

Yeah the code is a mess

Which, trust me, is not any one person's fault.

Sorry again for my noobishess in all of this but I hate to give up on it. :)

Don't be sorry. Instead, pat yourself on the back for trying. Something people tend to forget all too easily - we all start out as newbies.

That's a good Idea with the heroic strike before all the IF's. I will test this in my code.

The Idea to make the rotation/role of the bot based on the talents set really good.

Also I think it should be possible to change it, if you just want the pala to heal instead of DD

(of course he could not be such a good healer due to the "wrong" talents set)

In a series of IF/ELSEs (which, if it's not entirely, this should be), you (... generally) want the most restrictive clauses at the top. For example:

if (x>10) else if (x>20) // second clause will *never* be called

if (x>10.0f) else if (x>9.9999f) // second clause will very rarely be called (which, granted, may be the point)

As for having a Retri paladin heal, isn't that what combat orders are for? You could still have an ideal healing rotation based on his (mostly) retri talents though. For example.

@Corzarium:

Had a small look over your code, and I think it could be that the problems lies in line number 196.

else if (HEROIC_STRIKE > 0 && ai->GetRageAmount() > 110 && ai->GetAttackerCount() <= 2 && ai->CastSpell(HEROIC_STRIKE, *pTarget))

As far as I know (correct me anybody if I'm wrong here) All Stuff in the round brackets "( )" will be executed in an "if"-clause to check if it's true or false.

So here the Spell will be executed and returns a TRUE if he has enough rage and the spell will be done.

Try to change it to this, I hope that helps and stops the spamming

else if (HEROIC_STRIKE > 0 && ai->GetRageAmount() > 110 && ai->GetAttackerCount() <= 2 )

{

ai->CastSpell(HEROIC_STRIKE, *pTarget);

out << " > Heroic Strike > ";

}

Nope, conditionals inside an IF clause, while using AND (&&) are only evaluated while the previous clause is true.

HEROIC_STRIKE > 0

-> true, continue

-> false, skip the rest of this IF clause

I haven't realy worked with warriors (except for a small fix) so don't expect me to be an expert but that code looks solid. The only hickup I found was looking up the GetRageAmount() code:

uint8 PlayerbotAI::GetRageAmount(const Unit& target) const

{

return (static_cast<float> (target.GetPower(POWER_RAGE)));

}

I'm reading that correctly, right? It calls a function, gets a uint32, casts it to a float and then casts it to a uint8? Messed up as that is, it's not gonna change values <= 110 (or however high rage can go). Make sure you're running your latest code, and (unless someone else finds an error) then proceed to mess with your code.

Link to comment
Share on other sites

In a series of IF/ELSEs (which, if it's not entirely, this should be), you (... generally) want the most restrictive clauses at the top. For example:

if (x>10) else if (x>20) // second clause will *never* be called

if (x>10.0f) else if (x>9.9999f) // second clause will very rarely be called (which, granted, may be the point)

@kennumen:

I thought to use it without "else if", check if there is enough rage for Heroic_Strike and other spells. Cast the Heroic_Strike and then Cast whatever Spell is next in the rotation or spellpriority.

if ( ai->GetRageAmount() >= 50 &&  ai->CastSpell(HEROIC_STRIKE, *pTarget ) )
  ai->TellMaster("Casted Heroic_Strike");
if (... )
{
 start rotation/spellpriority here;
}

Nope, conditionals inside an IF clause, while using AND (&&) are only evaluated while the previous clause is true.

HEROIC_STRIKE > 0

-> true, continue

-> false, skip the rest of this IF clause

@kennumen:

I didn't know that, or I forgot it in the past years. :)

Thanks for the correction!

hm.. Is there any "how to" for the code boxes?

Link to comment
Share on other sites

Here is my first, for me at lvl 80, functionally version for the Warrior AI.

It holds the aggro from single targets as tank

and it deals when assisting as "Furor Warrior" with two weapons good damage.

Please keep in mind, that the assist is currently only working good as Furor and not as Arms-Warrior!

What has to be done:

- fit to lower levels

- get aggro from other groupmembers

What am I currently coding:

Mage AI (Fire is finished; arcane I will begin shortly (maybe I do some ice stuff..), also I need to find a way to find out which talent spec the mage is currently running, and how to check whether using single target or AoE Spells)

after that I will continue with the warrior!

PlayerWarriorAI.cpp : http://pastebin.com/ShJ2jCm7

PlayerWarriorAI.h : http://pastebin.com/KHdiQzVh

Link to comment
Share on other sites

Bonjour tout le monde !

It's my first post, and I want you all to know that I can't live without Playerbot's additions, these days I wait for Kennumen news, about autobots (I've played with Yad's Mangos for a long time but something got wrong and it's now unplayable). I hope I can merge mmaps with autobots fork, all is working quite fine for now, but autobots just go online and can't be invited.

Did I miss something ?

Well, I'll try to follow news, and to learn some tricks...

Merci beaucoup !

Link to comment
Share on other sites

Nice work!

... also I need to find a way to find out which talent spec the mage is currently running, and how to check whether using single target or AoE Spells)

You can really expect a player to conform to a 'set' talent spec. Even with an 'ideal' talent spec it's often tweaked to taste, so it's generally better to check for single spells and ignore the passive talents, at least to start out with.

Bonjour tout le monde !

It's my first post, and I want you all to know that I can't live without Playerbot's additions, these days I wait for Kennumen news, about autobots (I've played with Yad's Mangos for a long time but something got wrong and it's now unplayable). I hope I can merge mmaps with autobots fork, all is working quite fine for now, but autobots just go online and can't be invited.

Did I miss something ?

Yo.

Autobots are a bit stalled (unfortunately I'm unable to dazzle you with a hidden behind-the-scenes major update) as I'm struggling with creating a session (or rather, another session?). Once that's done things should fall into place somewhat quickly. I've set myself a deadline to get them working properly (including items, etc) by mid-february. It's tight but let's hope I make it.

I don't see any reason why mmaps would fail to merge with autobots (as long as mmaps merges fine with playerbot, that is).

As for the current state of autobots, they do in a very limited way 'go online' but they're not actually added to the world. Just new characters are created and then set to online in the database, which is why they cannot (yet) be invited.

Link to comment
Share on other sites

Hi Guys,

I have had a number of people interested in testing the playerbot code in combination with mmaps and the core. Those who already use mmaps will appreciate that it isn't a five minute job to prepare the source code ready to compile. If you merge directly you need to resolve any merge conflicts before the merge will take, and if your merging more than one mod into the core it becomes quite a headache. The alternative to this is to apply prepared standalone patches to the core. Here too you need to resolve merge conflicts in the patch, with the added headache that 'git apply' does not like 'whitespace errors' and there are quite a few in the mmaps source.

I decided to provide a step by step guide to allow even the most novice user to utilize both playerbot and mmaps with the core. In this guide I will demonstrate how to merge the code directly, providing scripts to merge and patches to fix current conflicts ( Please note that future changes with the core and mod code could cause additional conflicts). The source will be built in a folder called 'portal' <source root>. You can change this in the script if you wish to use another name.

1. It is most appropriate to begin with the mmaps mod and merge this with the latest core.

#!/bin/bash -x
mkdir portal
cd portal
git init
git pull git://github.com/faramir118/mangos.git mmaps_rewrite:master
git pull git://github.com/mangos/mangos.git
#
# Apply merge_mmap_into_core.patch to fix conflicts
# Then it is most important to do the following within the portal folder <source root>
# git add src/game/Chat.cpp
# git add src/game/Level3.cpp
# git add src/game/Unit.cpp
# git add src/game/movement/MoveSplineInit.h
# git rm win/VC80/game.vcproj
# git commit -a
#
# save the file to finalize the merge
# check that the merge has taken by viewing the commit history 'git log'

To resolve current conflicts I provide the following patch called merge_mmap_into_core.patch. To apply from <source root>

git apply --whitespace=fix merge_mmap_into_core.patch

diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 4f2b169..4fc5b21 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -823,11 +823,8 @@ ChatCommand * ChatHandler::getCommandTable()
        { "stable",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleStableCommand,              "", NULL },
        { "waterwalk",      SEC_GAMEMASTER,     false, &ChatHandler::HandleWaterwalkCommand,           "", NULL },
        { "quit",           SEC_CONSOLE,        true,  &ChatHandler::HandleQuitCommand,                "", NULL },
-<<<<<<< HEAD
-        { "mmap",           SEC_GAMEMASTER,     false, NULL,                                           "", mmapCommandTable },
-=======
        { "gearscore",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleShowGearScoreCommand,       "", NULL },
->>>>>>> b3a23acf7a70a41ad36be2705e79463edf153b3e
+        { "mmap",           SEC_GAMEMASTER,     false, NULL,                                           "", mmapCommandTable },

        { NULL,             0,                  false, NULL,                                           "", NULL }
    };
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 45dd371..c07f9d4 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -7066,7 +7066,6 @@ bool ChatHandler::HandleModifyGenderCommand(char *args)
    return true;
}

-<<<<<<< HEAD
bool ChatHandler::HandleMmap(char* args)
{
    bool on;
@@ -7135,7 +7134,7 @@ bool ChatHandler::HandleMmapTestArea(char* args)

    return true;
}
-=======
+
bool ChatHandler::HandleShowGearScoreCommand(char *args)
{
    Player *player = getSelectedPlayer();
@@ -7163,4 +7162,3 @@ bool ChatHandler::HandleShowGearScoreCommand(char *args)

    return true;
}
->>>>>>> b3a23acf7a70a41ad36be2705e79463edf153b3e
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 86e55d6..2630081 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -8655,8 +8655,8 @@ bool Unit::SelectHostileTarget()
        if (!hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
        {
            SetInFront(target);
-<<<<<<< HEAD
-            ((Creature*)this)->AI()->AttackStart(target);
+            if (oldTarget != target)
+                ((Creature*)this)->AI()->AttackStart(target);

            // check if currently selected target is reachable
            // NOTE: path alrteady generated from AttackStart()
@@ -8683,10 +8683,6 @@ bool Unit::SelectHostileTarget()

                return false;
            }
-=======
-            if (oldTarget != target)
-                ((Creature*)this)->AI()->AttackStart(target);
->>>>>>> b3a23acf7a70a41ad36be2705e79463edf153b3e
        }
        return true;
    }
diff --git a/src/game/movement/MoveSplineInit.h b/src/game/movement/MoveSplineInit.h
index cd8fa36..f79d88c 100644
--- a/src/game/movement/MoveSplineInit.h
+++ b/src/game/movement/MoveSplineInit.h
@@ -41,14 +41,9 @@ namespace Movement
    public:

        explicit MoveSplineInit(Unit& m);
-<<<<<<< HEAD

        /* Final pass of initialization that launches spline movement.
         * @return duration - estimated travel time
-=======
-
-        /*  Final pass of initialization that launches spline movement.
->>>>>>> b3a23acf7a70a41ad36be2705e79463edf153b3e
         */
        int32 Launch();

@@ -78,15 +73,9 @@ namespace Movement
        void MovebyPath(const PointsArray& path, int32 pointId = 0);

        /* Initializes simple A to B mition, A is current unit's position, B is destination
-<<<<<<< HEAD
         */ 
        void MoveTo(const Vector3& destination, bool generatePath = false, bool forceDestination = false);
        void MoveTo(float x, float y, float z, bool generatePath = false, bool forceDestination = false);
-=======
-         */
-        void MoveTo(const Vector3& destination);
-        void MoveTo(float x, float y, float z);
->>>>>>> b3a23acf7a70a41ad36be2705e79463edf153b3e

        /* Sets Id of fisrt point of the path. When N-th path point will be done ILisener will notify that pointId + N done
         * Needed for waypoint movement where path splitten into parts

If you are using windows with 'git bash' and copy/paste either of the patches to new files, remember to insert a newline at EOF and save the file with 'Unicode' encoding. If you don't the patches won't work.

O.K if all has gone well you should now have mmaps merged with the latest core.

2. To merge playerbot code (from the 'new-ai' branch on the portal repo) with the above merged code, run the following script from <source root> folder.(If you wish to use playerbot code from a different repo or branch, edit the script to change the 'URL' and branch name.

#!/bin/bash -x
cd portal
git pull git://github.com/blueboy/portal.git new-ai:new-ai
#
# Apply merge_pbot.patch to fix conflict
# Then it is most important to do the following within the portal folder <source root>
# git add win/VC100/game.vcxproj.filters
# git commit -a
#
# save file to finalize merge
# check that the merge has taken by viewing the commit history 'git log'

To resolve current conflicts I provide the following patch called merge_pbot.patch.To apply from <source root>

git apply --whitespace=fix merge_pbot.patch

diff --git a/win/VC100/game.vcxproj.filters b/win/VC100/game.vcxproj.filters
index 5b115a5..af15f9f 100644
--- a/win/VC100/game.vcxproj.filters
+++ b/win/VC100/game.vcxproj.filters
@@ -943,12 +943,6 @@
    <ClInclude Include="..\\..\\src\\game\\Camera.h">
      <Filter>Object</Filter>
    </ClInclude>
-<<<<<<< HEAD
-    <ClInclude Include="..\\..\\src\\game\\MoveMap.h">
-      <Filter>World/Handlers</Filter>
-    </ClInclude>
-    <ClInclude Include="..\\..\\src\\game\\MoveMapSharedDefines.h">
-=======
    <ClInclude Include="..\\..\\src\\game\\playerbot\\PlayerbotAI.h">
      <Filter>World/Handlers</Filter>
    </ClInclude>
@@ -986,7 +980,12 @@
      <Filter>World/Handlers</Filter>
    </ClInclude>
    <ClInclude Include="..\\..\\src\\game\\playerbot\\PlayerbotWarriorAI.h">
->>>>>>> 4a6c484b0113fe67becc3ee2131c1b9905c493c0
+      <Filter>World/Handlers</Filter>
+    </ClInclude>
+    <ClInclude Include="..\\..\\src\\game\\MoveMap.h">
+      <Filter>World/Handlers</Filter>
+    </ClInclude>
+    <ClInclude Include="..\\..\\src\\game\\MoveMapSharedDefines.h">
      <Filter>World/Handlers</Filter>
    </ClInclude>
    <ClInclude Include="..\\..\\src\\game\\AuctionHouseBot\\AuctionHouseBot.h">

If you have followed these instruction you should now have prepared code that should compile and run without issue. Remember to include 'ScriptDev2' scripts prior to compilation. Before trying to run your server you will need a set of 'dbc/maps/vmaps/mmaps' files generated from compiled binaries (source included in 'contrib' folder in <source root>)

EDIT: Sorry guys it was early in the morning when I finished this. I missed the addition (in green) to the first script above

Hope this helps

Link to comment
Share on other sites

Nice work!
... also I need to find a way to find out which talent spec the mage is currently running, and how to check whether using single target or AoE Spells)

You can really expect a player to conform to a 'set' talent spec. Even with an 'ideal' talent spec it's often tweaked to taste, so it's generally better to check for single spells and ignore the passive talents, at least to start out with.

That's a good idea! Would be indeed way easier.

I will play around with it a bit.

Link to comment
Share on other sites

You can really expect a player to conform to a 'set' talent spec. Even with an 'ideal' talent spec it's often tweaked to taste,...

This is the reasoning behind why I suggested the rotation command being added as a playerbot feature. It would allow players to choose a bot's best spells, based on the bot's talent spec, or establish custom rotations for boss fights.

It might even be desirable to have as many custom rotations per bot as the player wishes, by allowing the rotations to be saved to the database and loaded by a name specified by the player. Such as having a Holy Priest configured to cast nothing but heals, perhaps you'd save the rotation with the name "allheals".

So the command would then have this format:

.bot botname rotation label spellID1, spellID2, spellID3,...

where label is the name used to save the spell rotation. Perhaps a new DB table, spell_rotation, could be used with the label and the spell IDs saved under the bot's name, to prevent mixing up preset rotations.

I know a great many players would go with whatever the default spells are for each bot, but having the choice to further customize your bots with hand-picked spell rotations would be a good thing, too.

If there were ever a Playerbot UI addon created, then switching between preset, custom rotations would be even easier and add more depth for players relying on bots, who would otherwise face the hazards of the world alone.

Link to comment
Share on other sites

@UnkleNuke

I like the Idea to configure the rotations via DB or configuration file.

But this will result in a more or less complex configuration language. Due to the need of Spells, which should at best only be cast when a certain Aura is either on the target or on the bot itself.

Also we have do differentiate if this char should use a prioritylist or a special fixed rotation.

Currently I got a small problem, when testing a simple Shaman Elemental script.

I found out, that the shaman is always going into Melee and not in to Ranged combat.

Even though I reconfigured the m_combatstyle in PlayerbotAI.ccp in PlayerbotAI::PlayerbotAI and in PlayerbotAI::ReloadAI.

Is there anywhere else configured that he should use COMBAT_MELEE over COMBAT_RANGED?

It couldn't find it :(

Link to comment
Share on other sites

You can really expect a player to conform to a 'set' talent spec. Even with an 'ideal' talent spec it's often tweaked to taste,...

This is the reasoning behind why I suggested the rotation command being added as a playerbot feature. It would allow players to choose a bot's best spells, based on the bot's talent spec, or establish custom rotations for boss fights.

Rehash of an old discussion; I still remain that any *optimal* rotation can and should be set by playerbot itself, recognizing which are its best spells, and picking a rotation based on the situation (regular, specific boss, ...). There is one perfect answer given a set of spells, and instead of expecting all players to figure it out and then enter it using spellIDs...

I know a great many players would go with whatever the default spells are for each bot, but having the choice to further customize your bots with hand-picked spell rotations would be a good thing, too.

I've mentioned above that there is one perfect rotation given a bot and situation. If you still wish to add custom rotations, are you implying players might want suboptimal rotations (just for plain taste, or disagreement over what the perfect rotation is)? Or do you believe finding this perfect rotation is so difficult we should have a rotation command in the meanwhile, not only to hotfix suboptimal rotations, but also as a testing bed for getting nearer that perfect rotation?

-- No sarcasm, I genuinely wish to know.

Is there anywhere else configured that he should use COMBAT_MELEE over COMBAT_RANGED?

Have you checked if it's set to cast spells in the rotation? The priest used to go melee, perhaps there's a clue there.

Link to comment
Share on other sites

I am in no way suggesting that Playerbot's currently established spell rotations are somehow inferior.

Your suggestion that it might be used as a "debugging" tool to fix incorrect and sub-par rotations so such corrections could then be added into the bot AI code is one function I had not thought of, but it seems to be a good idea. This would also give players with greater knowledge of specific class/spec/item abilities the opportunity to make adjustments and then report this information for future development.

Players do differ in their style of play. Some, perhaps, have a preferred method of combat that deviates from what is considered "optimal", yet manage with great success to win the day. It may also be that optimal bot spell rotations would be incompatible with some individual styles.

This customization I propose would be entirely optional, to satisfy those that wish to tinker with things to suit their preferences and needs. Players who prefer to use the default bot spells would still be free to do so.

The feature is not something I feel is vital to Playerbot, but it would expand its flexibility for those who do wish to dig deeper into the potential of the bots.

Link to comment
Share on other sites

Has anyone gotten PlayerBot working with MangosOne? I can get through patching and making it compile, but I'm worried about logic errors.

Hi,

Thanks for your interest in playerbot. I personally haven't tested the code with MaNGOS One. That's not to say it won't work. Which playerbot code are you using?

playerbot for MaNGOS Zero

or

playerbot for MaNGOS (Two)

When I created the portalzero code I spent a solid week on it, and then had little response from users. If you are interested in testing the code, we will do our best to resolve any issues you might get.

Hope this helps

Link to comment
Share on other sites

It may be that the word about Playerbot-Zero just hasn't gotten out, yet.

It might be a good idea to advertise repo links to Playerbot and Playerbot-Zero in your signature. I would think it's allowed, since Playerbot has been a part of MaNGOS for such a long time.

With the Zero site and forums turning into a ghost town, the 1.12 fans have returned to these forums and only just begun to learn about some of the backports.

I am assuming the portalzero and zeronew-ai branch are roughly the same as their 3.3.5a counterparts?

Another thing about which I'm curious is if Playerbot or Playerbot-Zero would be compatible with MaNGOS-One? Nostalgia is getting the better of me and I've been contemplating the idea of switching my server back to Burning Crusade, which was the version I started with when my MaNGOS addiction began. :lol:

Link to comment
Share on other sites

Hello blueboy:

It's been a year since I came here last time, and very glad to see the efforts and progress all you guys have made, especially about the ai part.

I see the branches changed, are the new ai scripts merged into 'master' or only stored in 'new-ai'? cause I checked the last-2-month updates committed of each branch and found them almost the same. Besides, I tested 'playerbot/mangos', the most stable one, commands like 'report', 'orders' don't work, neither do some shortcuts like 's', 'skill l'.

Is there any place where I can get what you're currently working on? I take a glance at 'bot_todo.txt', it seems outdated. I think you can make a list of both accomplished and upcoming features on the very 1st post of this thread, also suggest you open another thread to seperate discussions about basic functions from those about PvE/PvP ai scripts.

Thanks for the brilliant work, wish I could help.

Edit: Sorry, I see the changes ahead of 'master' in 'new-ai', I'll check the code.

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