// ResetTrigger.cs using Simuspaces.Simulation; public class ResetTrigger : SimuScriptBase { public SceneObject SpawnPoint; public bool VerboseLogs = true; public override void Start() { Log("[ResetTrigger] Start. Registering trigger on: " + gameObject.name); RegisterTrigger(OnObjectEnteredTrigger); } private void OnObjectEnteredTrigger(SVTriggerInfo info) { Log("[ResetTrigger] ENTER fired."); if (info == null) { LogWarning("[ResetTrigger] info is null."); return; } Log( "[ResetTrigger] Info: " + "IsPlayer=" + info.IsPlayer + ", Username='" + info.Username + "'" + ", ObjectName='" + info.ObjectName + "'" + ", ObjectId='" + info.ObjectId + "'" + ", TriggerObjectId='" + info.TriggerObjectId + "'" ); if (info.OtherObject == null) { LogWarning("[ResetTrigger] OtherObject is null."); return; } Log( "[ResetTrigger] OtherObject: " + "Id='" + info.OtherObject.Id + "'" + ", Exists=" + info.OtherObject.Exists ); if (!info.OtherObject.Exists) { LogWarning("[ResetTrigger] OtherObject does not exist."); return; } GameObject target = info.OtherObject.gameObject; if (target == null) { LogWarning("[ResetTrigger] OtherObject.gameObject is null."); return; } Log("[ResetTrigger] Target GO: " + GetPath(target.transform)); Rigidbody rootRb = target.GetComponent(); Rigidbody childRb = target.GetComponentInChildren(); Rigidbody parentRb = target.GetComponentInParent(); Log( "[ResetTrigger] Rigidbody scan: " + "root=" + RbName(rootRb) + ", child=" + RbName(childRb) + ", parent=" + RbName(parentRb) ); Vector3 resetPosition = Vector3.zero; Vector3 resetRotation = Vector3.zero; if (SpawnPoint != null && SpawnPoint.Exists) { resetPosition = SpawnPoint.transform.position; resetRotation = SpawnPoint.transform.eulerAngles; Log( "[ResetTrigger] SpawnPoint found: " + GetPath(SpawnPoint.transform) + " pos=" + resetPosition + " rot=" + resetRotation ); } else { Log("[ResetTrigger] No SpawnPoint assigned/found. Using origin."); } bool nameLooksPlayer = !string.IsNullOrWhiteSpace(info.ObjectName) && info.ObjectName.StartsWith("Player_"); bool hasUsername = !string.IsNullOrWhiteSpace(info.Username); Log( "[ResetTrigger] Player checks: " + "info.IsPlayer=" + info.IsPlayer + ", nameLooksPlayer=" + nameLooksPlayer + ", hasUsername=" + hasUsername ); if (info.IsPlayer || nameLooksPlayer || hasUsername) { Log( "[ResetTrigger] PLAYER RESET branch. Sending TeleportPlayer. " + "targetUsername='" + info.Username + "'" ); TeleportPlayer(info.Username, resetPosition, resetRotation); return; } Log("[ResetTrigger] DYNAMIC OBJECT branch."); Rigidbody rb = rootRb; if (rb == null) { LogWarning("[ResetTrigger] No root Rigidbody. Not resetting as dynamic object."); return; } target.transform.position = resetPosition; target.transform.rotation = Quaternion.Euler(resetRotation); rb.linearVelocity = Vector3.zero; rb.angularVelocity = Vector3.zero; SetLocalPosition(info.OtherObject, resetPosition); SetLocalRotation(info.OtherObject, resetRotation); Log("[ResetTrigger] Dynamic reset complete for " + target.name); } private string RbName(Rigidbody rb) { return rb == null ? "null" : GetPath(rb.transform); } private string GetPath(Transform t) { if (t == null) return "null"; string path = t.name; while (t.parent != null) { t = t.parent; path = t.name + "/" + path; } return path; } }