Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Rain.cs
Go to the documentation of this file.
1using System;
4
5namespace Terraria;
6
7public class Rain
8{
10
12
13 public float scale;
14
15 public float rotation;
16
17 public int alpha;
18
19 public bool active;
20
21 public byte type;
22
23 public static void ClearRain()
24 {
25 for (int i = 0; i < Main.maxRain; i++)
26 {
27 Main.rain[i].active = false;
28 }
29 }
30
31 public static void MakeRain()
32 {
33 if (Main.shimmerAlpha > 0f || Main.netMode == 2 || Main.gamePaused)
34 {
35 return;
36 }
37 if (Main.remixWorld)
38 {
39 if (!((double)(Main.player[Main.myPlayer].position.Y / 16f) > Main.rockLayer) || !(Main.player[Main.myPlayer].position.Y / 16f < (float)(Main.maxTilesY - 350)) || Main.player[Main.myPlayer].ZoneDungeon)
40 {
41 return;
42 }
43 }
44 else if ((double)Main.screenPosition.Y > Main.worldSurface * 16.0)
45 {
46 return;
47 }
48 if (Main.gameMenu)
49 {
50 return;
51 }
52 float num = (float)Main.screenWidth / 1920f;
53 num *= 25f;
54 num *= 0.25f + 1f * Main.cloudAlpha;
55 if (Filters.Scene["Sandstorm"].IsActive())
56 {
57 return;
58 }
59 Vector2 vector = default(Vector2);
60 for (int i = 0; (float)i < num; i++)
61 {
62 int num2 = 600;
63 if (Main.player[Main.myPlayer].velocity.Y < 0f)
64 {
65 num2 += (int)(Math.Abs(Main.player[Main.myPlayer].velocity.Y) * 30f);
66 }
67 vector.X = Main.rand.Next((int)Main.screenPosition.X - num2, (int)Main.screenPosition.X + Main.screenWidth + num2);
68 vector.Y = Main.screenPosition.Y - (float)Main.rand.Next(20, 100);
69 vector.X -= Main.windSpeedCurrent * 15f * 40f;
70 vector.X += Main.player[Main.myPlayer].velocity.X * 40f;
71 if (vector.X < 0f)
72 {
73 vector.X = 0f;
74 }
75 if (vector.X > (float)((Main.maxTilesX - 1) * 16))
76 {
77 vector.X = (Main.maxTilesX - 1) * 16;
78 }
79 int num3 = (int)vector.X / 16;
80 int num4 = (int)vector.Y / 16;
81 if (num3 < 0)
82 {
83 num3 = 0;
84 }
85 if (num3 > Main.maxTilesX - 1)
86 {
87 num3 = Main.maxTilesX - 1;
88 }
89 if (num4 < 0)
90 {
91 num4 = 0;
92 }
93 if (num4 > Main.maxTilesY - 1)
94 {
95 num4 = Main.maxTilesY - 1;
96 }
97 if (Main.remixWorld || Main.gameMenu || (!WorldGen.SolidTile(num3, num4) && Main.tile[num3, num4].wall <= 0))
98 {
99 Vector2 rainFallVelocity = GetRainFallVelocity();
100 NewRain(vector, rainFallVelocity);
101 }
102 }
103 }
104
106 {
107 return new Vector2(Main.windSpeedCurrent * 18f, 14f);
108 }
109
110 public void Update()
111 {
112 if (Main.gamePaused)
113 {
114 return;
115 }
117 if (Main.gameMenu)
118 {
119 if (position.Y > Main.screenPosition.Y + (float)Main.screenHeight + 2000f)
120 {
121 active = false;
122 }
123 }
124 else if (Main.remixWorld)
125 {
126 if (position.Y > Main.screenPosition.Y + (float)Main.screenHeight + 100f)
127 {
128 active = false;
129 }
130 }
132 {
133 active = false;
134 if ((float)Main.rand.Next(100) < Main.gfxQuality * 100f)
135 {
136 int num = Dust.NewDust(position - velocity, 2, 2, Dust.dustWater());
137 Main.dust[num].position.X -= 2f;
138 Main.dust[num].position.Y += 2f;
139 Main.dust[num].alpha = 38;
140 Main.dust[num].velocity *= 0.1f;
141 Main.dust[num].velocity += -velocity * 0.025f;
142 Main.dust[num].velocity.Y -= 2f;
143 Main.dust[num].scale = 0.6f;
144 Main.dust[num].noGravity = true;
145 }
146 }
147 }
148
149 public static int NewRainForced(Vector2 Position, Vector2 Velocity)
150 {
151 int num = -1;
152 int num2 = Main.maxRain;
153 float num3 = (1f + Main.gfxQuality) / 2f;
154 if (num3 < 0.9f)
155 {
156 num2 = (int)((float)num2 * num3);
157 }
158 for (int i = 0; i < num2; i++)
159 {
160 if (!Main.rain[i].active)
161 {
162 num = i;
163 break;
164 }
165 }
166 if (num == -1)
167 {
168 return Main.maxRain;
169 }
170 Rain rain = Main.rain[num];
171 rain.active = true;
172 rain.position = Position;
173 rain.scale = 1f + (float)Main.rand.Next(-20, 21) * 0.01f;
174 rain.velocity = Velocity * rain.scale;
175 rain.rotation = (float)Math.Atan2(rain.velocity.X, 0f - rain.velocity.Y);
176 rain.type = (byte)(Main.waterStyle * 3 + Main.rand.Next(3));
177 return num;
178 }
179
180 private static int NewRain(Vector2 Position, Vector2 Velocity)
181 {
182 int num = -1;
183 int num2 = (int)((float)Main.maxRain * Main.cloudAlpha);
184 if (num2 > Main.maxRain)
185 {
186 num2 = Main.maxRain;
187 }
188 float num3 = (float)Main.maxTilesX / 6400f;
189 Math.Max(0f, Math.Min(1f, (Main.player[Main.myPlayer].position.Y / 16f - 85f * num3) / (60f * num3)));
190 float num4 = (1f + Main.gfxQuality) / 2f;
191 if ((double)num4 < 0.9)
192 {
193 num2 = (int)((float)num2 * num4);
194 }
195 float num5 = 800 - Main.SceneMetrics.SnowTileCount;
196 if (num5 < 0f)
197 {
198 num5 = 0f;
199 }
200 num5 /= 800f;
201 num2 = (int)((float)num2 * num5);
202 num2 = (int)((double)num2 * Math.Pow(Main.atmo, 9.0));
203 if ((double)Main.atmo < 0.4)
204 {
205 num2 = 0;
206 }
207 for (int i = 0; i < num2; i++)
208 {
209 if (!Main.rain[i].active)
210 {
211 num = i;
212 break;
213 }
214 }
215 if (num == -1)
216 {
217 return Main.maxRain;
218 }
219 Rain rain = Main.rain[num];
220 rain.active = true;
221 rain.position = Position;
222 rain.scale = 1f + (float)Main.rand.Next(-20, 21) * 0.01f;
223 rain.velocity = Velocity * rain.scale;
224 rain.rotation = (float)Math.Atan2(rain.velocity.X, 0f - rain.velocity.Y);
225 rain.type = (byte)(Main.waterStyle * 3 + Main.rand.Next(3));
226 return num;
227 }
228}
static byte Min(byte val1, byte val2)
Definition Math.cs:912
static double Atan2(double y, double x)
static double Pow(double x, double y)
static double Abs(double value)
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static bool WetCollision(Vector2 Position, int Width, int Height)
static bool SolidCollision(Vector2 Position, int Width, int Height)
static int dustWater()
Definition Dust.cs:340
static int NewDust(Vector2 Position, int Width, int Height, int Type, float SpeedX=0f, float SpeedY=0f, int Alpha=0, Color newColor=default(Color), float Scale=1f)
Definition Dust.cs:73
static FilterManager Scene
Definition Filters.cs:5
static SceneMetrics SceneMetrics
Definition Main.cs:1344
static float windSpeedCurrent
Definition Main.cs:1360
static int maxTilesY
Definition Main.cs:1116
static float cloudAlpha
Definition Main.cs:1302
static double worldSurface
Definition Main.cs:1272
static int waterStyle
Definition Main.cs:1208
static int myPlayer
Definition Main.cs:1801
static int netMode
Definition Main.cs:2095
static float gfxQuality
Definition Main.cs:1056
static double rockLayer
Definition Main.cs:1274
static int screenHeight
Definition Main.cs:1721
static Vector2 screenPosition
Definition Main.cs:1715
static float atmo
Definition Main.cs:2571
static int maxTilesX
Definition Main.cs:1114
static Tile[,] tile
Definition Main.cs:1675
static UnifiedRandom rand
Definition Main.cs:1387
static int maxRain
Definition Main.cs:1154
static int screenWidth
Definition Main.cs:1719
static bool gameMenu
Definition Main.cs:1926
static float shimmerAlpha
Definition Main.cs:1008
static bool gamePaused
Definition Main.cs:1072
static Player[] player
Definition Main.cs:1803
static bool remixWorld
Definition Main.cs:349
static Dust[] dust
Definition Main.cs:1677
static Rain[] rain
Definition Main.cs:1689
static int NewRain(Vector2 Position, Vector2 Velocity)
Definition Rain.cs:180
void Update()
Definition Rain.cs:110
static void ClearRain()
Definition Rain.cs:23
Vector2 position
Definition Rain.cs:9
float rotation
Definition Rain.cs:15
int alpha
Definition Rain.cs:17
static void MakeRain()
Definition Rain.cs:31
static int NewRainForced(Vector2 Position, Vector2 Velocity)
Definition Rain.cs:149
byte type
Definition Rain.cs:21
Vector2 velocity
Definition Rain.cs:11
bool active
Definition Rain.cs:19
static Vector2 GetRainFallVelocity()
Definition Rain.cs:105
float scale
Definition Rain.cs:13
static bool SolidTile(Tile testTile)