Kiến trúc ExtralyCinematic
ExtralyCinematic xoay quanh ba phần runtime: storage, authoring command, và playback.
Object runtime
Phần tiêu đề “Object runtime”Core sở hữu lifecycle plugin. Khi enable, nó:
- save default config
- tạo
MessageManager - đăng ký ACF commands
- tạo
Game - tạo
StorageManager - load cinematic từ YAML
- đăng ký listener
- phát hiện PlaceholderAPI, WorldGuard, và MythicMobs
Game lưu:
- cinematic đã load theo tên
- viewer đang xem cinematic
- state game time đơn giản
StorageManager load và save plugins/ExtralyCinematic/cinematics/*.yml.
Mô hình recording
Phần tiêu đề “Mô hình recording”Free recording lưu frame từ vị trí player đang record. Khoảng lấy mẫu là:
config interpolation-stepsTimed recording dùng cùng sampler nhưng dừng sau seconds * 20 tick.
Waypoint authoring đơn giản hơn: /cinematic addframe <name> thêm một frame từ vị trí hiện tại của player.
Mô hình playback
Phần tiêu đề “Mô hình playback”Playback tạo armor stand vô hình tại frame đầu tiên và đặt player ở spectator mode xem armor stand đó.
Plugin lưu:
- vị trí player ban đầu
- game mode ban đầu
Mỗi tick, playback:
- tính progress
- áp dụng ease-in-out sine
- chọn segment hiện tại
- nội suy vị trí
- tính yaw và pitch từ focus target hoặc góc frame
- áp dụng shake nếu bật
- teleport armor stand camera
- áp dụng potion effect zoom nếu cấu hình
- chạy frame command và title khi vượt qua frame
Cleanup xóa player khỏi viewers, clear spectator target, khôi phục game mode, teleport player về, xóa speed/slowness effect, dừng BGM, và remove armor stand.
Interpolation
Phần tiêu đề “Interpolation”Vị trí dùng nội suy Catmull-Rom. Nhờ vậy camera cong qua frame thay vì di chuyển tuyến tính thẳng.
Góc nhìn được smooth để tránh xoay 360 độ khi yaw đi qua -180 hoặc 180.
Timing dùng:
-(cos(pi * x) - 1) / 2Điều này làm chuyển động ease in và ease out thay vì tốc độ tuyến tính cố định.
Duration
Phần tiêu đề “Duration”Nếu cinematic có duration > 0, tổng tick là:
duration * 20Nếu không, tổng tick là:
(frameCount - 1) * interpolation-stepsVì vậy nên đặt duration rõ ràng cho sản phẩm hoàn chỉnh.
Frame event
Phần tiêu đề “Frame event”Command và title chạy khi playback vượt qua một frame index. Command dispatch bằng console sau khi thay %player% và parse PlaceholderAPI tùy chọn.
Title được parse bằng MiniMessage và hiển thị với timing cố định:
fade in: 500 msstay: 3500 msfade out: 1000 msSafety control
Phần tiêu đề “Safety control”Viewer set ngăn update tiếp sau stop/quit. Sneak bị cancel khi đang xem để player không thoát spectator camera ngoài ý muốn.
WorldGuard cũng kiểm tra viewer set để việc đi vào region có cinematic trong lúc playback không trigger loop cinematic khác.