Bỏ qua để đến nội dung

Kiến trúc ExtralyCinematic

ExtralyCinematic xoay quanh ba phần runtime: storage, authoring command, và playback.

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.

Free recording lưu frame từ vị trí player đang record. Khoảng lấy mẫu là:

config interpolation-steps

Timed 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.

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:

  1. tính progress
  2. áp dụng ease-in-out sine
  3. chọn segment hiện tại
  4. nội suy vị trí
  5. tính yaw và pitch từ focus target hoặc góc frame
  6. áp dụng shake nếu bật
  7. teleport armor stand camera
  8. áp dụng potion effect zoom nếu cấu hình
  9. 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.

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.

Nếu cinematic có duration > 0, tổng tick là:

duration * 20

Nếu không, tổng tick là:

(frameCount - 1) * interpolation-steps

Vì vậy nên đặt duration rõ ràng cho sản phẩm hoàn chỉnh.

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 ms
stay: 3500 ms
fade out: 1000 ms

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.