Boss Add - Target Vorgeben

sodele moin an alle

ich hab da so nen problem einem npc, der npc soll nach dem spawnen einen target angreiffen das mindest in 10 meter abstand steht, sprich einen caster wenn möglich, und wenn kein caster in dem abstand vorhanden ist soll er halt einen melee nehmen.

der rot makierte teil ist der wo net ganz will wie ich will. sprich er soll sich target suchen eun dann einfach nur melee angriffe machen mehr nicht und zwischendrin einen cast auf sich selbst. der cast geht nur das target nicht. sprich wenn das add gespawnt wird macht es gar nichts es bekomm net mal aggro von einem und wenn man es angreiftt das es aggro bekommt dann macht es nur den cast sonst nichts.

der rot makierte teil ist eine kopie von einem anderen boss nur das er dort statt attack start docast drin stand, aber ich weiss leider auch nicht mehr welcher boss ^^. aso das talk in der zeile ist nur zum überprüfen ob er ins if reingeht und nein er geht scheinbar nicht rein

der npc wird von einem Boss gespawnt, und der boss steht irgenwo auf der world map, zumindest soll er an jedem ort aufstellbar sein wenn möglich

[CODE]class npc_xyz_add : public CreatureScript

{

	public:

	npc_xyz_add() : CreatureScript("npc_xyz_add") { }


	CreatureAI* GetAI(Creature* pcreature) const

	{

	return new npc_xyz_addAI (pcreature);

	}


	struct npc_xyz_addAI : public BossAI

	{

		npc_xyz_addAI(Creature *creature) : BossAI(creature, npc_xyz_add_id)

		{

		}


		uint32 m_ui_Umhuellung_Timer;


		void Reset()

		{

		m_ui_Umhuellung_Timer = 30000;

		}


		void EnterCombat(Unit* who)

		{

		Talk(SAY_ADD_START);

		DoCast(me->getVictim(), SPELL_UMHUELLUNG);

		DoZoneInCombat();

		}


		void KilledUnit(Unit* pVictim)

		{

		Talk(SAY_ADD_PLAYER_DIE);

		}


		void JustDied(Unit* Killer)

		{

		Talk(SAY_ADD_ADD_DIE);

		}


		void UpdateAI(const uint32 diff)

		{

///////////////////////////////////////////////////////// ab hier ist mein Problem ^^

Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10, true);

				if (!target)

					{

					Talk(s_test);

					target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true);	// noone? select melee

					}

				if (target)

					{

					Talk(s_test2);

					AttackStart(target);

					//DoMeleeAttackIfReady();

				   }

//////////////////////////////////////////////////// bis hier

			// hier kommen noch ein paar spells die aber nichts zur sache tun ^^



		}


	}; //Struct Ende

}; //class Ende[/CODE]

ich hoffe ihr könnt mir helfen, und schonmal danke im vorraus.

edit: da rot makieren ja im code feld nicht geht hab ichs jetzt anderst sichtlich markiert XD

http://www.trinityco…__fromsearch__1

UnitAI.h

[CODE]

enum SelectAggroTarget

{

SELECT_TARGET_RANDOM = 0,							   //Just selects a random target

SELECT_TARGET_TOPAGGRO,								 //Selects targes from top aggro to bottom

SELECT_TARGET_BOTTOMAGGRO,							  //Selects targets from bottom aggro to top

SELECT_TARGET_NEAREST,

SELECT_TARGET_FARTHEST,

};[/CODE]

Ich empfehle dir die UnitAI.h genau anzuschauen. Da ist viel Interessantes!

ja das hatte ich auch gesehen aber genau das will ich net verwenden

SELECT_TARGET_FARTHEST

der befehl hat den nachteil der spieler lkann einen tank ganz hinter die heiler stellen und damit ist das problem gelöst und das will ich nicht. ich will mit dem random das alle dd auf das add müssen. aso als hinweiss das add ist spot immune ^^. sprich ich will das keiner vorraussagen kann auf wenn genau das add geht darum

SELECT_TARGET_RANDOM

ich kann leider auch net sagen wieviele spieler genau beim boss sein werden ich denk mal mindest 10 spieler^^

Soweit ich diese Funktion verstanden habe ist es so das dir auch ein totes Target zurück gegeben werden kann. Musst wohl überprüfen ob das gelieferte Ergebnis auch noch am leben ist, sonst hat das Add nichts zum angreifen! /emoticons/default_smile.png

das problem ist das es gar nichts macht… es bekommt erst aggro wenn ich es angreiff aber das liegt glaub daran das es in einem freien gebiet steht statt in einer ini und dadurch die zoneincombat net geht und selkbst wenn ich denn mob angreiff bekommt er zwar aggro rennt mir auch hinter her macht aber nichts… sprich er geht mir gar nicht ins if rein

weder !target noch target.

keiner ne idee mehr was falsch sein könnte oder ?

Hallo,

DoZoneInCombat()

macht nichts (außer Fehlerlog) falls die Kreature nicht in einer Instanz steht (oder andere Kriterien nicht erfüllt).

Damit hat die Kreatur auch keine Einträge in der Aggroliste, niemanden den man als Ziel mit SelectTarget() auswählen könnte.

Die Distanzangabe in SelectTarget() bezieht sich nicht auf minimale sondern maximale Suchreichweite.

Versuch doch beim Spawn das Ziel über die Aggroliste des Spawnenden festzulegen.

[CODE]if (Creature* creature = me->SummonCreature(…))

creature->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)));

[/CODE]

Das musst du noch an deine Bedürfnisse anpassen (spezielles Ziel auswählen).

In UpdateAI() gehört noch

[CODE]if (!UpdateVictim())

return;[/CODE]
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -10.0f, true);

liefert dir ein target (aus der aggroliste) was mind. 10 meter abstand hat, gibt es keiner spieler der weiter 10 meter entfernt ist, bekommst du einen null pointer

[/CODE]

Der Teil vom Boss wo das Add spawnt

[CODE] if (m_ui_Add_Timer < diff)

        {

            Talk(SAY_ADD_SPAWN);

            TempSummon* summon_xyz_add = me->SummonCreature(npc_hoger_add_id, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 10.0f, TEMPSUMMON_MANUAL_DESPAWN, 900000);

                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, -10.0f, true);

                if (!target)

                    {

                    summon_xyz_add->AI()->Talk(s_test);

                    target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true);    // noone? select melee

                    }

                if (target && target->isAlive())

                    {

                    summon_xyz_add->AI()->Talk(s_test2);

                    summon_xyz_add->AI()->AttackStart(target);

                    }

       	 m_ui_Add_Timer = urand(60000, 120000);

        }

        else m_ui_Add_Timer -= diff;[/CODE]

war das so gemeint dann ille ?


class npc_xyz_add : public CreatureScript

{

        public:

	    npc_xyz_add() : CreatureScript("npc_xyz_add") { }


        CreatureAI* GetAI(Creature* pcreature) const

        {

	    return new npc_xyz_addAI (pcreature);

        }


        struct npc_xyz_addAI : public BossAI

        {

            npc_xyz_addAI(Creature *creature) : BossAI(creature, npc_xyz_add_id)

            {

            }


            void Reset()

            {

            m_ui_Umhuellung_Timer = 30000;

            //me->DespawnOrUnsummon(1000);

            }


            void EnterCombat(Unit* who)

            {

            Talk(SAY_ADD_START);

            DoCast(me->getVictim(), SPELL_UMHUELLUNG);

            }


            void KilledUnit(Unit* pVictim)

            {

            Talk(SAY_ADD_PLAYER_DIE);

            }


            void JustDied(Unit* Killer)

            {

            Talk(SAY_ADD_ADD_DIE);

            }


            void UpdateAI(const uint32 diff)

            {

                if (!UpdateVictim())

                return;


                if (m_ui_Umhuellung_Timer <= diff)

                {

                    DoCast(me->getVictim(), SPELL_UMHUELLUNG);

                    m_ui_Umhuellung_Timer = 30000;

                } else m_ui_Umhuellung_Timer -= diff;


           	 DoMeleeAttackIfReady();


            }


        }; //Struct Ende

}; //class Ende

sodele war das ganze so etwa gemeint ?

Ja, funktionierts denn?

Falls Umhüllung ein Selbstzauber ist, brauchst du kein Ziel angeben, bzw. gibst sich selbst (me) als Ziel an.

umhüllung ist nen selbstzauber ja ^^

Talk(s_test); = test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:35]xyz ADD sagt: test1

[02:43:36]xyz ADD sagt: test1

[02:43:36]xyz ADD sagt: test1

[02:43:36]xyz ADD sagt: test1

[02:43:36]xyz ADD sagt: test1

[02:43:36]xyz ADD sagt: test1

er macht zwar jetzt immerhin was aber er findet immernoch kein target daher seh ich nur noch denn text im milisekunden takt ^^

also denk ich mal er übernimmt immer noch net die aggro liste vom boss

Wo deklarierst du denn die s_test? Poste doch mal dein ganzes Script, so wie es ist. Dann kann man dir auch etwas mehr helfen.


#include "ScriptPCH.h"

#include "ScriptedCreature.h"

enum Spells

{

.......

SPELL_UMHUELLUNG  = 70768, //Lady Todeswisper Add - Umhüllung des Okkulten

};

enum creature_id

{

boss_xyz_id  = 999999,

npc_xyz_add_id = 1000000, // ID des Boss Add

};

uint32 const SummonEntries[1] = {npc_xyz_add_id};

enum Texts

{

// creature_text

.....

s_test = 20, // "Ich habe es geschaft Meister"

s_test2 = 21, // "Ich habe es geschaft Meister"

};

// Timer

.....

uint32 m_ui_Umhuellung_Timer;

uint32 phase1_Timer;

uint32 phase;

class boss_xyz : public CreatureScript

{

  public:

	    boss_xyz() : CreatureScript("boss_xyz") { }

  CreatureAI* GetAI(Creature* creature) const

  {

	    return new boss_xyzAI (creature);

  }

  struct boss_xyzAI : public BossAI

  {

    boss_xyzAI(Creature *creature) : BossAI(creature, boss_xyz_id)

   {

   }


void Reset()

    {

  .....

  m_ui_Add_Timer   = 60000;

  phase1_Timer = 0;

  phase = 0;

    }

void EnterCombat(Unit* who)

{

  Talk(SAY_FIGHT_START);

  DoZoneInCombat();

}

//Ein Player starb, also lass den Boss ihn verhöhnen

void KilledUnit(Unit* pVictim)

{

  switch (urand(0,3))

  {

   case 0: Talk(SAY_PLAYER_DIE0); break;

   case 1: Talk(SAY_PLAYER_DIE1); break;

   case 2: Talk(SAY_PLAYER_DIE2); break;

   case 3: Talk(SAY_PLAYER_DIE3); break;

	    }

    }

void JustDied(Unit* Killer)

{

  Talk(SAY_BOSS_DIE);

}

void UpdateAI(const uint32 diff)

    {

	    //Target

	    if (!UpdateVictim())

		    return;

  if (phase == 0)

  {

   if (phase1_Timer <= diff)

   {

    phase = 1;

   }

   else phase1_Timer -= diff;

  }	   

  if (phase == 1)

  {

   //Spell Reflektion

   if (m_ui_Reflektion_Timer < diff)

	 {

		 DoCast(me, SPELL_REFLEKTION);

	  m_ui_Reflektion_Timer = 45000;

	 }else m_ui_Reflektion_Timer -= diff;

  ...... viele weitere Spells

//ADD Summon

   if (m_ui_Add_Timer < diff)

   {

    Talk(SAY_ADD_SPAWN);

    TempSummon* summon_xyz_add = me->SummonCreature(npc_xyz_add_id, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 10.0f, TEMPSUMMON_MANUAL_DESPAWN, 900000);

	 Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, -10.0f, true);

	 if (!target)

	  {

	  summon_xyz_add->AI()->Talk(s_test);

	  target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true);    // noone? select melee

	  }

	 if (target && target->isAlive())

	  {

	  summon_xyz_add->AI()->Talk(s_test2);

	  summon_xyz_add->AI()->AttackStart(target);

	  }

    //summon_xyz_add_guid = summon_xyz_add->GetGUID();

    m_ui_Add_Timer = urand(60000, 120000);

   }

   else m_ui_Add_Timer -= diff;

  } //Phase 1 Ende

	    DoMeleeAttackIfReady();

    }

}; // struct

}; // class

und danach folgt die class npc_xyz_add genau so wie sie 2 post weiter oben steht. und darunter das void AddSC

die texte sind jeweils für das add und denn boss mit der passenden entry in der creature_text die gehen ja

mein problem ist nur das das add nicht macht was es soll in dem thema target ^^

Warum lässt du das Add nicht einfach direkt bei einem random Target spawnen?

das der caster noch eine chance hat sich zu währen und davon zu laufen da das add nachher spot immune sein wird ^^

Irgendwie hast du das was ille dir geschrieben hatte leicht ignoriert, oder?

??? warum ?

von ihm kamm das ich das target oben beim summon schon vorgeben soll das hab ich gemacht und dann unden den selfcast das ich da kein target vorgeben muss, da es so aber auch geht hab ich es gelassen wie es ist.