void WorldSession::SendAttackStop(Unit const* enemy) { WorldPacket data(SMSG_ATTACKSTOP, (4 + 20)); // we guess size data << GetPlayer()->GetPackGUID(); data << (enemy ? enemy->GetPackGUID() : PackedGuid()); // must be packed guid data << uint32(0); // unk, can be 1 also SendPacket(&data); }
void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, WorldPacket& data) { MoveSplineFlag splineflags = move_spline.splineflags; if (move_spline.transportGuid) { //DEBUG_LOG("Setting transport opcode for %s", move_spline.transport->GetGuidStr().c_str()); data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT); data << PackedGuid(move_spline.transportGuid); data << uint8(move_spline.transportSeat); data << uint8(0); data << (Vector3)move_spline.transportPos; } else { data << uint8(0); data << move_spline.spline.getPoint(move_spline.spline.first()); } data << move_spline.GetId(); switch(splineflags & MoveSplineFlag::Mask_Final_Facing) { default: data << uint8(MonsterMoveNormal); break; case MoveSplineFlag::Final_Target: data << uint8(MonsterMoveFacingTarget); data << move_spline.facing.target; break; case MoveSplineFlag::Final_Angle: data << uint8(MonsterMoveFacingAngle); data << NormalizeOrientation(move_spline.facing.angle); break; case MoveSplineFlag::Final_Point: data << uint8(MonsterMoveFacingSpot); data << move_spline.facing.f.x << move_spline.facing.f.y << move_spline.facing.f.z; break; } // add fake Enter_Cycle flag - needed for client-side cyclic movement (client will erase first spline vertex after first cycle done) splineflags.enter_cycle = move_spline.isCyclic(); data << uint32(splineflags & ~MoveSplineFlag::Mask_No_Monster_Move); if (splineflags.animation) { data << splineflags.getAnimationId(); data << move_spline.effect_start_time; } data << move_spline.Duration(); if (splineflags.parabolic) { data << move_spline.vertical_acceleration; data << move_spline.effect_start_time; } }