Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TEItemFrame.cs
Go to the documentation of this file.
1using System.IO;
3
5
7{
8 private static byte _myEntityID;
9
10 public Item item;
11
12 public override void RegisterTileEntityID(int assignedID)
13 {
14 _myEntityID = (byte)assignedID;
15 }
16
17 public override void NetPlaceEntityAttempt(int x, int y)
18 {
19 NetPlaceEntity(x, y);
20 }
21
22 public static void NetPlaceEntity(int x, int y)
23 {
24 int number = Place(x, y);
25 NetMessage.SendData(86, -1, -1, null, number, x, y);
26 }
27
28 public override TileEntity GenerateInstance()
29 {
30 return new TEItemFrame();
31 }
32
33 public TEItemFrame()
34 {
35 item = new Item();
36 }
37
38 public static int Place(int x, int y)
39 {
40 TEItemFrame tEItemFrame = new TEItemFrame();
41 tEItemFrame.Position = new Point16(x, y);
42 tEItemFrame.ID = TileEntity.AssignNewID();
43 tEItemFrame.type = _myEntityID;
45 {
46 TileEntity.ByID[tEItemFrame.ID] = tEItemFrame;
47 TileEntity.ByPosition[tEItemFrame.Position] = tEItemFrame;
48 }
49 return tEItemFrame.ID;
50 }
51
52 public override bool IsTileValidForEntity(int x, int y)
53 {
54 return ValidTile(x, y);
55 }
56
57 public static int Hook_AfterPlacement(int x, int y, int type = 395, int style = 0, int direction = 1, int alternate = 0)
58 {
59 if (Main.netMode == 1)
60 {
62 NetMessage.SendData(87, -1, -1, null, x, y, (int)_myEntityID);
63 return -1;
64 }
65 return Place(x, y);
66 }
67
68 public static void Kill(int x, int y)
69 {
70 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
71 {
73 {
74 TileEntity.ByID.Remove(value.ID);
75 TileEntity.ByPosition.Remove(new Point16(x, y));
76 }
77 }
78 }
79
80 public static int Find(int x, int y)
81 {
82 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
83 {
84 return value.ID;
85 }
86 return -1;
87 }
88
89 public static bool ValidTile(int x, int y)
90 {
91 if (!Main.tile[x, y].active() || Main.tile[x, y].type != 395 || Main.tile[x, y].frameY != 0 || Main.tile[x, y].frameX % 36 != 0)
92 {
93 return false;
94 }
95 return true;
96 }
97
98 public override void WriteExtraData(BinaryWriter writer, bool networkSend)
99 {
100 writer.Write((short)item.netID);
101 writer.Write(item.prefix);
102 writer.Write((short)item.stack);
103 }
104
105 public override void ReadExtraData(BinaryReader reader, bool networkSend)
106 {
107 item = new Item();
108 item.netDefaults(reader.ReadInt16());
109 item.Prefix(reader.ReadByte());
110 item.stack = reader.ReadInt16();
111 }
112
113 public override string ToString()
114 {
115 return Position.X + "x " + Position.Y + "y item: " + item;
116 }
117
118 public void DropItem()
119 {
120 if (Main.netMode != 1)
121 {
122 Item.NewItem(new EntitySource_TileBreak(Position.X, Position.Y), Position.X * 16, Position.Y * 16, 32, 32, item.netID, 1, noBroadcast: false, item.prefix);
123 }
124 item = new Item();
125 }
126
127 public static void TryPlacing(int x, int y, int netid, int prefix, int stack)
128 {
129 WorldGen.RangeFrame(x, y, x + 2, y + 2);
130 int num = Find(x, y);
131 if (num == -1)
132 {
133 int num2 = Item.NewItem(new EntitySource_TileBreak(x, y), x * 16, y * 16, 32, 32, 1);
134 Main.item[num2].netDefaults(netid);
135 Main.item[num2].Prefix(prefix);
136 Main.item[num2].stack = stack;
137 NetMessage.SendData(21, -1, -1, null, num2);
138 return;
139 }
140 TEItemFrame tEItemFrame = (TEItemFrame)TileEntity.ByID[num];
141 if (tEItemFrame.item.stack > 0)
142 {
143 tEItemFrame.DropItem();
144 }
145 tEItemFrame.item = new Item();
146 tEItemFrame.item.netDefaults(netid);
147 tEItemFrame.item.Prefix(prefix);
148 tEItemFrame.item.stack = stack;
149 NetMessage.SendData(86, -1, -1, null, tEItemFrame.ID, x, y);
150 }
151
152 public static void OnPlayerInteraction(Player player, int clickX, int clickY)
153 {
154 if (FitsItemFrame(player.inventory[player.selectedItem]) && !player.inventory[player.selectedItem].favorited)
155 {
157 PlaceItemInFrame(player, clickX, clickY);
159 return;
160 }
161 int num = clickX;
162 int num2 = clickY;
163 if (Main.tile[num, num2].frameX % 36 != 0)
164 {
165 num--;
166 }
167 if (Main.tile[num, num2].frameY % 36 != 0)
168 {
169 num2--;
170 }
171 int num3 = Find(num, num2);
172 if (num3 != -1 && ((TEItemFrame)TileEntity.ByID[num3]).item.stack > 0)
173 {
175 WorldGen.KillTile(clickX, clickY, fail: true);
176 if (Main.netMode == 1)
177 {
178 NetMessage.SendData(17, -1, -1, null, 0, num, num2, 1f);
179 }
180 }
181 }
182
183 public static bool FitsItemFrame(Item i)
184 {
185 return i.stack > 0;
186 }
187
188 public static void PlaceItemInFrame(Player player, int x, int y)
189 {
190 if (!player.ItemTimeIsZero)
191 {
192 return;
193 }
194 if (Main.tile[x, y].frameX % 36 != 0)
195 {
196 x--;
197 }
198 if (Main.tile[x, y].frameY % 36 != 0)
199 {
200 y--;
201 }
202 int num = Find(x, y);
203 if (num == -1)
204 {
205 return;
206 }
207 if (((TEItemFrame)TileEntity.ByID[num]).item.stack > 0)
208 {
209 WorldGen.KillTile(x, y, fail: true);
210 if (Main.netMode == 1)
211 {
212 NetMessage.SendData(17, -1, -1, null, 0, Player.tileTargetX, y, 1f);
213 }
214 }
215 if (Main.netMode == 1)
216 {
217 NetMessage.SendData(89, -1, -1, null, x, y, player.selectedItem, player.whoAmI, 1);
218 }
219 else
220 {
221 TryPlacing(x, y, player.inventory[player.selectedItem].netID, player.inventory[player.selectedItem].prefix, 1);
222 }
223 player.inventory[player.selectedItem].stack--;
224 if (player.inventory[player.selectedItem].stack <= 0)
225 {
226 player.inventory[player.selectedItem].SetDefaults();
227 Main.mouseItem.SetDefaults();
228 }
229 if (player.selectedItem == 58)
230 {
231 Main.mouseItem = player.inventory[player.selectedItem].Clone();
232 }
233 player.releaseUseItem = false;
234 player.mouseInterface = true;
235 player.PlayDroppedItemAnimation(20);
236 WorldGen.RangeFrame(x, y, x + 2, y + 2);
237 }
238
239 public void FixLoadedData()
240 {
242 }
243}
virtual byte ReadByte()
virtual short ReadInt16()
static Dictionary< int, TileEntity > ByID
Definition TileEntity.cs:18
static Dictionary< Point16, TileEntity > ByPosition
Definition TileEntity.cs:20
override void RegisterTileEntityID(int assignedID)
override bool IsTileValidForEntity(int x, int y)
override void ReadExtraData(BinaryReader reader, bool networkSend)
override void NetPlaceEntityAttempt(int x, int y)
override void WriteExtraData(BinaryWriter writer, bool networkSend)
static void OnPlayerInteraction(Player player, int clickX, int clickY)
static void PlaceItemInFrame(Player player, int x, int y)
static void TryPlacing(int x, int y, int netid, int prefix, int stack)
static int Hook_AfterPlacement(int x, int y, int type=395, int style=0, int direction=1, int alternate=0)
Item Clone()
Definition Item.cs:49916
void netDefaults(int type)
Definition Item.cs:1088
int stack
Definition Item.cs:149
bool Prefix(int prefixWeWant)
Definition Item.cs:487
bool favorited
Definition Item.cs:135
int netID
Definition Item.cs:291
void SetDefaults(int Type=0)
Definition Item.cs:47332
static int NewItem(IEntitySource source, Vector2 pos, Vector2 randomBox, int Type, int Stack=1, bool noBroadcast=false, int prefixGiven=0, bool noGrabDelay=false, bool reverseLookup=false)
Definition Item.cs:49697
byte prefix
Definition Item.cs:295
void FixAgainstExploit()
Definition Item.cs:48328
static Item[] item
Definition Main.cs:1681
static int myPlayer
Definition Main.cs:1801
static int netMode
Definition Main.cs:2095
static Item mouseItem
Definition Main.cs:1773
static Tile[,] tile
Definition Main.cs:1675
static void SendData(int msgType, int remoteClient=-1, int ignoreClient=-1, NetworkText text=null, int number=0, float number2=0f, float number3=0f, float number4=0f, int number5=0, int number6=0, int number7=0)
Definition NetMessage.cs:88
static void SendTileSquare(int whoAmi, int tileX, int tileY, int xSize, int ySize, TileChangeType changeType=TileChangeType.None)
void GamepadEnableGrappleCooldown()
Definition Player.cs:23162
bool ItemTimeIsZero
Definition Player.cs:3525
void PlayDroppedItemAnimation(int time)
Definition Player.cs:4393
static int tileTargetX
Definition Player.cs:2083
Item[] inventory
Definition Player.cs:1257
static void FindRecipes(bool canDelayCheck=false)
Definition Recipe.cs:453
static void KillTile(int i, int j, bool fail=false, bool effectOnly=false, bool noItem=false)
static void RangeFrame(int startX, int startY, int endX, int endY)