Tanoda
ToolAction.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Runtime.Serialization;
5using GILES;
6using NaughtyAttributes;
7using UnityEngine;
8using UnityEngine.UI;
9using Random = UnityEngine.Random;
11using System.Globalization;
12#if DANA
13using static Valve.VR.InteractionSystem.Hand;
14#endif
15#if !UNITY_WEBGL
16using Valve.VR.InteractionSystem;
17
18#endif
19
20public class ToolAction : ActionObject, ISerializable
21{
22 internal int toolIndex;
23 public Dropdown drop;
24 public GameObject NmInput;
25 public InputField NmInputField, taktTimeInput;
26
27 internal Vector3 targetPosition, targetRotation;
28 internal bool activated;
29 internal bool done, executed, hasSecondHighlight, destroyed;
30 private bool BrushGrabbed = false;
32 internal Vector3 currpos, currrot, secondPos, secondRot, secondOriginalPos, secondOriginalRot, originalPosition, originalRotation;
33 internal GameObject highlightObject, highlightTool, highlightSecond;
34 protected GameObject selectedGO, secondGO;
35 [SerializeField] private GameObject canvasSelector;
36 private GameObject canvasHierarchy;
37 public string selectedHash = "";
38 public string customToolHash = "";
39 public string secondGoHash = "";
41 private GameObject[] generatedTriggers;
42 internal GameObject finishBtn, inspector, canvas, stageManagerWindow, savedCustomTool;
43 internal int torqueNm;
44 private Coroutine mouseOver;
45 internal bool isRotated = false;
46 internal Quaternion origRotation;
47 internal float time = 0.0f;
48 public bool hasTwoObjects = false;
49 internal Transform originalSecondParent;
50 internal bool overload = false;
51 internal bool stopped = false;
52 internal bool following = false;
53 internal GameObject installedGO;
54
55 internal enum Tool
56 {
57 Screwdriver = 0,
58 Scanner,
59 Wrench,
60 SeegerPlier,
61 Filctoll,
62 GreaseBrush,
63 Hammer,
64 ClecoNutrunner,
65 SmolWrench,
66 CustomTool,
67 DigitalTorqueWrench,
68 LevegosPisztoly
69 }
70
71 public override void Start()
72 {
73 base.Start();
74#if DANA
78 smolwrench = ToolPositioner.instance.GetToolByName("torque wrench_smol");
81 brush = ToolPositioner.instance.GetToolByName("greaseCsobor").GetComponentInChildren<ThrowableCanDisable>(true).gameObject;
85#endif
86 canvasSelector = GameObject.Find("Canvas_selector");
87 stageManagerWindow = GameObject.Find("StageManager Window");
88
89 StartCoroutine(HideTCD());
90
91 // find inactive finish btn
92 canvas = GameObject.Find("Canvas");
93 var trs = canvas.GetComponentsInChildren<Transform>(true); // true: get inactive as well
94 foreach (var t in trs)
95 if (t.name == "Inspector")
96 inspector = t.gameObject;
97
98 trs = inspector.GetComponentsInChildren<Transform>(true);
99 foreach (var t in trs)
100 if (t.name == "FinishToolPos_Btn")
101 finishBtn = t.gameObject;
102 }
103
104 public override void OnPointerEnter(PointerEventData eventData)
105 {
106 if (targetPosition == default && (Tool)drop.value != Tool.GreaseBrush && (Tool)drop.value != Tool.ClecoNutrunner) return;
107
108 if (SavedUser.instance.isEditor || MiscLogicManager.instance.mode == MiscLogicManager.CurrentMode.Optimization)
109 mouseOver = StartCoroutine(ShowHighLight());
110 }
111 public override void OnPointerExit(PointerEventData eventData)
112 {
113 if (SavedUser.instance.isEditor || MiscLogicManager.instance.mode == MiscLogicManager.CurrentMode.Optimization)
114 {
115 if (mouseOver != null)
116 StopCoroutine(mouseOver);
117 Destroy(highlightObject);
118 Destroy(highlightTool);
119#if !UNITY_WEBGL
120 PreviewHand.Instance?.hideHandPreview(GetToolObject());
121#endif
122 }
123 }
124
125 public void SetToOriginalPos()
126 {
127 if (originalPosition == null) return;
128 GetToolObject().transform.position = originalPosition;
129 GetToolObject().transform.eulerAngles = originalRotation;
130 }
131 void ShowFinishBtn()
132 {
133 if (!inspector.activeSelf)
134 inspector.SetActive(true);
135
136 var btnOffset = finishBtn.transform.parent.GetComponent<RectTransform>().rect.width;
137 var spacing = 5f;
138 finishBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(-(btnOffset + spacing), 0);
139
140 finishBtn.SetActive(true);
141 }
142
143 void HideFinishBtn()
144 {
145#if DANA
147#endif
148 finishBtn.SetActive(false);
150 }
151
152 internal void SetupIfDigitalTW()
153 {
154#if DANA
155 NmInputField.text = torqueNm.ToString();
156 NmInput?.SetActive((Tool)toolIndex == Tool.DigitalTorqueWrench);
157#endif
158 }
159
160 public void SetSecondGoButton()
161 {
162#if DANA
164 if (go == null)
165 {
166 hasTwoObjects = false;
167 return;
168 }
169 secondGO = go;
170 secondGoHash = go.GetComponent<HashHolder>().Hash;
171 secondPos = go.transform.position;
172 secondRot = go.transform.eulerAngles;
173 hasTwoObjects = true;
174#endif
175 }
176
177 public void SetToolPosition()
178 {
179#if !DANA
180 var toolname = "";
181 var to = GetToolObject();
182 if (to != null) toolname = to.name;
183 toolname = toolname.Replace("(Clone)", "").Replace("_blue", "");
184
187 return;
188#endif
189 GameObject tool;
190 switch ((Tool)drop.value)
191 {
192 case Tool.Screwdriver:
193 tool = screwdriver;
194 break;
195 case Tool.Scanner:
196 tool = scanner;
197 break;
198 case Tool.Wrench:
199 tool = wrench;
200 break;
201 case Tool.SmolWrench:
202 tool = smolwrench;
203 break;
204 case Tool.SeegerPlier:
205 tool = seeger_plier;
206 break;
207 case Tool.Filctoll:
208 tool = filctoll;
209 break;
210 case Tool.Hammer:
211 tool = hammer;
212 break;
213 case Tool.DigitalTorqueWrench:
214 tool = digitalTorqueWrench;
215 break;
216 case Tool.LevegosPisztoly:
217 tool = levegosPisztoly;
218 break;
219 case Tool.GreaseBrush:
220 GetComponentInParent<Canvas>().enabled = false;
221 canvasSelector.GetComponent<Canvas>().enabled = true;
222 canvasSelector.GetComponentInChildren<Button>().onClick.AddListener(OnGreaseTargetSelected);
223
224 canvasHierarchy = GameObject.Find("Hierarchy");
225 if (canvasHierarchy == null)
226 {
227 Debug.LogError("Hierarchy not found!");
228 return;
229 }
230
231 canvasHierarchy.transform.SetParent(canvasSelector.transform, false);
232 return;
233 case Tool.ClecoNutrunner:
234 GetComponentInParent<Canvas>().enabled = false;
235 canvasSelector.GetComponent<Canvas>().enabled = true;
236 canvasSelector.GetComponentInChildren<Button>().onClick.AddListener(OnClecoNutrunnerTargetSelected);
237 return;
238 case Tool.CustomTool:
239 if (savedCustomTool)
240 {
241 tool = savedCustomTool;
242 break;
243 }
246 return;
247 default:
248 tool = null;
249 break;
250 }
251#if DANA
252 originalPosition = tool.transform.position;
253 originalRotation = tool.transform.eulerAngles;
254 if (targetPosition != default || targetRotation != default)
255 {
256 tool.transform.position = targetPosition;
257 tool.transform.eulerAngles = targetRotation;
258 }
259#endif
261 pb_SelectionHandle.instance.SetTool(GILES.Tool.Position);
262#if DANA
263 currpos = tool.transform.position;
264 currrot = tool.transform.eulerAngles;
265#endif
266 GameObject.Find("Btn_StageMgr").GetComponent<Button>().onClick.Invoke();
267 pb_Selection.AddOnRemovedFromSelectionListener(OnRemovedFromSelection);
268
269 finishBtn.GetComponent<Button>().onClick.RemoveAllListeners();
270 finishBtn.GetComponent<Button>().onClick.AddListener(OnFinishBtn);
271 ShowFinishBtn();
272 }
273
274 public void SelectedCustomTool(GameObject tool)
275 {
277
279 pb_SelectionHandle.instance.SetTool(GILES.Tool.Position);
280 savedCustomTool = tool;
281
282 currpos = tool.transform.position;
283 currrot = tool.transform.eulerAngles;
284 GameObject.Find("Btn_StageMgr").GetComponent<Button>().onClick.Invoke();
285 pb_Selection.AddOnRemovedFromSelectionListener(OnRemovedFromSelection);
286
287 finishBtn.GetComponent<Button>().onClick.RemoveAllListeners();
288 finishBtn.GetComponent<Button>().onClick.AddListener(OnFinishBtn);
289 ShowFinishBtn();
290 }
291
292 void OnGreaseTargetSelected()
293 {
294 canvasSelector.GetComponentInChildren<Button>().onClick.RemoveAllListeners();
296 GetComponentInParent<Canvas>().enabled = true;
297 canvasSelector.GetComponent<Canvas>().enabled = false;
298 canvasHierarchy.transform.SetParent(canvas.transform, false);
299
300 StartCoroutine(TriggerCollGen());
301 }
302
303 void OnClecoNutrunnerTargetSelected()
304 {
305 canvasSelector.GetComponentInChildren<Button>().onClick.RemoveAllListeners();
307 GetComponentInParent<Canvas>().enabled = true;
308 canvasSelector.GetComponent<Canvas>().enabled = false;
309 }
310
311 void OnFinishBtn()
312 {
313 var selection = pb_Selection.gameObjects;
314 ResetTool(selection, true);
315 }
316
317 void SaveTarget(Transform t)
318 {
319 targetPosition = t.position;
320 targetRotation = t.eulerAngles;
321 if ((Tool)drop.value == Tool.ClecoNutrunner)
322 {
323 targetPosition = selectedGO.transform.position;
324 targetRotation = selectedGO.transform.eulerAngles;
325 }
326 }
327
328 void ResetTool(IEnumerable<GameObject> selection, bool saveTarget = false)
329 {
330 foreach (var o in selection)
331 if (o == screwdriver || o == scanner || o == wrench || o == smolwrench || o == seeger_plier ||
332 o == filctoll || o == hammer || o == digitalTorqueWrench || o == levegosPisztoly || o.GetComponent<ToolGO>())
333 {
334 // turn on, unless already on
335 if (stageManagerWindow.GetComponent<CanvasGroup>().alpha == 0)
336 GameObject.Find("Btn_StageMgr").GetComponent<Button>().onClick.Invoke();
337
338#if !DANA
339 if (saveTarget) SaveTarget(o.transform);
340 o.transform.eulerAngles = currrot;
341 o.transform.position = currpos;
342#else
343
344 switch ((Tool)drop.value)
345 {
346 case Tool.Screwdriver:
347 if (saveTarget) SaveTarget(screwdriver.transform);
348 screwdriver.transform.eulerAngles = currrot;
349 screwdriver.transform.position = currpos;
350 break;
351
352 case Tool.Scanner:
353 if (saveTarget) SaveTarget(scanner.transform);
354 scanner.transform.eulerAngles = currrot;
355 scanner.transform.position = currpos;
356 break;
357
358 case Tool.Wrench:
359 if (saveTarget) SaveTarget(wrench.transform);
360 wrench.transform.eulerAngles = currrot;
361 wrench.transform.position = currpos;
362 break;
363
364 case Tool.SmolWrench:
365 if (saveTarget) SaveTarget(smolwrench.transform);
366 smolwrench.transform.eulerAngles = currrot;
367 smolwrench.transform.position = currpos;
368 break;
369
370 case Tool.DigitalTorqueWrench:
371 if (saveTarget) SaveTarget(digitalTorqueWrench.transform);
372 digitalTorqueWrench.transform.eulerAngles = currrot;
373 digitalTorqueWrench.transform.position = currpos;
374 break;
375
376 case Tool.SeegerPlier:
377 if (saveTarget) SaveTarget(seeger_plier.transform);
378 seeger_plier.transform.eulerAngles = currrot;
379 seeger_plier.transform.position = currpos;
380 break;
381
382 case Tool.Filctoll:
383 if (saveTarget) SaveTarget(filctoll.transform);
384 filctoll.transform.eulerAngles = currrot;
385 filctoll.transform.position = currpos;
386 break;
387
388 case Tool.Hammer:
389 if (saveTarget) SaveTarget(hammer.transform);
390 hammer.transform.eulerAngles = currrot;
391 hammer.transform.position = currpos;
392 break;
393
394 case Tool.LevegosPisztoly:
395 if (saveTarget) SaveTarget(levegosPisztoly.transform);
396 levegosPisztoly.transform.eulerAngles = currrot;
397 levegosPisztoly.transform.position = currpos;
398 break;
399
400 case Tool.CustomTool:
401 if (saveTarget) SaveTarget(o.transform);
402 o.transform.eulerAngles = currrot;
403 o.transform.position = currpos;
404 break;
405 }
406#endif
407
408 pb_Selection.instance.OnRemovedFromSelection -= OnRemovedFromSelection;
409 }
410
411 HideFinishBtn();
412 }
413
414
415 void OnRemovedFromSelection(IEnumerable<GameObject> selection)
416 {
417 ResetTool(selection);
418 }
419
420
421 protected bool InGoodPos(Transform t)
422 {
423 if (Math.Abs(t.position.x - ((secondGO && t == secondGO.transform) ? secondPos.x : targetPosition.x) /* + iris.position.x*/) > 0.05f) return false;
424 if (Math.Abs(t.position.y - ((secondGO && t == secondGO.transform) ? secondPos.y : targetPosition.y) /* + iris.position.y*/) > 0.05f) return false;
425 if (Math.Abs(t.position.z - ((secondGO && t == secondGO.transform) ? secondPos.z : targetPosition.z) /* + iris.position.z*/) > 0.09f) return false;
426
427 return true;
428 }
429
430 protected bool InGoodRot(Transform t)
431 {
432 if (Quaternion.Angle(t.rotation, Quaternion.Euler(targetRotation)) < 25) return true;
433 byte checker = 0;
434 if (Math.Abs(Clamp0360(t.eulerAngles.x) - Clamp0360(targetRotation.x)) < 25 ||
435 Math.Abs(Clamp0360(t.eulerAngles.x) - Clamp0360(targetRotation.x)) > 360 - 25) checker++;
436 if (Math.Abs(Clamp0360(t.eulerAngles.y) - Clamp0360(targetRotation.y)) < 25 ||
437 Math.Abs(Clamp0360(t.eulerAngles.y) - Clamp0360(targetRotation.y)) > 360 - 25) checker++;
438 if (Math.Abs(Clamp0360(t.eulerAngles.z) - Clamp0360(targetRotation.z)) < 25 ||
439 Math.Abs(Clamp0360(t.eulerAngles.z) - Clamp0360(targetRotation.z)) > 360 - 25) checker++;
440 if (checker >= 2) return true;
441
442 checker = 0;
443 if (Math.Abs(Math.Abs(Clamp0360(t.eulerAngles.x) - Clamp0360(targetRotation.x)) - 180) < 25) checker++;
444 if (Math.Abs(Math.Abs(Clamp0360(t.eulerAngles.y) - Clamp0360(targetRotation.y)) - 180) < 25) checker++;
445 if (Math.Abs(Math.Abs(Clamp0360(t.eulerAngles.z) - Clamp0360(targetRotation.z)) - 180) < 25) checker++;
446 if (checker >= 2) return true;
447
448 return false;
449 }
450
451 public static float Clamp0360(float eulerAngles)
452 {
453 var result = eulerAngles - Mathf.CeilToInt(eulerAngles / 360f) * 360f;
454 if (result < 0) result += 360f;
455 return result;
456 }
457
458 new void Update()
459 {
460
461 base.Update();
462
463 if (base.isInFieldOfView(GetToolObject())) base.actionRecognized = true;
464
465
466 if (!activated || done) return;
467
468 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
469 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
470
471 var tool = GetToolObject();
472 //if (tool == null)
473 //{
474 if ((Tool)drop.value == Tool.GreaseBrush)
475 {
476#if !UNITY_WEBGL
477 if (brush.GetComponent<ThrowableCanDisable>().IsAttachedToHand())
478 {
480 }
481 if (brush.GetComponent<ThrowableCanDisable>().IsAttachedToHand() && !highlightObject && !executed)
482 {
483 StartCoroutine(ShowHighLight());
485 //return;
486 }
487#endif
488 //return;
489 }
490 //return;
491 //}
492
493 //bool isRunning = false;
494 //if (tool.GetComponent<TwoHandGrab>() == null) isRunning = false;
495 //if (tool.GetComponent<TwoHandGrab>() != null) isRunning = tool.GetComponent<TwoHandGrab>().isRunning;
496
497 var t = tool.transform;
498#if !UNITY_WEBGL
499 if (hasTwoObjects && !destroyed)
500 {
501 if (secondGO.transform.parent != originalSecondParent)
502 {
503 Destroy(highlightSecond);
504 hasSecondHighlight = true;
505 destroyed = true;
506 }
507
508 }
509 if (tool.GetComponent<ThrowableCanDisable>() && !tool.GetComponent<ThrowableCanDisable>().IsAttachedToHand() /*&&/* !isRunning*/) return;
510 time += Time.deltaTime;
511 if (tool.GetComponentInParent<HandCopyAvg>() && tool.GetComponentInParent<HandCopyAvg>().release() && time >= 2.0f)
512 {
513 if ((Tool)drop.value == Tool.Wrench) //TorqueWrench
514 if (TorqueWrench.instance.isInUse) return;
515
516 if ((Tool)drop.value == Tool.DigitalTorqueWrench)
518
519 if ((Tool)drop.value == Tool.SmolWrench)
520 if (!TorqueWrenchSmol.instance.isInUse) return;
521
522 tool.GetComponent<ThrowableCanDisable>().ForceDrop();
524 {
525 ToolPositioner.instance.GetToolBlue(tool).GetComponent<LerpToMe>().DoTheLerp(tool);
526 }
527 time = 0.0f;
528
529 }
530 if (!highlightObject && !executed)
531 {
532 Destroy(highlightObject);
533 if (hasTwoObjects && !hasSecondHighlight)
534 {
535 if (!following)
536 {
538 StartCoroutine(ShowSecondPreview(secondGO));
539 following = true;
540 }
541
542 //StartCoroutine(ShowPreview(secondGO.transform.position, secondGO));
543 return;
544 }
545 StartCoroutine(ShowHighLight());
546 if (hasTwoObjects) StartCoroutine(ShowSecondGOHighLightTarget());
548 {
549 if ((Tool)drop.value == Tool.GreaseBrush)
550 {
552 }
553 else
554 {
555 FollowMe.Instance?.StartFollowing(targetPosition, selectedGO);
556 }
557
558 }
559
560 //StartCoroutine(ShowPreview(targetPosition));
561
562 }
563 if (hasTwoObjects)
564 {
566 }
567 PreviewHand.Instance?.hideHandPreview(GetToolObject());
568
569#endif
570#region Auto Rotation
571 if ((Tool)drop.value != Tool.Hammer && (Tool)drop.value != Tool.GreaseBrush)
572 {
573 var dist = Vector3.Distance(t.position, targetPosition);
574
575 if (dist < 0.15f)
576 {
577 if (!isRotated)
578 {
579 origRotation = t.localRotation;
580 isRotated = true;
581 }
582
583 t.eulerAngles = Macro.LerpAngle((t.parent.rotation * origRotation).eulerAngles, targetRotation, Mathf.Max(0, 1f - Mathf.Max(0, dist - 0.05f) * 10));
584 }
585 }
586
587
588#endregion
589
590 if (!executed && InGoodPos(t) && (InGoodRot(t)
591#if DANA
592 || (Tool)drop.value == Tool.Wrench || (Tool)drop.value == Tool.SmolWrench ||
593 (Tool)drop.value == Tool.Hammer || (Tool)drop.value == Tool.DigitalTorqueWrench || (Tool)drop.value == Tool.GreaseBrush
594#endif
595 ))
596 {
597#if !DANA
598 TriggerOutput(outPuts[0].name);
599 activated = false;
600 done = true;
601 Destroy(highlightTool);
603 Destroy(highlightObject);
604 return;
605#endif
606 if (hasTwoObjects && !InGoodPos(secondGO.transform))
607 {
608 return;
609 }
610 if ((Tool)drop.value == Tool.Wrench) //TorqueWrench
611 {
613 {
614 wrench.transform.eulerAngles = targetRotation;
615 wrench.transform.position = targetPosition;
618 executed = true;
619 }
620 else
621 {
622 return;
623 }
624 }
625 else if ((Tool)drop.value == Tool.SmolWrench) //TorqueWrench
626 {
628 {
629 smolwrench.transform.eulerAngles = targetRotation;
630 smolwrench.transform.position = targetPosition;
633 executed = true;
634 }
635 else
636 {
637 return;
638 }
639 }
640 else if ((Tool)drop.value == Tool.DigitalTorqueWrench) //TorqueWrench
641 {
643 {
644 digitalTorqueWrench.transform.eulerAngles = targetRotation;
645 digitalTorqueWrench.transform.position = targetPosition;
649 executed = true;
650
651 }
652 else
653 {
654 return;
655 }
656 }
657 else
658 {
659 if ((Tool)drop.value == Tool.Screwdriver)
660 screwdriver.GetComponent<AudioSource>()?.Play();
661
662 if ((Tool)drop.value == Tool.SeegerPlier)
664 return;
665
666 //TriggerOutput(outPuts[0].name);
667 //activated = false;
668 //done = true;
669 executed = true;
670 Destroy(highlightTool);
671 if (hasTwoObjects) Destroy(highlightSecond);
673 }
674
675 Destroy(highlightObject);
676 if (!action.Contains("HoldTool") && nextActionIsTheSame() && (Tool)drop.value != Tool.DigitalTorqueWrench)
677 {
678 StartCoroutine(LateOnPutToolDown());
679 }
680
681 //var action = Controller.Instance.GetActionByInOut(Controller.Instance.GetConnectionByEndPointId(outPuts[0].name).toId);
682 //if (action is ToolAction ta)
683 //{
684 // if (toolIndex == ta.toolIndex)
685 // {
686 // if (selectedHash == ta.selectedHash)
687 // {
688 // OnToolPutDown();
689 // }
690 // if ((Tool)drop.value == (Tool)ta.drop.value)
691 // {
692 // OnToolPutDown();
693 // }
694 // }
695 //}
696 }
697 }
698
699 internal GameObject GetToolObject()
700 {
701 GameObject tool;
702#if !DANA
703 tool = savedCustomTool;
704#else
705 switch ((Tool)drop.value)
706 {
707 case Tool.Screwdriver:
708 tool = screwdriver;
709 break;
710 case Tool.Scanner:
711 tool = scanner;
712 break;
713 case Tool.Wrench:
714 tool = wrench;
715 break;
716 case Tool.SmolWrench:
717 tool = smolwrench;
718 break;
719 case Tool.DigitalTorqueWrench:
720 tool = digitalTorqueWrench;
721 break;
722 case Tool.SeegerPlier:
723 tool = seeger_plier;
724 break;
725 case Tool.Filctoll:
726 tool = filctoll;
727 break;
728 case Tool.GreaseBrush:
729 tool = brush;
730 break;
731 case Tool.ClecoNutrunner:
732 return null;
733 case Tool.Hammer:
734 tool = hammer;
735 break;
736 case Tool.LevegosPisztoly:
737 tool = levegosPisztoly;
738 break;
739 case Tool.CustomTool:
740 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
741 {
742 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
743
744 }
745 tool = savedCustomTool;
746 break;
747 default:
748 tool = null;
749 break;
750 }
751
752#endif
753 return tool;
754 }
755 public void onTaktTimeChanged(string value)
756 {
757 try
758 {
759 var ci = CultureInfo.CurrentCulture;
760 var nfi = ci.NumberFormat;
761 taktTimeInput.text = taktTimeInput.text.Replace(',', nfi.CurrencyDecimalSeparator[0]);
762 taktTimeInput.text = taktTimeInput.text.Replace('.', nfi.CurrencyDecimalSeparator[0]);
763 var single = Convert.ToSingle(taktTimeInput.text, ci);
764 taktTimeInput.text = single.ToString("F2");
765 taktTime = single;
766 taktTime = float.Parse(value, ci);
767 }
768 catch (Exception)
769 {
770 Debug.LogWarning("not parsable number(?) in holdTime inputfield!");
771
772 // restore last valid numbers
773 taktTimeInput.text = taktTime.ToString("F2");
774 }
775 }
776 internal IEnumerator ShowHighLight() //GREEN
777 {
778 if (highlightObject) Destroy(highlightObject);
779
780 if (MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Training && MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Optimization) yield break;
781
782 if (!selectedGO)
784
785 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
786 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
787
788 yield return new WaitForEndOfFrame();
789
790 if (done && IsCounting) yield break;
791
792 GameObject cachedGO;
793 var inflate = false;
794#if !DANA
795 cachedGO = savedCustomTool;
796#else
797 switch ((Tool)drop.value)
798 {
799 case Tool.Screwdriver:
800 cachedGO = screwdriver;
801 break;
802 case Tool.Scanner:
803 cachedGO = scanner;
804 break;
805 case Tool.Wrench:
806 cachedGO = wrench;
807 break;
808 case Tool.SmolWrench:
809 cachedGO = smolwrench;
810 break;
811 case Tool.DigitalTorqueWrench:
812 cachedGO = digitalTorqueWrench;
813 break;
814 case Tool.SeegerPlier:
815 cachedGO = seeger_plier;
816 break;
817 case Tool.Filctoll:
818 cachedGO = filctoll;
819 break;
820 case Tool.CustomTool:
821 cachedGO = savedCustomTool;
822 break;
823 case Tool.Hammer:
824 cachedGO = hammer;
825 break;
826 case Tool.LevegosPisztoly:
827 cachedGO = levegosPisztoly;
828 break;
829 case Tool.GreaseBrush:
830 cachedGO = selectedGO;
831 SaveTarget(selectedGO.transform);
832 inflate = true;
833 break;
834 case Tool.ClecoNutrunner:
835 cachedGO = selectedGO;
836 SaveTarget(selectedGO.transform);
837 inflate = true;
838 break;
839 default:
840 cachedGO = null;
841 break;
842 }
843#endif
844
845 highlightObject = Instantiate(cachedGO, targetPosition, Quaternion.Euler(targetRotation), cachedGO.transform.parent);
846 highlightObject.transform.position = targetPosition;
847 highlightObject.transform.eulerAngles = targetRotation;
848#if !UNITY_WEBGL
849 Destroy(highlightObject.GetComponent<TorqueWrench>());
850 Destroy(highlightObject.GetComponent<SeegerHelper>());
851 Destroy(highlightObject.GetComponent<ThrowableCanDisable>());
852 Destroy(highlightObject.GetComponent<Interactable>());
853#endif
854
855 var allCollider = highlightObject.GetComponentsInChildren<Collider>();
856 var allRb = highlightObject.GetComponentsInChildren<Rigidbody>();
857
858 foreach (var c in allCollider)
859 Destroy(c);
860
861 foreach (var c in allRb)
862 Destroy(c);
863
864 Destroy(highlightObject.GetComponent<HashHolder>());
865
866 yield return new WaitForEndOfFrame();
867
868 if (done && IsCounting)
869 {
870 Destroy(highlightObject);
871 yield break;
872 }
873
874 highlightObject.transform.SetPositionAndRotation(targetPosition, Quaternion.Euler(targetRotation));
875 highlightObject.transform.position = targetPosition;
876 highlightObject.transform.eulerAngles = targetRotation;
877
878 if (inflate)
879 highlightObject.transform.localScale *= 1.001f;
880
881 highlightObject.transform.SetParent(null, true);
882 highlightObject.SetActive(true);
883 MatChange(highlightObject);
884 if (highlightTool) highlightTool.SetActive(false);
885 }
886
887 private IEnumerator ShowPreview(Vector3 TargetPosition, GameObject TargetObject)
888 {
889 if (MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Training && MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Optimization) yield break;
890 yield return new WaitForEndOfFrame();
891
892#if !UNITY_WEBGL
893
894
895 if ((Tool)drop.value != Tool.ClecoNutrunner)
896 {
897 PreviewHand.Instance?.EnterOffsetEditor(TargetObject, this, targetPosition, targetRotation);
898
899
900 }
901 FollowMe.Instance?.StartFollowing(TargetPosition, TargetObject);
902
903#endif
904 yield return null;
905
906 }
907 private IEnumerator ShowSecondPreview(GameObject Target)
908 {
909 yield return new WaitForEndOfFrame();
910#if !UNITY_WEBGL
911 PreviewHand.Instance?.EnterOffsetEditor(Target, this, Target.transform.position, Target.transform.eulerAngles);
912 FollowMe.Instance?.StartFollowing(Target.transform.position, Target);
913#endif
914 }
915 private IEnumerator ShowToolHighLight() //BLUE
916 {
917 if (highlightTool) Destroy(highlightTool);
918
919 if (MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Training && MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Optimization) yield break;
920
921 if (!selectedGO)
923
924 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
925 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
926
927 yield return new WaitForEndOfFrame();
928
929 GameObject cachedGO;
930 var inflate = true;
931
932#if !DANA
933 cachedGO = savedCustomTool;
934#else
935 switch ((Tool)drop.value)
936 {
937 case Tool.Screwdriver:
938 cachedGO = screwdriver;
939 break;
940 case Tool.Scanner:
941 cachedGO = scanner;
942 break;
943 case Tool.Wrench:
944 cachedGO = wrench;
945 break;
946 case Tool.SmolWrench:
947 cachedGO = smolwrench;
948 break;
949 case Tool.DigitalTorqueWrench:
950 cachedGO = digitalTorqueWrench;
951 break;
952 case Tool.SeegerPlier:
953 cachedGO = seeger_plier;
954 break;
955 case Tool.Filctoll:
956 cachedGO = filctoll;
957 break;
958 case Tool.Hammer:
959 cachedGO = hammer;
960 break;
961 case Tool.LevegosPisztoly:
962 cachedGO = levegosPisztoly;
963 break;
964 case Tool.GreaseBrush:
965 cachedGO = brush;
966 break;
967 case Tool.CustomTool:
968 cachedGO = savedCustomTool;
969 /*yield */
970 break;
971 default:
972 yield break;
973 }
974#endif
975 if (cachedGO == null) Debug.LogError("ShowToolHighlight tool is null!");
976
977 highlightTool = Instantiate(cachedGO, cachedGO.transform.position, cachedGO.transform.rotation, null);
978#if !UNITY_WEBGL
979 Destroy(highlightTool.GetComponent<TorqueWrench>());
980 Destroy(highlightTool.GetComponent<SeegerHelper>());
981 Destroy(highlightTool.GetComponent<ThrowableCanDisable>());
982 Destroy(highlightTool.GetComponent<Interactable>());
983#endif
984 var allCollider = highlightTool.GetComponentsInChildren<Collider>();
985 var allRb = highlightTool.GetComponentsInChildren<Rigidbody>();
986
987 foreach (var c in allCollider)
988 Destroy(c);
989
990 foreach (var c in allRb)
991 Destroy(c);
992
993 Destroy(highlightTool.GetComponent<HashHolder>());
994
995 yield return new WaitForEndOfFrame();
996
997 highlightTool.transform.SetPositionAndRotation(cachedGO.transform.position, cachedGO.transform.rotation);
998
999 if (inflate)
1000 highlightTool.transform.localScale *= 1.001f;
1001
1002 highlightTool.SetActive(true);
1003
1004 MatChange(highlightTool, true);
1005 }
1006
1007 protected IEnumerator ShowSecondGOHighLight(Vector3 pos, Vector3 rot)
1008 {
1009 if (highlightSecond) Destroy(highlightSecond);
1010
1011 if (MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Training && MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Optimization) yield break;
1012
1013 yield return new WaitForEndOfFrame();
1014#if !UNITY_WEBGL
1015 highlightSecond = Instantiate(secondGO, pos, Quaternion.Euler(rot),
1016 secondGO.transform.parent);
1017 highlightSecond.transform.position = pos;
1018 highlightSecond.transform.eulerAngles = rot;
1019#if !UNITY_WEBGL
1020 Destroy(highlightSecond.GetComponent<ThrowableCanDisable>());
1021 //Destroy(highlightObject.GetComponent<TwoHandGrab>());
1022 Destroy(highlightSecond.GetComponent<Interactable>());
1023#endif
1024 Destroy(highlightSecond.GetComponent<Rigidbody>());
1025 var allCollider = highlightSecond.GetComponentsInChildren<Collider>();
1026 foreach (var coll in allCollider)
1027 {
1028 Destroy(coll);
1029 }
1030
1031 highlightSecond.transform.SetParent(originalSecondParent, true);
1032
1033
1034 yield return new WaitForEndOfFrame();
1035
1036 highlightSecond.transform.SetPositionAndRotation(pos, Quaternion.Euler(rot));
1037 highlightSecond.transform.position = pos;
1038 highlightSecond.transform.eulerAngles = rot;
1039
1040 MatChange(highlightSecond, true);
1041#endif
1042 }
1043
1044 protected IEnumerator ShowSecondGOHighLightTarget()
1045 {
1046 if (highlightSecond) Destroy(highlightSecond);
1047
1048 if (MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Training && MiscLogicManager.instance.mode != MiscLogicManager.CurrentMode.Optimization) yield break;
1049
1050 yield return new WaitForEndOfFrame();
1051#if !UNITY_WEBGL
1052 highlightSecond = Instantiate(secondGO, secondPos, Quaternion.Euler(secondRot),
1053 secondGO.transform.parent);
1054 highlightSecond.transform.position = secondPos;
1055 highlightSecond.transform.eulerAngles = secondRot;
1056#if !UNITY_WEBGL
1057 Destroy(highlightSecond.GetComponent<ThrowableCanDisable>());
1058 //Destroy(highlightObject.GetComponent<TwoHandGrab>());
1059 Destroy(highlightSecond.GetComponent<Interactable>());
1060#endif
1061 Destroy(highlightSecond.GetComponent<Rigidbody>());
1062 var allCollider = highlightSecond.GetComponentsInChildren<Collider>();
1063 foreach (var coll in allCollider)
1064 {
1065 Destroy(coll);
1066 }
1067
1068 highlightSecond.transform.SetParent(originalSecondParent, true);
1069
1070
1071 yield return new WaitForEndOfFrame();
1072
1073 highlightSecond.transform.SetPositionAndRotation(secondPos, Quaternion.Euler(secondRot));
1074 highlightSecond.transform.position = secondPos;
1075 highlightSecond.transform.eulerAngles = secondRot;
1076
1077 MatChange(highlightSecond, true);
1078#endif
1079 }
1080
1081 private void MatChange(GameObject go, bool tool = false)
1082 {
1083 var mrs = go.GetComponentsInChildren<MeshRenderer>();
1084 foreach (var meshRenderer in mrs)
1085 {
1086 var list = new List<Material>();
1087 for (var i = 0; i < meshRenderer.materials.Length; i++)
1088 list.Add(tool ? highlightToolMaterial : highlightMaterial);
1089
1090 meshRenderer.materials = list.ToArray();
1091 }
1092 }
1093
1094 protected void TriggerNext()
1095 {
1096 TorqueWrench.instance?.screwedIn.RemoveListener(TriggerNext);
1099
1100
1102 Destroy(highlightTool);
1103
1104 StopAllCoroutines();
1105 StartCoroutine(LateOnPutToolDown());
1106
1107 StartCoroutine(Cleanup());
1108
1109 }
1110 private IEnumerator LateOnPutToolDown()
1111 {
1112 yield return null;
1113#if !UNITY_WEBGL
1114 if (nextActionIsTheSame()) OnToolPutDown();
1115 else
1116 {
1117 var tcd = GetToolObject().GetComponent<ThrowableCanDisable>();
1118
1119 if (tcd.onDetachFromHand == null)
1120 tcd.onDetachFromHand = new UnityEngine.Events.UnityEvent();
1121 tcd.onDetachFromHand.AddListener(OnToolPutDown);
1122 }
1123#endif
1124 }
1125 internal bool nextActionIsTheSame()
1126 {
1127 //var action = Controller.Instance.GetActionByInOut(Controller.Instance.GetConnectionByEndPointId(outPuts[0].name).toId);
1128 //var actions = Controller.Instance.GetActionsByOut(outPuts[0].name);
1129 var connections = Controller.Instance.GetOutputConnectionsToObject(name);
1130 foreach (var conn in connections)
1131 {
1133 var actions = Controller.Instance.GetActionsByIn(c.toId);
1134
1135 foreach (var act in actions)
1136 {
1137 if (act is ToolAction ta)
1138 {
1139 if (toolIndex == ta.toolIndex)
1140 {
1141 if (selectedHash == ta.selectedHash)
1142 {
1143 return true;
1144 }
1145 if ((Tool)drop.value == (Tool)ta.drop.value)
1146 {
1147 return true;
1148 }
1149 }
1150 }
1151 }
1152 }
1153
1154
1155 return false;
1156
1157 }
1158 private IEnumerator Cleanup()
1159 {
1160 yield return null;
1161 Destroy(highlightTool);
1162 Destroy(highlightObject);
1163 yield return null;
1164 Destroy(highlightTool);
1165 Destroy(highlightObject);
1166 yield return null;
1167 Destroy(highlightTool);
1168 Destroy(highlightObject);
1169 yield return null;
1170 Destroy(highlightTool);
1171 Destroy(highlightObject);
1172 }
1173
1174 public void NmInputEnded(string input)
1175 {
1176 torqueNm = Convert.ToInt32(input);
1177 }
1178
1179 public void OnSelectionChanged(int value)
1180 {
1181 toolIndex = value;
1182#if DANA
1183 NmInput?.SetActive((Tool)toolIndex == Tool.DigitalTorqueWrench);
1184#endif
1185
1186 GetToolObject()?.SetActive(true);
1187 }
1188
1189 [Button]
1190 private void Teszt()
1191 {
1192 Triggered("");
1193 }
1194
1195 [Button]
1196 private void Done()
1197 {
1198 TriggerOutput(outPuts[0].name);
1199 activated = false;
1200 done = true;
1201 Destroy(highlightObject);
1202 Destroy(highlightTool);
1203 StopAllCoroutines();
1204 }
1205
1206 private IEnumerator TriggerCollGen()
1207 {
1208 var target = selectedGO.GetComponentInChildren<MeshRenderer>().gameObject;
1209 var isActive = target.activeSelf;
1210 target.SetActive(true);
1211 yield return null;
1212 var mc = target.AddComponent<MeshCollider>();
1213 var origScale = target.transform.localScale;
1214 var origPos = target.transform.position;
1215
1216 target.transform.position = Vector3.one * 999 * (Random.value + 1);
1217
1218 //target.transform.localScale *= 1/Macro.SmallestAxis(mc.bounds.size);
1219 //target.transform.localScale *= 0.25f;
1220 //yield return new WaitForEndOfFrame();
1221 var teg = target.AddComponent<TriggerEventGenerator>();
1222 if (teg.OnTrigger == null) teg.OnTrigger = new UnityEngine.Events.UnityEvent();
1223 teg.OnTrigger.AddListener(TriggerOutput);
1224 generatedTriggers = teg.GenerateThreadLocking();
1225 //target.transform.localScale = origScale;
1226 target.transform.position = origPos;
1227 foreach (var generatedTrigger in generatedTriggers) generatedTrigger.SetActive(false);
1228 Destroy(mc);
1229 target.SetActive(isActive);
1230 yield return null;
1231 }
1232
1233 private void TriggerOutput()
1234 {
1235 //TriggerOutput(outPuts[0].name);
1237 {
1238 var tool = GetToolObject();
1239 if (tool && !nextActionIsTheSame())
1240 {
1241 tool.GetComponent<ThrowableCanDisable>().enabled = false;
1242 }
1243 }
1244 activated = false;
1245 done = true;
1246 Destroy(highlightTool);
1247 BrushGrabbed = false;
1248 if ((Tool)drop.value == Tool.GreaseBrush)
1249 Destroy(highlightObject);
1250 }
1251
1252 public override void Triggered(string id)
1253 {
1254 StartCoroutine(LateTrigger(id));
1255
1256 }
1257
1258 public IEnumerator HideTCD()
1259 {
1260 yield return null;
1261
1263 {
1264 //Debug.LogError("Training (nem error)");
1265 var tool = GetToolObject();
1266 //Debug.LogError($"tool: {tool}");
1267 if (tool)
1268 {
1269 tool.GetComponent<ThrowableCanDisable>().enabled = false;
1270 //Debug.LogError($"elvileg kész");
1271 }
1272 }
1273 }
1274 public IEnumerator SetGameObjectJob(string hash)
1275 {
1276 if (selectedHash == "")
1277 selectedHash = hash;
1278
1279 yield return null;
1280 while (LoadingManager.instance.isLoading) yield return null;
1281 SetGameObject(hash);
1282
1283 GetToolObject()?.SetActive(true);
1284
1285 if ((Tool)drop.value == Tool.GreaseBrush)
1286 {
1287 brush.transform.parent.gameObject.SetActive(true);
1288 }
1289 }
1290
1291 public GameObject GetGameObject()
1292 {
1293 if (selectedGO)
1294 return selectedGO;
1295
1296 if (!string.IsNullOrEmpty(selectedHash))
1297 return HashingManager.instance.GetGOFromHash(selectedHash);
1298
1299 return null;
1300 }
1301
1302 public void SetGameObject(string hash)
1303 {
1304 if (hash == "") return;
1305 selectedGO = HashingManager.instance.GetGOFromHash(hash);
1306 if (selectedGO && (Tool)drop.value == Tool.GreaseBrush)
1307 StartCoroutine(TriggerCollGen());
1308 else if (selectedGO && (Tool)drop.value == Tool.ClecoNutrunner)
1309 {
1311
1312 if (!action.Contains("HoldTool"))
1313 ClecoTrigger.instance.triggerEnter.AddListener(ClecoCallback);
1314 }
1315 }
1316 public new void RefreshTargetDisplay()
1317 {
1318 taktTimeInput.text = taktTime.ToString("F2");
1319 }
1320 private void OnToolPutDown()
1321 {
1322#if !UNITY_WEBGL
1323 if (GetToolObject())
1324 {
1325 var rb = GetToolObject().GetComponentInChildren<Rigidbody>();
1326 if (rb)
1327 {
1328 rb.isKinematic = true;
1329 rb.useGravity = false;
1330 rb.velocity = Vector3.zero;
1331 }
1332 }
1333 if (!highlightTool)
1334 {
1335 TriggerOutput(outPuts[0].name);
1337 {
1338 if (!nextActionIsTheSame())
1339 {
1340 if (GetToolObject() == null)
1341 {
1342 savedCustomTool.GetComponent<ThrowableCanDisable>().enabled = false;
1343 savedCustomTool.GetComponent<ThrowableCanDisable>().actionOver = true;
1344 }
1345 else
1346 {
1347 GetToolObject().GetComponent<ThrowableCanDisable>().enabled = false;
1348 GetToolObject().GetComponent<ThrowableCanDisable>().actionOver = true;
1349 }
1350 }
1351
1352 }
1353 if (hasTwoObjects)
1354 {
1355 var tcd = secondGO.GetComponent<ThrowableCanDisable>();
1356 var rb = secondGO.GetComponent<Rigidbody>();
1357 rb.isKinematic = true;
1358 tcd.ForceDrop();
1359 tcd.enabled = false;
1360 secondGO.transform.position = secondOriginalPos;
1361 secondGO.transform.eulerAngles = secondOriginalRot;
1362 }
1363 activated = false;
1364 done = true;
1365 Destroy(highlightTool);
1366 Destroy(highlightObject);
1368
1369 //cleanup
1370 try
1371 {
1372 var tool = GetToolObject();
1373 if ((Tool)drop.value == Tool.GreaseBrush) tool = brush;
1374 var tcd = tool.GetComponent<ThrowableCanDisable>();
1375 tcd.enabled = false;
1376 tcd.onDetachFromHand.RemoveListener(OnToolPutDown);
1377 }
1378 catch (Exception)
1379 {
1380 // ignored
1381 }
1382 }
1383#endif
1384 }
1385 IEnumerator LateTrigger(string id)
1386 {
1387 yield return new WaitForSeconds(0.5f);
1388
1389 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
1390 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
1391
1392 base.Triggered(id);
1393#if !UNITY_WEBGL
1394 //if (MiscLogicManager.instance.mode == MiscLogicManager.CurrentMode.Training || MiscLogicManager.instance.mode == MiscLogicManager.CurrentMode.Optimization)
1395 {
1396 if (GetToolObject() == null && savedCustomTool != null)
1397 {
1398 savedCustomTool.GetComponent<ThrowableCanDisable>().enabled = true;
1399 savedCustomTool.GetComponent<ThrowableCanDisable>().actionOver = false;
1400 savedCustomTool.GetComponent<ThrowableCanDisable>().wrong = true;
1401 }
1402 if (GetToolObject() != null && GetToolObject().GetComponent<ThrowableCanDisable>())
1403 {
1404 GetToolObject().GetComponent<ThrowableCanDisable>().enabled = true;
1405 GetToolObject().GetComponent<ThrowableCanDisable>().actionOver = false;
1406 GetToolObject().GetComponent<ThrowableCanDisable>().wrong = true;
1407 }
1408 }
1409 activated = true;
1410
1411 if (!savedCustomTool && !string.IsNullOrEmpty(customToolHash))
1412 savedCustomTool = HashingManager.instance.GetGOFromHash(customToolHash);
1413
1414 if (hasTwoObjects)
1415 {
1418
1419 var tcds = secondGO.GetComponent<ThrowableCanDisable>();
1420 tcds.enabled = true;
1421#if DANA
1422 tcds.attachmentFlags |= AttachmentFlags.SnapOnAttach;
1423#endif
1424 Macro.allActiveTCD.Add(tcds);
1425 originalSecondParent = secondGO.transform.parent;
1426 secondOriginalPos = secondGO.transform.position;
1427 secondOriginalRot = secondGO.transform.eulerAngles;
1428 StartCoroutine(ShowSecondGOHighLight(secondGO.transform.position, secondGO.transform.eulerAngles));
1429 }
1430
1431 if (GetToolObject())
1432 {
1433 var rb = GetToolObject().GetComponentInChildren<Rigidbody>();
1434 if (rb != null)
1435 {
1436 rb.isKinematic = true;
1437 rb.useGravity = false;
1438 rb.velocity = Vector3.zero;
1439 }
1440 }
1441
1442 if ((Tool)drop.value == Tool.ClecoNutrunner)
1443 {
1444 StartCoroutine(ShowHighLight());
1445 StartCoroutine(ShowPreview(selectedGO.transform.position, selectedGO));
1447 yield break;
1448 }
1449
1450
1451 if ((Tool)drop.value == Tool.GreaseBrush)
1452 {
1453 //StartCoroutine(ShowHighLight());
1454
1455 if (BrushGrabbed) StartCoroutine(ShowPreview(selectedGO.transform.position, selectedGO));
1456 if (!BrushGrabbed)
1457 {
1458 StartCoroutine(ShowPreview(brush.transform.position, brush));
1459 BrushGrabbed = true;
1460 }
1461
1462 foreach (var generatedTrigger in generatedTriggers)
1463 generatedTrigger.SetActive(true);
1464 var btcd = brush.GetComponent<ThrowableCanDisable>();
1465 if (btcd.onDetachFromHand == null)
1466 btcd.onDetachFromHand = new UnityEngine.Events.UnityEvent();
1467
1468 if (!action.Contains("HoldTool") && (Tool)drop.value != Tool.DigitalTorqueWrench)
1469 {
1470 btcd.onDetachFromHand.AddListener(OnToolPutDown);
1471 }
1472
1473 yield break;
1474 }
1475#if !UNITY_WEBGL
1476 if (!GetToolObject().GetComponent<ThrowableCanDisable>().IsAttachedToHand())
1477 {
1478 StartCoroutine(ShowToolHighLight());
1479 }
1480#endif
1481
1482 StartCoroutine(ShowPreview(GetToolObject().transform.position, GetToolObject()));
1483 var tool = GetToolObject();
1484 if (tool == null)
1485 {
1486 yield break; // rossz node? nem lehet ilyen
1487 }
1488
1489 var tcd = tool.GetComponent<ThrowableCanDisable>();
1490
1491 if (tcd.onDetachFromHand == null)
1492 tcd.onDetachFromHand = new UnityEngine.Events.UnityEvent();
1493
1494 if (!action.Contains("HoldTool") && (Tool)drop.value != Tool.DigitalTorqueWrench)
1495 {
1496 tcd.onDetachFromHand.AddListener(OnToolPutDown);
1497 }
1498
1499
1500#endif
1501 }
1502 internal IEnumerator TCDOff()
1503 {
1504 yield return new WaitForSeconds(0.7f);
1505 if (GetToolObject() == null)
1506 {
1507 savedCustomTool.GetComponent<ThrowableCanDisable>().enabled = false;
1508 }
1509 else
1510 {
1511 GetToolObject().GetComponent<ThrowableCanDisable>().enabled = false;
1512 }
1513 }
1514 internal void ClecoCallback(Collider other)
1515 {
1516 if (!activated || done) return;
1517
1518 if (selectedGO == null) selectedGO = GetGameObject();
1519 if (other && (other.gameObject == selectedGO || other.transform.IsChildOf(selectedGO.transform)))
1520 {
1521 TriggerOutput();
1522 ClecoTrigger.instance.triggerEnter.RemoveListener(ClecoCallback);
1523 Destroy(highlightObject);
1524 }
1525 }
1526
1527 public override void GetObjectData(SerializationInfo info, StreamingContext context)
1528 {
1529 base.GetObjectData(info, context);
1530 var convertOldSave = false;
1531 if (convertOldSave)
1532 {
1533 targetPosition = GameObject.Find("iris_position_helper").transform.TransformPoint(targetPosition);
1534 targetRotation = GameObject.Find("iris_position_helper").transform.TransformDirection(targetRotation);
1535 }
1536
1537 info.AddValue("toolIndex", toolIndex, typeof(int));
1538 info.AddValue("targetPosition", targetPosition, typeof(Vector3));
1539 info.AddValue("targetRotation", targetRotation, typeof(Vector3));
1540
1541 info.AddValue("selectedGO", selectedGO, typeof(GameObject));
1542 try
1543 {
1544 if (!string.IsNullOrEmpty(selectedHash))
1545 info.AddValue("selectedGOHash", selectedHash, typeof(string));
1546 else
1547 info.AddValue("selectedGOHash", selectedGO.GetComponent<HashHolder>().Hash, typeof(string));
1548 }
1549 catch (Exception)
1550 {
1551 // ignored
1552 }
1553
1554 info.AddValue("customTool", savedCustomTool, typeof(GameObject));
1555 try
1556 {
1557 if (!string.IsNullOrEmpty(customToolHash))
1558 info.AddValue("customToolHash", customToolHash, typeof(string));
1559 else
1560 info.AddValue("customToolHash", savedCustomTool.GetComponent<HashHolder>().Hash, typeof(string));
1561 }
1562 catch (Exception)
1563 {
1564 // ignored
1565 }
1566#if DANA
1567 info.AddValue("torqueNm", torqueNm, typeof(int));
1568 info.AddValue("second", hasTwoObjects, typeof(bool));
1569#endif
1570
1571 info.AddValue("taktTime", taktTime, typeof(float));
1572#if DANA
1573 if (hasTwoObjects)
1574 {
1575 info.AddValue("secondHash", secondGoHash, typeof(string));
1576 info.AddValue("sp", secondPos, typeof(Vector3));
1577 info.AddValue("sr", secondRot, typeof(Vector3));
1578 }
1579#endif
1580 }
1581
1582 public ToolAction(SerializationInfo info, StreamingContext context) : base(info, context)
1583 {
1584 toolIndex = (int)info.GetValue("toolIndex", typeof(int));
1585 targetPosition = (Vector3)info.GetValue("targetPosition", typeof(Vector3));
1586 targetRotation = (Vector3)info.GetValue("targetRotation", typeof(Vector3));
1587
1588 try
1589 {
1590 foreach (var e in info)
1591 {
1592 if (e.Name == "selectedGO") selectedGO = (GameObject)info.GetValue("selectedGO", typeof(GameObject));
1593 if (e.Name == "customTool")
1594 savedCustomTool = (GameObject)info.GetValue("customTool", typeof(GameObject));
1595 if (e.Name == "selectedGOHash") selectedHash = info.GetString("selectedGOHash");
1596 if (e.Name == "customToolHash") customToolHash = info.GetString("customToolHash");
1597#if DANA
1598 if (e.Name == "torqueNm") torqueNm = info.GetInt32("torqueNm");
1599
1600 if (e.Name == "second") hasTwoObjects = info.GetBoolean("second");
1601 if (e.Name == "secondHash") secondGoHash = info.GetString("secondHash");
1602 if (e.Name == "sp") secondPos = (Vector3)info.GetValue("sp", typeof(Vector3));
1603 if (e.Name == "sr") secondRot = (Vector3)info.GetValue("sr", typeof(Vector3));
1604#endif
1605 if (e.Name == "taktTime") taktTime = (float)info.GetValue("taktTime", typeof(float));
1606 }
1607 }
1608 catch (Exception)
1609 {
1610 // ignored
1611 }
1612 }
1613}
Es.InkPainter.Math Math
Definition: PaintTest.cs:7
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
UnityEngine.Random Random
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
string action
Definition: ActionObject.cs:32
List< GameObject > outPuts
Definition: ActionObject.cs:19
static ClecoTrigger instance
Definition: ClecoTrigger.cs:8
UnityEvent< Collider > triggerEnter
Definition: ClecoTrigger.cs:9
ActionObject[] GetActionsByIn(string id)
Definition: Controller.cs:943
List< string > GetOutputConnectionsToObject(string id)
Definition: Controller.cs:899
Connection GetConnectionById(string id)
Definition: Controller.cs:871
static Controller Instance
Definition: Controller.cs:16
void StartFollowing(Vector3 EndPosition, GameObject TargetObject)
Definition: FollowMe.cs:35
static FollowMe Instance
Definition: FollowMe.cs:19
static List< GameObject > gameObjects
A list of the currently selected GameObjects.
Definition: pb_Selection.cs:56
static void AddOnRemovedFromSelectionListener(Callback< IEnumerable< GameObject > > del)
Definition: pb_Selection.cs:45
static void SetSelection(IEnumerable< GameObject > selection)
Definition: pb_Selection.cs:92
static void Clear()
Definition: pb_Selection.cs:61
static GameObject activeGameObject
Definition: pb_Selection.cs:82
UnityEvent< GameObject > OnSelected
static pb_ToolSelectorButton instance
void SelectToolWindow(string selected="")
bool release()
Definition: HandCopyAvg.cs:300
string Hash
Definition: HashHolder.cs:18
Definition: Macro.cs:12
static void SetInteractable(GameObject go, bool isKinematic=true)
Definition: Macro.cs:439
static Vector3 LerpAngle(Vector3 from, Vector3 to, float t)
Definition: Macro.cs:298
static ManipulatorArm instance
void hideHandPreview(GameObject objectToGrab)
Definition: PreviewHand.cs:73
void EnterOffsetEditor(GameObject objectToGrab, ActionObject action, Vector3 TargetPos, Vector3 TargetRot)
Definition: PreviewHand.cs:40
static PreviewHand Instance
Definition: PreviewHand.cs:16
static SeegerHelper instance
Definition: SeegerHelper.cs:11
bool Trigger()
Definition: SeegerHelper.cs:21
static SoundManager instance
Definition: SoundManager.cs:8
void PlaySuccessSound()
Definition: SoundManager.cs:33
GameObject scanner
Definition: ToolAction.cs:31
GameObject smolwrench
Definition: ToolAction.cs:31
override void OnPointerExit(PointerEventData eventData)
Definition: ToolAction.cs:111
static float Clamp0360(float eulerAngles)
Definition: ToolAction.cs:451
void SetToOriginalPos()
Definition: ToolAction.cs:125
bool InGoodPos(Transform t)
Definition: ToolAction.cs:421
IEnumerator SetGameObjectJob(string hash)
Definition: ToolAction.cs:1274
void SetToolPosition()
Definition: ToolAction.cs:177
GameObject seeger_plier
Definition: ToolAction.cs:31
InputField taktTimeInput
Definition: ToolAction.cs:25
GameObject hammer
Definition: ToolAction.cs:31
IEnumerator HideTCD()
Definition: ToolAction.cs:1258
GameObject GetGameObject()
Definition: ToolAction.cs:1291
bool InGoodRot(Transform t)
Definition: ToolAction.cs:430
Dropdown drop
Definition: ToolAction.cs:23
IEnumerator ShowSecondGOHighLightTarget()
Definition: ToolAction.cs:1044
InputField NmInputField
Definition: ToolAction.cs:25
void SetGameObject(string hash)
Definition: ToolAction.cs:1302
GameObject NmInput
Definition: ToolAction.cs:24
GameObject screwdriver
Definition: ToolAction.cs:31
bool hasTwoObjects
Definition: ToolAction.cs:48
GameObject filctoll
Definition: ToolAction.cs:31
void TriggerNext()
Definition: ToolAction.cs:1094
GameObject selectedGO
Definition: ToolAction.cs:34
void SelectedCustomTool(GameObject tool)
Definition: ToolAction.cs:274
GameObject levegosPisztoly
Definition: ToolAction.cs:31
override void Triggered(string id)
Definition: ToolAction.cs:1252
Material origHighlightToolMaterial
Definition: ToolAction.cs:40
void NmInputEnded(string input)
Definition: ToolAction.cs:1174
new void RefreshTargetDisplay()
Definition: ToolAction.cs:1316
string customToolHash
Definition: ToolAction.cs:38
override void OnPointerEnter(PointerEventData eventData)
Definition: ToolAction.cs:104
override void GetObjectData(SerializationInfo info, StreamingContext context)
Definition: ToolAction.cs:1527
GameObject digitalTorqueWrench
Definition: ToolAction.cs:31
Material highlightMaterial
Definition: ToolAction.cs:40
void onTaktTimeChanged(string value)
Definition: ToolAction.cs:755
GameObject brush
Definition: ToolAction.cs:31
override void Start()
Definition: ToolAction.cs:71
ToolAction(SerializationInfo info, StreamingContext context)
Definition: ToolAction.cs:1582
GameObject wrench
Definition: ToolAction.cs:31
void SetSecondGoButton()
Definition: ToolAction.cs:160
Material highlightToolMaterial
Definition: ToolAction.cs:40
GameObject secondGO
Definition: ToolAction.cs:34
string selectedHash
Definition: ToolAction.cs:37
string secondGoHash
Definition: ToolAction.cs:39
void OnSelectionChanged(int value)
Definition: ToolAction.cs:1179
IEnumerator ShowSecondGOHighLight(Vector3 pos, Vector3 rot)
Definition: ToolAction.cs:1007
Definition: ToolGO.cs:6
GameObject GetToolByName(string tool)
GameObject GetToolBlue(GameObject tool)
static ToolPositioner instance
static TorqueWrenchDigital instance
UnityEvent screwedIn
Definition: TorqueWrench.cs:18
static TorqueWrench instance
Definition: TorqueWrench.cs:13
void StartMoving()
Definition: TorqueWrench.cs:48
static TorqueWrenchSmol instance
Tool
Definition: pb_Enum.cs:24