Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EmitDust()

static void Terraria.GameContent.Events.Sandstorm.EmitDust ( )
inlinestatic

Definition at line 164 of file Sandstorm.cs.

165 {
166 if (Main.gamePaused)
167 {
168 return;
169 }
170 int sandTileCount = Main.SceneMetrics.SandTileCount;
171 Player player = Main.player[Main.myPlayer];
172 bool flag = ShouldSandstormDustPersist();
173 HandleEffectAndSky(flag && Main.UseStormEffects);
174 if (sandTileCount < 100 || (double)player.position.Y > Main.worldSurface * 16.0 || player.ZoneBeach)
175 {
176 return;
177 }
178 int maxValue = 1;
179 if (!flag || Main.rand.Next(maxValue) != 0)
180 {
181 return;
182 }
183 int num = Math.Sign(Main.windSpeedCurrent);
184 float num2 = Math.Abs(Main.windSpeedCurrent);
185 if (num2 < 0.01f)
186 {
187 return;
188 }
189 float num3 = (float)num * MathHelper.Lerp(0.9f, 1f, num2);
190 float num4 = 2000f / (float)sandTileCount;
191 float value = 3f / num4;
192 value = MathHelper.Clamp(value, 0.77f, 1f);
193 int num5 = (int)num4;
194 float num6 = (float)Main.screenWidth / (float)Main.maxScreenW;
195 int num7 = (int)(1000f * num6);
196 float num8 = 20f * Severity;
197 float num9 = (float)num7 * (Main.gfxQuality * 0.5f + 0.5f) + (float)num7 * 0.1f - (float)Dust.SandStormCount;
198 if (num9 <= 0f)
199 {
200 return;
201 }
202 float num10 = (float)Main.screenWidth + 1000f;
203 float num11 = Main.screenHeight;
204 Vector2 vector = Main.screenPosition + player.velocity;
205 WeightedRandom<Color> weightedRandom = new WeightedRandom<Color>();
206 weightedRandom.Add(new Color(200, 160, 20, 180), Main.SceneMetrics.GetTileCount(53) + Main.SceneMetrics.GetTileCount(396) + Main.SceneMetrics.GetTileCount(397));
207 weightedRandom.Add(new Color(103, 98, 122, 180), Main.SceneMetrics.GetTileCount(112) + Main.SceneMetrics.GetTileCount(400) + Main.SceneMetrics.GetTileCount(398));
208 weightedRandom.Add(new Color(135, 43, 34, 180), Main.SceneMetrics.GetTileCount(234) + Main.SceneMetrics.GetTileCount(401) + Main.SceneMetrics.GetTileCount(399));
209 weightedRandom.Add(new Color(213, 196, 197, 180), Main.SceneMetrics.GetTileCount(116) + Main.SceneMetrics.GetTileCount(403) + Main.SceneMetrics.GetTileCount(402));
210 float num12 = MathHelper.Lerp(0.2f, 0.35f, Severity);
211 float num13 = MathHelper.Lerp(0.5f, 0.7f, Severity);
212 float amount = (value - 0.77f) / 0.23000002f;
213 int maxValue2 = (int)MathHelper.Lerp(1f, 10f, amount);
214 for (int i = 0; (float)i < num8; i++)
215 {
216 if (Main.rand.Next(num5 / 4) != 0)
217 {
218 continue;
219 }
220 Vector2 position = new Vector2(Main.rand.NextFloat() * num10 - 500f, Main.rand.NextFloat() * -50f);
221 if (Main.rand.Next(3) == 0 && num == 1)
222 {
223 position.X = Main.rand.Next(500) - 500;
224 }
225 else if (Main.rand.Next(3) == 0 && num == -1)
226 {
227 position.X = Main.rand.Next(500) + Main.screenWidth;
228 }
229 if (position.X < 0f || position.X > (float)Main.screenWidth)
230 {
231 position.Y += Main.rand.NextFloat() * num11 * 0.9f;
232 }
233 position += vector;
234 int num14 = (int)position.X / 16;
235 int num15 = (int)position.Y / 16;
236 if (!WorldGen.InWorld(num14, num15, 10) || Main.tile[num14, num15] == null || Main.tile[num14, num15].wall != 0)
237 {
238 continue;
239 }
240 for (int j = 0; j < 1; j++)
241 {
242 Dust dust = Main.dust[Dust.NewDust(position, 10, 10, 268)];
243 dust.velocity.Y = 2f + Main.rand.NextFloat() * 0.2f;
244 dust.velocity.Y *= dust.scale;
245 dust.velocity.Y *= 0.35f;
246 dust.velocity.X = num3 * 5f + Main.rand.NextFloat() * 1f;
247 dust.velocity.X += num3 * num13 * 20f;
248 dust.fadeIn += num13 * 0.2f;
249 dust.velocity *= 1f + num12 * 0.5f;
250 dust.color = weightedRandom;
251 dust.velocity *= 1f + num12;
252 dust.velocity *= value;
253 dust.scale = 0.9f;
254 num9 -= 1f;
255 if (num9 <= 0f)
256 {
257 break;
258 }
259 if (Main.rand.Next(maxValue2) != 0)
260 {
261 j--;
262 position += Utils.RandomVector2(Main.rand, -10f, 10f) + dust.velocity * -1.1f;
263 num14 = (int)position.X / 16;
264 num15 = (int)position.Y / 16;
265 if (WorldGen.InWorld(num14, num15, 10) && Main.tile[num14, num15] != null)
266 {
267 _ = Main.tile[num14, num15].wall;
268 }
269 }
270 }
271 if (num9 <= 0f)
272 {
273 break;
274 }
275 }
276 }
static float Lerp(float value1, float value2, float amount)
Definition MathHelper.cs:53
static float Clamp(float value, float min, float max)
Definition MathHelper.cs:46
static double Abs(double value)
static int Sign(decimal value)
Definition Math.cs:1202
static void HandleEffectAndSky(bool toState)
Definition Sandstorm.cs:134
void Add(T element, double weight=1.0)

References System.Math.Abs(), Terraria.Utilities.WeightedRandom< T >.Add(), Microsoft.Xna.Framework.MathHelper.Clamp(), Terraria.Main.dust, Terraria.Main.gamePaused, Terraria.Main.gfxQuality, Terraria.GameContent.Events.Sandstorm.HandleEffectAndSky(), Terraria.WorldGen.InWorld(), Microsoft.Xna.Framework.MathHelper.Lerp(), Terraria.Main.maxScreenW, Terraria.Main.myPlayer, Terraria.Dust.NewDust(), Terraria.Main.player, Terraria.Entity.position, Terraria.Main.rand, Terraria.Utils.RandomVector2(), Terraria.Dust.SandStormCount, Terraria.Dust.scale, Terraria.Main.SceneMetrics, Terraria.Main.screenHeight, Terraria.Main.screenWidth, Terraria.GameContent.Events.Sandstorm.Severity, Terraria.GameContent.Events.Sandstorm.ShouldSandstormDustPersist(), System.Math.Sign(), Terraria.Main.tile, Terraria.Main.UseStormEffects, System.value, Terraria.Entity.velocity, Terraria.Main.windSpeedCurrent, Terraria.Main.worldSurface, Microsoft.Xna.Framework.Vector2.X, Microsoft.Xna.Framework.Vector2.Y, and Terraria.Player.ZoneBeach.

Referenced by Terraria.Main.DoUpdate().