void MOTransport::Start() { DETAIL_FILTER_LOG(LOG_FILTER_TRANSPORT_MOVES, "Transport::StartMovement %s (%s) start moves, period %u/%u", GetObjectGuid().GetString().c_str(), GetName(), m_pathTime, GetPeriod() ); SetActiveObjectState(true); SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); SetGoState(GO_STATE_ACTIVE); SetLootState(GO_ACTIVATED); }
void Transport::Update(uint32 /*update_diff*/, uint32 /*p_time*/) { if (m_WayPoints.size() <= 1) { return; } m_timer = WorldTimer::getMSTime() % m_period; while (((m_timer - m_curr->first) % m_pathTime) > ((m_next->first - m_curr->first) % m_pathTime)) { MoveToNextWayPoint(); // first check help in case client-server transport coordinates de-synchronization if (m_curr->second.mapid != GetMapId() || m_curr->second.teleport) { TeleportTransport(m_curr->second.mapid, m_curr->second.x, m_curr->second.y, m_curr->second.z); } else { Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z); } /* for(PlayerSet::const_iterator itr = m_passengers.begin(); itr != m_passengers.end();) { PlayerSet::const_iterator it2 = itr; ++itr; //(*it2)->SetPosition( m_curr->second.x + (*it2)->GetTransOffsetX(), m_curr->second.y + (*it2)->GetTransOffsetY(), m_curr->second.z + (*it2)->GetTransOffsetZ(), (*it2)->GetTransOffsetO() ); } */ m_nextNodeTime = m_curr->first; if (m_curr == m_WayPoints.begin()) { DETAIL_FILTER_LOG(LOG_FILTER_TRANSPORT_MOVES, " ************ BEGIN ************** %s", GetName()); } DETAIL_FILTER_LOG(LOG_FILTER_TRANSPORT_MOVES, "%s moved to %f %f %f %d", GetName(), m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid); } }
// Helper to log recent state void Weather::LogWeatherState(WeatherState state) const { char const* wthstr; switch (state) { case WEATHER_STATE_LIGHT_RAIN: wthstr = "light rain"; break; case WEATHER_STATE_MEDIUM_RAIN: wthstr = "medium rain"; break; case WEATHER_STATE_HEAVY_RAIN: wthstr = "heavy rain"; break; case WEATHER_STATE_LIGHT_SNOW: wthstr = "light snow"; break; case WEATHER_STATE_MEDIUM_SNOW: wthstr = "medium snow"; break; case WEATHER_STATE_HEAVY_SNOW: wthstr = "heavy snow"; break; case WEATHER_STATE_LIGHT_SANDSTORM: wthstr = "light sandstorm"; break; case WEATHER_STATE_MEDIUM_SANDSTORM: wthstr = "medium sandstorm"; break; case WEATHER_STATE_HEAVY_SANDSTORM: wthstr = "heavy sandstorm"; break; case WEATHER_STATE_THUNDERS: wthstr = "thunders"; break; case WEATHER_STATE_BLACKRAIN: wthstr = "black rain"; break; case WEATHER_STATE_FINE: default: wthstr = "fine"; break; } DETAIL_FILTER_LOG(LOG_FILTER_WEATHER, "Change the weather of zone %u (type %u, grade %f) to state %s.", m_zone, m_type, m_grade, wthstr); }
//-----------------------------------------------// void WaypointMovementGenerator<Creature>::LoadPath(Creature& creature) { DETAIL_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "LoadPath: loading waypoint path for %s", creature.GetGuidStr().c_str()); i_path = sWaypointMgr.GetDefaultPath(creature.GetEntry(), creature.GetGUIDLow()); // No movement found for entry nor guid if (!i_path) { sLog.outErrorDb("WaypointMovementGenerator::LoadPath: %s doesn't have waypoint path", creature.GetGuidStr().c_str()); return; } if (i_path->empty()) return; // Initialize the i_currentNode to point to the first node i_currentNode = i_path->begin()->first; m_lastReachedWaypoint = 0; }
//-----------------------------------------------// void WaypointMovementGenerator<Creature>::LoadPath(Creature &creature) { DETAIL_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "LoadPath: loading waypoint path for creature %u, %u", creature.GetGUIDLow(), creature.GetDBTableGUIDLow()); i_path = sWaypointMgr.GetPath(creature.GetDBTableGUIDLow()); // We may LoadPath() for several occasions: // 1: When creature.MovementType=2 // 1a) Path is selected by creature.guid == creature_movement.id // 1b) Path for 1a) does not exist and then use path from creature.GetEntry() == creature_movement_template.entry // 2: When creature_template.MovementType=2 // 2a) Creature is summoned and has creature_template.MovementType=2 // Creators need to be sure that creature_movement_template is always valid for summons. // Mob that can be summoned anywhere should not have creature_movement_template for example. // No movement found for guid if (!i_path) { i_path = sWaypointMgr.GetPathTemplate(creature.GetEntry()); // No movement found for entry if (!i_path) { sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u) doesn't have waypoint path", creature.GetName(), creature.GetEntry(), creature.GetDBTableGUIDLow()); return; } } // We have to set the destination here (for the first point), right after Initialize. Without, we may not have valid xyz for GetResetPosition CreatureTraveller traveller(creature); if (creature.canFly()) creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7); const WaypointNode &node = i_path->at(i_currentNode); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); }
//-----------------------------------------------// void WaypointMovementGenerator<Creature>::LoadPath(Creature& creature) { DETAIL_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "LoadPath: loading waypoint path for %s", creature.GetGuidStr().c_str()); i_path = sWaypointMgr.GetPath(creature.GetGUIDLow()); // We may LoadPath() for several occasions: // 1: When creature.MovementType=2 // 1a) Path is selected by creature.guid == creature_movement.id // 1b) Path for 1a) does not exist and then use path from creature.GetEntry() == creature_movement_template.entry // 2: When creature_template.MovementType=2 // 2a) Creature is summoned and has creature_template.MovementType=2 // Creators need to be sure that creature_movement_template is always valid for summons. // Mob that can be summoned anywhere should not have creature_movement_template for example. // No movement found for guid if (!i_path) { i_path = sWaypointMgr.GetPathTemplate(creature.GetEntry()); // No movement found for entry if (!i_path) { sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u) doesn't have waypoint path", creature.GetName(), creature.GetEntry(), creature.GetGUIDLow()); return; } } // Initialize the i_currentNode to point to the first node if (i_path->empty()) return; i_currentNode = i_path->begin()->first; m_lastReachedWaypoint = 0; }
/// Send the new weather to all players in the zone bool Weather::UpdateWeather() { ///- Send the weather packet to all players in this zone if (m_grade >= 1) m_grade = 0.9999f; else if (m_grade < 0) m_grade = 0.0001f; WeatherState state = GetWeatherState(); WorldPacket data(SMSG_WEATHER, (4 + 4 + 1)); data << uint32(state); data << float(m_grade); data << uint8(0); //- Returns false if there were no players found to update if (!sWorld.SendZoneMessage(m_zone, &data)) return false; ///- Log the event char const* wthstr; switch (state) { case WEATHER_STATE_LIGHT_RAIN: wthstr = "light rain"; break; case WEATHER_STATE_MEDIUM_RAIN: wthstr = "medium rain"; break; case WEATHER_STATE_HEAVY_RAIN: wthstr = "heavy rain"; break; case WEATHER_STATE_LIGHT_SNOW: wthstr = "light snow"; break; case WEATHER_STATE_MEDIUM_SNOW: wthstr = "medium snow"; break; case WEATHER_STATE_HEAVY_SNOW: wthstr = "heavy snow"; break; case WEATHER_STATE_LIGHT_SANDSTORM: wthstr = "light sandstorm"; break; case WEATHER_STATE_MEDIUM_SANDSTORM: wthstr = "medium sandstorm"; break; case WEATHER_STATE_HEAVY_SANDSTORM: wthstr = "heavy sandstorm"; break; case WEATHER_STATE_THUNDERS: wthstr = "thunders"; break; case WEATHER_STATE_BLACKRAIN: wthstr = "blackrain"; break; case WEATHER_STATE_FINE: default: wthstr = "fine"; break; } DETAIL_FILTER_LOG(LOG_FILTER_WEATHER, "Change the weather of zone %u to %s.", m_zone, wthstr); return true; }
/// Send the new weather to all players in the zone bool Weather::UpdateWeather() { Player* player = sWorld.FindPlayerInZone(m_zone); if (!player) { return false; } ///- Send the weather packet to all players in this zone uint32 sound = GetSound(); if (m_grade >= 1) { m_grade = 0.9999f; } else if (m_grade < 0) { m_grade = 0.0001f; } WorldPacket data(SMSG_WEATHER, (4 + 4 + 4)); data << (uint32)m_type << (float)m_grade << (uint32)sound; player->SendMessageToSet(&data, true); ///- Log the event char const* wthstr; switch (sound) { case WEATHER_RAINLIGHT: wthstr = "light rain"; break; case WEATHER_RAINMEDIUM: wthstr = "medium rain"; break; case WEATHER_RAINHEAVY: wthstr = "heavy rain"; break; case WEATHER_SNOWLIGHT: wthstr = "light snow"; break; case WEATHER_SNOWMEDIUM: wthstr = "medium snow"; break; case WEATHER_SNOWHEAVY: wthstr = "heavy snow"; break; case WEATHER_SANDSTORMLIGHT: wthstr = "light sandstorm"; break; case WEATHER_SANDSTORMMEDIUM: wthstr = "medium sandstorm"; break; case WEATHER_SANDSTORMHEAVY: wthstr = "heavy sandstorm"; break; case WEATHER_NOSOUND: default: wthstr = "fine"; break; } DETAIL_FILTER_LOG(LOG_FILTER_WEATHER, "Change the weather of zone %u to %s.", m_zone, wthstr); sEluna->OnChange(this, (WeatherState)m_type, m_grade); return true; }