Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TEHatRack.cs
Go to the documentation of this file.
1using System.IO;
7using Terraria.UI;
8
10
12{
13 private static byte _myEntityID;
14
15 private const int MyTileID = 475;
16
17 private const int entityTileWidth = 3;
18
19 private const int entityTileHeight = 4;
20
22
23 private Item[] _items;
24
25 private Item[] _dyes;
26
27 private static int hatTargetSlot;
28
29 public TEHatRack()
30 {
31 _items = new Item[2];
32 for (int i = 0; i < _items.Length; i++)
33 {
34 _items[i] = new Item();
35 }
36 _dyes = new Item[2];
37 for (int j = 0; j < _dyes.Length; j++)
38 {
39 _dyes[j] = new Item();
40 }
41 _dollPlayer = new Player();
42 _dollPlayer.hair = 15;
43 _dollPlayer.skinColor = Color.White;
44 _dollPlayer.skinVariant = 10;
45 }
46
47 public override void RegisterTileEntityID(int assignedID)
48 {
49 _myEntityID = (byte)assignedID;
50 }
51
52 public override TileEntity GenerateInstance()
53 {
54 return new TEHatRack();
55 }
56
57 public override void NetPlaceEntityAttempt(int x, int y)
58 {
59 int number = Place(x, y);
60 NetMessage.SendData(86, -1, -1, null, number, x, y);
61 }
62
63 public static int Place(int x, int y)
64 {
65 TEHatRack tEHatRack = new TEHatRack();
66 tEHatRack.Position = new Point16(x, y);
67 tEHatRack.ID = TileEntity.AssignNewID();
68 tEHatRack.type = _myEntityID;
70 {
71 TileEntity.ByID[tEHatRack.ID] = tEHatRack;
72 TileEntity.ByPosition[tEHatRack.Position] = tEHatRack;
73 }
74 return tEHatRack.ID;
75 }
76
77 public static int Hook_AfterPlacement(int x, int y, int type = 475, int style = 0, int direction = 1, int alternate = 0)
78 {
79 if (Main.netMode == 1)
80 {
81 NetMessage.SendTileSquare(Main.myPlayer, x - 1, y - 3, 3, 4);
82 NetMessage.SendData(87, -1, -1, null, x + -1, y + -3, (int)_myEntityID);
83 return -1;
84 }
85 return Place(x + -1, y + -3);
86 }
87
88 public static void Kill(int x, int y)
89 {
90 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
91 {
93 {
94 TileEntity.ByID.Remove(value.ID);
95 TileEntity.ByPosition.Remove(new Point16(x, y));
96 }
97 }
98 }
99
100 public static int Find(int x, int y)
101 {
102 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
103 {
104 return value.ID;
105 }
106 return -1;
107 }
108
109 public override void WriteExtraData(BinaryWriter writer, bool networkSend)
110 {
111 BitsByte bitsByte = (byte)0;
112 bitsByte[0] = !_items[0].IsAir;
113 bitsByte[1] = !_items[1].IsAir;
114 bitsByte[2] = !_dyes[0].IsAir;
115 bitsByte[3] = !_dyes[1].IsAir;
116 writer.Write(bitsByte);
117 for (int i = 0; i < 2; i++)
118 {
119 Item item = _items[i];
120 if (!item.IsAir)
121 {
122 writer.Write((short)item.netID);
123 writer.Write(item.prefix);
124 writer.Write((short)item.stack);
125 }
126 }
127 for (int j = 0; j < 2; j++)
128 {
129 Item item2 = _dyes[j];
130 if (!item2.IsAir)
131 {
132 writer.Write((short)item2.netID);
133 writer.Write(item2.prefix);
134 writer.Write((short)item2.stack);
135 }
136 }
137 }
138
139 public override void ReadExtraData(BinaryReader reader, bool networkSend)
140 {
141 BitsByte bitsByte = reader.ReadByte();
142 for (int i = 0; i < 2; i++)
143 {
144 _items[i] = new Item();
145 Item item = _items[i];
146 if (bitsByte[i])
147 {
148 item.netDefaults(reader.ReadInt16());
149 item.Prefix(reader.ReadByte());
150 item.stack = reader.ReadInt16();
151 }
152 }
153 for (int j = 0; j < 2; j++)
154 {
155 _dyes[j] = new Item();
156 Item item2 = _dyes[j];
157 if (bitsByte[j + 2])
158 {
159 item2.netDefaults(reader.ReadInt16());
160 item2.Prefix(reader.ReadByte());
161 item2.stack = reader.ReadInt16();
162 }
163 }
164 }
165
166 public override string ToString()
167 {
168 return string.Concat(Position.X, "x ", Position.Y, "y item: ", _items[0], " ", _items[1]);
169 }
170
171 public static void Framing_CheckTile(int callX, int callY)
172 {
174 {
175 return;
176 }
177 int num = callX;
178 int num2 = callY;
179 Tile tileSafely = Framing.GetTileSafely(callX, callY);
180 num -= tileSafely.frameX / 18 % 3;
181 num2 -= tileSafely.frameY / 18 % 4;
182 bool flag = false;
183 for (int i = num; i < num + 3; i++)
184 {
185 for (int j = num2; j < num2 + 4; j++)
186 {
187 Tile tile = Main.tile[i, j];
188 if (!tile.active() || tile.type != 475)
189 {
190 flag = true;
191 }
192 }
193 }
194 if (!WorldGen.SolidTileAllowBottomSlope(num, num2 + 4) || !WorldGen.SolidTileAllowBottomSlope(num + 1, num2 + 4) || !WorldGen.SolidTileAllowBottomSlope(num + 2, num2 + 4))
195 {
196 flag = true;
197 }
198 if (!flag)
199 {
200 return;
201 }
202 Kill(num, num2);
203 Item.NewItem(new EntitySource_TileBreak(num, num2), num * 16, num2 * 16, 48, 64, 3977);
204 WorldGen.destroyObject = true;
205 for (int k = num; k < num + 3; k++)
206 {
207 for (int l = num2; l < num2 + 4; l++)
208 {
209 if (Main.tile[k, l].active() && Main.tile[k, l].type == 475)
210 {
211 WorldGen.KillTile(k, l);
212 }
213 }
214 }
215 WorldGen.destroyObject = false;
216 }
217
218 public void Draw(int tileLeftX, int tileTopY)
219 {
220 Player dollPlayer = _dollPlayer;
221 dollPlayer.direction = -1;
222 dollPlayer.Male = true;
223 if (Framing.GetTileSafely(tileLeftX, tileTopY).frameX % 216 == 54)
224 {
225 dollPlayer.direction = 1;
226 }
227 dollPlayer.isDisplayDollOrInanimate = true;
228 dollPlayer.isHatRackDoll = true;
229 dollPlayer.armor[0] = _items[0];
230 dollPlayer.dye[0] = _dyes[0];
231 dollPlayer.ResetEffects();
232 dollPlayer.ResetVisibleAccessories();
233 dollPlayer.invis = true;
234 dollPlayer.UpdateDyes();
235 dollPlayer.DisplayDollUpdate();
236 dollPlayer.PlayerFrame();
237 Vector2 vector = new Vector2((float)tileLeftX + 1.5f, tileTopY + 4) * 16f;
238 dollPlayer.direction *= -1;
239 Vector2 vector2 = new Vector2(-dollPlayer.width / 2, -dollPlayer.height - 6) + new Vector2(dollPlayer.direction * 14, -2f);
240 dollPlayer.position = vector + vector2;
241 Main.PlayerRenderer.DrawPlayer(Main.Camera, dollPlayer, dollPlayer.position, 0f, dollPlayer.fullRotationOrigin);
242 dollPlayer.armor[0] = _items[1];
243 dollPlayer.dye[0] = _dyes[1];
244 dollPlayer.ResetEffects();
245 dollPlayer.ResetVisibleAccessories();
246 dollPlayer.invis = true;
247 dollPlayer.UpdateDyes();
248 dollPlayer.DisplayDollUpdate();
249 dollPlayer.skipAnimatingValuesInPlayerFrame = true;
250 dollPlayer.PlayerFrame();
251 dollPlayer.skipAnimatingValuesInPlayerFrame = false;
252 dollPlayer.direction *= -1;
253 vector2 = new Vector2(-dollPlayer.width / 2, -dollPlayer.height - 6) + new Vector2(dollPlayer.direction * 12, 16f);
254 dollPlayer.position = vector + vector2;
255 Main.PlayerRenderer.DrawPlayer(Main.Camera, dollPlayer, dollPlayer.position, 0f, dollPlayer.fullRotationOrigin);
256 }
257
258 public override string GetItemGamepadInstructions(int slot = 0)
259 {
260 Item[] inv = _items;
261 int num = slot;
262 int context = 26;
263 if (slot >= 2)
264 {
265 num -= 2;
266 inv = _dyes;
267 context = 27;
268 }
269 return ItemSlot.GetGamepadInstructions(inv, context, num);
270 }
271
272 public override bool TryGetItemGamepadOverrideInstructions(Item[] inv, int context, int slot, out string instruction)
273 {
274 instruction = "";
275 Item item = inv[slot];
276 if (item.IsAir || item.favorited)
277 {
278 return false;
279 }
280 switch (context)
281 {
282 case 0:
283 if (FitsHatRack(item))
284 {
285 instruction = Lang.misc[76].Value;
286 return true;
287 }
288 break;
289 case 26:
290 case 27:
291 if (Main.player[Main.myPlayer].ItemSpace(item).CanTakeItemToPersonalInventory)
292 {
293 instruction = Lang.misc[68].Value;
294 return true;
295 }
296 break;
297 }
298 return false;
299 }
300
301 public override void OnPlayerUpdate(Player player)
302 {
303 if (!player.InInteractionRange(player.tileEntityAnchor.X, player.tileEntityAnchor.Y, TileReachCheckSettings.Simple) || player.chest != -1 || player.talkNPC != -1)
304 {
305 if (player.chest == -1 && player.talkNPC == -1)
306 {
308 }
309 player.tileEntityAnchor.Clear();
311 }
312 }
313
314 public static void OnPlayerInteraction(Player player, int clickX, int clickY)
315 {
316 int num = clickX;
317 int num2 = clickY;
318 num -= Main.tile[num, num2].frameX % 54 / 18;
319 num2 -= Main.tile[num, num2].frameY / 18;
320 int num3 = Find(num, num2);
321 if (num3 != -1)
322 {
323 num2++;
324 num++;
325 TileEntity.BasicOpenCloseInteraction(player, num, num2, num3);
326 }
327 }
328
329 public override void OnInventoryDraw(Player player, SpriteBatch spriteBatch)
330 {
331 if (Main.tile[player.tileEntityAnchor.X, player.tileEntityAnchor.Y].type != 475)
332 {
333 player.tileEntityAnchor.Clear();
335 }
336 else
337 {
338 DrawInner(player, spriteBatch);
339 }
340 }
341
342 private void DrawInner(Player player, SpriteBatch spriteBatch)
343 {
344 Main.inventoryScale = 0.72f;
345 DrawSlotPairSet(player, spriteBatch, 2, 0, 3.5f, 0.5f, 26);
346 }
347
348 private void DrawSlotPairSet(Player player, SpriteBatch spriteBatch, int slotsToShowLine, int slotsArrayOffset, float offsetX, float offsetY, int inventoryContextTarget)
349 {
350 Item[] items = _items;
351 int num = inventoryContextTarget;
352 for (int i = 0; i < slotsToShowLine; i++)
353 {
354 for (int j = 0; j < 2; j++)
355 {
356 int num2 = (int)(73f + ((float)i + offsetX) * 56f * Main.inventoryScale);
357 int num3 = (int)((float)Main.instance.invBottom + ((float)j + offsetY) * 56f * Main.inventoryScale);
358 if (j == 0)
359 {
360 items = _items;
361 num = inventoryContextTarget;
362 }
363 else
364 {
365 items = _dyes;
366 num = 27;
367 }
369 {
370 player.mouseInterface = true;
371 ItemSlot.Handle(items, num, i + slotsArrayOffset);
372 }
373 ItemSlot.Draw(spriteBatch, items, num, i + slotsArrayOffset, new Vector2(num2, num3));
374 }
375 }
376 }
377
378 public override bool OverrideItemSlotHover(Item[] inv, int context = 0, int slot = 0)
379 {
380 Item item = inv[slot];
381 if (!item.IsAir && !inv[slot].favorited && context == 0 && FitsHatRack(item))
382 {
383 Main.cursorOverride = 9;
384 return true;
385 }
386 if (!item.IsAir && (context == 26 || context == 27) && Main.player[Main.myPlayer].ItemSpace(inv[slot]).CanTakeItemToPersonalInventory)
387 {
388 Main.cursorOverride = 8;
389 return true;
390 }
391 return false;
392 }
393
394 public override bool OverrideItemSlotLeftClick(Item[] inv, int context = 0, int slot = 0)
395 {
396 if (!ItemSlot.ShiftInUse)
397 {
398 return false;
399 }
400 if (Main.cursorOverride == 9 && context == 0)
401 {
402 Item item = inv[slot];
403 if (Main.cursorOverride == 9 && !item.IsAir && !item.favorited && context == 0 && FitsHatRack(item))
404 {
405 return TryFitting(inv, context, slot);
406 }
407 }
408 if ((Main.cursorOverride == 8 && context == 23) || context == 26 || context == 27)
409 {
411 if (Main.netMode == 1)
412 {
413 NetMessage.SendData(124, -1, -1, null, Main.myPlayer, ID, slot);
414 }
415 return true;
416 }
417 return false;
418 }
419
420 public static bool FitsHatRack(Item item)
421 {
422 if (item.maxStack > 1)
423 {
424 return false;
425 }
426 return item.headSlot > 0;
427 }
428
429 private bool TryFitting(Item[] inv, int context = 0, int slot = 0, bool justCheck = false)
430 {
431 if (!FitsHatRack(inv[slot]))
432 {
433 return false;
434 }
435 if (justCheck)
436 {
437 return true;
438 }
439 int num = hatTargetSlot;
441 for (int i = 0; i < 2; i++)
442 {
443 if (_items[i].IsAir)
444 {
445 num = i;
446 hatTargetSlot = i + 1;
447 break;
448 }
449 }
450 for (int j = 0; j < 2; j++)
451 {
452 if (inv[slot].type == _items[j].type)
453 {
454 num = j;
455 }
456 }
457 if (hatTargetSlot >= 2)
458 {
459 hatTargetSlot = 0;
460 }
462 Utils.Swap(ref _items[num], ref inv[slot]);
463 if (Main.netMode == 1)
464 {
465 NetMessage.SendData(124, -1, -1, null, Main.myPlayer, ID, num);
466 }
467 return true;
468 }
469
470 public void WriteItem(int itemIndex, BinaryWriter writer, bool dye)
471 {
472 Item item = _items[itemIndex];
473 if (dye)
474 {
475 item = _dyes[itemIndex];
476 }
477 writer.Write((ushort)item.netID);
478 writer.Write((ushort)item.stack);
479 writer.Write(item.prefix);
480 }
481
482 public void ReadItem(int itemIndex, BinaryReader reader, bool dye)
483 {
484 int defaults = reader.ReadUInt16();
485 int stack = reader.ReadUInt16();
486 int prefixWeWant = reader.ReadByte();
487 Item item = _items[itemIndex];
488 if (dye)
489 {
490 item = _dyes[itemIndex];
491 }
492 item.SetDefaults(defaults);
493 item.stack = stack;
494 item.Prefix(prefixWeWant);
495 }
496
497 public override bool IsTileValidForEntity(int x, int y)
498 {
499 if (!Main.tile[x, y].active() || Main.tile[x, y].type != 475 || Main.tile[x, y].frameY != 0 || Main.tile[x, y].frameX % 54 != 0)
500 {
501 return false;
502 }
503 return true;
504 }
505
506 public static bool IsBreakable(int clickX, int clickY)
507 {
508 int num = clickX;
509 int num2 = clickY;
510 num -= Main.tile[num, num2].frameX % 54 / 18;
511 num2 -= Main.tile[num, num2].frameY / 18;
512 int num3 = Find(num, num2);
513 if (num3 != -1)
514 {
515 return !(TileEntity.ByID[num3] as TEHatRack).ContainsItems();
516 }
517 return true;
518 }
519
520 public bool ContainsItems()
521 {
522 for (int i = 0; i < 2; i++)
523 {
524 if (!_items[i].IsAir || !_dyes[i].IsAir)
525 {
526 return true;
527 }
528 }
529 return false;
530 }
531
532 public void FixLoadedData()
533 {
534 Item[] items = _items;
535 for (int i = 0; i < items.Length; i++)
536 {
537 items[i].FixAgainstExploit();
538 }
539 items = _dyes;
540 for (int i = 0; i < items.Length; i++)
541 {
542 items[i].FixAgainstExploit();
543 }
544 }
545}
virtual byte ReadByte()
virtual ushort ReadUInt16()
virtual short ReadInt16()
static void PlaySound(int type, Vector2 position, int style=1)
static Dictionary< int, TileEntity > ByID
Definition TileEntity.cs:18
static void BasicOpenCloseInteraction(Player player, int x, int y, int id)
static Dictionary< Point16, TileEntity > ByPosition
Definition TileEntity.cs:20
Vector2 position
Definition Entity.cs:14
static Tile GetTileSafely(Vector2 position)
Definition Framing.cs:419
static Asset< Texture2D > InventoryBack
static bool IsBreakable(int clickX, int clickY)
Definition TEHatRack.cs:506
override bool IsTileValidForEntity(int x, int y)
Definition TEHatRack.cs:497
override void ReadExtraData(BinaryReader reader, bool networkSend)
Definition TEHatRack.cs:139
static int Hook_AfterPlacement(int x, int y, int type=475, int style=0, int direction=1, int alternate=0)
Definition TEHatRack.cs:77
void WriteItem(int itemIndex, BinaryWriter writer, bool dye)
Definition TEHatRack.cs:470
override void WriteExtraData(BinaryWriter writer, bool networkSend)
Definition TEHatRack.cs:109
override void NetPlaceEntityAttempt(int x, int y)
Definition TEHatRack.cs:57
static void Framing_CheckTile(int callX, int callY)
Definition TEHatRack.cs:171
override bool OverrideItemSlotHover(Item[] inv, int context=0, int slot=0)
Definition TEHatRack.cs:378
override bool TryGetItemGamepadOverrideInstructions(Item[] inv, int context, int slot, out string instruction)
Definition TEHatRack.cs:272
bool TryFitting(Item[] inv, int context=0, int slot=0, bool justCheck=false)
Definition TEHatRack.cs:429
override string GetItemGamepadInstructions(int slot=0)
Definition TEHatRack.cs:258
static void OnPlayerInteraction(Player player, int clickX, int clickY)
Definition TEHatRack.cs:314
void DrawInner(Player player, SpriteBatch spriteBatch)
Definition TEHatRack.cs:342
override void OnPlayerUpdate(Player player)
Definition TEHatRack.cs:301
void ReadItem(int itemIndex, BinaryReader reader, bool dye)
Definition TEHatRack.cs:482
override bool OverrideItemSlotLeftClick(Item[] inv, int context=0, int slot=0)
Definition TEHatRack.cs:394
override void RegisterTileEntityID(int assignedID)
Definition TEHatRack.cs:47
override void OnInventoryDraw(Player player, SpriteBatch spriteBatch)
Definition TEHatRack.cs:329
void Draw(int tileLeftX, int tileTopY)
Definition TEHatRack.cs:218
void DrawSlotPairSet(Player player, SpriteBatch spriteBatch, int slotsToShowLine, int slotsArrayOffset, float offsetX, float offsetY, int inventoryContextTarget)
Definition TEHatRack.cs:348
void netDefaults(int type)
Definition Item.cs:1088
int stack
Definition Item.cs:149
bool Prefix(int prefixWeWant)
Definition Item.cs:487
bool IsAir
Definition Item.cs:377
bool favorited
Definition Item.cs:135
int netID
Definition Item.cs:291
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 LocalizedText[] misc
Definition Lang.cs:25
static int myPlayer
Definition Main.cs:1801
static int netMode
Definition Main.cs:2095
static IPlayerRenderer PlayerRenderer
Definition Main.cs:291
static int cursorOverride
Definition Main.cs:2181
static Camera Camera
Definition Main.cs:289
static float inventoryScale
Definition Main.cs:1779
static Tile[,] tile
Definition Main.cs:1675
static int mouseY
Definition Main.cs:606
static Player[] player
Definition Main.cs:1803
static int mouseX
Definition Main.cs:604
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 ResetEffects()
Definition Player.cs:17886
void ResetVisibleAccessories()
Definition Player.cs:28887
void DisplayDollUpdate()
Definition Player.cs:33951
void UpdateDyes()
Definition Player.cs:9096
bool InInteractionRange(int interactX, int interactY, TileReachCheckSettings settings)
Definition Player.cs:29774
Vector2 fullRotationOrigin
Definition Player.cs:1293
void PlayerFrame()
Definition Player.cs:33978
PlayerInteractionAnchor tileEntityAnchor
Definition Player.cs:2469
static void FindRecipes(bool canDelayCheck=false)
Definition Recipe.cs:453
ushort type
Definition Tile.cs:8
bool active()
Definition Tile.cs:565
static void Draw(SpriteBatch spriteBatch, ref Item inv, int context, Vector2 position, Color lightColor=default(Color))
Definition ItemSlot.cs:1777
static bool ShiftInUse
Definition ItemSlot.cs:162
static string GetGamepadInstructions(ref Item inv, int context=0)
Definition ItemSlot.cs:3092
static void Handle(ref Item inv, int context=0)
Definition ItemSlot.cs:302
static bool FloatIntersect(float r1StartX, float r1StartY, float r1Width, float r1Height, float r2StartX, float r2StartY, float r2Width, float r2Height)
Definition Utils.cs:627
static bool destroyObject
Definition WorldGen.cs:1020
static void KillTile(int i, int j, bool fail=false, bool effectOnly=false, bool noItem=false)
static bool SolidTileAllowBottomSlope(int i, int j)
static GetItemSettings InventoryEntityToPlayerInventorySettings