<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Design problem bei &#x27;nem Bot.]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich schreibe grade ein Bot für ein MMORPG, zurzeit hänge ich an einem problem, dass Spiel hat verschiedene skills, jeder skill hat eine eigene &quot;cooldown&quot; zeit(bis man den skill wieder benutzen kann). Hier ein beispiel:</p>
<p>Der Charakter &lt;hans&gt; hat 3 skills.</p>
<p>Skill 1: Name ( Skill A ) , cooldown ( 1500 ms )<br />
Skill 2: Name ( Skill B ) , cooldown ( 2000 ms )<br />
Skill 3: Name ( Skill C ) , cooldown ( 2500 ms )</p>
<p>Jetz muss ich die Skills in der richtigen reinfolge benutzen, basierend welcher skill zurzeit bereit ist. Wie würdet ihr vorgehen? Welcher Container wäre am Besten? Ich frage nicht wirklich nach code, sondern nach Ideen wie man es am besten Implementieren könnte. Und, bevor mich jemand steinigt, weil Bots ah so böse sind, und Spiele zerstören, ja du hast recht, aber der bot wird nicht pub gemacht, dient lediglich zur übung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247754/design-problem-bei-nem-bot</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 06:14:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247754.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Aug 2009 00:22:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 00:22:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich schreibe grade ein Bot für ein MMORPG, zurzeit hänge ich an einem problem, dass Spiel hat verschiedene skills, jeder skill hat eine eigene &quot;cooldown&quot; zeit(bis man den skill wieder benutzen kann). Hier ein beispiel:</p>
<p>Der Charakter &lt;hans&gt; hat 3 skills.</p>
<p>Skill 1: Name ( Skill A ) , cooldown ( 1500 ms )<br />
Skill 2: Name ( Skill B ) , cooldown ( 2000 ms )<br />
Skill 3: Name ( Skill C ) , cooldown ( 2500 ms )</p>
<p>Jetz muss ich die Skills in der richtigen reinfolge benutzen, basierend welcher skill zurzeit bereit ist. Wie würdet ihr vorgehen? Welcher Container wäre am Besten? Ich frage nicht wirklich nach code, sondern nach Ideen wie man es am besten Implementieren könnte. Und, bevor mich jemand steinigt, weil Bots ah so böse sind, und Spiele zerstören, ja du hast recht, aber der bot wird nicht pub gemacht, dient lediglich zur übung. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761147</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 00:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 00:35:19 GMT]]></title><description><![CDATA[<p>Mir fällt da gerade <code>std::priority_queue</code> ein. Die hat allerdings (als Container-Adapter) einige Einschränkungen, zum Beispiel kannst du nur auf das vorderste (respektive grösste) Element zugreifen. Wie hast du den Cooldown implementiert? Eine fixe Zeitmarke, zu der du jeweils die Differenz von der aktuellen Zeit misst? Oder (was ich eher glaube) eine Variable, die sich dauernd ändert?</p>
<p>Es gibt auch einige andere Möglichkeiten. Du kannst z.B. einen <code>std::vector</code> nehmen und sortieren, oder mit den <code>*_heap()</code> -Funktionen der Standardbibliothek eine Priority-Queue nachbilden. Da es so wenige Elemente sind (ich nehme an, die Anzahl Skills ist eine sehr kleine Zahl), fällt die Containerwahl auch von der Performance her nicht wirklich ins Gewicht (was nicht heisst, dass man sich nichts bei der Wahl überlegen sollte).</p>
<p>Wenn immer nur Elemente dazu kommen, die länger dauern als alle anderen Cooldowns im Container, kannst du auch eine <code>std::queue</code> bzw. flexibler eine <code>std::list</code> nehmen und neue Elemente am Ende einfügen. Dann hast du eine normale Warteschlange.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761151</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 15 Aug 2009 00:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 01:49:17 GMT]]></title><description><![CDATA[<p>sind die skills visuell. sichtbar? sind die skills zum anklicken?<br />
bzw. wie und wann merkt hans, welche skills er hat?</p>
<p>irgendwo muss ja ein timer die cooldown zeit der skills dekrementieren, dort wäre auch bei t &lt;= 0 ein bool flag angebracht, das den entsprechenden skill aktiviert.<br />
sortieren fällt flach, weil man in jeden skill 'reingucken' muss. es tut also ein skill array als &quot;container&quot; und ne schleife drum herum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761161</guid><dc:creator><![CDATA[skill0r]]></dc:creator><pubDate>Sat, 15 Aug 2009 01:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 02:03:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a></p>
<p>Hi,</p>
<p>Erstmal danke für deine Antwort. Zurzeit hab ich den Cooldown part nicht Implementiert, ich dachte aber an sowas, siehe code unten.</p>
<p>setCastTime wird ausgeführt, wenn ich die &quot;antwort&quot; vom gameserver kriege, dass der skill erfolgreich benutzt wurde. Weiter bin ich aber nicht gekommen, ist vielleicht auch zu spät zum nachdenken, werd morgen weiter darüber grübeln.</p>
<pre><code class="language-cpp">#include &quot;windows.h&quot;
#include &lt;list&gt;
#include &lt;string&gt;

struct sSkills
{
	DWORD skillId;
	std::string skillName;
	int skillCooldown;
	bool isSkillReady;
	int lastCastTime;

};

class skillManager
{
    public:

	std::list &lt; sSkills &gt; playerSkills;

	void AddSkill(sSkills newPlayer);
	bool isSkillReady(DWORD skillId);
	void setCastTime(DWORD skillID);

};
</code></pre>
<pre><code class="language-cpp">bool skillManager::isSkillReady(DWORD skillId)
{
	std::list&lt;sSkills&gt;::iterator Itr = playerSkills.begin();
	std::list&lt;sSkills&gt;::iterator ItrEnd = playerSkills.end();

	while (Itr != ItrEnd)
	{
		if (Itr-&gt;skillId == skillId)
		{
			if ( GetTickCount() - Itr-&gt;lastCastTime &gt;= Itr-&gt;skillCooldown)
			{
				Itr-&gt;isSkillReady = true;
				return true;
			}
		}
		else
			Itr++;
	}

	return false;
}

void skillManager::setCastTime(DWORD skillID)
{
	std::list&lt;sSkills&gt;::iterator Itr = playerSkills.begin();
	std::list&lt;sSkills&gt;::iterator ItrEnd = playerSkills.end();

	while (Itr != ItrEnd)
	{
		if (Itr-&gt;skillId == skillId)
		{
			Itr-&gt;lastCastTime = 0;
			Itr-&gt;lastCastTime = GetTickCount();
			Itr-&gt;isSkillReady = false;
		}
		else
			Itr++;
	}

}
</code></pre>
<p>Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761163</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 02:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 02:13:42 GMT]]></title><description><![CDATA[<p>skill0r schrieb:</p>
<blockquote>
<p>sind die skills visuell. sichtbar? sind die skills zum anklicken?<br />
bzw. wie und wann merkt hans, welche skills er hat?</p>
<p>irgendwo muss ja ein timer die cooldown zeit der skills dekrementieren, dort wäre auch bei t &lt;= 0 ein bool flag angebracht, das den entsprechenden skill aktiviert.<br />
sortieren fällt flach, weil man in jeden skill 'reingucken' muss. es tut also ein skill array als &quot;container&quot; und ne schleife drum herum.</p>
</blockquote>
<p>Sorry, hab dein post nicht gesehen als ich Nexus geantwortet habe.</p>
<p>1. ) Beim einloggen shickt der GameServer dem GameClient die verfügbaren Skills.</p>
<p>2. ) Die verfübaren skills von dem Charakter werden in einer std::list gespeichert, und in der GUI Angezeigt.</p>
<p>3. ) Es gibt einen &quot;Add&quot; button, mit dem man den gewünschten skill in einer Listbox hinzufügt, die Listbox repräsentiert die Skills die der Bot benutzen wird.</p>
<p>4. ) Der GameServer sagt dem GameClient leider nicht wann ein skill wieder benutzbar ist, daher muss ich es selber machen, genauso wie der GameClient.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761164</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 02:13:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 02:21:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Arg, vergessen zu sagen dass es max 6-7 skills geben wird, wenn es hoch kommt manchmal 10. Sorry für triple post. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761165</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 02:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 08:30:34 GMT]]></title><description><![CDATA[<h2>zu 4)<br />
aber der sever muss wenigstens die cooldown time liefern? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></h2>
<p>wie auch immer,<br />
die ids für die skills würde ich so vergeben, das man ohne eine schleife indexbasiert direkt zugreifen kann.<br />
wenn nicht allzu viele player zu verwalten sind, kann man auch beim suchen nach einem skill eines players auf eine schleife verzichten:</p>
<pre><code class="language-cpp">#define SKILL_1 0
#define SKILL_2 1
// ...
#define SKILL_10 9
#define SKILLS_QUANTITY 10

typedef struct Skill
{
	int id;
	int lastCastTime;
	int skillCooldown;
	char* name;
	// ... 
}Skills[SKILLS_QUANTITY];

typedef struct Player
{
	int id;
	char* name;
	Skills skills;
	// ...
};

void set_cast_time ( Player* p, int skill_id )
{
	p-&gt;skills[skill_id].lastCastTime = 0;
	// ...
}

bool skill_ready ( Skill* s )
{
	return GetTickCount() - s-&gt;lastCastTime &gt;= s-&gt;skillCooldown;
}

int main() 
{ 
	Player p = {0};
	p.name = &quot;Hans&quot;;
	p.skills[SKILL_2].name = &quot;Hans kanns.&quot;;

	set_cast_time (&amp;p, SKILL_2);
	if ( skill_ready ( &amp;p.skills[SKILL_2] ))
		cout &lt;&lt; &quot;Hello, my name is &quot; &lt;&lt; p.name &lt;&lt; 
			&quot; my skill level is &quot; &lt;&lt; p.skills[SKILL_2].name &lt;&lt; endl;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1761198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761198</guid><dc:creator><![CDATA[skill0r]]></dc:creator><pubDate>Sat, 15 Aug 2009 08:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 14:52:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Der server liefert nicht die Cooldown zeit, der Client liest die Cooldown zeit aus den data files, genau wie ich. Irgendwie find ich den code nicht wirklich schön, irgendwie sehe ich da kein c++. Dennoch danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761398</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 14:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 20:07:27 GMT]]></title><description><![CDATA[<p>warum muss der gameserver umbedingt die cooldownzeit liefern?<br />
die ist ja meist ein vielfaches von 0.5, oder es steht ingame drauf.</p>
<p>oder halt ne datei.</p>
<p>@skil0r: blub, C++ forum, define? typedef struct? das C forum ist eins weiter oben</p>
<pre><code class="language-cpp">class Skill
{
public:
    Skill(){}
    Skill(const char *pname, float pcooldown)
    : name(pname), cooldown(pcooldown), time_left(0.f)
    {
    }
    void AdvanceTime(float ftime)
    {
        if (time_left &gt; 0.f)
            time_left -= ftime;
    }
    bool SpellReady()
    {
        return time_left &lt;= 0.f;
    }
    bool Reset()
    {
        time_left = cooldown;
    }
    const char *GetName()
    {
        return name;
    }
private:
    const char *name;
    const float cooldown;
    float time_left;
};
class Container
{
public:
    void AddSpell(const Spell &amp;s)
    {
        spells.push_back(s);
    }
    void AdvanceTime(float ftime)
    {
        for (unsigned i = 0; i &lt; spells.size(); ++i)
            spells[i].AdvanceTime(ftime);
    }
    Spell *GetReadySpell()
    {
        for (unsigned i = 0; i &lt; spells.size(); ++i)
            if (spells[i].SpellReady())
                return &amp;spells[i];
        return 0;
    }
private:
    std::vector&lt;Spell&gt; spells;
};
</code></pre>
<p>so würde ich es machen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761503</guid><dc:creator><![CDATA[dosenkekse]]></dc:creator><pubDate>Sat, 15 Aug 2009 20:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 21:38:32 GMT]]></title><description><![CDATA[<p>Hm, nett. Nur wieso fügst du eine referenz zu dem objekt in den vector ein? und wieso char * und nicht std::string ? und ftime is *nix only soweit ich weiß. Dennoch danke. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761525</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Sat, 15 Aug 2009 21:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sat, 15 Aug 2009 22:11:54 GMT]]></title><description><![CDATA[<p>Um die Skills zu speichern, ist eine map angebracht, die Schleifen zum Finden der Skills fallen damit weg. Zudem sollte diese Funktionalität sowieso in getSkill() o.ä. ausgelagert werden, dann kannst du die Implementierung bei Bedarf bequem austauschen. Die map setzt natürlich voraus, dass es keine zwei Skills mit gleicher ID geben kann.<br />
sSkills bekommt eine Funktion ready() frei nach skill0rs skill_ready. Der Besitzer der Skills sollte regelmäßig alle Skills pollen und bei Bedarf casten. Ein Flag wie castPending ist hier wohl auch angebracht, damit du denselben Skill nicht noch zwanzig weitere mal zu casten versuchst, bis endlich die Antwort vom Server kommt.<br />
Wenn der Bot sonst nichts machst, kannst du auch CPU-Zeit sparen, indem du schaust, welcher Cooldown am frühesten abläuft und schläfst dann so lange.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761533</guid><dc:creator><![CDATA[Nanyuki]]></dc:creator><pubDate>Sat, 15 Aug 2009 22:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Sun, 16 Aug 2009 00:38:17 GMT]]></title><description><![CDATA[<p>dosenkekse schrieb:</p>
<blockquote>
<p>@skil0r: blub, C++ forum, define? typedef struct? das C forum ist eins</p>
</blockquote>
<p>Isch liebe disch schrieb:</p>
<blockquote>
<p>irgendwie sehe ich da kein c++. Dennoch danke.</p>
</blockquote>
<p>Es ging mir um den Zugriff, für den man keine Schleife und auch keine Map braucht, weiter nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761567</guid><dc:creator><![CDATA[merk0r]]></dc:creator><pubDate>Sun, 16 Aug 2009 00:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Design problem bei &#x27;nem Bot. on Fri, 21 Aug 2009 00:59:14 GMT]]></title><description><![CDATA[<p>Hatte in den letzen tagen keine zeit, aber danke an alle für die tipps, denk mal das ich es schaffen werde, falls jemand dennoch was übrig zu sagen hat, leg los.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1764389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1764389</guid><dc:creator><![CDATA[Isch liebe disch]]></dc:creator><pubDate>Fri, 21 Aug 2009 00:59:14 GMT</pubDate></item></channel></rss>