Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentWalkAroundBehavior.cs
浏览该文件的文档.
1using Engine;
4
5namespace Game {
8
10
12
14
16
17 public Random m_random = new();
18
19 public float m_importanceLevel;
20
22
23 public override float ImportanceLevel => m_importanceLevel;
24
25 public virtual void Update(float dt) {
26 m_stateMachine.Update();
27 }
28
29 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
30 m_subsystemTerrain = Project.FindSubsystem<SubsystemTerrain>(true);
31 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
32 m_componentCreature = Entity.FindComponent<ComponentCreature>(true);
34 m_stateMachine.AddState(
35 "Inactive",
36 delegate { m_importanceLevel = m_random.Float(0f, 1f); },
37 delegate {
38 if (m_random.Float(0f, 1f) < 0.05f * m_subsystemTime.GameTimeDelta) {
39 m_importanceLevel = m_random.Float(1f, 2f);
40 }
41 if (IsActive) {
42 m_stateMachine.TransitionTo("Walk");
43 }
44 },
45 null
46 );
47 m_stateMachine.AddState(
48 "Walk",
49 delegate {
50 float speed = m_componentCreature.ComponentBody.ImmersionFactor > 0.5f ? 1f : m_random.Float(0.25f, 0.35f);
51 m_componentPathfinding.SetDestination(
53 speed,
54 1f,
55 0,
56 false,
57 true,
58 false,
59 null
60 );
61 },
62 delegate {
63 if (m_componentPathfinding.IsStuck
64 || !IsActive) {
65 m_stateMachine.TransitionTo("Inactive");
66 }
67 if (!m_componentPathfinding.Destination.HasValue) {
68 if (m_random.Float(0f, 1f) < 0.5f) {
69 m_stateMachine.TransitionTo("Inactive");
70 }
71 else {
72 m_stateMachine.TransitionTo(null);
73 m_stateMachine.TransitionTo("Walk");
74 }
75 }
76 if (m_random.Float(0f, 1f) < 0.1f * m_subsystemTime.GameTimeDelta) {
77 m_componentCreature.ComponentCreatureSounds.PlayIdleSound(false);
78 }
79 m_componentCreature.ComponentCreatureModel.LookRandomOrder = true;
80 },
81 null
82 );
83 m_stateMachine.TransitionTo("Inactive");
84 }
85
86 public virtual Vector3 FindDestination() {
87 Vector3 position = m_componentCreature.ComponentBody.Position;
88 float num = 0f;
89 Vector3 result = position;
90 for (int i = 0; i < 16; i++) {
91 Vector2 vector = Vector2.Normalize(m_random.Vector2(1f)) * m_random.Float(6f, 12f);
92 Vector3 vector2 = new(position.X + vector.X, 0f, position.Z + vector.Y);
93 vector2.Y = m_subsystemTerrain.Terrain.GetTopHeight(Terrain.ToCell(vector2.X), Terrain.ToCell(vector2.Z)) + 1;
94 float num2 = ScoreDestination(vector2);
95 if (num2 > num) {
96 num = num2;
97 result = vector2;
98 }
99 }
100 return result;
101 }
102
103 public virtual float ScoreDestination(Vector3 destination) {
104 float num = 8f - MathF.Abs(m_componentCreature.ComponentBody.Position.Y - destination.Y);
105 if (m_subsystemTerrain.Terrain.GetCellContents(
106 Terrain.ToCell(destination.X),
107 Terrain.ToCell(destination.Y) - 1,
108 Terrain.ToCell(destination.Z)
109 )
110 == 18) {
111 num -= 5f;
112 }
113 return num;
114 }
115 }
116}
virtual float ScoreDestination(Vector3 destination)
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
static int ToCell(float x)
ValuesDictionary ValuesDictionary
static Vector2 Normalize(Vector2 v)