[C++] Class EventMap::GetPhaseMask()

Class EventMap

Also ich habe folgendes Problem… ich bin auf den return von GetPhaseMask() gestoßen, und find mich da nicht ganz zurecht.

Und zwar bin ich mir nicht ganz sicher was die Funktion genau returnt.

EventMap _events;
switch (_events.GetPhaseMask())
{
// Riesige case statements…
}

Würde ich jetzt in Phase 1 sein, was wäre mein Wert von RetVal ? Was wäre er in Phase 2 und in Phase 3 ? Würde sich der Wert ändern wenn z. B. Phase 2 & 4 auf einmal aktiv wären ?

Hab bereits versucht es durch diverse Funktionen zu debuggen & so auszugeben, hat aber leider nicht so funktioniert wie es sein sollte.

[SIZE=10px]Ja, ich versuche die aktive Phase zu switchen, würde bevorzugt switch nehmen, da if statements mit EventMap::IsInPhase leider zu unübersichtlich wären - in meinem/diesem Code. Wer denkt, dass ich dennoch die IsInPhase Funktion nehmen soll, bitte auch posten.[/SIZE]

/*Structure of event data:

  • Bit 0 - 15: Event Id.
  • Bit 16 - 23: Group
  • Bit 24 - 31: Phase
  • Pattern: 0xPPGGEEEE*/

//Andere Funktionen…

/**

  • @name GetPhaseMask
  • @return Active phases as mask.
    */
    uint8 GetPhaseMask() const
    {
    return _phase;
    }

Wie sich die “Structure of event data:” jetzt genau zusammensetzt, da bin ich mir auch nicht sicher. Mir wäre aber bereits mit meinem obigen Problem geholfen.

[SIZE=8px]Ich hoffe ich bin hier richtig. /emoticons/default_blink.png[/SIZE]

Wenn jemand weiß was der genaue return-wert ist, bitte posten.

Vielen Dank !

Naja, steht doch alles wunderbar da.

[CODE]
/**

  • @name GetPhaseMask
  • @return Active phases as mask.
    */
    uint8 GetPhaseMask() const
    {
    return _phase;
    }[/CODE]

du bekommst einen uint8 mit den activen Phasen.

Klar steht das so da, das war ja nicht meine Frage, tut mir leid wenn du mich missverstanden hast. Ich weiß nicht was der genaue Wert ist der returnt wird, das will ich ja wissen, also Wert == der Inhalt der variable _phase.

Ist es 1, 2, 3, 4, 5, 6, 7, 8 für die Phasen oder ist es 1, 2, 4, 8, 16, 32, 64, 128 für die ersten 4 ? Oder 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 ? Laut der Aussage von “structure of event data” könnte es aber auch 0x01000000 / 0x02000000 / 0x04000000 / 0x08000000 / 0x10000000 / 0x20000000 / 0x40000000 / 0x80000000 sein. /emoticons/default_unsure.png

Darin liegt mein Problem.

Könntest du mir da evtl. weiterhelfen ?

Sieht ‘[COLOR=rgb(40,40,40)]0x10’ für dich nach einem Integer aus ?

[COLOR=rgb(40,40,40)]Es sind natürlich zahlen wie [COLOR=rgb(40,40,40)]1, 2, 3, 4, 5, 6, 7, 8 und wenn ich mich jetzt ohne eine Core und DB hier auf meinem Arbeits-Computer zu haben nicht irre,

[COLOR=rgb(40,40,40)]genau das was du auch in-game oder in der DB einträgst, wenn du ein NPC / GO / Player oder sonst was in eine Phase verschiebst.

Sprich:

1 = 1

2 = 2

3 = 1 | 2

4 = 4

5 = 4 |1

6 = 4 | 2

7 = 4 | 2 | 1

8 = 8

usw.

Soll heißen, du hast einen Spieler in Phase 1 und einen in Phase 2, gegenseitig können sie sich nicht sehen.

Willst du nun ein GameObject stellen, das beide sehen sollen kommt das in eine PhaseMask 3 = 1 | 2

[SIZE=8px]0x10 = 16[/SIZE]

[SIZE=8px]0x20 = 32[/SIZE]

[SIZE=8px]Du weißt was ich meine…[/SIZE]

Danke für deine Antwort /emoticons/default_happy.png , aber ich hab dennoch ein Problem, dass ich eigentlich bei dieser Funktion vermutet hatte, da im Script die Phasen scheinbar nicht wechseln.

Hier ein Ausschnitt aus allem, teils geänderte Variablennamen:

enum abcd
{
PHASE_ONE = 1,
PHASE_SEVEN = 7,
GROUP_SEVEN = 7,
EVENT_EXAMPLE = 75,
EVENT_BLAH = 125,
};

void DamageTaken (Unit* /*attacker*/, uint32& /*damage*/)
{
    if (_events.IsInPhase(PHASE_ONE) && !HealthAbovePct (88))
    {
        _events.Reset();
        _events.SetPhase (PHASE_TWO);
        _events.ScheduleEvent (EVENT_BLAH, 2500, GROUP_SEVEN, PHASE_TWO);  
        // diverse Schedules
    }
    if (_events.IsInPhase(PHASE_TWO) && !HealthAbovePct (75))
    {
        _events.Reset();
        _events.SetPhase (PHASE_SEVEN);
        //etc. kleines Beispiel vom ganzen Code
    }
}

[SIZE=10px]Ja, der Code ist etwas verschachtelter…[/SIZE]

if (!UpdateVictim () )
{ return; }

_events.Update(diff);

while (uint32 EventID = _events.ExecuteEvent())
{
switch (_events.GetPhaseMask())
{
case PHASE_ONE:
{
switch (EventID)
{
case EVENT_EXAMPLE:
{
// Code
break;
}
}
break;
} //Phase 1

   case PHASE_SEVEN:
   {
       //Das selbe wie oben
       break;
   }

} //Switch PhaseMask
} //While Schleife

Du wüsstest nicht zufällig ob es in dem Code ein Problem gibt ? Syntax sollte soweit stimmen (Kein Error oder Warnings), aber ich bin mir nicht 100% sicher ob der Core das auch kapiert, bzw. ob das für den Core so richtig ist. Hoffe du kannst mir da weiterhelfen /emoticons/default_unsure.png .

Und was erwartest du nun das passiert ?

Von deiner Seite aus passiert wahrscheinlich gar nichts, so wie ich das sehe, also bin ich wohl wieder auf mich gestellt, trotzdem danke.

-Close please-

Naja, wo soll ich dir da nun groß helfen ?

Mit dem bisl müll den du da oben geposted hast kann man keinen Fehler analysiren.

Erstens weiß ich gar nicht wie du das testest, in welcher Phase ein Char ist usw.

Wenn er was machen würden, würde es dir in Phase 1 z.B. gar nicht auffallen, da 7 auch mit in 1 angezeigt wird. (7 = 4 + 2 + 1)

PHASE_TWO ist weder Deklariert noch Instantiiert. Das würde so nicht mal Compilen.

Also was erwartest du von mir ?

Dir ist schon klar, dass du in der UpdateAI die Phasen nicht abfragen musst, wenn du sie vorher im ScheduleEvent angegeben hast oder?