Factionid über entry ändern

Hallo,

Ich versuche seit gestern, leider erfolglos, die fraktion von einem npc zu ändern.

Ich habe die Id (entry) des npcs und möchte nun alle spawns von diesem einer anderen Fraktion zuweißen. Das ganze findet in dem “JustDied” Event eines CreaturScriptes statt.

Versucht hab ich das ganze folgendermaßen:

  1. alle guid’s aus der creature tabelle laden

Schleifenanfang(für jede guid)

  1. ein neues Objekt der Klasse Creature erstellt.

  2. die Funktion “LoadFromDb” mit der guid und der Map der Unit des Killers aufrufen

  3. Prüfen ob die Creature erfolgreich geladen wurde

→ erfolgreich: SetFaction aufrufen

  1. delete Creature

Schleifenende

Bei einigen wenigen Npcs wird die Creature erfolgreich geladen, allerdings ändert sich die Faktion nach dem aufruf von “SetFaction” nicht und bei dem großteil der ids die ich versucht habe wird die Creature erst garnicht geladen.

Hat jemand eine idee woran das liegen könnte oder vll sogar einen besseren Lösungsvorschlag für mein Problem.

– Quellcode werd ich im laufe des Tages noch posten.

void JustDied(Unit* killer)
{
QueryResult result = WorldDatabase.PQuery(“SELECT guid FROM creature WHERE id = 6749”);

if(result)
{
	do
	{
		Field* field = result->Fetch();
		uint32 guid = field[0].GetUInt32();

		Creature* creature = new Creature();
								
		if(creature->LoadFromDB(guid, killer->GetMap()))
		{
			TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Creature: GUID: %u", creature->GetGUID());

			creature->setFaction(85);
		}
		else
		{
			TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "LoadFromDb() -> Fehlgeschlagen");
		}

		delete creature;
	}
	while(result->NextRow());
}

}

Hier noch nachträglich mein aktueller Quellcode

Wenn ich mich nicht irre müssen Kreaturen neu geladen werden bzw. neu gespawnt werden, damit die neue Fraktion anerkannt wird.

Wär ein versuch Wert aber das löst leider nicht das Problem das beim großteil der ID´s erst garkein NPC Spawn aus der Datenbank geladen wird obwohl zu 100% einer existiert.

[CODE] void JustDied (Unit* killer)
{
if (!(killer->GetGUID() == 6749))
return;

        QueryResult const result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE id = 6749");
        if (result)
        {
            do
            {
                uint32 guid = (*result)[0].GetUInt32();

                Creature* creature = new Creature();

                if (creature->LoadFromDB(guid, killer->GetMap()))
                {
                    TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Creature: GUID: %u", creature->GetGUID());
                    creature->setFaction(85);
                    creature->Respawn(true);
                }
                else
                    TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "LoadFromDb() -> Fehlgeschlagen");

                delete creature;
    		      } while ((*result).NextRow());
        }
    }[/CODE]

Weil mich der Codestyle genervt hat… Ist jetzt nicht viel abgeändert, aber müsste klappen. Teste mal. Sag, was das Resultat ist.

Erstmal danke für die Antworten hat aber leider nicht geklappt.

Hab mir nochmal ein paar Gedanken gemacht und ein bisschen durch den Trinitycore Code gestöbert und bin drauf gekommen das es schwachsinnig ist die NPCs aus der Datenbank zu laden da sie ja bereits gespawnt sind und somit auch schon geladen wurden.

Hab mir mal eine Funktion geschrieben die sich bis jetzt mal funktioniert.

Creature* LoadCreature(uint32 guid)
{
	Creature* creature = NULL;

	if(const CreatureData* creatureData = sObjectMgr->GetCreatureData(guid))
	{
		creature = HashMapHolder<Creature>::Find(MAKE_NEW_GUID(guid, creatureData->id, HIGHGUID_UNIT));
	}

	return creature;
}