bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type) { SetMap(caster->GetMap()); Relocate(pos); if (!IsPositionValid()) { sLog->outError("DynamicObject (spell %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spellId, GetPositionX(), GetPositionY()); return false; } WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetPhaseMask()); SetEntry(spellId); SetFloatValue(OBJECT_FIELD_SCALE_X, 1); SetUInt64Value(DYNAMICOBJECT_CASTER, caster->GetGUID()); // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden // by client for most of the "ground patch" visual effect spells and a few "skyfall" ones like Hurricane. // If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but // precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells // I saw sniffed... SetByteValue(DYNAMICOBJECT_BYTES, 0, type); SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); m_isWorldObject = active; if (active) setActive(true); //must before add to map to be put in world container if (!GetMap()->AddToMap(this)) return false; return true; }
bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, SpellEffectIndex effIndex, float x, float y, float z, int32 duration, float radius, DynamicObjectType type) { WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT); SetMap(caster->GetMap()); Relocate(x, y, z, 0); if (!IsPositionValid()) { sLog.outError("DynamicObject (spell %u eff %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spellId, effIndex, GetPositionX(), GetPositionY()); return false; } SetEntry(spellId); SetObjectScale(DEFAULT_OBJECT_SCALE); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetObjectGuid()); /* Bytes field, so it's really 4 bit fields. These flags are unknown, but we do know that 0x00000001 is set for most. Farsight for example, does not have this flag, instead it has 0x80000002. Flags are set dynamically with some conditions, so one spell may have different flags set, depending on those conditions. The size of the visual may be controlled to some degree with these flags. uint32 bytes = 0x00000000; bytes |= 0x01; bytes |= 0x00 << 8; bytes |= 0x00 << 16; bytes |= 0x00 << 24; */ SetByteValue(DYNAMICOBJECT_BYTES, 0, type); SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetFloatValue(DYNAMICOBJECT_POS_X, x); SetFloatValue(DYNAMICOBJECT_POS_Y, y); SetFloatValue(DYNAMICOBJECT_POS_Z, z); SetUInt32Value(DYNAMICOBJECT_CASTTIME, WorldTimer::getMSTime()); // new 2.4.0 SpellEntry const* spellProto = sSpellStore.LookupEntry(spellId); if (!spellProto) { sLog.outError("DynamicObject (spell %u) not created. Spell not exist!", spellId); return false; } m_aliveDuration = duration; m_radius = radius; m_effIndex = effIndex; m_spellId = spellId; m_positive = IsPositiveEffect(spellProto, m_effIndex); return true; }
bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type) { SetMap(caster->GetMap()); Relocate(pos); if (!IsPositionValid()) { TC_LOG_ERROR("misc", "DynamicObject (spell %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spellId, GetPositionX(), GetPositionY()); return false; } WorldObject::_Create(guidlow, HighGuid::DynamicObject, caster->GetPhaseMask()); SetEntry(spellId); SetObjectScale(1); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden // by client for most of the "ground patch" visual effect spells and a few "skyfall" ones like Hurricane. // If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but // precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells // I saw sniffed... SetByteValue(DYNAMICOBJECT_BYTES, 0, type); SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, GameTime::GetGameTimeMS()); if (IsWorldObject()) setActive(true); //must before add to map to be put in world container Transport* transport = caster->GetTransport(); if (transport) { float x, y, z, o; pos.GetPosition(x, y, z, o); transport->CalculatePassengerOffset(x, y, z, &o); m_movementInfo.transport.pos.Relocate(x, y, z, o); // This object must be added to transport before adding to map for the client to properly display it transport->AddPassenger(this); } if (!GetMap()->AddToMap(this)) { // Returning false will cause the object to be deleted - remove from transport if (transport) transport->RemovePassenger(this); return false; } return true; }
void CPlayer::LeaveBattleGround(BattleGround* bg) { if (bg->isArena()) return; SetByteValue(UNIT_FIELD_BYTES_0, 0, getORace()); setFaction(getOFaction()); InitDisplayIds(); SetFakedPlayers(m_FakedPlayers); SetRecache(); SetUInt32Value(PLAYER_BYTES, getOPlayerBytes()); SetUInt32Value(PLAYER_BYTES_2, getOPlayerBytes2()); }
void CPlayer::JoinBattleGround(BattleGround* bg) { if (bg->isArena()) return; if (!NativeTeam()) { m_FakedPlayers.push_back(GetObjectGuid()); SetByteValue(UNIT_FIELD_BYTES_0, 0, getFRace()); setFaction(getFFaction()); } SetRecache(); FakeDisplayID(); }
void CPlayer::Sometimes() { if (GetRecache()) { RecachePlayersFromList(); RecachePlayersFromBG(); } if (GetFakeOnNextTick()) { SetFakeOnNextTick(false); SetByteValue(UNIT_FIELD_BYTES_0, 0, getFRace()); setFaction(getFFaction()); FakeDisplayID(); SetUInt32Value(PLAYER_BYTES, getFPlayerBytes()); SetUInt32Value(PLAYER_BYTES_2, getFPlayerBytes2()); } }