Core/Misc: Use new Field::Get*OrNull where possible

This commit is contained in:
Shauren
2025-06-24 16:11:11 +02:00
parent d89ebc125c
commit 39c06d40e2
7 changed files with 137 additions and 211 deletions

View File

@@ -222,10 +222,10 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
createProperties.AnimKitId = fields[10].GetInt32();
createProperties.DecalPropertiesId = fields[11].GetUInt32();
createProperties.SpellForVisuals = fields[12].GetInt32OrNull();
if (!fields[12].IsNull())
if (createProperties.SpellForVisuals)
{
createProperties.SpellForVisuals = fields[12].GetInt32();
if (!sSpellMgr->GetSpellInfo(*createProperties.SpellForVisuals, DIFFICULTY_NONE))
{
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid SpellForVisual {}, set to none.", createPropertiesId.Id, uint32(createPropertiesId.IsCustom), *createProperties.SpellForVisuals);

View File

@@ -449,14 +449,14 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
if (!fields[31].IsNull())
creatureTemplate.Movement.HoverInitiallyEnabled = fields[31].GetBool();
if (!fields[32].IsNull())
creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(fields[32].GetUInt8());
if (Optional<uint8> chaseMovementType = fields[32].GetUInt8OrNull())
creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(*chaseMovementType);
if (!fields[33].IsNull())
creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(fields[33].GetUInt8());
if (Optional<uint8> randomMovementType = fields[33].GetUInt8OrNull())
creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(*randomMovementType);
if (!fields[34].IsNull())
creatureTemplate.Movement.InteractionPauseTimer = fields[34].GetUInt32();
if (Optional<uint32> interactionPauseTimer = fields[34].GetUInt32OrNull())
creatureTemplate.Movement.InteractionPauseTimer = *interactionPauseTimer;
creatureTemplate.ModExperience = fields[35].GetFloat();
creatureTemplate.RacialLeader = fields[36].GetBool();
@@ -684,44 +684,35 @@ void ObjectMgr::LoadCreatureSummonedData()
}
CreatureSummonedData& summonedData = _creatureSummonedDataStore[creatureId];
summonedData.CreatureIDVisibleToSummoner = fields[1].GetUInt32OrNull();
summonedData.GroundMountDisplayID = fields[2].GetUInt32OrNull();
summonedData.FlyingMountDisplayID = fields[3].GetUInt32OrNull();
if (!fields[1].IsNull())
if (summonedData.CreatureIDVisibleToSummoner && !GetCreatureTemplate(*summonedData.CreatureIDVisibleToSummoner))
{
summonedData.CreatureIDVisibleToSummoner = fields[1].GetUInt32();
if (!GetCreatureTemplate(*summonedData.CreatureIDVisibleToSummoner))
{
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing creature {} in CreatureIDVisibleToSummoner for creature {}, set to 0",
*summonedData.CreatureIDVisibleToSummoner, creatureId);
summonedData.CreatureIDVisibleToSummoner.reset();
}
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing creature {} in CreatureIDVisibleToSummoner for creature {}, set to 0",
*summonedData.CreatureIDVisibleToSummoner, creatureId);
summonedData.CreatureIDVisibleToSummoner.reset();
}
if (!fields[2].IsNull())
if (summonedData.GroundMountDisplayID && !sCreatureDisplayInfoStore.LookupEntry(*summonedData.GroundMountDisplayID))
{
summonedData.GroundMountDisplayID = fields[2].GetUInt32();
if (!sCreatureDisplayInfoStore.LookupEntry(*summonedData.GroundMountDisplayID))
{
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing display id {} in GroundMountDisplayID for creature {}, set to 0",
*summonedData.GroundMountDisplayID, creatureId);
summonedData.CreatureIDVisibleToSummoner.reset();
}
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing display id {} in GroundMountDisplayID for creature {}, set to 0",
*summonedData.GroundMountDisplayID, creatureId);
summonedData.CreatureIDVisibleToSummoner.reset();
}
if (!fields[3].IsNull())
if (summonedData.FlyingMountDisplayID && !sCreatureDisplayInfoStore.LookupEntry(*summonedData.FlyingMountDisplayID))
{
summonedData.FlyingMountDisplayID = fields[3].GetUInt32();
if (!sCreatureDisplayInfoStore.LookupEntry(*summonedData.FlyingMountDisplayID))
{
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing display id {} in FlyingMountDisplayID for creature {}, set to 0",
*summonedData.FlyingMountDisplayID, creatureId);
summonedData.GroundMountDisplayID.reset();
}
TC_LOG_ERROR("sql.sql", "Table `creature_summoned_data` references non-existing display id {} in FlyingMountDisplayID for creature {}, set to 0",
*summonedData.FlyingMountDisplayID, creatureId);
summonedData.GroundMountDisplayID.reset();
}
if (!fields[4].IsNull())
if (Optional<std::string_view> despawnOnQuestsRemoved = fields[4].GetStringViewOrNull())
{
std::vector<uint32> questList;
for (std::string_view questStr : Trinity::Tokenize(fields[4].GetStringView(), ',', false))
summonedData.DespawnOnQuestsRemoved.emplace();
for (std::string_view questStr : Trinity::Tokenize(*despawnOnQuestsRemoved, ',', false))
{
Optional<uint32> questId = Trinity::StringTo<uint32>(questStr);
if (!questId)
@@ -735,11 +726,11 @@ void ObjectMgr::LoadCreatureSummonedData()
continue;
}
questList.push_back(*questId);
summonedData.DespawnOnQuestsRemoved->push_back(*questId);
}
if (!questList.empty())
summonedData.DespawnOnQuestsRemoved = std::move(questList);
if (summonedData.DespawnOnQuestsRemoved->empty())
summonedData.DespawnOnQuestsRemoved.reset();
}
} while (result->NextRow());
@@ -1582,12 +1573,12 @@ void ObjectMgr::LoadCreatureMovementOverrides()
CreatureMovementData& movement = _creatureMovementOverrides[spawnId];
if (!fields[1].IsNull())
movement.HoverInitiallyEnabled = fields[1].GetBool();
if (!fields[2].IsNull())
movement.Chase = static_cast<CreatureChaseMovementType>(fields[2].GetUInt8());
if (!fields[3].IsNull())
movement.Random = static_cast<CreatureRandomMovementType>(fields[3].GetUInt8());
if (!fields[4].IsNull())
movement.InteractionPauseTimer = fields[4].GetUInt32();
if (Optional<uint8> chaseMovementType = fields[2].GetUInt8OrNull())
movement.Chase = static_cast<CreatureChaseMovementType>(*chaseMovementType);
if (Optional<uint8> randomMovementType = fields[3].GetUInt8OrNull())
movement.Random = static_cast<CreatureRandomMovementType>(*randomMovementType);
if (Optional<uint32> interactionPauseTimer = fields[4].GetUInt32OrNull())
movement.InteractionPauseTimer = *interactionPauseTimer;
CheckCreatureMovement("creature_movement_override", spawnId, movement);
}
@@ -2185,14 +2176,10 @@ void ObjectMgr::LoadCreatures()
data.spawnDifficulties = ParseSpawnDifficulties(fields[14].GetStringView(), "creature", guid, data.mapId, spawnMasks[data.mapId]);
int16 gameEvent = fields[15].GetInt8();
data.poolId = fields[16].GetUInt32();
if (!fields[17].IsNull())
data.npcflag = fields[17].GetUInt64();
if (!fields[18].IsNull())
data.unit_flags = fields[18].GetUInt32();
if (!fields[19].IsNull())
data.unit_flags2 = fields[19].GetUInt32();
if (!fields[20].IsNull())
data.unit_flags3 = fields[20].GetUInt32();
data.npcflag = fields[17].GetUInt64OrNull();
data.unit_flags = fields[18].GetUInt32OrNull();
data.unit_flags2 = fields[19].GetUInt32OrNull();
data.unit_flags3 = fields[20].GetUInt32OrNull();
data.phaseUseFlags = fields[21].GetUInt8();
data.phaseId = fields[22].GetUInt32();
data.phaseGroup = fields[23].GetUInt32();
@@ -3484,17 +3471,12 @@ void ObjectMgr::LoadVehicleTemplateAccessories()
bool isMinion = fields[3].GetBool();
uint8 summonType = fields[4].GetUInt8();
uint32 summonTimer = fields[5].GetUInt32();
Optional<uint32> rideSpellId = fields[6].GetUInt32OrNull();
Optional<uint32> rideSpellId;
if (!fields[6].IsNull())
if (rideSpellId && !sSpellMgr->GetSpellInfo(*rideSpellId, DIFFICULTY_NONE))
{
rideSpellId = fields[6].GetUInt32();
if (!sSpellMgr->GetSpellInfo(*rideSpellId, DIFFICULTY_NONE))
{
TC_LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: rideSpellId {} does not exist for entry {}.", *rideSpellId, entry);
continue;
}
TC_LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: rideSpellId {} does not exist for entry {}.", *rideSpellId, entry);
continue;
}
if (!GetCreatureTemplate(entry))
@@ -3560,22 +3542,20 @@ void ObjectMgr::LoadVehicleTemplate()
VehicleTemplate& vehicleTemplate = _vehicleTemplateStore[creatureId];
vehicleTemplate.DespawnDelay = Milliseconds(fields[1].GetInt32());
vehicleTemplate.Pitch = fields[2].GetFloatOrNull();
if (!fields[2].IsNull())
if (vehicleTemplate.Pitch)
{
VehicleEntry const* vehicle = sVehicleStore.LookupEntry(creatureInfo->VehicleId);
if (!vehicle)
continue;
float pitch = fields[2].GetFloat();
if (pitch < vehicle->PitchMin || pitch > vehicle->PitchMax)
if (VehicleEntry const* vehicle = sVehicleStore.LookupEntry(creatureInfo->VehicleId))
{
TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Creature (Entry: {}) has invalid Pitch ({}).`. Ignoring",
creatureId, pitch);
continue;
if (*vehicleTemplate.Pitch < vehicle->PitchMin || *vehicleTemplate.Pitch > vehicle->PitchMax)
{
TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Creature (Entry: {}) has invalid Pitch ({}).`. Ignoring",
creatureId, *vehicleTemplate.Pitch);
vehicleTemplate.Pitch.reset();
}
}
vehicleTemplate.Pitch = pitch;
}
} while (result->NextRow());
@@ -3609,17 +3589,12 @@ void ObjectMgr::LoadVehicleAccessories()
bool bMinion = fields[3].GetBool();
uint8 uiSummonType = fields[4].GetUInt8();
uint32 uiSummonTimer= fields[5].GetUInt32();
Optional<uint32> rideSpellId = fields[6].GetUInt32OrNull();
Optional<uint32> rideSpellId;
if (!fields[6].IsNull())
if (rideSpellId && !sSpellMgr->GetSpellInfo(*rideSpellId, DIFFICULTY_NONE))
{
rideSpellId = fields[6].GetUInt32();
if (!sSpellMgr->GetSpellInfo(*rideSpellId, DIFFICULTY_NONE))
{
TC_LOG_ERROR("sql.sql", "Table `vehicle_accessory`: rideSpellId {} does not exist for guid {}.", *rideSpellId, uiGUID);
continue;
}
TC_LOG_ERROR("sql.sql", "Table `vehicle_accessory`: rideSpellId {} does not exist for guid {}.", *rideSpellId, uiGUID);
continue;
}
if (!GetCreatureTemplate(uiAccessory))
@@ -3893,8 +3868,7 @@ void ObjectMgr::LoadPlayerInfo()
info->createPositionNPE.emplace();
info->createPositionNPE->Loc.WorldRelocate(fields[7].GetUInt32(), fields[8].GetFloat(), fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat());
if (!fields[12].IsNull())
info->createPositionNPE->TransportGuid = fields[12].GetUInt64();
info->createPositionNPE->TransportGuid = fields[12].GetUInt64OrNull();
if (!sMapStore.LookupEntry(info->createPositionNPE->Loc.GetMapId()))
{
@@ -3911,34 +3885,28 @@ void ObjectMgr::LoadPlayerInfo()
}
}
if (!fields[13].IsNull())
info->introMovieId = fields[13].GetUInt32OrNull();
if (info->introMovieId && !sMovieStore.LookupEntry(*info->introMovieId))
{
uint32 introMovieId = fields[13].GetUInt32();
if (sMovieStore.LookupEntry(introMovieId))
info->introMovieId = introMovieId;
else
TC_LOG_ERROR("sql.sql", "Invalid intro movie id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
introMovieId, current_class, current_race);
TC_LOG_ERROR("sql.sql", "Invalid intro movie id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
*info->introMovieId, current_class, current_race);
info->introMovieId.reset();
}
if (!fields[14].IsNull())
info->introSceneId = fields[14].GetUInt32OrNull();
if (info->introSceneId && !GetSceneTemplate(*info->introSceneId))
{
uint32 introSceneId = fields[14].GetUInt32();
if (GetSceneTemplate(introSceneId))
info->introSceneId = introSceneId;
else
TC_LOG_ERROR("sql.sql", "Invalid intro scene id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
introSceneId, current_class, current_race);
TC_LOG_ERROR("sql.sql", "Invalid intro scene id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
*info->introSceneId, current_class, current_race);
info->introSceneId.reset();
}
if (!fields[15].IsNull())
info->introSceneIdNPE = fields[15].GetUInt32OrNull();
if (info->introSceneIdNPE && !GetSceneTemplate(*info->introSceneIdNPE))
{
uint32 introSceneId = fields[15].GetUInt32();
if (GetSceneTemplate(introSceneId))
info->introSceneIdNPE = introSceneId;
else
TC_LOG_ERROR("sql.sql", "Invalid NPE intro scene id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
introSceneId, current_class, current_race);
TC_LOG_ERROR("sql.sql", "Invalid NPE intro scene id {} for class {} race {} pair in `playercreateinfo` table, ignoring.",
*info->introSceneIdNPE, current_class, current_race);
info->introSceneIdNPE.reset();
}
_playerInfo[{ Races(current_race), Classes(current_class) }] = std::move(info);
@@ -7117,16 +7085,11 @@ void ObjectMgr::LoadWorldSafeLocs()
continue;
}
Optional<ObjectGuid::LowType> transportSpawnId = {};
if (!fields[6].IsNull())
Optional<ObjectGuid::LowType> transportSpawnId = fields[6].GetUInt64OrNull();
if (transportSpawnId && !sTransportMgr->GetTransportSpawn(*transportSpawnId))
{
if (!sTransportMgr->GetTransportSpawn(fields[6].GetUInt64()))
{
TC_LOG_ERROR("sql.sql", "World location (ID: {}) has a invalid transportSpawnID {}, skipped.", id, fields[6].GetUInt64());
continue;
}
transportSpawnId = fields[6].GetUInt64();
TC_LOG_ERROR("sql.sql", "World location (ID: {}) has a invalid transportSpawnID {}, skipped.", id, *transportSpawnId);
continue;
}
WorldSafeLocsEntry& worldSafeLocs = _worldSafeLocs[id];
@@ -9747,18 +9710,13 @@ void ObjectMgr::LoadGossipMenuItems()
gMenuItem.Flags = GossipOptionFlags(fields[7].GetInt32());
gMenuItem.ActionMenuID = fields[8].GetUInt32();
gMenuItem.ActionPoiID = fields[9].GetUInt32();
if (!fields[10].IsNull())
gMenuItem.GossipNpcOptionID = fields[10].GetInt32();
gMenuItem.GossipNpcOptionID = fields[10].GetInt32OrNull();
gMenuItem.BoxCoded = fields[11].GetBool();
gMenuItem.BoxMoney = fields[12].GetUInt64();
gMenuItem.BoxText = fields[13].GetString();
gMenuItem.BoxBroadcastTextID = fields[14].GetUInt32();
if (!fields[15].IsNull())
gMenuItem.SpellID = fields[15].GetInt32();
if (!fields[16].IsNull())
gMenuItem.OverrideIconID = fields[16].GetInt32();
gMenuItem.SpellID = fields[15].GetInt32OrNull();
gMenuItem.OverrideIconID = fields[16].GetInt32OrNull();
if (gMenuItem.OptionNpc >= GossipOptionNpc::Count)
{
@@ -11191,10 +11149,7 @@ void ObjectMgr::LoadPlayerChoices()
choice.KeepOpenAfterChoice = fields.KeepOpenAfterChoice().GetBool();
choice.ShowChoicesAsList = fields.ShowChoicesAsList().GetBool();
choice.ForceDontShowChoicesAsList = fields.ForceDontShowChoicesAsList().GetBool();
if (!fields.MaxResponses().IsNull())
choice.MaxResponses = fields.MaxResponses().GetUInt32();
choice.MaxResponses = fields.MaxResponses().GetUInt32OrNull();
choice.ScriptId = GetScriptId(fields.ScriptName().GetString());
} while (choices->NextRow());
@@ -11236,8 +11191,7 @@ void ObjectMgr::LoadPlayerChoices()
response.ButtonTooltip = fields.ButtonTooltip().GetStringView();
response.Description = fields.Description().GetStringView();
response.Confirmation = fields.Confirmation().GetStringView();
if (!fields.RewardQuestID().IsNull())
response.RewardQuestID = fields.RewardQuestID().GetUInt32();
response.RewardQuestID = fields.RewardQuestID().GetUInt32OrNull();
++responseCount;
@@ -11517,8 +11471,7 @@ void ObjectMgr::LoadPlayerChoices()
PlayerChoiceResponseMawPower& mawPower = responseItr->MawPower.emplace();
mawPower.TypeArtFileID = fields.TypeArtFileID().GetInt32();
if (!fields.Rarity().IsNull())
mawPower.Rarity = fields.Rarity().GetInt32();
mawPower.Rarity = fields.Rarity().GetInt32OrNull();
mawPower.SpellID = fields.SpellID().GetInt32();
mawPower.MaxStacks = fields.MaxStacks().GetInt32();
@@ -11993,46 +11946,36 @@ void ObjectMgr::LoadSpawnTrackingStates()
SpawnTrackingStateData& spawnTrackingStateData = const_cast<SpawnMetadata*>(data)->spawnTrackingStates[AsUnderlyingType(state)];
spawnTrackingStateData.Visible = fields[3].GetBool();
spawnTrackingStateData.StateSpellVisualId = fields[4].GetUInt32OrNull();
spawnTrackingStateData.StateAnimId = fields[5].GetUInt16OrNull();
spawnTrackingStateData.StateAnimKitId = fields[6].GetUInt16OrNull();
if (!fields[4].IsNull())
if (spawnTrackingStateData.StateSpellVisualId && !sSpellVisualStore.HasRecord(*spawnTrackingStateData.StateSpellVisualId))
{
spawnTrackingStateData.StateSpellVisualId = fields[4].GetUInt32();
if (!sSpellVisualStore.HasRecord(*spawnTrackingStateData.StateSpellVisualId))
{
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateSpellVisualId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateSpellVisualId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateSpellVisualId.reset();
}
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateSpellVisualId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateSpellVisualId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateSpellVisualId.reset();
}
if (!fields[5].IsNull())
if (spawnTrackingStateData.StateAnimId && *spawnTrackingStateData.StateAnimId != sDB2Manager.GetEmptyAnimStateID() && !sAnimationDataStore.HasRecord(*spawnTrackingStateData.StateAnimId))
{
spawnTrackingStateData.StateAnimId = fields[5].GetUInt16();
if (*spawnTrackingStateData.StateAnimId != sDB2Manager.GetEmptyAnimStateID() && !sAnimationDataStore.HasRecord(*spawnTrackingStateData.StateAnimId))
{
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateAnimId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateAnimId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateAnimId.reset();
}
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateAnimId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateAnimId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateAnimId.reset();
}
if (!fields[6].IsNull())
if (spawnTrackingStateData.StateAnimKitId && !sAnimKitStore.HasRecord(*spawnTrackingStateData.StateAnimKitId))
{
spawnTrackingStateData.StateAnimKitId = fields[6].GetUInt16();
if (!sAnimKitStore.HasRecord(*spawnTrackingStateData.StateAnimKitId))
{
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateAnimKitId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateAnimKitId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateAnimKitId.reset();
}
TC_LOG_ERROR("sql.sql", "Table `spawn_tracking_state` references invalid StateAnimKitId {} for spawn ({},{}), set to none.",
*spawnTrackingStateData.StateAnimKitId, uint32(spawnType), spawnId);
spawnTrackingStateData.StateAnimKitId.reset();
}
if (!fields[7].IsNull())
if (Optional<std::string_view> worldEffectsStr = fields[7].GetStringViewOrNull())
{
std::vector<uint32> worldEffectList;
for (std::string_view worldEffectsStr : Trinity::Tokenize(fields[7].GetStringView(), ',', false))
for (std::string_view worldEffectStr : Trinity::Tokenize(*worldEffectsStr, ',', false))
{
Optional<uint32> worldEffectId = Trinity::StringTo<uint32>(worldEffectsStr);
Optional<uint32> worldEffectId = Trinity::StringTo<uint32>(worldEffectStr);
if (!worldEffectId)
continue;
@@ -12043,11 +11986,8 @@ void ObjectMgr::LoadSpawnTrackingStates()
continue;
}
worldEffectList.push_back(*worldEffectId);
spawnTrackingStateData.StateWorldEffects.push_back(*worldEffectId);
}
if (!worldEffectList.empty())
spawnTrackingStateData.StateWorldEffects = std::move(worldEffectList);
}
++count;
@@ -12078,9 +12018,9 @@ void ObjectMgr::LoadJumpChargeParams()
float speed = fields[1].GetFloat();
bool treatSpeedAsMoveTimeSeconds = fields[2].GetBool();
float jumpGravity = fields[3].GetFloat();
Optional<int32> spellVisualId;
Optional<int32> progressCurveId;
Optional<int32> parabolicCurveId;
Optional<int32> spellVisualId = fields[4].GetInt32OrNull();
Optional<int32> progressCurveId = fields[5].GetInt32OrNull();
Optional<int32> parabolicCurveId = fields[6].GetInt32OrNull();
if (speed <= 0.0f)
{
@@ -12096,31 +12036,25 @@ void ObjectMgr::LoadJumpChargeParams()
jumpGravity = Movement::gravity;
}
if (!fields[4].IsNull())
if (spellVisualId && !sSpellVisualStore.LookupEntry(*spellVisualId))
{
if (sSpellVisualStore.LookupEntry(fields[4].GetInt32()))
spellVisualId = fields[4].GetInt32();
else
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing SpellVisual: {} for id {}, ignored.",
fields[4].GetInt32(), id);
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing SpellVisual: {} for id {}, ignored.",
*spellVisualId, id);
spellVisualId.reset();
}
if (!fields[5].IsNull())
if (progressCurveId && !sCurveStore.LookupEntry(*progressCurveId))
{
if (sCurveStore.LookupEntry(fields[5].GetInt32()))
progressCurveId = fields[5].GetInt32();
else
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing progress Curve: {} for id {}, ignored.",
fields[4].GetInt32(), id);
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing progress Curve: {} for id {}, ignored.",
*progressCurveId, id);
progressCurveId.reset();
}
if (!fields[6].IsNull())
if (parabolicCurveId && !sCurveStore.LookupEntry(*parabolicCurveId))
{
if (sCurveStore.LookupEntry(fields[6].GetInt32()))
parabolicCurveId = fields[6].GetInt32();
else
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing parabolic Curve: {} for id {}, ignored.",
fields[6].GetInt32(), id);
TC_LOG_ERROR("sql.sql", "Table `jump_charge_params` references non-existing parabolic Curve: {} for id {}, ignored.",
*parabolicCurveId, id);
parabolicCurveId.reset();
}
JumpChargeParams& params = _jumpChargeParams[id];

View File

@@ -2156,7 +2156,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa
Field* fields = result->Fetch();
uint16 atLoginFlags = fields[0].GetUInt16();
std::string knownTitlesStr = fields[1].GetString();
uint32 groupId = !fields[2].IsNull() ? fields[2].GetUInt32() : 0;
uint32 groupId = fields[2].GetUInt32();
uint16 usedLoginFlag = (factionChangeInfo->FactionChange ? AT_LOGIN_CHANGE_FACTION : AT_LOGIN_CHANGE_RACE);
if (!(atLoginFlags & usedLoginFlag))

View File

@@ -100,13 +100,12 @@ void WaypointMgr::LoadPathFromDB(Field* fields)
path.Id = pathId;
path.Flags = WaypointPathFlags(fields[2].GetUInt8());
path.Velocity = fields[3].GetFloatOrNull();
if (!fields[3].IsNull())
if (path.Velocity && *path.Velocity <= 0.0f)
{
if (fields[3].GetFloat() > 0.0f)
path.Velocity = fields[3].GetFloat();
else
TC_LOG_ERROR("sql.sql", "PathId {} in `waypoint_path` has invalid velocity {}, using default velocity instead", pathId, fields[3].GetFloat());
TC_LOG_ERROR("sql.sql", "PathId {} in `waypoint_path` has invalid velocity {}, using default velocity instead", pathId, *path.Velocity);
path.Velocity.reset();
}
path.Nodes.clear();
@@ -126,9 +125,7 @@ void WaypointMgr::LoadPathNodesFromDB(Field* fields)
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
Optional<float> o;
if (!fields[5].IsNull())
o = fields[5].GetFloat();
Optional<float> o = fields[5].GetFloatOrNull();
Optional<Milliseconds> delay;
if (uint32 delayMs = fields[6].GetUInt32())

View File

@@ -286,16 +286,11 @@ void Quest::LoadQuestObjective(Field* fields)
if (hasCompletionEffect)
{
obj.CompletionEffect = new QuestObjectiveAction();
if (!fields[10].IsNull())
obj.CompletionEffect->GameEventId = fields[10].GetUInt32();
if (!fields[11].IsNull())
obj.CompletionEffect->SpellId = fields[11].GetUInt32();
if (!fields[12].IsNull())
obj.CompletionEffect->ConversationId = fields[12].GetUInt32();
if (!fields[13].IsNull())
obj.CompletionEffect->UpdatePhaseShift = fields[13].GetBool();
if (!fields[14].IsNull())
obj.CompletionEffect->UpdateZoneAuras = fields[14].GetBool();
obj.CompletionEffect->GameEventId = fields[10].GetUInt32OrNull();
obj.CompletionEffect->SpellId = fields[11].GetUInt32OrNull();
obj.CompletionEffect->ConversationId = fields[12].GetUInt32OrNull();
obj.CompletionEffect->UpdatePhaseShift = fields[13].GetBool();
obj.CompletionEffect->UpdateZoneAuras = fields[14].GetBool();
}
_usedQuestObjectiveTypes[obj.Type] = true;

View File

@@ -1206,8 +1206,8 @@ void SpellMgr::LoadSpellTargetPositions()
}
SpellEffectInfo const& spellEffectInfo = spellInfo->GetEffect(effIndex);
if (!fields[7].IsNull())
st.SetOrientation(fields[7].GetFloat());
if (Optional<float> orientiation = fields[7].GetFloatOrNull())
st.SetOrientation(*orientiation);
else
{
// target facing is in degrees for 6484 & 9268...

View File

@@ -124,16 +124,16 @@ void RealmList::UpdateRealms()
for (std::size_t i = 0; i < 4; ++i)
{
if (fields[2 + i].IsNull())
continue;
for (boost::asio::ip::tcp::endpoint const& endpoint : _resolver->ResolveAll(fields[2 + i].GetStringView(), ""))
if (Optional<std::string_view> addressStr = fields[2 + i].GetStringViewOrNull())
{
boost::asio::ip::address address = endpoint.address();
if (advstd::ranges::contains(addresses, address))
continue;
for (boost::asio::ip::tcp::endpoint const& endpoint : _resolver->ResolveAll(*addressStr, ""))
{
boost::asio::ip::address address = endpoint.address();
if (advstd::ranges::contains(addresses, address))
continue;
addresses.push_back(std::move(address));
addresses.push_back(std::move(address));
}
}
}