Beispiel #1
0
void GameEventMgr::ScriptedBackToOrig(uint32 event_id)
{
	GameEventScriptMap::iterator event_backup = m_GameEventScriptBackup.find(event_id);
	if( event_backup == m_GameEventScriptBackup.end() )
		return;

	set<EventScript*>::iterator itr = event_backup->second.begin();
	for( itr; itr != event_backup->second.end(); itr++ )
	{
		uint32 mapid = (*itr)->mapid;
		uint32 sql_id = (*itr)->sql_id;
		uint8 type = (*itr)->type;
		uint32 data1 = (*itr)->data_1;
		uint32 data2 = (*itr)->data_2;
		uint32 data3 = (*itr)->data_3;

		MapMgr * mapmgr = sInstanceMgr.GetMapMgr( mapid );
		if( mapmgr == NULL )
			return;

		Creature *c;
		GameObject *go;
		if(type < GAMEOBJECT_CHANGE_STATE)
		{
			c = mapmgr->GetSqlIdCreature( sql_id );
			if( c == NULL ) return;
		}
		else
		{
			go = mapmgr->GetSqlIdGameObject( sql_id );
			if( go == NULL ) return;
		}

		switch( type )
		{
			case CREATURE_CHANGE_SCRIPTED_CHANGE:
			{
				CALL_SCRIPT_EVENT(c, GameEventFinish)(event_id);
			} break;
			case CREATURE_CHANGE_EMOTE:
			{
				c->Emote(EmoteType(data1));
				c->SetEmoteState(data2);
				c->SetStandState(static_cast<uint8>(data3));
			} break;

			case CREATURE_CHANGE_DISPLAYID:
			{
				c->SetDisplayId(data1);
				c->SetNativeDisplayId(data2);
				c->SetMount(data3);

				c->EventModelChange();
			} break;

			case CREATURE_CHANGE_WEAPON:
			{
				c->SetEquippedItem(MELEE, data1);
				c->SetEquippedItem(OFFHAND, data2);
				c->SetEquippedItem(RANGED, data3);
			} break;

			case CREATURE_CHANGE_REACT:
			{
				c->SetFaction(data1);
				c->SetUInt32Value(UNIT_NPC_FLAGS, data2);
				c->SetUInt32Value(UNIT_FIELD_FLAGS, data3);
			} break;

			case CREATURE_CAST_SPELL_ON_EVENT_STOP:
			{
				SpellEntry * sp = dbcSpell.LookupEntryForced( data1 );
				if( sp == NULL )
					return;

				SpellCastTime * casttime = dbcSpellCastTime.LookupEntry(sp->CastingTimeIndex);
				Spell * spell = sSpellFactoryMgr.NewSpell(c, sp, false, NULL);

				SpellCastTargets t(0);

				// force self casting
				if( data2 )
				{
					t.m_unitTarget = c->GetGUID();
				}
				else
				{
					spell->GenerateTargets(&t);
					spell->m_targets = t;
				}

				if (objmgr.IsSpellDisabled(spell->GetProto()->Id) || spell->CanCast(false) != SPELL_CANCAST_OK || !spell->HasPower() || c->m_silenced || c->IsStunned() || c->IsFeared() )
				{
					delete spell;
					return;
				}

				if( casttime->CastTime > 0 )
					c->GetAIInterface()->StopMovement(casttime->CastTime);

				spell->prepare(&t);

			} break;

			case CREATURE_CHANGE_UPDATE_FIELD:
			{
				c->SetUInt32Value(data1, data2);
			} break;

			case GAMEOBJECT_CHANGE_STATE:
			{
				go->SetState((uint8)data1);
			} break;
		}
	}

	m_GameEventScriptBackup.erase(event_id);
}
Beispiel #2
0
void GameEventMgr::DoScript(uint32 event_id, uint32 sql_id, uint8 type, uint32 data1, uint32 data2, uint32 data3, char * say, uint32 mapid)
{
	MapMgr * mapmgr = sInstanceMgr.GetMapMgr( mapid );
	if( mapmgr == NULL )
		return;

	Creature *c;
	GameObject *go;
	if(type < GAMEOBJECT_CHANGE_STATE)
	{
		c = mapmgr->GetSqlIdCreature( sql_id );
		if( c == NULL ) return;
	}
	else
	{
		go = mapmgr->GetSqlIdGameObject( sql_id );
		if( go == NULL ) return;
	}

	// create backup for original values
	EventScript * es = new EventScript();
	es->sql_id = sql_id;
	es->mapid = mapid;
	es->type = type;
	es->data_1 = 0; // null them out first!
	es->data_2 = 0;
	es->data_3 = 0;

	if( c && strlen(say) )
	{
		c->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, say);
	}

	switch( type )
	{
		case CREATURE_CHANGE_SCRIPTED_CHANGE:
		{
			CALL_SCRIPT_EVENT(c, GameEventStart)(event_id);
		} break;
		case CREATURE_CHANGE_EMOTE:
		{
			// do not backup one-shoot emote
			c->Emote(EmoteType(data1));

			// backup emote state first
			es->data_2 = c->GetEmoteState();
			c->SetEmoteState(data2);

			// backup stand state
			es->data_3 = static_cast<uint32>(c->GetStandState());
			c->SetStandState(static_cast<uint8>(data3));
		} break;

		case CREATURE_CHANGE_DISPLAYID:
		{
			es->data_1 = c->GetDisplayId();
			c->SetDisplayId(data1);
			es->data_2 = c->GetNativeDisplayId();
			c->SetNativeDisplayId(data2);
			es->data_3 = c->GetMount();
			c->SetMount(data3);

			c->EventModelChange();
		} break;

		case CREATURE_CHANGE_WEAPON:
		{
			es->data_1 = c->GetEquippedItem(MELEE);
			es->data_2 = c->GetEquippedItem(OFFHAND);
			es->data_3 = c->GetEquippedItem(RANGED);
			c->SetEquippedItem(MELEE, data1);
			c->SetEquippedItem(OFFHAND, data2);
			c->SetEquippedItem(RANGED, data3);
		} break;

		case CREATURE_CHANGE_REACT:
		{
			es->data_1 = c->GetFaction();
			c->SetFaction(data1);
			es->data_2 = c->GetUInt32Value(UNIT_NPC_FLAGS);
			c->SetUInt32Value(UNIT_NPC_FLAGS, data2);
			es->data_3 = c->GetUInt32Value(UNIT_FIELD_FLAGS);
			c->SetUInt32Value(UNIT_FIELD_FLAGS, data3);
		} break;

		case CREATURE_CAST_SPELL_ON_EVENT_START:
		{
			SpellEntry * sp = dbcSpell.LookupEntryForced( data1 );
			if( sp == NULL )
				return;

			SpellCastTime * casttime = dbcSpellCastTime.LookupEntry(sp->CastingTimeIndex);
			Spell * spell = sSpellFactoryMgr.NewSpell(c, sp, false, NULL);

			SpellCastTargets t(0);

			// force self casting
			if( data2 )
			{
				t.m_unitTarget = c->GetGUID();
			}
			else
			{
				spell->GenerateTargets(&t);
				spell->m_targets = t;
			}

			if (objmgr.IsSpellDisabled(spell->GetProto()->Id) || spell->CanCast(false) != SPELL_CANCAST_OK || !spell->HasPower() || c->m_silenced || c->IsStunned() || c->IsFeared() )
			{
				delete spell;
				return;
			}

			if( casttime->CastTime > 0 )
				c->GetAIInterface()->StopMovement(casttime->CastTime);

			spell->prepare(&t);

		} break;

		case CREATURE_CAST_SPELL_ON_EVENT_STOP:
		{
			// this time just backup it, we will procez it on event end
			es->data_1 = data1;
			es->data_2 = data2;
		} break;

		case CREATURE_CHANGE_UPDATE_FIELD:
		{
			es->data_1 = data1;
			es->data_2 = c->GetUInt32Value(data1);
			c->SetUInt32Value(data1, data2);
		} break;

		case CREATURE_CHANGE_DESPAWN:
		{
			GameEventMap::iterator itr = CheckAndReturnEvent( event_id );
			if( itr == m_GameEventMap.end() )
				return;

			uint32 current_time = mktime(&g_localTime);
			// this is calculated in seconds and added 1 extra second as timer for spawn and despawn
			uint32 respawntime = itr->second->end_time - current_time + 1;
			// values here are in miliseconds
			c->Despawn(0, respawntime*1000);
			delete es;
			return;
		} break;

		case GAMEOBJECT_CHANGE_STATE:
		{
			es->data_1 = (uint32)go->GetState();
			go->SetState((uint8)data1);
		} break;
	}

	// insert event into storage
	GameEventScriptMap::iterator itr = m_GameEventScriptBackup.find(event_id);
	if( itr == m_GameEventScriptBackup.end() )
	{
		set< EventScript* > s;
		s.insert( es );
		m_GameEventScriptBackup.insert(make_pair(event_id, s));
	}
	else
	{
		itr->second.insert( es );
	}
}