1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
using System;
using System.Collections.Generic;
using UnityEngine;
public class BrodalAIController : MonoBehaviour
{
private PlayerAPI m_playerAPI;
private int m_sampleCount = 250;
private float m_sampleSize;
private LayerMask m_layerMask;
private Dictionary<Guid, Platform> m_platforms = new Dictionary<Guid, Platform>();
private Platform m_currentPlatform;
private Vector2 m_pointOnLine;
private bool inited;
private void Start()
{
m_playerAPI = GetComponentInParent<PlayerAPI>();
HealthHandler healthHandler = m_playerAPI.player.data.healthHandler;
healthHandler.delayedReviveAction = (Action)Delegate.Combine(healthHandler.delayedReviveAction, new Action(Init));
}
public void Init()
{
m_platforms.Clear();
m_currentPlatform = null;
PlotPlatforms();
RaycastMap();
PostProcessPlatforms();
inited = true;
Debug.Log("Revived");
}
private void PostProcessPlatforms()
{
foreach (KeyValuePair<Guid, Platform> platform in m_platforms)
{
platform.Value.PostProcessPlatformPoints();
}
}
private void PlotPlatforms()
{
BoxCollider2D[] array = UnityEngine.Object.FindObjectsOfType<BoxCollider2D>();
foreach (BoxCollider2D boxCollider2D in array)
{
if (boxCollider2D.gameObject.layer == LayerMask.GetMask("Player"))
{
continue;
}
bool flag = false;
foreach (KeyValuePair<Guid, Platform> platform in m_platforms)
{
foreach (BoxCollider2D boxCollider in platform.Value.BoxColliders)
{
bool flag2 = false;
if (boxCollider2D.bounds.Intersects(boxCollider.bounds))
{
flag2 = true;
}
if (flag2)
{
m_platforms[platform.Key].AddCollider(boxCollider2D);
flag = true;
break;
}
}
if (flag)
{
break;
}
}
if (!flag)
{
Guid key = Guid.NewGuid();
m_platforms.Add(key, new Platform());
m_platforms[key].AddCollider(boxCollider2D);
}
}
}
private void MergePlatforms()
{
}
private void RaycastMap()
{
m_layerMask = LayerMask.GetMask("Default");
Camera component = MainCam.instance.transform.GetComponent<Camera>();
Vector3 vector = component.ViewportToWorldPoint(new Vector2(0f, 1f));
Vector3 vector2 = component.ViewportToWorldPoint(new Vector2(1f, 1f));
m_sampleSize = (vector2.x - vector.x) / (float)m_sampleCount;
for (float num = vector.x; num < vector2.x; num += m_sampleSize)
{
RaycastHit2D[] array = Physics2D.RaycastAll(new Vector3(num, vector.y, 0f), Vector2.down, 9999f, m_layerMask);
for (int i = 0; i < array.Length; i++)
{
RaycastHit2D raycastHit2D = array[i];
foreach (KeyValuePair<Guid, Platform> platform in m_platforms)
{
if (platform.Value.ContainsCollider((BoxCollider2D)raycastHit2D.collider))
{
m_platforms[platform.Key].AddPlatformPoint(raycastHit2D.point);
break;
}
}
}
}
}
private void Update()
{
if (inited)
{
FindClosestPlatform(base.transform.position);
Vector2 vector = m_playerAPI.OtherPlayerPosition() - base.transform.position;
float magnitude = vector.magnitude;
vector.Normalize();
Vector2 normalized = (vector + new Vector2(0f, 0.15f)).normalized;
m_playerAPI.SetAimDirection(normalized);
Vector2 position = new Vector2(base.transform.position.x, base.transform.position.y) + vector * 1.5f;
bool num = m_currentPlatform.IsPositionOutsidePlatform(position);
m_playerAPI.Move(m_playerAPI.TowardsOtherPlayer());
if (num)
{
m_playerAPI.Jump();
}
vector.y = 0f;
vector.Normalize();
RaycastHit2D raycastHit2D = Physics2D.Raycast(base.transform.position, vector, 0.85f, m_layerMask);
RaycastHit2D raycastHit2D2 = Physics2D.Raycast(base.transform.position, vector, magnitude, m_layerMask);
if ((bool)raycastHit2D.collider)
{
m_playerAPI.Jump();
}
if (raycastHit2D2.collider == null)
{
m_playerAPI.Attack();
}
m_playerAPI.Block();
}
}
private void FindClosestPlatform(Vector2 position)
{
float num = float.MaxValue;
foreach (KeyValuePair<Guid, Platform> platform in m_platforms)
{
float closestDistance = platform.Value.GetClosestDistance(position);
if (closestDistance < num)
{
m_currentPlatform = platform.Value;
num = closestDistance;
}
}
}
}
|