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 ); } }
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); }
bool AI_Movement::showWayPoints(Player* pPlayer, bool Backwards) { ASSERT(m_Unit != NULL); if(!m_waypoints) return false; //wpid of 0 == all WayPointMap::const_iterator itr; if(m_WayPointsShowing == true) return false; m_WayPointsShowing = true; WayPoint* wp = NULL; for (itr = m_waypoints->begin(); itr != m_waypoints->end(); itr++) { if( (*itr) != NULL ) { wp = *itr; //Create Creature* pWayPoint = NULLCREATURE; pWayPoint = new Creature((uint64)HIGHGUID_TYPE_WAYPOINT << 32 | wp->id); pWayPoint->Init(); pWayPoint->CreateWayPoint(wp->id, pPlayer->GetMapId(), wp->x, wp->y, wp->z, wp->orientation); pWayPoint->SetUInt32Value(OBJECT_FIELD_ENTRY, 300000); pWayPoint->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5f); bool ModelChange = false; if(!Backwards) { if(wp->forwardInfo) { uint32 DisplayID = (wp->forwardInfo->SkinID == 0) ? m_Unit->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID) : wp->forwardInfo->SkinID; if(DisplayID != m_Unit->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)) ModelChange = true; pWayPoint->SetUInt32Value(UNIT_FIELD_DISPLAYID, DisplayID); pWayPoint->SetUInt32Value(UNIT_NPC_EMOTESTATE, wp->forwardInfo->EmoteID); pWayPoint->SetStandState(wp->forwardInfo->StandState); } } else { if(wp->backwardInfo) { uint32 DisplayID = (wp->backwardInfo->SkinID == 0) ? m_Unit->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID) : wp->backwardInfo->SkinID; if(DisplayID != m_Unit->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)) ModelChange = true; pWayPoint->SetUInt32Value(UNIT_FIELD_DISPLAYID, DisplayID); pWayPoint->SetUInt32Value(UNIT_NPC_EMOTESTATE, wp->backwardInfo->EmoteID); pWayPoint->SetStandState(wp->backwardInfo->StandState); } } if(ModelChange) pWayPoint->EventModelChange(); pWayPoint->SetUInt32Value(UNIT_FIELD_LEVEL, wp->id); pWayPoint->SetUInt32Value(UNIT_NPC_FLAGS, 0); // pWayPoint->SetUInt32Value(UNIT_FIELD_AURA+32, 8326); //invisable & deathworld look pWayPoint->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE , pPlayer->GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE)); pWayPoint->SetUInt32Value(UNIT_FIELD_HEALTH, 1); pWayPoint->SetUInt32Value(UNIT_FIELD_MAXHEALTH, 1); pWayPoint->SetUInt32Value(UNIT_FIELD_STAT0, wp->flags); //Create on client ByteBuffer buf(2500); uint32 count = pWayPoint->BuildCreateUpdateBlockForPlayer(&buf, pPlayer); pPlayer->PushCreationData(&buf, count); //root the object WorldPacket data1; data1.Initialize(SMSG_FORCE_MOVE_ROOT); data1 << pWayPoint->GetNewGUID(); pPlayer->GetSession()->SendPacket( &data1 ); //Cleanup delete pWayPoint; pWayPoint = NULL; } } return true; }