using UnityEngine; using Photon.Pun; // ส่วนวาร์ปของ PlayerController (แท่นวาร์ปในแม็พปริซึม) public partial class PlayerController { public const float WarpCooldown = 3f; private float warpReadyAt; // เรียกจาก WarpPad เมื่อยานแตะแท่น: เฉพาะเจ้าของยานเป็นคนสั่ง public void TryWarp(WarpPad from, WarpPad to) { if (!photonView.IsMine || from == null || to == null) return; if (isDead || matchEnded || isSpawnProtected || !BattleInputAllowed) return; if (Time.time < warpReadyAt) return; warpReadyAt = Time.time + WarpCooldown; photonView.RPC("WarpRPC", RpcTarget.All, (Vector2)from.transform.position, to.ExitPoint()); } [PunRPC] public void WarpRPC(Vector2 from, Vector2 to, PhotonMessageInfo info) { if (info.Sender != photonView.Owner) return; transform.position = to; networkPosition = to; // ไม่ให้ยานอีกฝั่งค่อยๆ ไหลข้ามแม็พ if (playerRigidbody != null) playerRigidbody.position = to; previousVfxPosition = transform.position; Physics2D.SyncTransforms(); foreach (var pad in FindObjectsByType(FindObjectsSortMode.None)) { Vector2 padPosition = pad.transform.position; if ((padPosition - from).sqrMagnitude < 1f || (pad.ExitPoint() - to).sqrMagnitude < 1f) pad.Flash(); } if (AudioManager.Instance != null) AudioManager.Instance.PlaySFX("SFX_ShieldHit"); if (photonView.IsMine) { var follow = Camera.main != null ? Camera.main.GetComponent() : null; if (follow != null) follow.SnapToTarget(); } } }