terraria-source-code/Animation.cs
2021-10-26 12:45:26 -04:00

164 lines
5.4 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.Animation
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using System.Collections.Generic;
using Terraria.DataStructures;
namespace Terraria
{
public class Animation
{
private static List<Animation> _animations;
private static Dictionary<Point16, Animation> _temporaryAnimations;
private static List<Point16> _awaitingRemoval;
private static List<Animation> _awaitingAddition;
private bool _temporary;
private Point16 _coordinates;
private ushort _tileType;
private int _frame;
private int _frameMax;
private int _frameCounter;
private int _frameCounterMax;
private int[] _frameData;
public static void Initialize()
{
Animation._animations = new List<Animation>();
Animation._temporaryAnimations = new Dictionary<Point16, Animation>();
Animation._awaitingRemoval = new List<Point16>();
Animation._awaitingAddition = new List<Animation>();
}
private void SetDefaults(int type)
{
this._tileType = (ushort) 0;
this._frame = 0;
this._frameMax = 0;
this._frameCounter = 0;
this._frameCounterMax = 0;
this._temporary = false;
switch (type)
{
case 0:
this._frameMax = 5;
this._frameCounterMax = 12;
this._frameData = new int[this._frameMax];
for (int index = 0; index < this._frameMax; ++index)
this._frameData[index] = index + 1;
break;
case 1:
this._frameMax = 5;
this._frameCounterMax = 12;
this._frameData = new int[this._frameMax];
for (int index = 0; index < this._frameMax; ++index)
this._frameData[index] = 5 - index;
break;
case 2:
this._frameCounterMax = 6;
this._frameData = new int[5]{ 1, 2, 2, 2, 1 };
this._frameMax = this._frameData.Length;
break;
case 3:
this._frameMax = 5;
this._frameCounterMax = 5;
this._frameData = new int[this._frameMax];
for (int index = 0; index < this._frameMax; ++index)
this._frameData[index] = index;
break;
case 4:
this._frameMax = 3;
this._frameCounterMax = 5;
this._frameData = new int[this._frameMax];
for (int index = 0; index < this._frameMax; ++index)
this._frameData[index] = 9 + index;
break;
}
}
public static void NewTemporaryAnimation(int type, ushort tileType, int x, int y)
{
Point16 point16 = new Point16(x, y);
if (x < 0 || x >= Main.maxTilesX || y < 0 || y >= Main.maxTilesY)
return;
Animation animation = new Animation();
animation.SetDefaults(type);
animation._tileType = tileType;
animation._coordinates = point16;
animation._temporary = true;
Animation._awaitingAddition.Add(animation);
if (Main.netMode != 2)
return;
NetMessage.SendTemporaryAnimation(-1, type, (int) tileType, x, y);
}
private static void RemoveTemporaryAnimation(short x, short y)
{
Point16 key = new Point16(x, y);
if (!Animation._temporaryAnimations.ContainsKey(key))
return;
Animation._awaitingRemoval.Add(key);
}
public static void UpdateAll()
{
for (int index = 0; index < Animation._animations.Count; ++index)
Animation._animations[index].Update();
if (Animation._awaitingAddition.Count > 0)
{
for (int index = 0; index < Animation._awaitingAddition.Count; ++index)
{
Animation animation = Animation._awaitingAddition[index];
Animation._temporaryAnimations[animation._coordinates] = animation;
}
Animation._awaitingAddition.Clear();
}
foreach (KeyValuePair<Point16, Animation> temporaryAnimation in Animation._temporaryAnimations)
temporaryAnimation.Value.Update();
if (Animation._awaitingRemoval.Count <= 0)
return;
for (int index = 0; index < Animation._awaitingRemoval.Count; ++index)
Animation._temporaryAnimations.Remove(Animation._awaitingRemoval[index]);
Animation._awaitingRemoval.Clear();
}
public void Update()
{
if (this._temporary)
{
Tile tile = Main.tile[(int) this._coordinates.X, (int) this._coordinates.Y];
if (tile != null && (int) tile.type != (int) this._tileType)
{
Animation.RemoveTemporaryAnimation(this._coordinates.X, this._coordinates.Y);
return;
}
}
++this._frameCounter;
if (this._frameCounter < this._frameCounterMax)
return;
this._frameCounter = 0;
++this._frame;
if (this._frame < this._frameMax)
return;
this._frame = 0;
if (!this._temporary)
return;
Animation.RemoveTemporaryAnimation(this._coordinates.X, this._coordinates.Y);
}
public static bool GetTemporaryFrame(int x, int y, out int frameData)
{
Point16 key = new Point16(x, y);
Animation animation;
if (!Animation._temporaryAnimations.TryGetValue(key, out animation))
{
frameData = 0;
return false;
}
frameData = animation._frameData[animation._frame];
return true;
}
}
}