[C++] Script läst sich nicht übersetzen!

Hi!

Ich schreibe gerade den Boss Mar’li in ZulGurub neu und er läst sich fast Fehlerfrei übersetzen. Habe da zwei Fehlermeldungen mit dennen ich nicht schlau werde!

Wäre super wenn mir da einer Weiterhelfen könnte

Script

[SPOILER]

[CODE]

#include “ScriptPCH.h”

#include “zulgurub.h”

// Zauber Definitionen

#define SPELL_AOE 14538 // Fluch = 35% Langsahmer Zaubern 2 Minunten Laufzeit!

#define SPELL_GESPINST 24110 // Kurzer unbeweglichkeits Effekt. Netz!

#define SPELL_SPIDER_FORM 24084 // Spinnen Form

#define SPELL_ENRAGE 54356 // Enrage - 25% dmg + 50% tempo

// Coords der Spinnen spawns

#define CORD_1_X -12320.0732f

#define CORD_1_Y -1584.3980f

#define CORD_1_Z 132.8214f

#define CORD_2_X -12332.8134f

#define CORD_2_Y -1597.2281f

#define CORD_2_Z 132.6992f

#define CORD_3_X -12317.5136f

#define CORD_3_Y -1609.3076f

#define CORD_3_Z 133.3880

// Ansagen

#define SAY_AGGRO -1309005

#define SAY_TRANSFORM -1309006

#define SAY_SPIDER_SPAWN -1309007

#define SAY_DEATH -1309008

// Spider Spells

#define SPELL_SPIDER_LEVELUP 24312 // LevelUp-Effekt und Scale wird vergrößert

// Boss

class Boss_Marli : public CreatureScript

{

public: Boss_Marli() : CreatureScript("Boss_Marli") {}


struct Boss_MarliAI : public ScriptedAI

{

	Boss_MarliAI( Creature *c ) : ScriptedAI(c)

	{

		m_pInstance = c->GetInstanceScript();

	}


	InstanceScript *m_pInstance;


	uint32 Spider_Timer;

	uint32 AOE_Timer;

	uint32 Enrage_Timer;


	bool verwandelt;

	bool rueckverwandelt;


	void Reset()

	{

		Spider_Timer	=	60000;

		AOE_Timer		=	60000;

		Enrage_Timer	=	300000;

		verwandelt		= 	false;


		// Zurück in die normale Gestahlt

		me->SetDisplayId(15220);

		DoResetThreat();

	}


	void EnterCombat( Unit * )

	{

		DoScriptText( SAY_AGGRO, me );

	}


	void JustDied( Unit * )

	{

		DoScriptText( SAY_DEATH, me );

		if (m_pInstance)

			m_pInstance->SetData(TYPE_MARLI, DONE);

	}


	void UpdateAI( const uint32 diff )

	{

		if (!UpdateVictim())

			return;


		if (me->getVictim() && me->isAlive())

		{

			// Leben <= 96% dann hier starten!

			if ( HealthAbovePct(96) )

			{

				// Adds Spawnen 3x

				DoScriptText( SAY_SPIDER_SPAWN, me );

				Creature *spider = NULL;

				spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

				spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

				spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);


				// Leben <= 90% dann hier weiter

				if ( HealthAbovePct(90) )

				{

					// Ist bereits verwandelt? Wenn nicht, verwandeln!

					if ( verwandelt == true )

					{

						if( AOE_Timer <= diff )

						{

							// Gruppe Verfluchen!

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

							AOE_Timer = 120000; // Nach zwei Minuten neu Verfluchen!

						} else AOE_Timer -= diff;


						// Leben <= 60% dann hier weiter

						if ( HealthAbovePct(60) && rueckverwandelt == true )

						{

							// Spinnen rufen

							if ( Spider_Timer <= diff )

							{

								Creature *spider = NULL;

								spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

								spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

								spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

								Spider_Timer = 45000;

							} else Spider_Timer -= diff;


							// Leben <= 10% dann hier weiter

							if ( HealthAbovePct(10) )

							{

								if( Enrage_Timer <= diff )

								{

									DoCast(me, SPELL_ENRAGE);

									Enrage_Timer = 300000; // 5 Minuten

								} else Enrage_Timer -= diff;

							}

						}

						else

						{

							me->SetDisplayId(15220);

							DoResetThreat();

							rueckverwandelt = true;

						}

					}

					else

					{

						// Nein, wurde noch nicht verwandelt. Verwandeln!

						DoScriptText( SAY_TRANSFORM, me );

						me->SetDisplayId(SPELL_SPIDER_FORM);

						DoResetThreat();

						verwandelt = true;

					}

				}

			}


			DoMeleeAttackIfReady();

		}

	}


};


CreatureAI* GetAI(Creature* creature) const

{

	return new Boss_MarliAI(creature);

}

};

// Spider

class Spinnen_von_Marli : public CreatureScript

{

public: Spinnen_von_Marli() : CreatureScript("Spinnen_von_Marli") {}


struct Spinnen_von_MarliAI : public ScriptedAI

{

	Spinnen_von_MarliAI(Creature *c) : ScriptedAI(c) {}


	static uint32 Levelup_Step;


	void Reset()

	{

		Levelup_Step = 0;

	}


	void EnterCombat( Unit * ) {}


	void UpdateAI( const uint32 diff )

	{

		if(!UpdateVictim())

			return;


		if( HealthAbovePct(67) )

		{

			if( Levelup_Step <= 0 )

			{

				const CreatureInfo *cinfo = me->GetCreatureInfo();

				DoCast(me, SPELL_SPIDER_LEVELUP);

				me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 5)));

                                    me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 5)));

                                    me->UpdateDamagePhysical(BASE_ATTACK);

				Levelup_Step = 1;

			}


			if( HealthAbovePct(34) )

			{

				if( Levelup_Step == 1 )

				{

					const CreatureInfo* cinfo = me->GetCreatureInfo();

					DoCast(me, SPELL_SPIDER_LEVELUP);

					me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 10)));

					me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 10)));

					me->UpdateDamagePhysical(BASE_ATTACK);

					Levelup_Step = 2;

				}

			}

		}


		DoMeleeAttackIfReady();

	}

};


CreatureAI* GetAI(Creature* creature) const

{

	return new Spinnen_von_MarliAI(creature);

}

};

void AddSC_Boss_Marli()

{

new Boss_Marli();

new Spinnen_von_Marli();

}

[/CODE][/SPOILER]

Compiler Error


/home/trinity/source/335a/23-06-2011/TrinityCore/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp: In member function ‘virtual void Spinnen_von_Marli::Spinnen_von_MarliAI::UpdateAI(uint32)’:

/home/trinity/source/335a/23-06-2011/TrinityCore/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp:187: error: ‘CreatureInfo’ was not declared in this scope

/home/trinity/source/335a/23-06-2011/TrinityCore/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp:187: error: ‘cinfo’ was not declared in this scope

/home/trinity/source/335a/23-06-2011/TrinityCore/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp:199: error: expected initializer before ‘*’ token

/home/trinity/source/335a/23-06-2011/TrinityCore/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp:201: error: ‘cinfo’ was not declared in this scope

make[2]: *** [src/server/scripts/CMakeFiles/scripts.dir/EasternKingdoms/ZulGurub/boss_marli.cpp.o] Error 1

make[1]: *** [src/server/scripts/CMakeFiles/scripts.dir/all] Error 2

Möchte gerne den normalen Waffenschaden in zwei Schritten erhöhen! Aber leider läst sich die CreatureInfo nicht deklarieren /emoticons/default_sad.png

Liebe Grüße

Yellow

probiere mal:

-const CreatureInfo *cinfo = me->GetCreatureInfo();

+const CreatureTemplate* cinfo = me->GetCreatureInfo();

Danke Vincent, das war wohl der Fehler :wink:

Rein informationshalber:

habe mir mal deinen Codesnipped angesehen und mir kam doch ein paar Fragen/Fehler auf:

Ich rede von diesem Bereich:

[SPOILER]

[CODE] void UpdateAI( const uint32 diff )

            {

                    if (!UpdateVictim())

                            return;


                    if (me->getVictim() && me->isAlive())

                    {

                            // Leben <= 96% dann hier starten!

                            if ( HealthAbovePct(96) )

                            {

                                    // Adds Spawnen 3x

                                    DoScriptText( SAY_SPIDER_SPAWN, me );

                                    Creature *spider = NULL;

                                    spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

                                    spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

                                    spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);


                                    // Leben <= 90% dann hier weiter

                                    if ( HealthAbovePct(90) )

                                    {

                                            // Ist bereits verwandelt? Wenn nicht, verwandeln!

                                            if ( verwandelt == true )

                                            {

                                                    if( AOE_Timer <= diff )

                                                    {

                                                            // Gruppe Verfluchen!

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

                                                            AOE_Timer = 120000; // Nach zwei Minuten neu Verfluchen!

                                                    } else AOE_Timer -= diff;


                                                    // Leben <= 60% dann hier weiter

                                                    if ( HealthAbovePct(60) && rueckverwandelt == true )

                                                    {

                                                            // Spinnen rufen

                                                            if ( Spider_Timer <= diff )

                                                            {

                                                                    Creature *spider = NULL;

                                                                    spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

                                                                    spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

                                                                    spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);

                                                                    Spider_Timer = 45000;

                                                            } else Spider_Timer -= diff;


                                                            // Leben <= 10% dann hier weiter

                                                            if ( HealthAbovePct(10) )

                                                            {

                                                                    if( Enrage_Timer <= diff )

                                                                    {

                                                                            DoCast(me, SPELL_ENRAGE);

                                                                            Enrage_Timer = 300000; // 5 Minuten

                                                                    } else Enrage_Timer -= diff;

                                                            }

                                                    }

                                                    else

                                                    {

                                                            me->SetDisplayId(15220);

                                                            DoResetThreat();

                                                            rueckverwandelt = true;

                                                    }

                                            }

                                            else

                                            {

                                                    // Nein, wurde noch nicht verwandelt. Verwandeln!

                                                    DoScriptText( SAY_TRANSFORM, me );

                                                    me->SetDisplayId(SPELL_SPIDER_FORM);

                                                    DoResetThreat();

                                                    verwandelt = true;

                                            }

                                    }

                            }


                            DoMeleeAttackIfReady();

                    }

            }


    };

[/CODE][/SPOILER]

Du benutzt:

[CODE] // Leben <= 96% dann hier starten!

                            if ( HealthAbovePct(96) )[/CODE]

aber "Leben <= 96% ist nicht “Health>>Above<<Pct”, was übersetzt “Leben>>über<<prozent” heißt.

Somit werden deine anderen Bedingungen (bspw.):

[CODE] // Leben <= 90% dann hier weiter

                                    if ( HealthAbovePct(90) )[/CODE]

nie erreicht, wenn das Leben “<= 96%” ist…

Da du aber eine weitere Bedingung setzt, welche einspringen soll, wenn das Leben “unter” 90% sinkt, du jedoch schon eine Bedingung für 96% gestellt hast, kann die “90%-Bedingung” garnicht mehr erfüllt werden (Und die anderen natürlich auch nicht).

Das ganze sollte eher so aussehen:

[CODE]if (HealthBelowPct(97))

{

//Das Leben ist 96% oder geringer.


if(HealthBelowPct(91))

{

    //Das Leben ist 90% oder geringer

}

}

…[/CODE]

So habe ich es jedenfalls deinen Kommentaren entnommen.

Wenn ich falsch liege, dann habe ich deine Kommentare wohl falsch verstanden /emoticons/default_smile.png

Nur so nebenbei, man kann auch mit diesen beiden Sachen “Ranges” bauen:

[CODE]

if (HealthAbovePct(49) && HealthBelowPct(81))

{

//Das Leben ist zwischen 50% und 80%

}[/CODE]

PS: Hoffentlich habe ich mich jetzt nicht verzettelt. Ganz schön verwirrend /emoticons/default_wink.png

Hi Eltarion… das ist mir heute morgen mit dem HealthAbovePct() und Below aufgefallen^^. Script ist eh fürn PoPo gewesen^^

Habe es komplett nochmal neu und siehe da es läuf wie ein Deutscher A-Klasse Motor /emoticons/default_biggrin.png

Aber danke für deine Mühen /emoticons/default_wink.png

Fals es interessieren sollte wie es derzeit aussieht, hier der aktuelle Status


#include "ScriptPCH.h"

#include "zulgurub.h"


// Zauber Definitionen

#define SPELL_AOE			14538			// Fluch = 35% Langsahmer Zaubern 2 Minunten Laufzeit!

#define SPELL_GESPINST		24110			// Kurzer unbeweglichkeits Effekt. Netz!

#define SPELL_SPIDER_FORM	16462			// Spinnen Form

#define SPELL_DEFAULT_FORM	15220			// Standart Aussehen!

#define SPELL_ENRAGE		54356			// Enrage - 25% dmg + 50% tempo


// Coords der Spinnen spawns

#define CORD_1_X		-12320.0732f

#define CORD_1_Y		-1584.3980f

#define CORD_1_Z		 132.8214f


#define CORD_2_X		-12332.8134f

#define CORD_2_Y		-1597.2281f

#define CORD_2_Z		 132.6992f


#define CORD_3_X		-12317.5136f

#define CORD_3_Y		-1609.3076f

#define CORD_3_Z		 133.3880


// Ansagen

#define SAY_AGGRO				-1309005

#define SAY_TRANSFORM           -1309006

#define SAY_SPIDER_SPAWN        -1309007

#define SAY_DEATH               -1309008


// Spider Spells

#define SPELL_LEVELUP	24312			// LevelUp-Effekt und Scale wird vergrößert


// Boss

class Boss_Marli : public CreatureScript

{

	public: Boss_Marli() : CreatureScript("Boss_Marli") {}


	struct Boss_MarliAI : public ScriptedAI

	{

		Boss_MarliAI( Creature *c ) : ScriptedAI(c)

		{

			m_pInstance = c->GetInstanceScript();

		}


		InstanceScript *m_pInstance;


		// Timer

		uint32 StartSpinnenSpawn_Timer;

		uint32 SpinnenSpawn_Timer;

		uint32 AOE_Timer;

		uint32 Gespinst_Timer;

		uint32 Enrage_Timer;

		// andere Variablen

		uint32 Phase;

		uint32 BackForm;


		void Reset()

		{

			// Gruppe Scheitert, zurück auf Postion (+Werte)

			StartSpinnenSpawn_Timer		=		 5000;

			SpinnenSpawn_Timer			=		45000;

			AOE_Timer					=	     5000;

			Gespinst_Timer				=		30000;

			Enrage_Timer				=		 1000;


			Phase		=	0;			// 0 = Phase 1

			BackForm	=	0;

			me->SetDisplayId( SPELL_DEFAULT_FORM );

		}


		void EnterCombat( Unit * /*who*/ )

		{

			DoScriptText( SAY_AGGRO , me );		// Kampf Einleitungstext mit Sound!

		}


		void JustDied( Unit * )

		{

			DoScriptText( SAY_DEATH, me );								// Boss down - Text mit Sound!

			if(m_pInstance) m_pInstance->SetData(TYPE_MARLI, DONE);		// ID Setzen - Boss Marli down (DONE)

		}


		void UpdateAI( const uint32 diff )

		{

			if(!UpdateVictim())

				return;				// Gibt es kein Ziel anzugreifen? Dann raus aus der Funktion!


			if( HealthBelowPct(96) )

			{

				// Ist das Leben des Bosses -> unter 96% <- dann hier weiter!

				if( StartSpinnenSpawn_Timer <= diff && Phase == 0)

				{

					// Erste Zeit aus Reset() dann die unten neu deklarierte Zeit.

					DoScriptText( SAY_SPIDER_SPAWN , me);

					Unit *pTarget = NULL;


					Creature *spider;

					spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);	// Spinne 1

					pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true );

					spider->AI()->AttackStart(pTarget);


					spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); // Spinne 2

					pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true );

					spider->AI()->AttackStart(pTarget);


					spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); // Spinne 3

					pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true );

					spider->AI()->AttackStart(pTarget);


					StartSpinnenSpawn_Timer = 60000;

					Phase = 1; // Phasen Übergang einleiten!

				} else StartSpinnenSpawn_Timer -= diff;


				if( HealthBelowPct(90) && Phase >= 0 )

				{

					// Leben unter 90% und die Variable Phase nicht 0 oder kleiner, dann!

					if( Phase >= 2 )

					{

						// Wenn verwandelt wurde, dann hier weiter

						if( AOE_Timer <= diff && Phase == 2 )

						{

							// FLUCH

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

							AOE_Timer = 60000;

							Phase = 3;	// Da hier gecastet, nun Phase 3 einleiten

						} else AOE_Timer -= diff;


						if( Gespinst_Timer <= diff && Phase == 2 )

						{

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

							Gespinst_Timer = 30000; // 30 Sekunden

						} else Gespinst_Timer -= diff;


						if( HealthBelowPct(60) && Phase >= 3 )

						{

							// Leben unter 60% und Phase 3

							if( SpinnenSpawn_Timer <= diff && Phase == 3 )

							{

								// Nur solange Spinnen spawnen wie der Boss in Phase 3 ist.

								DoScriptText( SAY_SPIDER_SPAWN , me);

								Unit *pTarget = NULL;

								Creature *spider;

								spider = me->SummonCreature( 15041, CORD_1_X, CORD_1_Y, CORD_1_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);	// Spinne 1

								pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);

								spider->AI()->AttackStart(pTarget);


								spider = me->SummonCreature( 15041, CORD_2_X, CORD_2_Y, CORD_2_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); // Spinne 2

								pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);

								spider->AI()->AttackStart(pTarget);


								spider = me->SummonCreature( 15041, CORD_3_X, CORD_3_Y, CORD_3_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); // Spinne 3

								pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);

								spider->AI()->AttackStart(pTarget);


								SpinnenSpawn_Timer = 35000;

							} else SpinnenSpawn_Timer -= diff;


							if( BackForm == 0 )

							{

								// Zurückverwandelt? Nein! Dann hier

								me->SetDisplayId( SPELL_DEFAULT_FORM );


								const CreatureTemplate *cinfo = me->GetCreatureInfo();

								me->SetBaseWeaponDamage( BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 10)) );

								me->SetBaseWeaponDamage( BASE_ATTACK, MINDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 10)) );

								me->UpdateDamagePhysical( BASE_ATTACK );


								BackForm = 1;

							}


							if( HealthBelowPct(10) )

							{

								// Ist das Leben unter 10% angelangt, dann sollen keine Spinnen mehr spawnen

								Phase = 4;


								if( Enrage_Timer <= diff )

								{

									DoCast( me, SPELL_ENRAGE );

									Enrage_Timer = 300000; // 5 Minuten

								} else Enrage_Timer -= diff;


							}

						}

					}

					else

					{

						// Noch nicht verwandelt

						DoScriptText( SAY_TRANSFORM, me );

						me->SetDisplayId( SPELL_SPIDER_FORM );

						DoResetThreat(); // Aggro Reset? (NOCH ERTESTEN!)


						// Schaden des Bosses erhöhen.

						const CreatureTemplate *cinfo = me->GetCreatureInfo();

						me->SetBaseWeaponDamage( BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 5)) );

						me->SetBaseWeaponDamage( BASE_ATTACK, MINDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 5)) );

						me->UpdateDamagePhysical( BASE_ATTACK );


						Phase = 2; // Phase 2

					}

				}


			}


			DoMeleeAttackIfReady();

		}


	};


	CreatureAI* GetAI( Creature* creature ) const

	{

		return new Boss_MarliAI( creature );

	}

};


void AddSC_Boss_Marli()

{

	new Boss_Marli();

}