void DynamicObject::Remove() { if (!IsInWorld()) { delete this; return; } for (std::set< uint64 >::iterator itr = targets.begin(); itr != targets.end(); ++itr) { uint64 TargetGUID = *itr; if (Unit* target = m_mapMgr->GetUnit(TargetGUID)) target->RemoveAura(m_spellProto->Id); } WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); data << GetGUID(); SendMessageToSet(&data, false); if (IsInWorld()) RemoveFromWorld(true); if (u_caster != NULL && m_spellProto->ChannelInterruptFlags != 0) { u_caster->SetChannelSpellTargetGUID(0); u_caster->SetChannelSpellId(0); } delete this; }
void Vehicle::RegeneratePower(Powers power) { uint32 curValue = GetPower(power); uint32 maxValue = GetMaxPower(power); if (curValue >= maxValue) return; float addvalue = 0.0f; // hack: needs more research of power type from the dbc. // It must contains some info about vehicles like Salvaged Chopper. if(m_vehicleInfo->m_powerType == POWER_TYPE_PYRITE) return; addvalue = 10.0; ModifyPower(power, (int32)addvalue); WorldPacket data(SMSG_POWER_UPDATE); data << GetPackGUID(); data << uint8(power); data << uint32(addvalue+curValue); SendMessageToSet(&data, true); }
void Totem::Summon(Unit* owner) { sLog.outDebug("AddObject at Totem.cpp line 49"); SetInstanceId(owner->GetInstanceId()); owner->GetMap()->Add((Creature*)this); // select totem model in dependent from owner team CreatureInfo const *cinfo = GetCreatureInfo(); if(owner->GetTypeId()==TYPEID_PLAYER && cinfo) { uint32 display_id = objmgr.ChooseDisplayId(((Player*)owner)->GetTeam(),cinfo); CreatureModelInfo const *minfo = objmgr.GetCreatureModelRandomGender(display_id); if (minfo) display_id = minfo->modelid; SetDisplayId(display_id); } WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data,true); AIM_Initialize(); switch(m_type) { case TOTEM_PASSIVE: CastSpell(this, GetSpell(), true); break; case TOTEM_STATUE: CastSpell(GetOwner(), GetSpell(), true); break; default: break; } }
void Totem::Summon(Unit* owner) { AIM_Initialize(); owner->GetMap()->Add((Creature*)this); WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetObjectGuid(); SendMessageToSet(&data,true); if (owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->AI()) ((Creature*)owner)->AI()->JustSummoned((Creature*)this); // there are some totems, which exist just for their visual appeareance if (!GetSpell()) return; switch(m_type) { case TOTEM_PASSIVE: CastSpell(this, GetSpell(), true); break; case TOTEM_STATUE: CastSpell(GetOwner(), GetSpell(), true); break; default: break; } }
void Player::SendPlaySpellVisual(uint64 guid, uint32 visualid) { WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); data << uint64(guid); data << uint32(visualid); SendMessageToSet(&data, true, false); }
void Player::SendPartyKillLog( uint64 GUID ){ WorldPacket data( SMSG_PARTYKILLLOG, 16 ); data << GetGUID(); data << GUID; SendMessageToSet( &data, true ); }
void DynamicObject::Delete() { WorldPacket data; data.Initialize(SMSG_GAMEOBJECT_DESPAWN_ANIM); data << GetGUID(); SendMessageToSet(&data,true); data.Initialize(SMSG_DESTROY_OBJECT); data << GetGUID(); SendMessageToSet(&data,true); m_PeriodicDamage = 0; m_PeriodicDamageTick = 0; RemoveFromWorld(); ObjectAccessor::Instance().AddObjectToRemoveList(this); }
void Player::SendNewDrunkState(uint32 state, uint32 itemid) { WorldPacket data(SMSG_CROSSED_INEBRIATION_THRESHOLD, (8 + 4 + 4)); data << GetGUID(); data << uint32(state); data << uint32(itemid); SendMessageToSet(&data, true); }
void GameObject::RemoveFromWorld(bool free_guid) { WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); data << GetGUID(); SendMessageToSet(&data,true); sEventMgr.RemoveEvents(this, EVENT_GAMEOBJECT_TRAP_SEARCH_TARGET); Object::RemoveFromWorld(free_guid); }
void Totem::InitSummon() { WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data, true); if (m_type == TOTEM_PASSIVE) CastSpell(this, GetSpell(), true); }
void Totem::InitSummon() { WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data, true); if (m_type == TOTEM_PASSIVE) for (unsigned long i = 0; i < sizeof(m_spells)/sizeof(m_spells[0]); ++i) CastSpell(this, m_spells[i], true); }
// this one needs to be send inrange... void Player::SendEnvironmentalDamageLog(const uint64 & guid, uint8 type, uint32 damage){ WorldPacket data( SMSG_ENVIRONMENTALDAMAGELOG, 20 ); data << uint64( guid ); data << uint8( type ); data << uint32( damage ); data << uint64( 0 ); SendMessageToSet( &data, true, false ); }
void Totem::InitSummon() { WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data, true); if(m_type == TOTEM_PASSIVE) CastSpell(this, GetSpell(), true); // Some totems can have both instant effect and passive spell if (GetSpell(1)) CastSpell(this, GetSpell(1), true); }
void Totem::Summon() { sLog.outDebug("AddObject at Totem.cpp line 49"); MapManager::Instance().GetMap(GetMapId())->Add((Creature*)this); WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM, 8); data << GetGUID(); SendMessageToSet(&data,true); AIM_Initialize(); if (m_type == TOTEM_PASSIVE) this->CastSpell(this, m_spell, true); }
void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, bool run) { WorldPacket data; data.Initialize( SMSG_MONSTER_MOVE ); data << GetGUID(); data << GetPositionX() << GetPositionY() << GetPositionZ(); data << (uint32)getMSTime(); data << uint8(0); data << uint32(run ? 0x00000100 : 0x00000000); data << time; data << uint32(1); data << x << y << z; WPAssert( data.size() == 49 ); SendMessageToSet( &data, false ); }
void AreaTrigger::InitSplines(std::vector<G3D::Vector3> splinePoints, uint32 timeToTarget) { if (splinePoints.size() < 2) return; _movementTime = 0; _spline = Trinity::make_unique<::Movement::Spline<int32>>(); _spline->init_spline(&splinePoints[0], splinePoints.size(), ::Movement::SplineBase::ModeLinear); _spline->initLengths(); // should be sent in object create packets only m_uint32Values[AREATRIGGER_TIME_TO_TARGET] = timeToTarget; if (IsInWorld()) { if (_reachedDestination) { WorldPackets::AreaTrigger::AreaTriggerRePath reshape; reshape.TriggerGUID = GetGUID(); SendMessageToSet(reshape.Write(), true); } WorldPackets::AreaTrigger::AreaTriggerRePath reshape; reshape.TriggerGUID = GetGUID(); reshape.AreaTriggerSpline = boost::in_place(); reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement(); reshape.AreaTriggerSpline->TimeToTarget = timeToTarget; for (G3D::Vector3 const& vec : splinePoints) reshape.AreaTriggerSpline->Points.emplace_back(vec.x, vec.y, vec.z); SendMessageToSet(reshape.Write(), true); } _reachedDestination = false; }
void Totem::Summon(Unit* owner) { CreatureInfo const *cinfo = GetCreatureInfo(); if (owner->GetTypeId()==TYPEID_PLAYER && cinfo) { uint32 modelid = 0; if(((Player*)owner)->GetTeam() == HORDE) { if(cinfo->Modelid_H1) modelid = cinfo->Modelid_H1; else if(cinfo->Modelid_H2) modelid = cinfo->Modelid_H2; } else { if(cinfo->Modelid_A1) modelid = cinfo->Modelid_A1; else if(cinfo->Modelid_A2) modelid = cinfo->Modelid_A2; } if (modelid) SetDisplayId(modelid); else sLog.outErrorDb("Totem::Summon: Missing modelid information for entry %u, team %u, totem will use default values.",GetEntry(),((Player*)owner)->GetTeam()); } // Only add if a display exists. sLog.outDebug("AddObject at Totem.cpp line 49"); SetInstanceId(owner->GetInstanceId()); owner->GetMap()->Add((Creature*)this); WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data,true); AIM_Initialize(); switch(m_type) { case TOTEM_PASSIVE: CastSpell(this, GetSpell(), true); break; case TOTEM_STATUE: CastSpell(GetOwner(), GetSpell(), true); break; default: break; } if(GetEntry() == SENTRY_TOTEM_ENTRY) SetReactState(REACT_AGGRESSIVE); }
void Totem::Summon(Unit* owner) { sLog.outDebug("AddObject at Totem.cpp line 49"); SetInstanceId(owner->GetInstanceId()); owner->GetMap()->Add((Creature*)this); // select totem model in dependent from owner team [-ZERO] not implemented/useful CreatureInfo const *cinfo = GetCreatureInfo(); if(owner->GetTypeId() == TYPEID_PLAYER && cinfo) { uint32 display_id = sObjectMgr.ChooseDisplayId(((Player*)owner)->GetTeam(), cinfo); CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelRandomGender(display_id); if (minfo) display_id = minfo->modelid; SetDisplayId(display_id); } WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data,true); AIM_Initialize(); if (owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->AI()) ((Creature*)owner)->AI()->JustSummoned((Creature*)this); // there are some totems, which exist just for their visual appeareance if (!GetSpell()) return; switch(m_type) { case TOTEM_PASSIVE: CastSpell(this, GetSpell(), true); break; case TOTEM_STATUE: CastSpell(GetOwner(), GetSpell(), true); break; default: break; } }
void DynamicObject::Update(uint32 p_time) { WorldPacket data; if(m_aliveDuration > 0) { if(m_aliveDuration > p_time) m_aliveDuration -= p_time; else { if(this->IsInWorld()) { deleteThis = true; WorldPacket data; data.Initialize(SMSG_GAMEOBJECT_DESPAWN_ANIM); data << GetGUID(); SendMessageToSet(&data,true); } } } if(GetUInt32Value(OBJECT_FIELD_TYPE ) == 65) { if(m_PeriodicDamageCurrentTick > p_time) m_PeriodicDamageCurrentTick -= p_time; else { m_PeriodicDamageCurrentTick = m_PeriodicDamageTick; m_caster->DealWithSpellDamage(*this); } } if(deleteThis) { Delete(); } }
void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cmi, uint32 timeToTarget) { // Circular movement requires either a center position or an attached unit ASSERT(cmi.Center.is_initialized() || cmi.PathTarget.is_initialized()); // should be sent in object create packets only m_uint32Values[AREATRIGGER_TIME_TO_TARGET] = timeToTarget; _circularMovementInfo = cmi; _circularMovementInfo->TimeToTarget = timeToTarget; _circularMovementInfo->ElapsedTimeForMovement = 0; if (IsInWorld()) { WorldPackets::AreaTrigger::AreaTriggerRePath reshape; reshape.TriggerGUID = GetGUID(); reshape.AreaTriggerCircularMovement = _circularMovementInfo; SendMessageToSet(reshape.Write(), true); } }
void DynamicObject::Remove() { if(IsInWorld()) { // remove aura from all targets Unit* target; for(std::set< uint64 >::iterator itr = targets.begin(); itr != targets.end(); ++itr) { uint64 TargetGUID = *itr; target = m_mapMgr->GetUnit(TargetGUID); if(target != NULL) target->RemoveAura(m_spellProto->Id); } WorldPacket data(SMSG_DESTROY_OBJECT, 8); data << GetGUID() << uint8(1); SendMessageToSet(&data, true); if(m_spellProto->IsChannelSpell() && GUID_HIPART(casterGuid) != HIGHGUID_TYPE_GAMEOBJECT) { if(Unit* u_caster = GetMapMgr()->GetUnit(casterGuid)) { if(u_caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) == GetGUID()) { u_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, 0); u_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0); } } } RemoveFromWorld(true); } Destruct(); }
void GameObject::Despawn(uint32 time) { loot.items.clear(); //This is for go get deleted while looting if(m_spawn) { SetUInt32Value(GAMEOBJECT_STATE, m_spawn->state); SetUInt32Value(GAMEOBJECT_FLAGS, m_spawn->flags); } WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); data << GetGUID(); SendMessageToSet(&data,true); if(this->IsInWorld()) RemoveFromWorld(); if(time) { sEventMgr.AddEvent(this, &GameObject::Spawn, EVENT_GAMEOBJECT_ITEM_SPAWN, time, 1); } CALL_GO_SCRIPT_EVENT(this, OnDespawn)(); }
//----------------------------------------------------------------------------- void Unit::ApplyModifier(const Modifier *mod, bool apply, Affect* parent) { //Player * player; Creature * creature; Unit * unit; WorldPacket data; Unit * caster = WorldGetUnit (parent->GetCasterGUID()); if (caster != NULL && Call_Aura_ApplyModifier (mod->GetType(), caster, this, apply, mod->GetAmount(), mod->GetMiscValue(), mod->GetMiscValue2())) { sLog.outDebug ("ApplyModifier->SCRIPT: Type=%d Amount=%d V1=%d V2=%d", mod->GetType(), mod->GetAmount(), mod->GetMiscValue(), mod->GetMiscValue2()); return; } sLog.outDebug ("ApplyModifier: Type=%d Amount=%d V1=%d V2=%d", mod->GetType(), mod->GetAmount(), mod->GetMiscValue(), mod->GetMiscValue2()); switch(mod->GetType()) { case SPELL_AURA_NONE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_NONE"); break; } case SPELL_AURA_BIND_SIGHT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_BIND_SIGHT"); break; } case SPELL_AURA_MOD_THREAT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_THREAT"); break; } case SPELL_AURA_AURAS_VISIBLE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_AURAS_VISIBLE"); break; } case SPELL_AURA_MOD_RESISTANCE_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RESISTANCE_PCT"); break; } case SPELL_AURA_MOD_CREATURE_ATTACK_POWER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_CREATURE_ATTACK_POWER"); break; } case SPELL_AURA_MOD_TOTAL_THREAT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_TOTAL_THREAT"); break; } case SPELL_AURA_WATER_WALK: { apply ? data.Initialize(SMSG_MOVE_WATER_WALK) : data.Initialize(SMSG_MOVE_LAND_WALK); data << GetGUID(); SendMessageToSet(&data,true); break; } case SPELL_AURA_FEATHER_FALL: { apply ? data.Initialize(SMSG_MOVE_FEATHER_FALL) : data.Initialize(SMSG_MOVE_NORMAL_FALL); data << GetGUID(); SendMessageToSet(&data,true); break; } case SPELL_AURA_HOVER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_HOVER"); break; } case SPELL_AURA_ADD_FLAT_MODIFIER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_ADD_FLAT_MODIFIER"); break; } case SPELL_AURA_ADD_PCT_MODIFIER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_ADD_PCT_MODIFIER"); break; } case SPELL_AURA_ADD_TARGET_TRIGGER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_ADD_TARGET_TRIGGER"); break; } case SPELL_AURA_MOD_TAUNT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_TAUNT"); break; } case SPELL_AURA_MOD_POWER_REGEN_PERCENT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POWER_REGEN_PERCENT"); break; } case SPELL_AURA_ADD_CASTER_HIT_TRIGGER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_ADD_CASTER_HIT_TRIGGER"); break; } case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_OVERRIDE_CLASS_SCRIPTS"); break; } case SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN"); break; } case SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT"); break; } case SPELL_AURA_MOD_HEALING: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HEALING"); break; } case SPELL_AURA_IGNORE_REGEN_INTERRUPT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_IGNORE_REGEN_INTERRUPT"); break; } case SPELL_AURA_MOD_MECHANIC_RESISTANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_MECHANIC_RESISTANCE"); break; } case SPELL_AURA_MOD_HEALING_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HEALING_PCT"); break; } case SPELL_AURA_SHARE_PET_TRACKING: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_SHARE_PET_TRACKING"); break; } case SPELL_AURA_MOD_CONFUSE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_CONFUSE"); break; } case SPELL_AURA_MOD_STUN: { //sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_STUN"); if (apply) SetTarget (0); break; } case SPELL_AURA_UNTRACKABLE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_UNTRACKABLE"); break; } case SPELL_AURA_EMPATHY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_EMPATHY"); break; } case SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT"); break; } case SPELL_AURA_MOD_POWER_COST_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POWER_COST_PCT"); break; } case SPELL_AURA_MOD_RANGED_ATTACK_POWER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RANGED_ATTACK_POWER"); break; } case SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN"); break; } case SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT"); break; } case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS"); break; } case SPELL_AURA_MOD_POSSESS_PET: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POSSESS_PET"); break; } case SPELL_AURA_MOD_INCREASE_SPEED_ALWAYS: { unit = WorldGetUnit (GetGUID()); if (unit != NULL) { if (apply) unit->ModifySpeedMod (mod->GetAmount() / 100.0f); else { if (mod->GetAmount() != 0) unit->ModifySpeedMod (100.0f / mod->GetAmount()); else unit->SetSpeedMod (1.0f); } } else { sLog.outDebug ("ApplyModifier SPELL_AURA_MOD_INCREASE_SPEED_ALWAYS: Unit %X not found", GetGUIDLow()); } break; } case SPELL_AURA_MOD_DAMAGE_DONE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DAMAGE_DONE"); break; } case SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS"); break; } case SPELL_AURA_MOD_CREATURE_RANGED_ATTACK_POWER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_CREATURE_RANGED_ATTACK_POWER"); break; } case SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT: { uint32 percent = mod->GetAmount(); uint32 current = GetUInt32Value(UNIT_FIELD_POWER4); apply ? SetUInt32Value(UNIT_FIELD_POWER4,current+current/100*percent) : SetUInt32Value(UNIT_FIELD_POWER4,current-current/(100+percent)*100); break; } case SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT: { uint32 percent = mod->GetAmount(); uint32 current = GetUInt32Value(UNIT_FIELD_MAXHEALTH); apply ? SetUInt32Value(UNIT_FIELD_MAXHEALTH,current+current/100*percent) : SetUInt32Value(UNIT_FIELD_MAXHEALTH,current-current/(100+percent)*100); break; } case SPELL_AURA_MOD_MANA_REGEN_INTERRUPT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_MANA_REGEN_INTERRUPT"); break; } case SPELL_AURA_MOD_HEALING_DONE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HEALING_DONE"); break; } case SPELL_AURA_MOD_HEALING_DONE_PERCENT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HEALING_DONE_PERCENT"); break; } case SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE"); break; } case SPELL_AURA_MOD_HASTE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HASTE"); break; } case SPELL_AURA_FORCE_REACTION: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_FORCE_REACTION"); break; } case SPELL_AURA_MOD_DAMAGE_TAKEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DAMAGE_TAKEN"); break; } case SPELL_AURA_MOD_RANGED_HASTE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RANGED_HASTE"); break; } case SPELL_AURA_MOD_RANGED_AMMO_HASTE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RANGED_AMMO_HASTE"); break; } case SPELL_AURA_MOD_BASE_RESISTANCE_PCT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_BASE_RESISTANCE_PCT"); break; } case SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE"); break; } case SPELL_AURA_SAFE_FALL: { apply ? data.Initialize(SMSG_MOVE_FEATHER_FALL) : data.Initialize(SMSG_MOVE_NORMAL_FALL); data << GetGUID(); SendMessageToSet(&data,true); break; } case SPELL_AURA_CHARISMA: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_CHARISMA"); break; } case SPELL_AURA_PERSUADED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERSUADED"); break; } case SPELL_AURA_ADD_CREATURE_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_ADD_CREATURE_IMMUNITY"); break; } case SPELL_AURA_RETAIN_COMBO_POINTS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_RETAIN_COMBO_POINTS"); break; } case SPELL_AURA_DAMAGE_SHIELD: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_DAMAGE_SHIELD"); break; } case SPELL_AURA_MOD_STEALTH: { //sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_STEALTH"); // Convert float stored into integer field to normal view float amountf; *((int *)&amountf) = mod->GetAmount(); // Clip effective stealth level by spell level int amount = min (GetLevel() * 5, (int)amountf + 95); if (apply) m_stealthLevel += amount; else m_stealthLevel -= amount; sLog.outDebug ("ApplyModifier: STEALTH value set to %d", m_stealthLevel); break; } case SPELL_AURA_MOD_DETECT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DETECT"); break; } case SPELL_AURA_MOD_INVISIBILITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_INVISIBILITY"); break; } case SPELL_AURA_MOD_INVISIBILITY_DETECTION: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_INVISIBILITY_DETECTION"); break; } case SPELL_AURA_MOD_POSSESS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POSSESS"); break; } case SPELL_AURA_MOD_RESISTANCE: { uint16 index = 0; uint16 index2 = 0; switch(mod->GetMiscValue()) { case DMG_PHYSICAL: { index = UNIT_FIELD_RESISTANCES; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE; break; } case DMG_HOLY: { index = UNIT_FIELD_RESISTANCES + DMG_HOLY; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_HOLY : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_HOLY; break; } case DMG_FIRE: { index = UNIT_FIELD_RESISTANCES + DMG_FIRE; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_FIRE : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_FIRE; break; } case DMG_NATURE: { index = UNIT_FIELD_RESISTANCES + DMG_NATURE; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_NATURE : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_NATURE; break; } case DMG_FROST: { index = UNIT_FIELD_RESISTANCES + DMG_FROST; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_FROST : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_FROST; break; } case DMG_SHADOW:{ index = UNIT_FIELD_RESISTANCES + DMG_SHADOW; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_SHADOW : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_SHADOW; break; } case DMG_ARCANE:{ index = UNIT_FIELD_RESISTANCES + DMG_ARCANE; mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE + DMG_ARCANE : index2 = PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE + DMG_ARCANE; break; } default:{ sLog.outDetail ("WARNING: Misc Value for SPELL_AURA_MOD_STAT not valid\n"); return; break; } } if(apply){ SetUInt32Value(index,GetUInt32Value(index)+mod->GetAmount()); if (isPlayer()) SetUInt32Value(index2,GetUInt32Value(index2)+mod->GetAmount()); }else{ SetUInt32Value(index,GetUInt32Value(index)-mod->GetAmount()); if (isPlayer()) SetUInt32Value(index2,GetUInt32Value(index2)-mod->GetAmount()); } break; } case SPELL_AURA_PERIODIC_TRIGGER_SPELL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_TRIGGER_SPELL"); break; } case SPELL_AURA_PERIODIC_ENERGIZE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_ENERGIZE"); break; } case SPELL_AURA_MOD_PACIFY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_PACIFY"); break; } case SPELL_AURA_MOD_ROOT: { apply ? data.Initialize(MSG_MOVE_ROOT) : data.Initialize(MSG_MOVE_UNROOT); data << GetGUID(); SendMessageToSet(&data,true); break; } case SPELL_AURA_MOD_SILENCE: { apply ? m_silenced = true : m_silenced = false; break; } case SPELL_AURA_REFLECT_SPELLS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_REFLECT_SPELLS"); break; } case SPELL_AURA_MOD_STAT: { uint16 index = 0; uint16 index2 = 0; int32 v = mod->GetAmount(); switch(mod->GetMiscValue()) { case 0:{ //index = UNIT_FIELD_STAT0; ModifyStrength (apply ? v : -v); mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_POSSTAT0 : index2 = PLAYER_FIELD_NEGSTAT0; break; } case 1:{ //index = UNIT_FIELD_STAT1; ModifyAgility (apply ? v : -v); mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_POSSTAT1 : index2 = PLAYER_FIELD_NEGSTAT1; break; } case 2:{ //index = UNIT_FIELD_STAT2; ModifyStamina (apply ? v : -v); mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_POSSTAT2 : index2 = PLAYER_FIELD_NEGSTAT2; break; } case 3:{ //index = UNIT_FIELD_STAT3; ModifyIntellect (apply ? v : -v); mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_POSSTAT3 : index2 = PLAYER_FIELD_NEGSTAT3; break; } case 4:{ //index = UNIT_FIELD_STAT4; ModifySpirit (apply ? v : -v); mod->GetMiscValue2() == 0 ? index2 = PLAYER_FIELD_POSSTAT4 : index2 = PLAYER_FIELD_NEGSTAT4; break; } default:{ printf("WARNING: Misc Value for SPELL_AURA_MOD_STAT not valid\n"); return; break; } } if(apply){ if (isPlayer()) SetUInt32Value(index2,GetUInt32Value(index2) + v); }else{ if (isPlayer()) SetUInt32Value(index2,GetUInt32Value(index2) - v); } break; } case SPELL_AURA_PERIODIC_DAMAGE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_DAMAGE"); break; } case SPELL_AURA_MOD_SKILL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_SKILL"); break; } case SPELL_AURA_MOD_INCREASE_SPEED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_INCREASE_SPEED"); break; } case SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED: { if (GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_MOUNTED ) { float newspeed = (float)mod->GetAmount() / 100.0f; newspeed = newspeed + 1.0f; sLog.outDebug("New Speed (With mount): %.1f", newspeed); unit = WorldGetUnit (GetGUID()); if (unit != NULL) unit->SetSpeedMod(newspeed); } else { unit = WorldGetUnit (GetGUID()); if (unit != NULL) unit->SetSpeedMod(1.0f); } sLog.outDebug ("ApplyModifier: SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED"); break; } case SPELL_AURA_MOD_DECREASE_SPEED: { unit = WorldGetUnit (GetGUID()); if (unit != NULL) { if (apply) unit->ModifySpeedMod (mod->GetAmount() / 100.0f); else { if (mod->GetAmount() != 0) unit->ModifySpeedMod (100.0f / mod->GetAmount()); else unit->SetSpeedMod (1.0f); } } break; } case SPELL_AURA_MOD_INCREASE_HEALTH: { uint32 newValue; newValue = GetUInt32Value(UNIT_FIELD_MAXHEALTH); apply ? newValue += mod->GetAmount() : newValue -= mod->GetAmount(); SetUInt32Value(UNIT_FIELD_MAXHEALTH,newValue); break; } case SPELL_AURA_MOD_INCREASE_ENERGY: { uint32 powerField = 23; uint8 powerType = (uint8)(GetUInt32Value(UNIT_FIELD_BYTES_0) >> 24); if(powerType == 0) // Mana powerField = UNIT_FIELD_POWER1; else if(powerType == 1) // Rage powerField = UNIT_FIELD_POWER2; else if(powerType == 3) // Energy powerField = UNIT_FIELD_POWER4; uint32 newValue = GetUInt32Value(powerType); apply ? newValue += mod->GetAmount() : newValue -= mod->GetAmount(); SetUInt32Value(powerType,newValue); break; } case SPELL_AURA_MOD_SHAPESHIFT: { Affect* tmpAff; uint32 spellId; switch(mod->GetMiscValue()) { case FORM_CAT: { spellId = 3025; break; } case FORM_TREE:{ spellId = 3122; break; } case FORM_TRAVEL:{ spellId = 5419; break; } case FORM_AQUA:{ spellId = 5421; break; } case FORM_BEAR:{ spellId = 1178; break; } case FORM_AMBIENT:{ spellId = 0; break; } case FORM_GHOUL:{ spellId = 0; break; } case FORM_DIREBEAR:{ spellId = 9635; break; } case FORM_CREATUREBEAR:{ spellId = 2882; break; } case FORM_GHOSTWOLF:{ spellId = 0; break; } case FORM_BATTLESTANCE:{ spellId = 2457; break; } case FORM_DEFENSIVESTANCE:{ spellId = 7376; break; } case FORM_BERSERKERSTANCE:{ spellId = 7381; break; } case FORM_SHADOW:{ spellId = 0; break; } case FORM_STEALTH:{ //spellId = 0; // Turn on Sneaky Stance, Switch stealth button to unstealth and switch spellbar SetUInt32Value (UNIT_FIELD_BYTES_1, apply? 0x021E0000: 0); if (apply == false && isPlayer()) { data.Initialize (SMSG_COOLDOWN_EVENT); data << (uint32)1784 << GetGUID(); ((Player*)this)->GetSession()->SendPacket (&data); } return; } default:{ printf("Unknown Shapeshift Type\n"); break; } } // check for spell id SpellEntry *spellInfo = sSpellStore.LookupEntry( spellId ); if(!spellInfo) { sLog.outError("WORLD: unknown spell id %i\n", spellId); break; } tmpAff = new Affect(spellInfo,parent->GetDuration(),parent->GetCasterGUID()); for(uint8 i=0; i<3; ++i){ if(spellInfo->Effect[i] == 6){ uint32 value = 0; uint32 type = 0; uint32 damage = 0; if(spellInfo->EffectBasePoints[i] < 0){ tmpAff->SetNegative(); type = 1; } uint32 sBasePoints = (uint32)sqrt((float)(spellInfo->EffectBasePoints[i]*spellInfo->EffectBasePoints[i])); if(spellInfo->EffectApplyAuraName[i] == 3){ // Periodic Trigger Damage damage = spellInfo->EffectBasePoints[i]+rand()%spellInfo->EffectDieSides[i]+1; //TODO: why the hell it takes uint16? tmpAff->SetDamagePerTick((uint16)damage, spellInfo->EffectAmplitude[i]); tmpAff->SetNegative(); }else if(spellInfo->EffectApplyAuraName[i] == 23)// Periodic Trigger Spell tmpAff->SetPeriodicTriggerSpell(spellInfo->EffectTriggerSpell[i],spellInfo->EffectAmplitude[i]); else{ if(spellInfo->EffectDieSides[i] != 0) value = sBasePoints+rand()%spellInfo->EffectDieSides[i]; else value = sBasePoints; if(spellInfo->EffectDieSides[i] <= 1) value += 1; //TODO: why the hell it takes uint8? tmpAff->AddMod((uint8)spellInfo->EffectApplyAuraName[i],value,spellInfo->EffectMiscValue[i],type); } } } if(tmpAff){ parent->SetCoAffect(tmpAff); AddAffect(tmpAff); } break; } case SPELL_AURA_EFFECT_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_EFFECT_IMMUNITY"); break; } case SPELL_AURA_STATE_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_STATE_IMMUNITY"); break; } case SPELL_AURA_SCHOOL_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_SCHOOL_IMMUNITY"); break; } case SPELL_AURA_DAMAGE_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_DAMAGE_IMMUNITY"); break; } case SPELL_AURA_DISPEL_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_DISPEL_IMMUNITY"); break; } case SPELL_AURA_PROC_TRIGGER_SPELL: { apply ? m_triggerSpell = mod->GetAmount() : m_triggerSpell = 0; break; } case SPELL_AURA_PROC_TRIGGER_DAMAGE: { apply ? m_triggerDamage = mod->GetAmount() : m_triggerDamage = 0; break; } case SPELL_AURA_TRACK_CREATURES: { apply ? SetUInt32Value(PLAYER_TRACK_CREATURES,mod->GetMiscValue()) : SetUInt32Value(PLAYER_TRACK_CREATURES,0); break; } case SPELL_AURA_TRACK_RESOURCES: { apply ? SetUInt32Value(PLAYER_TRACK_RESOURCES,mod->GetMiscValue()) : SetUInt32Value(PLAYER_TRACK_RESOURCES,0); break; } case SPELL_AURA_MOD_PARRY_SKILL: { break; } case SPELL_AURA_MOD_PARRY_PERCENT: { //uint32 current = GetUInt32Value(PLAYER_PARRY_PERCENTAGE); //apply ? SetUInt32Value(PLAYER_PARRY_PERCENTAGE,current+mod->GetAmount()) : SetUInt32Value(PLAYER_PARRY_PERCENTAGE,current-mod->GetAmount()); ModifyParryChance (apply ? mod->GetAmount() : -mod->GetAmount()); break; } case SPELL_AURA_MOD_DODGE_SKILL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DODGE_SKILL"); break; } case SPELL_AURA_MOD_DODGE_PERCENT: { //uint32 current = GetUInt32Value(PLAYER_DODGE_PERCENTAGE); //apply ? SetUInt32Value(PLAYER_DODGE_PERCENTAGE,current+mod->GetAmount()) : SetUInt32Value(PLAYER_DODGE_PERCENTAGE,current-mod->GetAmount()); ModifyDodgeChance (apply ? mod->GetAmount() : -mod->GetAmount()); break; } case SPELL_AURA_MOD_BLOCK_SKILL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_BLOCK_SKILL"); break; } case SPELL_AURA_MOD_BLOCK_PERCENT: { //uint32 current = GetUInt32Value(PLAYER_BLOCK_PERCENTAGE); //apply ? SetUInt32Value(PLAYER_BLOCK_PERCENTAGE,current+mod->GetAmount()) : SetUInt32Value(PLAYER_BLOCK_PERCENTAGE,current-mod->GetAmount()); ModifyBlockChance (apply ? mod->GetAmount() : -mod->GetAmount()); break; } case SPELL_AURA_MOD_CRIT_PERCENT: { //uint32 current = GetUInt32Value(PLAYER_CRIT_PERCENTAGE); //apply ? SetUInt32Value(PLAYER_CRIT_PERCENTAGE,current+mod->GetAmount()) : SetUInt32Value(PLAYER_CRIT_PERCENTAGE,current-mod->GetAmount()); ModifyCritChance (apply ? mod->GetAmount() : -mod->GetAmount()); break; } case SPELL_AURA_PERIODIC_LEECH: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_LEECH"); break; } case SPELL_AURA_MOD_HIT_CHANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_HIT_CHANCE"); break; } case SPELL_AURA_MOD_SPELL_HIT_CHANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_SPELL_HIT_CHANCE"); break; } case SPELL_AURA_TRANSFORM: { if (parent->GetId() == 118) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 228) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 304); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 851) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 4060) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 131); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 5254) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 12824) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 12825) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 12826) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 13323) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 15534) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 856); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } if (parent->GetId() == 17738) { if (apply) { //((Modifier *)mod)->SetValue1 (GetUInt32Value (UNIT_FIELD_DISPLAYID)); SetUInt32Value (UNIT_FIELD_DISPLAYID, 1141); } else { SetUInt32Value (UNIT_FIELD_DISPLAYID, GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); if (caster != NULL) AddHate (caster, 1.0f); } } break; } case SPELL_AURA_MOD_SPELL_CRIT_CHANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_SPELL_CRIT_CHANCE"); break; } case SPELL_AURA_MOD_INCREASE_SWIM_SPEED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_INCREASE_SWIM_SPEED"); break; } case SPELL_AURA_MOD_DAMAGE_DONE_CREATURE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DAMAGE_DONE_CREATURE"); break; } case SPELL_AURA_MOD_CHARM: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_CHARM"); break; } case SPELL_AURA_MOD_PACIFY_SILENCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_PACIFY_SILENCE"); break; } case SPELL_AURA_MOD_SCALE: { float current = GetFloatValue(OBJECT_FIELD_SCALE_X); apply ? SetFloatValue(OBJECT_FIELD_SCALE_X,current+current/100*10) : SetFloatValue(OBJECT_FIELD_SCALE_X,current-current/110*100); break; } case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_HEALTH_FUNNEL"); break; } case SPELL_AURA_PERIODIC_MANA_FUNNEL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_MANA_FUNNEL"); break; } case SPELL_AURA_PERIODIC_MANA_LEECH: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_MANA_LEECH"); break; } case SPELL_AURA_MOD_CASTING_SPEED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_CASTING_SPEED"); break; } case SPELL_AURA_FEIGN_DEATH: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_FEIGN_DEATH"); break; } case SPELL_AURA_MOD_DISARM: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DISARM"); break; } case SPELL_AURA_MOD_STALKED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_STALKED"); break; } case SPELL_AURA_SCHOOL_ABSORB: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_SCHOOL_ABSORB"); break; } case SPELL_AURA_MOD_FEAR: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_FEAR"); break; } case SPELL_AURA_EXTRA_ATTACKS: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_EXTRA_ATTACKS"); break; } case SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL"); break; } case SPELL_AURA_MOD_POWER_COST: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POWER_COST"); break; } case SPELL_AURA_MOD_POWER_COST_SCHOOL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POWER_COST_SCHOOL"); break; } case SPELL_AURA_REFLECT_SPELLS_SCHOOL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_REFLECT_SPELLS_SCHOOL"); break; } case SPELL_AURA_MOD_LANGUAGE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_LANGUAGE"); break; } case SPELL_AURA_FAR_SIGHT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_FAR_SIGHT"); break; } case SPELL_AURA_MECHANIC_IMMUNITY: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MECHANIC_IMMUNITY"); break; } case SPELL_AURA_MOUNTED: { sLog.outDebug ("ApplyModifier: SPELL_AURA_MOUNTED"); if (GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_MOUNTED ) { SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID , 0); RemoveFlag( UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNTED ); // Remove the "player locked" flag, to allow movement if (GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_LOCKED ) RemoveFlag( UNIT_FIELD_FLAGS, UNIT_FLAG_LOCKED ); // Make sure we're standing ;) SetUInt32Value(UNIT_FIELD_BYTES_1, STANDSTATE_STAND); } else { // Set mount ID from creatures_templ CreatureTemplate *ptempl = objmgr.GetCreatureTemplate(mod->GetMiscValue(), true); SetUInt32Value( UNIT_FIELD_MOUNTDISPLAYID , ptempl->Model); //SetUInt32Value( UNIT_FIELD_FLAGS , UNIT_FLAG_MOUNTED ); SetFlag( UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNTED ); } break; } case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DAMAGE_PERCENT_DONE"); break; } case SPELL_AURA_PERIODIC_HEAL: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_HEAL"); break; } case SPELL_AURA_MOD_PERCENT_STAT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_PERCENT_STAT"); break; } case SPELL_AURA_SPLIT_DAMAGE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_SPLIT_DAMAGE"); break; } case SPELL_AURA_WATER_BREATHING: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_WATER_BREATHING"); break; } case SPELL_AURA_MOD_BASE_RESISTANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_BASE_RESISTANCE"); break; } case SPELL_AURA_MOD_REGEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_REGEN"); break; } case SPELL_AURA_MOD_POWER_REGEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_POWER_REGEN"); break; } case SPELL_AURA_CHANNEL_DEATH_ITEM: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_CHANNEL_DEATH_ITEM"); break; } case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN"); break; } case SPELL_AURA_MOD_PERCENT_REGEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_PERCENT_REGEN"); break; } case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PERIODIC_DAMAGE_PERCENT"); break; } case SPELL_AURA_MOD_ATTACKSPEED: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_ATTACKSPEED"); break; } case SPELL_AURA_MOD_RESIST_CHANCE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_RESIST_CHANCE"); break; } case SPELL_AURA_MOD_DETECT_RANGE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_DETECT_RANGE"); break; } case SPELL_AURA_PREVENTS_FLEEING: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_PREVENTS_FLEEING"); break; } case SPELL_AURA_MOD_UNATTACKABLE: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_UNATTACKABLE"); break; } case SPELL_AURA_INTERRUPT_REGEN: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_INTERRUPT_REGEN"); break; } case SPELL_AURA_GHOST: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_GHOST"); break; } case SPELL_AURA_SPELL_MAGNET: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_SPELL_MAGNET"); break; } case SPELL_AURA_MANA_SHIELD: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MANA_SHIELD"); break; } case SPELL_AURA_MOD_SKILL_TALENT: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_SKILL_TALENT"); break; } case SPELL_AURA_MOD_ATTACK_POWER: { sLog.outDebug ("ApplyModifier: Unsupported SPELL_AURA_MOD_ATTACK_POWER"); break; } default: { sLog.outError("Unknown affect id %u", (uint32)mod->GetType()); } } }
void Vehicle::AddPassenger(Unit *unit, int8 seatId, bool force) { SeatMap::iterator seat; seat = m_Seats.find(seatId); // this should never happen if(seat == m_Seats.end()) return; unit->SetVehicleGUID(GetGUID()); seat->second.passenger = unit; if(unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->isVehicle()) { if(((Vehicle*)unit)->GetEmptySeatsCount(true) == 0) seat->second.flags = SEAT_VEHICLE_FULL; else seat->second.flags = SEAT_VEHICLE_FREE; } else { seat->second.flags = SEAT_FULL; } if(unit->GetTypeId() == TYPEID_PLAYER) { WorldPacket data0(SMSG_FORCE_MOVE_ROOT, 10); data0 << unit->GetPackGUID(); data0 << (uint32)((seat->second.vs_flags & SF_CAN_CAST) ? 2 : 0); unit->SendMessageToSet(&data0,true); } if(seat->second.vs_flags & SF_MAIN_RIDER) { if(!(GetVehicleFlags() & VF_MOVEMENT)) { GetMotionMaster()->Clear(false); GetMotionMaster()->MoveIdle(); SetCharmerGUID(unit->GetGUID()); unit->SetUInt64Value(UNIT_FIELD_CHARM, GetGUID()); if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->SetMover(this); ((Player*)unit)->SetMoverInQueve(this); ((Player*)unit)->SetClientControl(this, 1); } if(canFly() || HasAuraType(SPELL_AURA_FLY) || HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { WorldPacket data3(SMSG_MOVE_SET_CAN_FLY, 12); data3<< GetPackGUID(); data3 << (uint32)(0); SendMessageToSet(&data3,false); } } SpellClickInfoMapBounds clickPair = sObjectMgr.GetSpellClickInfoMapBounds(GetEntry()); for(SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) { if (unit->GetTypeId() == TYPEID_UNIT || itr->second.IsFitToRequirements((Player*)unit)) { Unit *caster = (itr->second.castFlags & 0x1) ? unit : this; Unit *target = (itr->second.castFlags & 0x2) ? unit : this; caster->CastSpell(target, itr->second.spellId, true); } } if(unit->GetTypeId() == TYPEID_PLAYER) { // it should be added only on rider enter? if(((Player*)unit)->GetGroup()) ((Player*)unit)->SetGroupUpdateFlag(GROUP_UPDATE_VEHICLE); ((Player*)unit)->GetCamera().SetView(this); BuildVehicleActionBar((Player*)unit); } if(!(GetVehicleFlags() & VF_FACTION)) setFaction(unit->getFaction()); if(GetVehicleFlags() & VF_CANT_MOVE) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); data2<< GetPackGUID(); data2 << (uint32)(2); SendMessageToSet(&data2,false); } if(GetVehicleFlags() & VF_NON_SELECTABLE) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } if(seat->second.vs_flags & SF_UNATTACKABLE) unit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); EmptySeatsCountChanged(); }
void Vehicle::RemovePassenger(Unit* pPassenger) { if(pPassenger == NULL) // We have enough problems that we need to do this :( return; uint8 slot = pPassenger->GetSeatID(); pPassenger->SetVehicle(NULL); pPassenger->SetSeatID(NULL); pPassenger->RemoveFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION | UNIT_FLAG_NOT_SELECTABLE)); if( pPassenger->IsPlayer() && TO_PLAYER(pPassenger)->m_MountSpellId != m_mountSpell ) pPassenger->RemoveAura(TO_PLAYER(pPassenger)->m_MountSpellId); if( m_mountSpell ) pPassenger->RemoveAura( m_mountSpell ); if( m_CastSpellOnMount ) pPassenger->RemoveAura( m_CastSpellOnMount ); WorldPacket data(SMSG_MONSTER_MOVE, 85); data << pPassenger->GetNewGUID(); // PlayerGUID data << uint8(0x40); // Unk - blizz uses 0x40 data << pPassenger->GetPosition(); // Player Position xyz data << getMSTime(); // Timestamp data << uint8(0x4); // Flags data << pPassenger->GetOrientation(); // Orientation data << uint32(MOVEFLAG_AIR_SUSPENSION); // MovementFlags data << uint32(0); // MovementTime data << uint32(1); // Pointcount data << GetPosition(); // Vehicle Position xyz SendMessageToSet(&data, false); pPassenger->movement_info.flags &= ~MOVEFLAG_TAXI; pPassenger->movement_info.transX = 0; pPassenger->movement_info.transY = 0; pPassenger->movement_info.transZ = 0; pPassenger->movement_info.transO = 0; pPassenger->movement_info.transTime = 0; pPassenger->movement_info.transSeat = 0; pPassenger->movement_info.transGuid = WoWGuid(uint64(NULL)); if(pPassenger->IsPlayer()) { Player* plr = TO_PLAYER(pPassenger); if(plr == GetControllingUnit()) { plr->m_CurrentCharm = NULL; data.Initialize(SMSG_CLIENT_CONTROL_UPDATE); data << GetNewGUID() << (uint8)0; plr->GetSession()->SendPacket(&data); } RemoveFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_PLAYER_CONTROLLED_CREATURE | UNIT_FLAG_PLAYER_CONTROLLED)); plr->SetPlayerStatus(TRANSFER_PENDING); // We get an ack later, if we don't set this now, we get disconnected. sEventMgr.AddEvent(plr, &Player::CheckPlayerStatus, (uint8)TRANSFER_PENDING, EVENT_PLAYER_CHECK_STATUS_Transfer, 5000, 0, 0); plr->m_sentTeleportPosition.ChangeCoords(GetPositionX(), GetPositionY(), GetPositionZ()); plr->SetPosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); data.Initialize(MSG_MOVE_TELEPORT_ACK); data << plr->GetNewGUID(); data << plr->m_teleportAckCounter; plr->m_teleportAckCounter++; data << uint32(MOVEFLAG_FLYING); data << uint16(0x40); data << getMSTime(); data << GetPositionX(); data << GetPositionY(); data << GetPositionZ(); data << GetOrientation(); data << uint32(0); plr->GetSession()->SendPacket(&data); plr->SetUInt64Value( PLAYER_FARSIGHT, 0 ); data.Initialize(SMSG_PET_DISMISS_SOUND); data << uint32(m_vehicleSeats[slot]->m_exitUISoundID); data << plr->GetPosition(); plr->GetSession()->SendPacket(&data); data.Initialize(SMSG_PET_SPELLS); data << uint64(0); data << uint32(0); plr->GetSession()->SendPacket(&data); CreatureProtoVehicle* vehicleproto = CreatureProtoVehicleStorage.LookupEntry(GetEntry()); if(vehicleproto && vehicleproto->healthfromdriver) { if(slot == 0) { uint32 health = GetUInt32Value(UNIT_FIELD_HEALTH); uint32 maxhealth = GetUInt32Value(UNIT_FIELD_MAXHEALTH); uint32 protomaxhealth = GetProto()->MaxHealth; uint32 healthdiff = maxhealth - health; uint32 plritemlevel = plr->GetTotalItemLevel(); uint32 convrate = vehicleproto->healthunitfromitemlev; if(plritemlevel != 0 && convrate != 0) { uint32 healthloss = healthdiff+plritemlevel*convrate; SetUInt32Value(UNIT_FIELD_HEALTH, GetProto()->MaxHealth - healthloss); } else if(protomaxhealth > healthdiff) SetUInt32Value(UNIT_FIELD_HEALTH, protomaxhealth-healthdiff); else SetUInt32Value(UNIT_FIELD_HEALTH, 1); SetUInt32Value(UNIT_FIELD_MAXHEALTH, protomaxhealth); } } } if(slot == 0) { m_redirectSpellPackets = NULLPLR; CombatStatus.Vanished(); pPassenger->SetUInt64Value( UNIT_FIELD_CHARM, 0 ); SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0); if(!m_faction || m_faction->ID == 35 || m_faction->ID == 2105) SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, GetCharmTempVal()); RemoveAura(62064); } SendHeartBeatMsg(false); m_passengers[slot] = NULL; pPassenger->m_TransporterGUID = NULL; // We need to null this out if(pPassenger->IsPlayer()) --m_ppassengerCount; //note: this is not blizz like we should despawn //and respawn at spawn point. //Well actually this is how blizz wanted it //but they couldnt get it to work xD bool haspassengers = false; for(uint8 i = 0; i < m_seatSlotMax; i++) { if(m_passengers[i] != NULL && m_passengers[i]->IsPlayer()) { haspassengers = true; break; } } if(!haspassengers && !GetVehicle()) // Passenger and accessory checks. { if( m_spawn == NULL ) SafeDelete(); } if(!IsFull()) SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); if(canFly()) DisableFlight(); _setFaction(); }
void Vehicle::_AddToSlot(Unit* pPassenger, uint8 slot) { assert( slot < m_seatSlotMax ); if(pPassenger->IsPlayer() && TO_PLAYER(pPassenger)->m_CurrentCharm) return; if(pPassenger->IsPlayer() && TO_PLAYER(pPassenger)->m_isGmInvisible) { sChatHandler.GreenSystemMessage(TO_PLAYER(pPassenger)->GetSession(), "Please turn off invis before entering vehicle."); return; } CreatureProtoVehicle* vehicleproto = CreatureProtoVehicleStorage.LookupEntry(GetEntry()); m_passengers[slot] = pPassenger; LocationVector v; v.x = m_vehicleSeats[slot]->m_attachmentOffsetX; /* pPassenger->m_TransporterX = */ v.y = m_vehicleSeats[slot]->m_attachmentOffsetY; /* pPassenger->m_TransporterY = */ v.z = m_vehicleSeats[slot]->m_attachmentOffsetZ; /* pPassenger->m_TransporterZ = */ v.o = 0; /* pPassenger->m_TransporterO = */ //pPassenger->m_transportPosition =& v; // This is handled elsewhere, do not initialize here. pPassenger->movement_info.flags |= MOVEFLAG_TAXI; pPassenger->movement_info.transX = v.x; pPassenger->movement_info.transY = v.y; pPassenger->movement_info.transZ = v.z; pPassenger->movement_info.transO = GetOrientation(); pPassenger->movement_info.transSeat = slot; pPassenger->movement_info.transGuid = WoWGuid(GetGUID()); pPassenger->SetSeatID(slot); pPassenger->m_TransporterGUID = GetGUID(); if( m_CastSpellOnMount ) pPassenger->CastSpell( pPassenger, m_CastSpellOnMount, true ); RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SELF_RES); // This is where the real magic happens if( pPassenger->IsPlayer() ) { Player* pPlayer = TO_PLAYER(pPassenger); //pPlayer->Root(); //Dismount if(pPlayer->m_MountSpellId && pPlayer->m_MountSpellId != m_mountSpell) pPlayer->RemoveAura(pPlayer->m_MountSpellId); //Remove morph spells if(pPlayer->GetUInt32Value(UNIT_FIELD_DISPLAYID) != pPlayer->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)) { pPlayer->RemoveAllAurasOfType(SPELL_AURA_TRANSFORM); pPlayer->RemoveAllAurasOfType(SPELL_AURA_MOD_SHAPESHIFT); } //Dismiss any pets if(pPlayer->GetSummon()) { if(pPlayer->GetSummon()->GetUInt32Value(UNIT_CREATED_BY_SPELL) > 0) pPlayer->GetSummon()->Dismiss(false); // warlock summon -> dismiss else pPlayer->GetSummon()->Remove(false, true, true); // hunter pet -> just remove for later re-call } pPlayer->SetVehicle(this); pPlayer->SetUInt64Value(PLAYER_FARSIGHT, GetGUID()); pPlayer->SetPlayerStatus(TRANSFER_PENDING); sEventMgr.AddEvent(pPlayer, &Player::CheckPlayerStatus, (uint8)TRANSFER_PENDING, EVENT_PLAYER_CHECK_STATUS_Transfer, 5000, 0, 0); pPlayer->m_sentTeleportPosition.ChangeCoords(GetPositionX(), GetPositionY(), GetPositionZ()); WorldPacket data(SMSG_MONSTER_MOVE_TRANSPORT, 100); data << pPlayer->GetNewGUID(); // Passengerguid data << GetNewGUID(); // Transporterguid (vehicleguid) data << uint8(slot); // Vehicle Seat ID data << uint8(0); // Unknown data << GetPositionX() - pPlayer->GetPositionX(); // OffsetTransporterX data << GetPositionY() - pPlayer->GetPositionY(); // OffsetTransporterY data << GetPositionZ() - pPlayer->GetPositionZ(); // OffsetTransporterZ data << getMSTime(); // Timestamp data << uint8(0x04); // Flags data << float(0); // Orientation Offset data << uint32(MOVEFLAG_TB_MOVED); // MovementFlags data << uint32(0); // MoveTime data << uint32(1); // Points data << v.x; // GetTransOffsetX(); data << v.y; // GetTransOffsetY(); data << v.z; // GetTransOffsetZ(); SendMessageToSet(&data, true); if(vehicleproto) { // We have proto, no accessory in slot, and slot sets unselectable, unlike some seats if(!vehicleproto->seats[slot].accessoryentry && vehicleproto->seats[slot].unselectableaccessory) pPlayer->SetFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION | UNIT_FLAG_NOT_SELECTABLE)); } else pPlayer->SetFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION | UNIT_FLAG_NOT_SELECTABLE)); if(slot == 0) { if(m_vehicleSeats[slot]->IsControllable()) { m_redirectSpellPackets = pPlayer; SetSpeed(RUN, m_runSpeed); SetSpeed(FLY, m_flySpeed); // send "switch mover" packet data.Initialize(SMSG_CLIENT_CONTROL_UPDATE); data << GetNewGUID() << uint8(1); pPlayer->GetSession()->SendPacket(&data); pPlayer->m_CurrentCharm = TO_UNIT(this); pPlayer->SetUInt64Value(UNIT_FIELD_CHARM, GetGUID()); SetUInt64Value(UNIT_FIELD_CHARMEDBY, pPlayer->GetGUID()); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED_CREATURE); if(!m_faction || m_faction->ID == 35 || m_faction->ID == 2105) { SetCharmTempVal(pPlayer->GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE)); SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, pPlayer->GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE)); } if(vehicleproto && vehicleproto->healthfromdriver) { uint32 health = GetUInt32Value(UNIT_FIELD_HEALTH); uint32 maxhealth = GetUInt32Value(UNIT_FIELD_MAXHEALTH); uint32 healthdiff = maxhealth - health; SetUInt32Value(UNIT_FIELD_MAXHEALTH, (maxhealth+((pPlayer->GetTotalItemLevel())*(vehicleproto->healthunitfromitemlev)))); SetUInt32Value(UNIT_FIELD_HEALTH, (health+((pPlayer->GetTotalItemLevel())*(vehicleproto->healthunitfromitemlev))) - healthdiff); } SendSpells(GetEntry(), pPlayer); if(pPlayer->HasAura(62064)) { uint32 stack = pPlayer->FindActiveAura(62064)->stackSize; AddAura(new Aura(dbcSpell.LookupEntry(62064),-1,this,this)); FindActiveAura(62064)->ModStackSize(stack); } } } else { data.Initialize(SMSG_CLIENT_CONTROL_UPDATE); data << GetNewGUID() << uint8(0); pPlayer->GetSession()->SendPacket(&data); } data.Initialize(SMSG_PET_DISMISS_SOUND); data << uint32(m_vehicleSeats[slot]->m_enterUISoundID); data << pPlayer->GetPosition(); pPlayer->GetSession()->SendPacket(&data); ++m_ppassengerCount; } else { pPassenger->SetVehicle(this); if(vehicleproto != NULL) if(vehicleproto->seats[slot].accessoryentry == pPassenger->GetEntry()) if(vehicleproto->seats[slot].unselectableaccessory == true) pPassenger->SetFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION | UNIT_FLAG_NOT_SELECTABLE)); else pPassenger->SetFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION)); else pPassenger->SetFlag(UNIT_FIELD_FLAGS, (UNIT_FLAG_UNKNOWN_5 | UNIT_FLAG_PREPARATION | UNIT_FLAG_NOT_SELECTABLE)); pPassenger->SetPosition(GetPositionX()+v.x, GetPositionY()+v.y, GetPositionZ()+v.z, GetOrientation()); } SendHeartBeatMsg(false); if(IsFull()) RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); if(canFly()) EnableFlight(); _setFaction(); }