using UnityEngine; /// /// Temporary fix to force settlement detection to work /// This patches the coordinate conversion issue /// public class SettlementDetectionHotfix : MonoBehaviour { [Header("Settlement Detection Hotfix")] [Tooltip("Force settlement detection to work by improving coordinate conversion")] public bool enableHotfix = true; private SettlementInteractionManager settlementManager; void Start() { settlementManager = FindFirstObjectByType(); if (settlementManager != null && enableHotfix) { Debug.Log("[Hotfix] Settlement detection hotfix enabled"); } } void Update() { if (!enableHotfix || settlementManager == null) return; // Check if we should manually trigger settlement detection var teamMarker = GameObject.Find("TeamMarker"); if (teamMarker == null) return; Vector3 teamPos = teamMarker.transform.position; Vector2Int mapPos = new Vector2Int( Mathf.RoundToInt(teamPos.x), Mathf.RoundToInt(teamPos.z) ); // Force check the exact coordinate and nearby coordinates var mapMaker = FindFirstObjectByType(); if (mapMaker?.GetMapData() != null) { var mapData = mapMaker.GetMapData(); // Check current position and all adjacent positions Settlement foundSettlement = null; for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { Vector2Int checkPos = new Vector2Int(mapPos.x + dx, mapPos.y + dy); var settlement = mapData.GetSettlementAt(checkPos, 0.1f); // Very tight tolerance if (settlement != null) { foundSettlement = settlement; break; } } if (foundSettlement != null) break; } // If we found a settlement but the manager doesn't detect it, force the detection var currentDetected = settlementManager.GetCurrentNearbySettlement(); if (foundSettlement != null && currentDetected == null) { Debug.Log($"[Hotfix] Forcing settlement detection: {foundSettlement.name} at {foundSettlement.position}"); // Force manual entry when E is pressed if (Input.GetKeyDown(KeyCode.E)) { Debug.Log($"[Hotfix] Manually entering settlement: {foundSettlement.name}"); settlementManager.EnterSettlement(foundSettlement); } } } } [ContextMenu("Force Settlement Detection Now")] public void ForceDetectionNow() { var teamMarker = GameObject.Find("TeamMarker"); var mapMaker = FindFirstObjectByType(); if (teamMarker == null || mapMaker?.GetMapData() == null) { Debug.LogError("[Hotfix] Missing components for detection"); return; } Vector3 teamPos = teamMarker.transform.position; Vector2Int mapPos = new Vector2Int( Mathf.RoundToInt(teamPos.x), Mathf.RoundToInt(teamPos.z) ); Debug.Log($"[Hotfix] Checking position {mapPos} (world {teamPos})"); var mapData = mapMaker.GetMapData(); var allSettlements = mapData.GetAllSettlements(); foreach (var settlement in allSettlements) { float distance = Vector2Int.Distance(mapPos, settlement.position); Debug.Log($"[Hotfix] Settlement '{settlement.name}' at {settlement.position} - Distance: {distance:F2}"); if (distance <= 1.5f) { Debug.Log($"[Hotfix] 🎯 FOUND NEARBY: {settlement.name}"); if (settlementManager != null) { Debug.Log($"[Hotfix] Manually entering settlement: {settlement.name}"); settlementManager.EnterSettlement(settlement); return; } } } Debug.Log("[Hotfix] No settlement found within range"); } void OnGUI() { if (!enableHotfix) return; GUILayout.BeginArea(new Rect(Screen.width - 300, 10, 280, 100)); GUILayout.BeginVertical("box"); GUILayout.Label("Settlement Detection Hotfix", new GUIStyle(GUI.skin.label) { fontSize = 12, fontStyle = FontStyle.Bold }); if (GUILayout.Button("Force Enter Settlement")) { ForceDetectionNow(); } var teamMarker = GameObject.Find("TeamMarker"); if (teamMarker != null) { Vector3 pos = teamMarker.transform.position; GUILayout.Label($"Position: ({pos.x:F0}, {pos.z:F0})", new GUIStyle(GUI.skin.label) { fontSize = 10 }); } GUILayout.EndVertical(); GUILayout.EndArea(); } }