aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp62
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp53
-rw-r--r--src/server/game/Globals/ObjectMgr.h17
3 files changed, 78 insertions, 54 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 4d0968dde76..ef6f2dc147e 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -434,8 +434,6 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
m_items[i] = nullptr;
- Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
-
ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
if (!cEntry)
{
@@ -451,8 +449,28 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
return false;
}
- SetMap(sMapMgr->CreateMap(info->mapId, this));
+ PlayerInfo::CreatePosition const& position = createInfo->UseNPE && info->createPositionNPE ? info->createPositionNPE.get() : info->createPosition;
+
m_createTime = GameTime::GetGameTime();
+ m_createMode = createInfo->UseNPE && info->createPositionNPE ? PlayerCreateMode::NPE : PlayerCreateMode::Normal;
+
+ Relocate(position.Loc);
+
+ SetMap(sMapMgr->CreateMap(position.Loc.GetMapId(), this));
+
+ if (position.TransportGuid)
+ {
+ if (Transport* transport = HashMapHolder<Transport>::Find(ObjectGuid::Create<HighGuid::Transport>(*position.TransportGuid)))
+ {
+ transport->AddPassenger(this);
+ m_movementInfo.transport.pos.Relocate(position.Loc);
+ float x, y, z, o;
+ position.Loc.GetPosition(x, y, z, o);
+ transport->CalculatePassengerPosition(x, y, z, &o);
+ Relocate(x, y, z, o);
+ }
+ }
+
UpdatePositionData();
// set initial homebind position
@@ -20288,11 +20306,15 @@ bool Player::_LoadHomeBind(PreparedQueryResult result)
if (!ok && HasAtLoginFlag(AT_LOGIN_FIRST))
{
- m_homebindMapId = info->mapId;
- m_homebindAreaId = info->areaId;
- m_homebindX = info->positionX;
- m_homebindY = info->positionY;
- m_homebindZ = info->positionZ;
+ PlayerInfo::CreatePosition const& createPosition = m_createMode == PlayerCreateMode::NPE && info->createPositionNPE ? info->createPositionNPE.get() : info->createPosition;
+
+ m_homebindMapId = createPosition.Loc.GetMapId();
+ createPosition.Loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
+ if (createPosition.TransportGuid)
+ if (Transport* transport = HashMapHolder<Transport>::Find(ObjectGuid::Create<HighGuid::Transport>(*createPosition.TransportGuid)))
+ transport->CalculatePassengerPosition(m_homebindX, m_homebindY, m_homebindZ);
+
+ m_homebindAreaId = sMapMgr->GetAreaId(PhasingHandler::GetEmptyPhaseShift(), m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ);
saveHomebindToDb();
ok = true;
@@ -22886,29 +22908,15 @@ void Player::InitDataForForm(bool reapplyMods)
void Player::InitDisplayIds()
{
- PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
- if (!info)
+ ChrModelEntry const* model = sDB2Manager.GetChrModel(getRace(), GetNativeSex());
+ if (!model)
{
- TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has incorrect race/class pair. Can't init display ids.", GetName().c_str(), GetGUID().ToString().c_str());
+ TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has incorrect race/gender pair. Can't init display ids.", GetName().c_str(), GetGUID().ToString().c_str());
return;
}
- Gender gender = GetNativeSex();
- switch (gender)
- {
- case GENDER_FEMALE:
- SetDisplayId(info->displayId_f);
- SetNativeDisplayId(info->displayId_f);
- break;
- case GENDER_MALE:
- SetDisplayId(info->displayId_m);
- SetNativeDisplayId(info->displayId_m);
- break;
- default:
- TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), uint32(gender));
- break;
- }
-
+ SetDisplayId(model->DisplayID);
+ SetNativeDisplayId(model->DisplayID);
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::StateAnimID), sDB2Manager.GetEmptyAnimStateID());
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index dffae64da64..bbbe298a932 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -58,6 +58,7 @@
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "Timer.h"
+#include "TransportMgr.h"
#include "Vehicle.h"
#include "VMapFactory.h"
#include "World.h"
@@ -3475,8 +3476,8 @@ void ObjectMgr::LoadPlayerInfo()
// Load playercreate
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo");
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12
+ QueryResult result = WorldDatabase.Query("SELECT race, class, map, position_x, position_y, position_z, orientation, npe_map, npe_position_x, npe_position_y, npe_position_z, npe_orientation, npe_transport_guid FROM playercreateinfo");
if (!result)
{
@@ -3494,11 +3495,10 @@ void ObjectMgr::LoadPlayerInfo()
uint32 current_race = fields[0].GetUInt8();
uint32 current_class = fields[1].GetUInt8();
uint32 mapId = fields[2].GetUInt16();
- uint32 areaId = fields[3].GetUInt32(); // zone
- float positionX = fields[4].GetFloat();
- float positionY = fields[5].GetFloat();
- float positionZ = fields[6].GetFloat();
- float orientation = fields[7].GetFloat();
+ float positionX = fields[3].GetFloat();
+ float positionY = fields[4].GetFloat();
+ float positionZ = fields[5].GetFloat();
+ float orientation = fields[6].GetFloat();
if (!sChrRacesStore.LookupEntry(current_race))
{
@@ -3525,29 +3525,44 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- ChrModelEntry const* maleModel = sDB2Manager.GetChrModel(current_race, GENDER_MALE);
- if (!maleModel)
+ if (!sDB2Manager.GetChrModel(current_race, GENDER_MALE))
{
TC_LOG_ERROR("sql.sql", "Missing male model for race %u, ignoring.", current_race);
continue;
}
- ChrModelEntry const* femaleModel = sDB2Manager.GetChrModel(current_race, GENDER_FEMALE);
- if (!femaleModel)
+ if (!sDB2Manager.GetChrModel(current_race, GENDER_FEMALE))
{
TC_LOG_ERROR("sql.sql", "Missing female model for race %u, ignoring.", current_race);
continue;
}
std::unique_ptr<PlayerInfo> info = std::make_unique<PlayerInfo>();
- info->mapId = mapId;
- info->areaId = areaId;
- info->positionX = positionX;
- info->positionY = positionY;
- info->positionZ = positionZ;
- info->orientation = orientation;
- info->displayId_m = maleModel->DisplayID;
- info->displayId_f = femaleModel->DisplayID;
+ info->createPosition.Loc.WorldRelocate(mapId, positionX, positionY, positionZ, orientation);
+
+ if (std::none_of(fields + 7, fields + 12, [](Field const& field) { return field.IsNull(); }))
+ {
+ 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();
+
+ if (!sMapStore.LookupEntry(info->createPositionNPE->Loc.GetMapId()))
+ {
+ TC_LOG_ERROR("sql.sql", "Invalid NPE map id %u for class %u race %u pair in `playercreateinfo` table, ignoring.",
+ info->createPositionNPE->Loc.GetMapId(), current_class, current_race);
+ info->createPositionNPE.reset();
+ }
+
+ if (info->createPositionNPE && info->createPositionNPE->TransportGuid && !sTransportMgr->GetTransportSpawn(*info->createPositionNPE->TransportGuid))
+ {
+ TC_LOG_ERROR("sql.sql", "Invalid NPE transport spawn id " UI64FMTD " for class %u race %u pair in `playercreateinfo` table, ignoring.",
+ *info->createPositionNPE->TransportGuid, current_class, current_race);
+ info->createPositionNPE.reset(); // remove entire NPE data - assume user put transport offsets into npe_position fields
+ }
+ }
+
_playerInfo[current_race][current_class] = std::move(info);
++count;
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 48c1076b91d..4e5eede59ee 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -596,14 +596,15 @@ typedef std::vector<SkillRaceClassInfoEntry const*> PlayerCreateInfoSkills;
// existence checked by displayId != 0
struct PlayerInfo
{
- uint32 mapId = 0;
- uint32 areaId = 0;
- float positionX = 0.0f;
- float positionY = 0.0f;
- float positionZ = 0.0f;
- float orientation = 0.0f;
- uint32 displayId_m = 0;
- uint32 displayId_f = 0;
+ struct CreatePosition
+ {
+ WorldLocation Loc;
+ Optional<ObjectGuid::LowType> TransportGuid;
+ };
+
+ CreatePosition createPosition;
+ Optional<CreatePosition> createPositionNPE;
+
PlayerCreateInfoItems item;
PlayerCreateInfoSpells customSpells;
PlayerCreateInfoSpells castSpells;