Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
DeciduousLeavesBlock.cs
浏览该文件的文档.
1using Engine;
2
3namespace Game {
4 public abstract class DeciduousLeavesBlock : LeavesBlock {
5 public Random m_random1 = new();
6
7 public readonly float SummerStart;
8
9 public readonly float AutumnStart;
10
11 public readonly float WinterStart;
12
13 public readonly float SpringStart;
14
15 public readonly float SummerInterval;
16
17 public readonly float AutumnInterval;
18
19 public readonly float WinterInterval;
20
21 public readonly float SpringInterval;
22
23 public readonly float SummerIntervalInv;
24
25 public readonly float AutumnIntervalInv;
26
27 public readonly float WinterIntervalInv;
28
29 public readonly float SpringIntervalInv;
30
32
33 public readonly Color AutumnColor1;
34
35 public readonly Color AutumnColor2;
36
37 public readonly float AutumnTransitionLightening;
38
39 public readonly float AutumnSpeedupFactor;
40
41 public readonly Color SpringColor;
42
43 public const string fName = "DeciduousLeavesBlock";
44
45 public DeciduousLeavesBlock(float summerStart,
46 float autumnStart,
47 float winterStart,
48 float springStart,
49 BlockColorsMap blockColorsMap,
50 Color autumnColor1,
51 Color autumnColor2,
52 float autumnTransitionLightening) {
53 SummerStart = summerStart;
54 AutumnStart = autumnStart;
55 WinterStart = winterStart;
56 SpringStart = springStart;
57 SummerInterval = IntervalUtils.Interval(summerStart, autumnStart);
58 AutumnInterval = IntervalUtils.Interval(autumnStart, winterStart);
59 WinterInterval = IntervalUtils.Interval(winterStart, springStart);
60 SpringInterval = IntervalUtils.Interval(springStart, summerStart);
65 BlockColorsMap = blockColorsMap;
66 AutumnColor1 = autumnColor1;
67 AutumnColor2 = autumnColor2;
68 AutumnTransitionLightening = autumnTransitionLightening;
69 AutumnSpeedupFactor = 1.33f;
70 SpringColor = new Color(160, 255, 90);
71 }
72
73 public override Color GetLeavesBlockColor(int value, Terrain terrain, int x, int y, int z) {
74 int data = Terrain.ExtractData(value);
75 switch (GetSeason(data)) {
76 case Season.Spring: {
77 Color springColor = SpringColor;
78 Color c3 = BlockColorsMap.Lookup(terrain, x, y, z);
79 float timeOfSeason = GetTimeOfSeason(data);
80 return Color.LerpNotSaturated(springColor, c3, timeOfSeason);
81 }
82 case Season.Autumn: {
83 Color c = BlockColorsMap.Lookup(terrain, x, y, z);
85 f: MathUtils.Hash((uint)(x + 59 * y + 2497 * z)) / 4.2949673E+09f,
86 c1: AutumnColor1,
87 c2: AutumnColor2
88 );
89 float f2 = MathUtils.Min(GetTimeOfSeason(data) * AutumnSpeedupFactor, 1f);
91 }
92 case Season.Winter: return Color.White;
93 default: return BlockColorsMap.Lookup(terrain, x, y, z);
94 }
95 }
96
97 public override Color GetLeavesItemColor(int value, DrawBlockEnvironmentData environmentData) {
98 int data = Terrain.ExtractData(value);
99 switch (GetSeason(data)) {
100 case Season.Spring: {
101 Color springColor = SpringColor;
102 Color c3 = BlockColorsMap.Lookup(environmentData);
103 float timeOfSeason = GetTimeOfSeason(data);
104 return Color.LerpNotSaturated(springColor, c3, timeOfSeason);
105 }
106 case Season.Autumn: {
107 Color c = BlockColorsMap.Lookup(environmentData);
109 float f = MathUtils.Min(GetTimeOfSeason(data) * AutumnSpeedupFactor, 1f);
111 }
112 case Season.Winter: return Color.White;
113 default: return BlockColorsMap.Lookup(environmentData);
114 }
115 }
116
117 public override bool ShouldGenerateFace(SubsystemTerrain subsystemTerrain,
118 int face,
119 int value,
120 int neighborValue,
121 int x,
122 int y,
123 int z) {
124 if (!base.ShouldGenerateFace(
125 subsystemTerrain,
126 face,
127 value,
128 neighborValue,
129 x,
130 y,
131 z
132 )) {
133 return false;
134 }
135 if (Terrain.ExtractContents(value) != Terrain.ExtractContents(neighborValue)) {
136 return true;
137 }
138 int data = Terrain.ExtractData(value);
139 int data2 = Terrain.ExtractData(neighborValue);
140 bool num = GetSeason(data) == Season.Winter;
141 bool flag = GetSeason(data2) == Season.Winter;
142 if (num != flag) {
143 return true;
144 }
145 return false;
146 }
147
148 public override BlockPlacementData GetDigValue(SubsystemTerrain subsystemTerrain,
149 ComponentMiner componentMiner,
150 int value,
151 int toolValue,
152 TerrainRaycastResult raycastResult) {
153 int data = Terrain.ExtractData(value);
154 if (GetSeason(data) == Season.Autumn
155 && GetTimeOfSeason(data) > 0.5f) {
156 subsystemTerrain.Project.FindSubsystem<SubsystemParticles>(true)
157 .AddParticleSystem(new LeavesParticleSystem(subsystemTerrain, raycastResult.CellFace.Point, 8, false, true, value));
158 BlockPlacementData result = default;
159 result.Value = Terrain.ReplaceData(value, SetSeason(SetIsShaken(data, true), Season.Winter));
160 result.CellFace = raycastResult.CellFace;
161 return result;
162 }
163 return base.GetDigValue(subsystemTerrain, componentMiner, value, toolValue, raycastResult);
164 }
165
166 public override void GetDropValues(SubsystemTerrain subsystemTerrain,
167 int oldValue,
168 int newValue,
169 int toolLevel,
170 List<BlockDropValue> dropValues,
171 out bool showDebris) {
172 if (Terrain.ExtractContents(newValue) == Terrain.ExtractContents(oldValue)) {
173 showDebris = false;
174 }
175 else if (m_random1.Bool(0.25f)) {
176 dropValues.Add(new BlockDropValue { Value = 23, Count = 1 });
177 showDebris = true;
178 }
179 else {
180 int data = Terrain.ExtractData(oldValue);
181 int data2 = SetTimeOfSeason(data, GetSeason(data) == Season.Autumn ? 0.999f : 0f);
182 int value = Terrain.MakeBlockValue(DefaultDropContent, 0, data2);
183 dropValues.Add(new BlockDropValue { Value = value, Count = 1 });
184 showDebris = true;
185 }
186 }
187
188 public override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value) =>
189 $"{LanguageControl.Get(fName, (int)GetSeason(Terrain.ExtractData(value)))}{base.GetDisplayName(subsystemTerrain, value)}";
190
191 public override IEnumerable<int> GetCreativeValues() {
192 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetSeason(SetTimeOfSeason(0, 0f), Season.Spring));
193 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetSeason(SetTimeOfSeason(0, 0f), Season.Summer));
194 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetSeason(SetTimeOfSeason(0, 0.999f), Season.Autumn));
195 yield return Terrain.MakeBlockValue(BlockIndex, 0, SetSeason(SetTimeOfSeason(0, 0f), Season.Winter));
196 }
197
198 public override int GetShadowStrength(int value) {
199 return GetSeason(Terrain.ExtractData(value)) switch {
200 Season.Winter => base.GetShadowStrength(value) / 3,
201 Season.Spring => base.GetShadowStrength(value) / 2,
202 _ => base.GetShadowStrength(value)
203 };
204 }
205
206 public virtual float GetLeafDropProbability(int value) {
207 int data = Terrain.ExtractData(value);
208 return GetSeason(data) switch {
209 Season.Summer => 0.015f,
210 Season.Autumn => MathUtils.Lerp(0.04f, 0.16f, GetTimeOfSeason(data)),
211 _ => 0f
212 };
213 }
214
215 public virtual int SetTimeOfYear(int data, float timeOfYear) {
216 float num = IntervalUtils.Interval(SummerStart, timeOfYear);
217 int num2;
218 if (num < SummerInterval) {
219 num2 = SetSeason(SetTimeOfSeason(data, num * SummerIntervalInv), Season.Summer);
220 }
221 else {
222 float num3 = IntervalUtils.Interval(AutumnStart, timeOfYear);
223 if (num3 < AutumnInterval) {
224 num2 = SetSeason(SetTimeOfSeason(data, num3 * AutumnIntervalInv), Season.Autumn);
225 }
226 else {
227 float num4 = IntervalUtils.Interval(WinterStart, timeOfYear);
228 if (num4 < WinterInterval) {
229 num2 = SetSeason(SetTimeOfSeason(data, num4 * WinterIntervalInv), Season.Winter);
230 }
231 else {
232 float num5 = IntervalUtils.Interval(SpringStart, timeOfYear);
233 num2 = SetSeason(SetTimeOfSeason(data, num5 * SpringIntervalInv), Season.Spring);
234 }
235 }
236 }
237 if (GetIsShaken(data)) {
238 if (GetSeason(num2) == Season.Autumn) {
239 return data;
240 }
241 if (GetSeason(num2) != Season.Winter) {
242 num2 = SetIsShaken(num2, false);
243 }
244 }
245 return num2;
246 }
247
248 public static Season GetSeason(int data) => (Season)((data >> 3) & 3);
249
250 public static int SetSeason(int data, Season season) => (data & -25) | ((int)(season & Season.Spring) << 3);
251
252 public static float GetTimeOfSeason(int data) => (data & 7) / 7f;
253
254 public static int SetTimeOfSeason(int data, float timeOfSeason) {
255 int num = (int)(Math.Clamp(timeOfSeason, 0f, 0.999f) * 8f);
256 return (data & -8) | (num & 7);
257 }
258
259 public static bool GetIsShaken(int data) => (data & 0x20) != 0;
260
261 public static int SetIsShaken(int data, bool isManuallyCleared) => (data & -33) | (isManuallyCleared ? 32 : 0);
262
263 public static float Hat(float f) => 1f - 2f * MathF.Abs(f - 0.5f);
264 }
265}
Engine.Color Color
static int Min(int x1, int x2)
static int Hash(int key)
static float Lerp(float x1, float x2, float f)
int BlockIndex
定义 Block.cs:6
int DefaultDropContent
DeciduousLeavesBlock(float summerStart, float autumnStart, float winterStart, float springStart, BlockColorsMap blockColorsMap, Color autumnColor1, Color autumnColor2, float autumnTransitionLightening)
override bool ShouldGenerateFace(SubsystemTerrain subsystemTerrain, int face, int value, int neighborValue, int x, int y, int z)
virtual int SetTimeOfYear(int data, float timeOfYear)
override int GetShadowStrength(int value)
override Color GetLeavesBlockColor(int value, Terrain terrain, int x, int y, int z)
readonly BlockColorsMap BlockColorsMap
static int SetTimeOfSeason(int data, float timeOfSeason)
override BlockPlacementData GetDigValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, int toolValue, TerrainRaycastResult raycastResult)
override Color GetLeavesItemColor(int value, DrawBlockEnvironmentData environmentData)
static int SetSeason(int data, Season season)
override string GetDisplayName(SubsystemTerrain subsystemTerrain, int value)
override void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
static int SetIsShaken(int data, bool isManuallyCleared)
override IEnumerable< int > GetCreativeValues()
virtual float GetLeafDropProbability(int value)
static float Interval(float t1, float t2)
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
virtual Subsystem FindSubsystem(Type type, string name, bool throwOnError)
static Color Lerp(Color c1, Color c2, float f)
static Color White
static Color MultiplyColorOnly(Color c, float s)
static Color LerpNotSaturated(Color c1, Color c2, float f)