Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TEDisplayDoll.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 = 470;
16
17 private const int entityTileWidth = 2;
18
19 private const int entityTileHeight = 3;
20
22
23 private Item[] _items;
24
25 private Item[] _dyes;
26
27 private static int accessoryTargetSlot = 3;
28
30 {
31 _items = new Item[8];
32 for (int i = 0; i < _items.Length; i++)
33 {
34 _items[i] = new Item();
35 }
36 _dyes = new Item[8];
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 TEDisplayDoll();
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 TEDisplayDoll tEDisplayDoll = new TEDisplayDoll();
66 tEDisplayDoll.Position = new Point16(x, y);
67 tEDisplayDoll.ID = TileEntity.AssignNewID();
68 tEDisplayDoll.type = _myEntityID;
70 {
71 TileEntity.ByID[tEDisplayDoll.ID] = tEDisplayDoll;
72 TileEntity.ByPosition[tEDisplayDoll.Position] = tEDisplayDoll;
73 }
74 return tEDisplayDoll.ID;
75 }
76
77 public static int Hook_AfterPlacement(int x, int y, int type = 470, int style = 0, int direction = 1, int alternate = 0)
78 {
79 if (Main.netMode == 1)
80 {
81 NetMessage.SendTileSquare(Main.myPlayer, x, y - 2, 2, 3);
82 NetMessage.SendData(87, -1, -1, null, x, y - 2, (int)_myEntityID);
83 return -1;
84 }
85 return Place(x, y - 2);
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] = !_items[2].IsAir;
115 bitsByte[3] = !_items[3].IsAir;
116 bitsByte[4] = !_items[4].IsAir;
117 bitsByte[5] = !_items[5].IsAir;
118 bitsByte[6] = !_items[6].IsAir;
119 bitsByte[7] = !_items[7].IsAir;
120 BitsByte bitsByte2 = (byte)0;
121 bitsByte2[0] = !_dyes[0].IsAir;
122 bitsByte2[1] = !_dyes[1].IsAir;
123 bitsByte2[2] = !_dyes[2].IsAir;
124 bitsByte2[3] = !_dyes[3].IsAir;
125 bitsByte2[4] = !_dyes[4].IsAir;
126 bitsByte2[5] = !_dyes[5].IsAir;
127 bitsByte2[6] = !_dyes[6].IsAir;
128 bitsByte2[7] = !_dyes[7].IsAir;
129 writer.Write(bitsByte);
130 writer.Write(bitsByte2);
131 for (int i = 0; i < 8; i++)
132 {
133 Item item = _items[i];
134 if (!item.IsAir)
135 {
136 writer.Write((short)item.netID);
137 writer.Write(item.prefix);
138 writer.Write((short)item.stack);
139 }
140 }
141 for (int j = 0; j < 8; j++)
142 {
143 Item item2 = _dyes[j];
144 if (!item2.IsAir)
145 {
146 writer.Write((short)item2.netID);
147 writer.Write(item2.prefix);
148 writer.Write((short)item2.stack);
149 }
150 }
151 }
152
153 public override void ReadExtraData(BinaryReader reader, bool networkSend)
154 {
155 BitsByte bitsByte = reader.ReadByte();
156 BitsByte bitsByte2 = reader.ReadByte();
157 for (int i = 0; i < 8; i++)
158 {
159 _items[i] = new Item();
160 Item item = _items[i];
161 if (bitsByte[i])
162 {
163 item.netDefaults(reader.ReadInt16());
164 item.Prefix(reader.ReadByte());
165 item.stack = reader.ReadInt16();
166 }
167 }
168 for (int j = 0; j < 8; j++)
169 {
170 _dyes[j] = new Item();
171 Item item2 = _dyes[j];
172 if (bitsByte2[j])
173 {
174 item2.netDefaults(reader.ReadInt16());
175 item2.Prefix(reader.ReadByte());
176 item2.stack = reader.ReadInt16();
177 }
178 }
179 }
180
181 public override string ToString()
182 {
183 return string.Concat(Position.X, "x ", Position.Y, "y item: ", _items[0], " ", _items[1], " ", _items[2]);
184 }
185
186 public static void Framing_CheckTile(int callX, int callY)
187 {
189 {
190 return;
191 }
192 int num = callX;
193 int num2 = callY;
194 Tile tileSafely = Framing.GetTileSafely(callX, callY);
195 num -= tileSafely.frameX / 18 % 2;
196 num2 -= tileSafely.frameY / 18 % 3;
197 bool flag = false;
198 for (int i = num; i < num + 2; i++)
199 {
200 for (int j = num2; j < num2 + 3; j++)
201 {
202 Tile tile = Main.tile[i, j];
203 if (!tile.active() || tile.type != 470)
204 {
205 flag = true;
206 }
207 }
208 }
209 if (!WorldGen.SolidTileAllowBottomSlope(num, num2 + 3) || !WorldGen.SolidTileAllowBottomSlope(num + 1, num2 + 3))
210 {
211 flag = true;
212 }
213 if (!flag)
214 {
215 return;
216 }
217 Kill(num, num2);
218 if (Main.tile[callX, callY].frameX / 72 != 1)
219 {
220 Item.NewItem(new EntitySource_TileBreak(num, num2), num * 16, num2 * 16, 32, 48, 498);
221 }
222 else
223 {
224 Item.NewItem(new EntitySource_TileBreak(num, num2), num * 16, num2 * 16, 32, 48, 1989);
225 }
226 WorldGen.destroyObject = true;
227 for (int k = num; k < num + 2; k++)
228 {
229 for (int l = num2; l < num2 + 3; l++)
230 {
231 if (Main.tile[k, l].active() && Main.tile[k, l].type == 470)
232 {
233 WorldGen.KillTile(k, l);
234 }
235 }
236 }
237 WorldGen.destroyObject = false;
238 }
239
240 public void Draw(int tileLeftX, int tileTopY)
241 {
242 Player dollPlayer = _dollPlayer;
243 for (int i = 0; i < 8; i++)
244 {
245 dollPlayer.armor[i] = _items[i];
246 dollPlayer.dye[i] = _dyes[i];
247 }
248 dollPlayer.direction = -1;
249 dollPlayer.Male = true;
250 Tile tileSafely = Framing.GetTileSafely(tileLeftX, tileTopY);
251 if (tileSafely.frameX % 72 == 36)
252 {
253 dollPlayer.direction = 1;
254 }
255 if (tileSafely.frameX / 72 == 1)
256 {
257 dollPlayer.Male = false;
258 }
259 dollPlayer.isDisplayDollOrInanimate = true;
260 dollPlayer.ResetEffects();
261 dollPlayer.ResetVisibleAccessories();
262 dollPlayer.UpdateDyes();
263 dollPlayer.DisplayDollUpdate();
264 dollPlayer.UpdateSocialShadow();
265 dollPlayer.PlayerFrame();
266 Vector2 position = new Vector2(tileLeftX + 1, tileTopY + 3) * 16f + new Vector2(-dollPlayer.width / 2, -dollPlayer.height - 6);
267 dollPlayer.position = position;
268 dollPlayer.isFullbright = tileSafely.fullbrightBlock();
269 dollPlayer.skinDyePacked = PlayerDrawHelper.PackShader(tileSafely.color(), PlayerDrawHelper.ShaderConfiguration.TilePaintID);
270 Main.PlayerRenderer.DrawPlayer(Main.Camera, dollPlayer, dollPlayer.position, 0f, dollPlayer.fullRotationOrigin);
271 }
272
273 public override void OnPlayerUpdate(Player player)
274 {
275 if (!player.InInteractionRange(player.tileEntityAnchor.X, player.tileEntityAnchor.Y, TileReachCheckSettings.Simple) || player.chest != -1 || player.talkNPC != -1)
276 {
277 if (player.chest == -1 && player.talkNPC == -1)
278 {
280 }
281 player.tileEntityAnchor.Clear();
283 }
284 }
285
286 public static void OnPlayerInteraction(Player player, int clickX, int clickY)
287 {
288 int num = clickX;
289 int num2 = clickY;
290 if (Main.tile[num, num2].frameX % 36 != 0)
291 {
292 num--;
293 }
294 num2 -= Main.tile[num, num2].frameY / 18;
295 int num3 = Find(num, num2);
296 if (num3 != -1)
297 {
298 num2++;
300 TileEntity.BasicOpenCloseInteraction(player, num, num2, num3);
301 }
302 }
303
304 public override void OnInventoryDraw(Player player, SpriteBatch spriteBatch)
305 {
306 if (Main.tile[player.tileEntityAnchor.X, player.tileEntityAnchor.Y].type != 470)
307 {
308 player.tileEntityAnchor.Clear();
310 }
311 else
312 {
313 DrawInner(player, spriteBatch);
314 }
315 }
316
317 public override bool TryGetItemGamepadOverrideInstructions(Item[] inv, int context, int slot, out string instruction)
318 {
319 instruction = "";
320 Item item = inv[slot];
321 if (item.IsAir || item.favorited)
322 {
323 return false;
324 }
325 switch (context)
326 {
327 case 0:
328 if (FitsDisplayDoll(item))
329 {
330 instruction = Lang.misc[76].Value;
331 return true;
332 }
333 break;
334 case 23:
335 case 24:
336 case 25:
337 if (Main.player[Main.myPlayer].ItemSpace(item).CanTakeItemToPersonalInventory)
338 {
339 instruction = Lang.misc[68].Value;
340 return true;
341 }
342 break;
343 }
344 return false;
345 }
346
347 public override string GetItemGamepadInstructions(int slot = 0)
348 {
349 Item[] inv = _items;
350 int num = slot;
351 int context = 23;
352 if (slot >= 8)
353 {
354 num -= 8;
355 inv = _dyes;
356 context = 25;
357 }
358 else if (slot >= 3)
359 {
360 inv = _items;
361 context = 24;
362 }
363 return ItemSlot.GetGamepadInstructions(inv, context, num);
364 }
365
366 private void DrawInner(Player player, SpriteBatch spriteBatch)
367 {
368 Main.inventoryScale = 0.72f;
369 DrawSlotPairSet(player, spriteBatch, 3, 0, 0f, 0.5f, 23);
370 DrawSlotPairSet(player, spriteBatch, 5, 3, 3f, 0.5f, 24);
371 }
372
373 private void DrawSlotPairSet(Player player, SpriteBatch spriteBatch, int slotsToShowLine, int slotsArrayOffset, float offsetX, float offsetY, int inventoryContextTarget)
374 {
375 Item[] items = _items;
376 int num = inventoryContextTarget;
377 for (int i = 0; i < slotsToShowLine; i++)
378 {
379 for (int j = 0; j < 2; j++)
380 {
381 int num2 = (int)(73f + ((float)i + offsetX) * 56f * Main.inventoryScale);
382 int num3 = (int)((float)Main.instance.invBottom + ((float)j + offsetY) * 56f * Main.inventoryScale);
383 if (j == 0)
384 {
385 items = _items;
386 num = inventoryContextTarget;
387 }
388 else
389 {
390 items = _dyes;
391 num = 25;
392 }
394 {
395 player.mouseInterface = true;
396 ItemSlot.Handle(items, num, i + slotsArrayOffset);
397 }
398 ItemSlot.Draw(spriteBatch, items, num, i + slotsArrayOffset, new Vector2(num2, num3));
399 }
400 }
401 }
402
403 public override bool OverrideItemSlotHover(Item[] inv, int context = 0, int slot = 0)
404 {
405 Item item = inv[slot];
406 if (!item.IsAir && !inv[slot].favorited && context == 0 && FitsDisplayDoll(item))
407 {
408 Main.cursorOverride = 9;
409 return true;
410 }
411 if (!item.IsAir && (context == 23 || context == 24 || context == 25) && Main.player[Main.myPlayer].ItemSpace(inv[slot]).CanTakeItemToPersonalInventory)
412 {
413 Main.cursorOverride = 8;
414 return true;
415 }
416 return false;
417 }
418
419 public override bool OverrideItemSlotLeftClick(Item[] inv, int context = 0, int slot = 0)
420 {
421 if (!ItemSlot.ShiftInUse)
422 {
423 return false;
424 }
425 if (Main.cursorOverride == 9 && context == 0)
426 {
427 Item item = inv[slot];
428 if (!item.IsAir && !item.favorited && FitsDisplayDoll(item))
429 {
430 return TryFitting(inv, context, slot);
431 }
432 }
433 if ((Main.cursorOverride == 8 && context == 23) || context == 24 || context == 25)
434 {
436 if (Main.netMode == 1)
437 {
438 if (context == 25)
439 {
440 NetMessage.SendData(121, -1, -1, null, Main.myPlayer, ID, slot, 1f);
441 }
442 else
443 {
444 NetMessage.SendData(121, -1, -1, null, Main.myPlayer, ID, slot);
445 }
446 }
447 return true;
448 }
449 return false;
450 }
451
452 public static bool FitsDisplayDoll(Item item)
453 {
454 if (item.maxStack > 1)
455 {
456 return false;
457 }
458 if (item.headSlot <= 0 && item.bodySlot <= 0 && item.legSlot <= 0)
459 {
460 return item.accessory;
461 }
462 return true;
463 }
464
465 private bool TryFitting(Item[] inv, int context = 0, int slot = 0, bool justCheck = false)
466 {
467 Item item = inv[slot];
468 int num = -1;
469 if (item.headSlot > 0)
470 {
471 num = 0;
472 }
473 if (item.bodySlot > 0)
474 {
475 num = 1;
476 }
477 if (item.legSlot > 0)
478 {
479 num = 2;
480 }
481 if (item.accessory)
482 {
484 }
485 if (num == -1)
486 {
487 return false;
488 }
489 if (justCheck)
490 {
491 return true;
492 }
493 if (item.accessory)
494 {
496 if (accessoryTargetSlot >= 8)
497 {
499 }
500 bool flag = ItemSlot.AccCheck(_items, inv[slot], -1);
501 for (int i = 3; i < 8; i++)
502 {
503 if (_items[i].IsAir)
504 {
505 num = i;
507 break;
508 }
509 }
510 for (int j = 3; j < 8; j++)
511 {
512 if (inv[slot].type == _items[j].type || (flag && !ItemSlot.AccCheck(_items, inv[slot], j)))
513 {
514 num = j;
515 if (flag)
516 {
517 flag = false;
518 break;
519 }
520 }
521 }
522 if (flag && num > -1)
523 {
524 return false;
525 }
526 }
528 Utils.Swap(ref _items[num], ref inv[slot]);
529 if (Main.netMode == 1)
530 {
531 NetMessage.SendData(121, -1, -1, null, Main.myPlayer, ID, num);
532 }
533 return true;
534 }
535
536 public void WriteItem(int itemIndex, BinaryWriter writer, bool dye)
537 {
538 Item item = _items[itemIndex];
539 if (dye)
540 {
541 item = _dyes[itemIndex];
542 }
543 writer.Write((ushort)item.netID);
544 writer.Write((ushort)item.stack);
545 writer.Write(item.prefix);
546 }
547
548 public void ReadItem(int itemIndex, BinaryReader reader, bool dye)
549 {
550 int defaults = reader.ReadUInt16();
551 int stack = reader.ReadUInt16();
552 int prefixWeWant = reader.ReadByte();
553 Item item = _items[itemIndex];
554 if (dye)
555 {
556 item = _dyes[itemIndex];
557 }
558 item.SetDefaults(defaults);
559 item.stack = stack;
560 item.Prefix(prefixWeWant);
561 }
562
563 public override bool IsTileValidForEntity(int x, int y)
564 {
565 if (!Main.tile[x, y].active() || Main.tile[x, y].type != 470 || Main.tile[x, y].frameY != 0 || Main.tile[x, y].frameX % 36 != 0)
566 {
567 return false;
568 }
569 return true;
570 }
571
572 public void SetInventoryFromMannequin(int headFrame, int shirtFrame, int legFrame)
573 {
574 headFrame /= 100;
575 shirtFrame /= 100;
576 legFrame /= 100;
577 if (headFrame >= 0 && headFrame < Item.headType.Length)
578 {
579 _items[0].SetDefaults(Item.headType[headFrame]);
580 }
581 if (shirtFrame >= 0 && shirtFrame < Item.bodyType.Length)
582 {
583 _items[1].SetDefaults(Item.bodyType[shirtFrame]);
584 }
585 if (legFrame >= 0 && legFrame < Item.legType.Length)
586 {
587 _items[2].SetDefaults(Item.legType[legFrame]);
588 }
589 }
590
591 public static bool IsBreakable(int clickX, int clickY)
592 {
593 int num = clickX;
594 int num2 = clickY;
595 if (Main.tile[num, num2].frameX % 36 != 0)
596 {
597 num--;
598 }
599 num2 -= Main.tile[num, num2].frameY / 18;
600 int num3 = Find(num, num2);
601 if (num3 != -1)
602 {
603 return !(TileEntity.ByID[num3] as TEDisplayDoll).ContainsItems();
604 }
605 return true;
606 }
607
608 public bool ContainsItems()
609 {
610 for (int i = 0; i < 8; i++)
611 {
612 if (!_items[i].IsAir || !_dyes[i].IsAir)
613 {
614 return true;
615 }
616 }
617 return false;
618 }
619
620 public void FixLoadedData()
621 {
622 Item[] items = _items;
623 for (int i = 0; i < items.Length; i++)
624 {
625 items[i].FixAgainstExploit();
626 }
627 items = _dyes;
628 for (int i = 0; i < items.Length; i++)
629 {
630 items[i].FixAgainstExploit();
631 }
632 }
633}
virtual byte ReadByte()
virtual ushort ReadUInt16()
virtual short ReadInt16()
static void PlaySound(int type, Vector2 position, int style=1)
static int PackShader(int localShaderIndex, ShaderConfiguration shaderType)
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
override void RegisterTileEntityID(int assignedID)
override bool OverrideItemSlotLeftClick(Item[] inv, int context=0, int slot=0)
bool TryFitting(Item[] inv, int context=0, int slot=0, bool justCheck=false)
void SetInventoryFromMannequin(int headFrame, int shirtFrame, int legFrame)
void Draw(int tileLeftX, int tileTopY)
static void Framing_CheckTile(int callX, int callY)
static void OnPlayerInteraction(Player player, int clickX, int clickY)
void ReadItem(int itemIndex, BinaryReader reader, bool dye)
override bool OverrideItemSlotHover(Item[] inv, int context=0, int slot=0)
override bool TryGetItemGamepadOverrideInstructions(Item[] inv, int context, int slot, out string instruction)
static bool IsBreakable(int clickX, int clickY)
override void OnInventoryDraw(Player player, SpriteBatch spriteBatch)
override void ReadExtraData(BinaryReader reader, bool networkSend)
override void NetPlaceEntityAttempt(int x, int y)
static int Hook_AfterPlacement(int x, int y, int type=470, int style=0, int direction=1, int alternate=0)
override string GetItemGamepadInstructions(int slot=0)
void DrawInner(Player player, SpriteBatch spriteBatch)
void DrawSlotPairSet(Player player, SpriteBatch spriteBatch, int slotsToShowLine, int slotsArrayOffset, float offsetX, float offsetY, int inventoryContextTarget)
void WriteItem(int itemIndex, BinaryWriter writer, bool dye)
override void WriteExtraData(BinaryWriter writer, bool networkSend)
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
static int[] legType
Definition Item.cs:73
static int[] headType
Definition Item.cs:69
int netID
Definition Item.cs:291
static int[] bodyType
Definition Item.cs:71
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 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
void UpdateSocialShadow()
Definition Player.cs:15909
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
byte color()
Definition Tile.cs:555
bool fullbrightBlock()
Definition Tile.cs:538
ushort type
Definition Tile.cs:8
short frameX
Definition Tile.cs:22
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 bool AccCheck(Item[] itemCollection, Item item, int slot)
Definition ItemSlot.cs:2654
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