Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TEWeaponsRack.cs
Go to the documentation of this file.
1using System.IO;
3using Terraria.ID;
4
6
8{
9 private static byte _myEntityID;
10
11 public Item item;
12
13 private const int MyTileID = 471;
14
16 {
17 item = new Item();
18 }
19
20 public override void RegisterTileEntityID(int assignedID)
21 {
22 _myEntityID = (byte)assignedID;
23 }
24
25 public override TileEntity GenerateInstance()
26 {
27 return new TEWeaponsRack();
28 }
29
30 public override void NetPlaceEntityAttempt(int x, int y)
31 {
32 NetPlaceEntity(x, y);
33 }
34
35 public static void NetPlaceEntity(int x, int y)
36 {
37 int number = Place(x, y);
38 NetMessage.SendData(86, -1, -1, null, number, x, y);
39 }
40
41 public override bool IsTileValidForEntity(int x, int y)
42 {
43 return ValidTile(x, y);
44 }
45
46 public static bool ValidTile(int x, int y)
47 {
48 if (!Main.tile[x, y].active() || Main.tile[x, y].type != 471 || Main.tile[x, y].frameY != 0 || Main.tile[x, y].frameX % 54 != 0)
49 {
50 return false;
51 }
52 return true;
53 }
54
55 public static int Place(int x, int y)
56 {
57 TEWeaponsRack tEWeaponsRack = new TEWeaponsRack();
58 tEWeaponsRack.Position = new Point16(x, y);
59 tEWeaponsRack.ID = TileEntity.AssignNewID();
60 tEWeaponsRack.type = _myEntityID;
62 {
63 TileEntity.ByID[tEWeaponsRack.ID] = tEWeaponsRack;
64 TileEntity.ByPosition[tEWeaponsRack.Position] = tEWeaponsRack;
65 }
66 return tEWeaponsRack.ID;
67 }
68
69 public static int Hook_AfterPlacement(int x, int y, int type = 471, int style = 0, int direction = 1, int alternate = 0)
70 {
71 if (Main.netMode == 1)
72 {
74 NetMessage.SendData(87, -1, -1, null, x, y, (int)_myEntityID);
75 return -1;
76 }
77 return Place(x, y);
78 }
79
80 public static void Kill(int x, int y)
81 {
82 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
83 {
85 {
86 TileEntity.ByID.Remove(value.ID);
87 TileEntity.ByPosition.Remove(new Point16(x, y));
88 }
89 }
90 }
91
92 public static int Find(int x, int y)
93 {
94 if (TileEntity.ByPosition.TryGetValue(new Point16(x, y), out var value) && value.type == _myEntityID)
95 {
96 return value.ID;
97 }
98 return -1;
99 }
100
101 public override void WriteExtraData(BinaryWriter writer, bool networkSend)
102 {
103 writer.Write((short)item.netID);
104 writer.Write(item.prefix);
105 writer.Write((short)item.stack);
106 }
107
108 public override void ReadExtraData(BinaryReader reader, bool networkSend)
109 {
110 item = new Item();
111 item.netDefaults(reader.ReadInt16());
112 item.Prefix(reader.ReadByte());
113 item.stack = reader.ReadInt16();
114 }
115
116 public override string ToString()
117 {
118 return Position.X + "x " + Position.Y + "y item: " + item;
119 }
120
121 public static void Framing_CheckTile(int callX, int callY)
122 {
123 int num = 3;
124 int num2 = 3;
126 {
127 return;
128 }
129 int num3 = callX;
130 int num4 = callY;
131 Tile tileSafely = Framing.GetTileSafely(callX, callY);
132 num3 -= tileSafely.frameX / 18 % num;
133 num4 -= tileSafely.frameY / 18 % num2;
134 bool flag = false;
135 for (int i = num3; i < num3 + num; i++)
136 {
137 for (int j = num4; j < num4 + num2; j++)
138 {
139 Tile tile = Main.tile[i, j];
140 if (!tile.active() || tile.type != 471 || tile.wall == 0)
141 {
142 flag = true;
143 }
144 }
145 }
146 if (!flag)
147 {
148 return;
149 }
150 int num5 = Find(num3, num4);
151 if (num5 != -1 && ((TEWeaponsRack)TileEntity.ByID[num5]).item.stack > 0)
152 {
153 ((TEWeaponsRack)TileEntity.ByID[num5]).DropItem();
154 if (Main.netMode != 2)
155 {
156 Main.LocalPlayer.InterruptItemUsageIfOverTile(471);
157 }
158 }
159 WorldGen.destroyObject = true;
160 for (int k = num3; k < num3 + num; k++)
161 {
162 for (int l = num4; l < num4 + num2; l++)
163 {
164 if (Main.tile[k, l].active() && Main.tile[k, l].type == 471)
165 {
166 WorldGen.KillTile(k, l);
167 }
168 }
169 }
170 Item.NewItem(new EntitySource_TileBreak(num3, num4), num3 * 16, num4 * 16, 48, 48, 2699);
171 Kill(num3, num4);
172 WorldGen.destroyObject = false;
173 }
174
175 public void DropItem()
176 {
177 if (Main.netMode != 1)
178 {
179 Item.NewItem(new EntitySource_TileBreak(Position.X, Position.Y), Position.X * 16, Position.Y * 16, 32, 32, item.netID, 1, noBroadcast: false, item.prefix);
180 }
181 item = new Item();
182 }
183
184 public static void TryPlacing(int x, int y, int netid, int prefix, int stack)
185 {
186 WorldGen.RangeFrame(x, y, x + 3, y + 3);
187 int num = Find(x, y);
188 if (num == -1)
189 {
190 int num2 = Item.NewItem(new EntitySource_TileBreak(x, y), x * 16, y * 16, 32, 32, 1);
191 Main.item[num2].netDefaults(netid);
192 Main.item[num2].Prefix(prefix);
193 Main.item[num2].stack = stack;
194 NetMessage.SendData(21, -1, -1, null, num2);
195 return;
196 }
197 TEWeaponsRack tEWeaponsRack = (TEWeaponsRack)TileEntity.ByID[num];
198 if (tEWeaponsRack.item.stack > 0)
199 {
200 tEWeaponsRack.DropItem();
201 }
202 tEWeaponsRack.item = new Item();
203 tEWeaponsRack.item.netDefaults(netid);
204 tEWeaponsRack.item.Prefix(prefix);
205 tEWeaponsRack.item.stack = stack;
206 NetMessage.SendData(86, -1, -1, null, tEWeaponsRack.ID, x, y);
207 }
208
209 public static void OnPlayerInteraction(Player player, int clickX, int clickY)
210 {
211 if (FitsWeaponFrame(player.inventory[player.selectedItem]) && !player.inventory[player.selectedItem].favorited)
212 {
214 PlaceItemInFrame(player, clickX, clickY);
216 return;
217 }
218 int num = clickX;
219 int num2 = clickY;
220 num -= Main.tile[num, num2].frameX % 54 / 18;
221 num2 -= Main.tile[num, num2].frameY % 54 / 18;
222 int num3 = Find(num, num2);
223 if (num3 != -1 && ((TEWeaponsRack)TileEntity.ByID[num3]).item.stack > 0)
224 {
226 WorldGen.KillTile(num, num2, fail: true);
227 if (Main.netMode == 1)
228 {
229 NetMessage.SendData(17, -1, -1, null, 0, num, num2, 1f);
230 }
231 }
232 }
233
234 public static bool FitsWeaponFrame(Item i)
235 {
236 if (!i.IsAir && (i.fishingPole > 0 || ItemID.Sets.CanBePlacedOnWeaponRacks[i.type]))
237 {
238 return true;
239 }
240 if (i.damage > 0 && i.useStyle != 0)
241 {
242 return i.stack > 0;
243 }
244 return false;
245 }
246
247 private static void PlaceItemInFrame(Player player, int x, int y)
248 {
249 if (!player.ItemTimeIsZero)
250 {
251 return;
252 }
253 x -= Main.tile[x, y].frameX % 54 / 18;
254 y -= Main.tile[x, y].frameY % 54 / 18;
255 int num = Find(x, y);
256 if (num == -1)
257 {
258 return;
259 }
260 if (((TEWeaponsRack)TileEntity.ByID[num]).item.stack > 0)
261 {
262 WorldGen.KillTile(x, y, fail: true);
263 if (Main.netMode == 1)
264 {
265 NetMessage.SendData(17, -1, -1, null, 0, Player.tileTargetX, y, 1f);
266 }
267 }
268 if (Main.netMode == 1)
269 {
270 NetMessage.SendData(123, -1, -1, null, x, y, player.selectedItem, player.whoAmI, 1);
271 }
272 else
273 {
274 TryPlacing(x, y, player.inventory[player.selectedItem].netID, player.inventory[player.selectedItem].prefix, 1);
275 }
276 player.inventory[player.selectedItem].stack--;
277 if (player.inventory[player.selectedItem].stack <= 0)
278 {
279 player.inventory[player.selectedItem].SetDefaults();
280 Main.mouseItem.SetDefaults();
281 }
282 if (player.selectedItem == 58)
283 {
284 Main.mouseItem = player.inventory[player.selectedItem].Clone();
285 }
286 player.releaseUseItem = false;
287 player.mouseInterface = true;
288 player.PlayDroppedItemAnimation(20);
289 WorldGen.RangeFrame(x, y, x + 3, y + 3);
290 }
291
292 public void FixLoadedData()
293 {
295 }
296}
virtual byte ReadByte()
virtual short ReadInt16()
static Dictionary< int, TileEntity > ByID
Definition TileEntity.cs:18
static Dictionary< Point16, TileEntity > ByPosition
Definition TileEntity.cs:20
static Tile GetTileSafely(Vector2 position)
Definition Framing.cs:419
override void WriteExtraData(BinaryWriter writer, bool networkSend)
override void NetPlaceEntityAttempt(int x, int y)
static int Hook_AfterPlacement(int x, int y, int type=471, int style=0, int direction=1, int alternate=0)
override bool IsTileValidForEntity(int x, int y)
static void PlaceItemInFrame(Player player, int x, int y)
static void TryPlacing(int x, int y, int netid, int prefix, int stack)
static void Framing_CheckTile(int callX, int callY)
override void RegisterTileEntityID(int assignedID)
override void ReadExtraData(BinaryReader reader, bool networkSend)
static void OnPlayerInteraction(Player player, int clickX, int clickY)
static bool[] CanBePlacedOnWeaponRacks
Definition ItemID.cs:1036
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 Player LocalPlayer
Definition Main.cs:2829
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
ushort type
Definition Tile.cs:8
bool active()
Definition Tile.cs:565
ushort wall
Definition Tile.cs:10
static bool destroyObject
Definition WorldGen.cs:1020
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)