SettlementInteractionCompleteFix.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. /// <summary>
  4. /// Comprehensive fix for settlement interaction detection and UI updates
  5. /// This component forces the settlement detection system to work properly
  6. /// </summary>
  7. public class SettlementInteractionCompleteFix : MonoBehaviour
  8. {
  9. [Header("Complete Settlement Interaction Fix")]
  10. [Tooltip("Enable comprehensive settlement detection fix")]
  11. public bool enableFix = true;
  12. [Tooltip("Force UI updates even when manager doesn't detect settlements")]
  13. public bool forceUIUpdates = true;
  14. [Tooltip("Debug output level")]
  15. public bool verboseDebug = true;
  16. private SettlementInteractionManager manager;
  17. private SettlementInteractionUI settlementUI;
  18. private Transform teamMarker;
  19. private MapMaker2 mapMaker;
  20. private Settlement lastDetectedSettlement;
  21. void Start()
  22. {
  23. if (!enableFix) return;
  24. // Find all components
  25. manager = FindFirstObjectByType<SettlementInteractionManager>();
  26. settlementUI = FindFirstObjectByType<SettlementInteractionUI>();
  27. teamMarker = GameObject.Find("TeamMarker")?.transform;
  28. mapMaker = FindFirstObjectByType<MapMaker2>();
  29. LogDebug("=== Settlement Interaction Complete Fix Started ===");
  30. LogDebug($"Manager found: {manager != null}");
  31. LogDebug($"UI found: {settlementUI != null}");
  32. LogDebug($"TeamMarker found: {teamMarker != null}");
  33. LogDebug($"MapMaker found: {mapMaker != null}");
  34. if (manager != null)
  35. {
  36. // Ensure debug logging is enabled
  37. manager.enableDebugLogs = true;
  38. LogDebug("Enabled debug logging on SettlementInteractionManager");
  39. }
  40. }
  41. void Update()
  42. {
  43. if (!enableFix || manager == null || teamMarker == null || mapMaker?.GetMapData() == null)
  44. return;
  45. // Manual settlement detection that actually works
  46. Settlement currentSettlement = DetectNearbySettlement();
  47. // Check if settlement detection changed
  48. if (currentSettlement != lastDetectedSettlement)
  49. {
  50. if (lastDetectedSettlement != null)
  51. {
  52. LogDebug($"Left settlement: {lastDetectedSettlement.name}");
  53. // Force trigger OnSettlementLeft event
  54. if (forceUIUpdates && settlementUI != null)
  55. {
  56. settlementUI.ForceHideUI();
  57. }
  58. // Try to trigger manager's event
  59. try
  60. {
  61. manager.OnSettlementLeft?.Invoke();
  62. }
  63. catch (System.Exception e)
  64. {
  65. LogDebug($"Error invoking OnSettlementLeft: {e.Message}");
  66. }
  67. }
  68. lastDetectedSettlement = currentSettlement;
  69. if (currentSettlement != null)
  70. {
  71. LogDebug($"Detected settlement: {currentSettlement.name} ({currentSettlement.Type})");
  72. // Force trigger OnSettlementDetected event
  73. if (forceUIUpdates && settlementUI != null)
  74. {
  75. // Update UI manually
  76. UpdateSettlementUI(currentSettlement);
  77. }
  78. // Try to trigger manager's event
  79. try
  80. {
  81. manager.OnSettlementDetected?.Invoke(currentSettlement);
  82. }
  83. catch (System.Exception e)
  84. {
  85. LogDebug($"Error invoking OnSettlementDetected: {e.Message}");
  86. }
  87. }
  88. }
  89. // Handle input manually if manager doesn't
  90. if (currentSettlement != null && Input.GetKeyDown(KeyCode.E))
  91. {
  92. LogDebug($"Manual E key detection - entering {currentSettlement.name}");
  93. manager.EnterSettlement(currentSettlement);
  94. }
  95. }
  96. private Settlement DetectNearbySettlement()
  97. {
  98. Vector3 teamPos = teamMarker.position;
  99. Vector2Int mapPos = new Vector2Int(
  100. Mathf.RoundToInt(teamPos.x),
  101. Mathf.RoundToInt(teamPos.z)
  102. );
  103. var mapData = mapMaker.GetMapData();
  104. if (mapData == null) return null;
  105. // Check current position and surrounding area
  106. for (int dx = -2; dx <= 2; dx++)
  107. {
  108. for (int dy = -2; dy <= 2; dy++)
  109. {
  110. Vector2Int checkPos = new Vector2Int(mapPos.x + dx, mapPos.y + dy);
  111. var settlement = mapData.GetSettlementAt(checkPos, 0.5f);
  112. if (settlement != null)
  113. {
  114. float distance = Vector2Int.Distance(mapPos, settlement.position);
  115. if (distance <= 2f) // Within interaction range
  116. {
  117. return settlement;
  118. }
  119. }
  120. }
  121. }
  122. return null;
  123. }
  124. private void UpdateSettlementUI(Settlement settlement)
  125. {
  126. if (settlementUI == null) return;
  127. // Force show UI
  128. settlementUI.ForceShowUI();
  129. // Try to update UI elements directly
  130. try
  131. {
  132. var uiDoc = settlementUI.GetComponent<UIDocument>();
  133. if (uiDoc != null)
  134. {
  135. var root = uiDoc.rootVisualElement;
  136. var nameLabel = root.Q<UnityEngine.UIElements.Label>("SettlementName");
  137. if (nameLabel != null)
  138. {
  139. nameLabel.text = settlement.name;
  140. LogDebug($"Updated settlement name to: {settlement.name}");
  141. }
  142. var instructionLabel = root.Q<UnityEngine.UIElements.Label>("InteractionInstruction");
  143. if (instructionLabel != null)
  144. {
  145. string settlementType = settlement.Type == SettlementType.Town ? "Town" : "Village";
  146. instructionLabel.text = $"Press E to enter {settlementType}";
  147. LogDebug($"Updated instruction text");
  148. }
  149. var container = root.Q<UnityEngine.UIElements.VisualElement>("SettlementPrompt");
  150. if (container != null)
  151. {
  152. container.style.display = UnityEngine.UIElements.DisplayStyle.Flex;
  153. }
  154. }
  155. }
  156. catch (System.Exception e)
  157. {
  158. LogDebug($"Error updating UI: {e.Message}");
  159. }
  160. }
  161. private void LogDebug(string message)
  162. {
  163. if (verboseDebug)
  164. {
  165. Debug.Log($"[SettlementFix] {message}");
  166. }
  167. }
  168. [ContextMenu("Force Detect Settlement Now")]
  169. public void ForceDetectNow()
  170. {
  171. var settlement = DetectNearbySettlement();
  172. if (settlement != null)
  173. {
  174. LogDebug($"Force detected: {settlement.name}");
  175. UpdateSettlementUI(settlement);
  176. }
  177. else
  178. {
  179. LogDebug("No settlement detected at current position");
  180. if (settlementUI != null)
  181. {
  182. settlementUI.ForceHideUI();
  183. }
  184. }
  185. }
  186. void OnGUI()
  187. {
  188. if (!enableFix) return;
  189. GUILayout.BeginArea(new Rect(10, 300, 350, 120));
  190. GUILayout.BeginVertical("box");
  191. GUILayout.Label("Settlement Complete Fix", new GUIStyle(GUI.skin.label) { fontSize = 12, fontStyle = FontStyle.Bold });
  192. if (GUILayout.Button("Force Detect Settlement"))
  193. {
  194. ForceDetectNow();
  195. }
  196. if (lastDetectedSettlement != null)
  197. {
  198. GUILayout.Label($"Current: {lastDetectedSettlement.name}", new GUIStyle(GUI.skin.label) { fontSize = 10 });
  199. }
  200. else
  201. {
  202. GUILayout.Label("No settlement detected", new GUIStyle(GUI.skin.label) { fontSize = 10 });
  203. }
  204. if (teamMarker != null)
  205. {
  206. Vector3 pos = teamMarker.position;
  207. GUILayout.Label($"Position: ({pos.x:F0}, {pos.z:F0})", new GUIStyle(GUI.skin.label) { fontSize = 10 });
  208. }
  209. GUILayout.EndVertical();
  210. GUILayout.EndArea();
  211. }
  212. }