Skip to content

Commit 3c0178e

Browse files
committed
Merge branch 'develop'
2 parents c852d4a + 9f11312 commit 3c0178e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+931
-437
lines changed

ContainerAdapters/CannonAdapter.cs

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public bool InjectItem(int x, int y, Item item)
5252

5353
WorldGen.ShootFromCannon(originX, originY, angle, ammotype, item.damage, item.knockBack, Main.myPlayer);
5454

55+
item.stack--;
56+
5557
return true;
5658
}
5759
}

ContainerAdapters/ChestAdapter.cs

+37-12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
using System;
22
using System.Collections.Generic;
33
using Terraria;
4-
using Terraria.ID;
54
using Terraria.ModLoader;
65

76
namespace MechTransfer.ContainerAdapters
87
{
98
internal class ChestAdapter
109
{
10+
private Mod mod;
11+
12+
public ChestAdapter(Mod mod)
13+
{
14+
this.mod = mod;
15+
}
16+
1117
private int FindChest(int x, int y)
1218
{
1319
Tile tile = Main.tile[x, y];
@@ -30,15 +36,16 @@ private int FindChest(int x, int y)
3036
return -1;
3137
}
3238

33-
private void HandleChestItemChange(int chest, int slot)
39+
private void HandleChestItemChange(int chest)
3440
{
3541
int targetPlayer = WhichPlayerInChest(chest);
3642
if (targetPlayer != -1)
3743
{
3844
if (Main.netMode == 2)
3945
{
40-
Item item = Main.chest[chest].item[slot];
41-
NetMessage.SendData(MessageID.SyncChestItem, targetPlayer, -1, null, chest, slot, item.stack, item.prefix, item.type);
46+
ModPacket packet = mod.GetPacket();
47+
packet.Write((byte)MechTransfer.ModMessageID.KickFromChest);
48+
packet.Send(targetPlayer);
4249
}
4350
else if (Main.netMode == 0)
4451
Recipe.FindRecipes();
@@ -64,16 +71,30 @@ public bool InjectItem(int x, int y, Item item)
6471
if (c == -1)
6572
return false;
6673

74+
bool injectedPartial = false;
75+
6776
if (item.maxStack > 1)
6877
{
6978
for (int i = 0; i < Main.chest[c].item.Length; i++)
7079
{
7180
Item chestItem = Main.chest[c].item[i];
7281
if (item.IsTheSameAs(chestItem) && chestItem.stack < chestItem.maxStack)
7382
{
74-
chestItem.stack++;
75-
HandleChestItemChange(c, i);
76-
return true;
83+
int spaceLeft = chestItem.maxStack - chestItem.stack;
84+
if (spaceLeft >= item.stack)
85+
{
86+
chestItem.stack += item.stack;
87+
item.stack = 0;
88+
HandleChestItemChange(c);
89+
return true;
90+
}
91+
else
92+
{
93+
item.stack -= spaceLeft;
94+
chestItem.stack = chestItem.maxStack;
95+
HandleChestItemChange(c);
96+
injectedPartial = true;
97+
}
7798
}
7899
}
79100
}
@@ -82,13 +103,14 @@ public bool InjectItem(int x, int y, Item item)
82103
{
83104
if (Main.chest[c].item[i].IsAir)
84105
{
85-
Main.chest[c].item[i] = item;
86-
HandleChestItemChange(c, i);
106+
Main.chest[c].item[i] = item.Clone();
107+
item.stack = 0;
108+
HandleChestItemChange(c);
87109
return true;
88110
}
89111
}
90112

91-
return false;
113+
return injectedPartial;
92114
}
93115

94116
public IEnumerable<Tuple<Item, object>> EnumerateItems(int x, int y)
@@ -111,8 +133,11 @@ public void TakeItem(int x, int y, object slot, int amount)
111133
if (c == -1)
112134
return;
113135

114-
TransferUtils.EatItem(ref Main.chest[c].item[(int)slot], amount);
115-
HandleChestItemChange(c, (int)slot);
136+
Main.chest[c].item[(int)slot].stack -= amount;
137+
if (Main.chest[c].item[(int)slot].stack < 1)
138+
Main.chest[c].item[(int)slot] = new Item();
139+
140+
HandleChestItemChange(c);
116141
}
117142
}
118143
}

ContainerAdapters/CrystalStandAdapter.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,15 @@ public bool InjectItem(int x, int y, Item item)
2929
if (tile == null || !tile.active())
3030
return false;
3131

32-
int originY = y - tile.frameY % 18;
33-
34-
if (DD2Event.WouldFailSpawningHere(x, originY))
32+
if (DD2Event.WouldFailSpawningHere(x, y))
3533
{
3634
DD2Event.FailureMessage(-1);
3735
return false;
3836
}
3937
else
4038
{
41-
DD2Event.SummonCrystal(x, originY);
39+
DD2Event.SummonCrystal(x, y);
40+
item.stack--;
4241
return true;
4342
}
4443
}

ContainerAdapters/ItemFrameAdapter.cs

+5-7
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,8 @@ private TEItemFrame FindItemFrame(int x, int y)
1515
if (tile == null || !tile.active())
1616
return null;
1717

18-
int originX = x;
19-
int originY = y;
20-
if (tile.frameX % 36 != 0)
21-
originX--;
22-
if (tile.frameY != 0)
23-
originY--;
18+
int originX = x - tile.frameX % 36 / 18;
19+
int originY = y - tile.frameY / 18;
2420

2521
int id = TEItemFrame.Find(originX, originY);
2622
if (id == -1)
@@ -42,7 +38,9 @@ public bool InjectItem(int x, int y, Item item)
4238
if (!frame.item.IsAir)
4339
return false;
4440

45-
frame.item = item;
41+
frame.item = item.Clone();
42+
frame.item.stack = 1;
43+
item.stack--;
4644
HandleItemFrameChange(x, y, frame.ID);
4745
return true;
4846
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using MagicStorage;
2+
using MagicStorage.Components;
3+
using System;
4+
using System.Collections.Generic;
5+
using Terraria;
6+
using Terraria.DataStructures;
7+
8+
namespace MechTransfer.ContainerAdapters
9+
{
10+
internal class MagicStorageInterfaceAdapter
11+
{
12+
private TEStorageHeart FindHeart(int x, int y)
13+
{
14+
Point16 center = TEStorageComponent.FindStorageCenter(new Point16(x, y));
15+
if (center.X == -1 && center.Y == -1)
16+
return null;
17+
18+
TEStorageHeart heart = ((TEStorageCenter)TileEntity.ByPosition[center]).GetHeart();
19+
20+
return heart;
21+
}
22+
23+
private void HandleStorageItemChange(TEStorageHeart heart)
24+
{
25+
if (Main.netMode == 2)
26+
{
27+
NetHelper.SendRefreshNetworkItems(heart.ID);
28+
}
29+
else if (Main.netMode == 0)
30+
{
31+
StorageGUI.RefreshItems();
32+
}
33+
}
34+
35+
public void KickMe()
36+
{
37+
Main.LocalPlayer.GetModPlayer<StoragePlayer>().CloseStorage();
38+
}
39+
40+
public bool InjectItem(int x, int y, Item item)
41+
{
42+
int oldstack = item.stack;
43+
44+
TEStorageHeart targetHeart = FindHeart(x, y);
45+
targetHeart.DepositItem(item);
46+
47+
if (oldstack != item.stack)
48+
{
49+
HandleStorageItemChange(targetHeart);
50+
return true;
51+
}
52+
return false;
53+
}
54+
55+
public IEnumerable<Tuple<Item, object>> EnumerateItems(int x, int y)
56+
{
57+
TEStorageHeart targetHeart = FindHeart(x, y);
58+
foreach (var item in targetHeart.GetStoredItems())
59+
{
60+
yield return new Tuple<Item, object>(item, item.type);
61+
}
62+
}
63+
64+
public void TakeItem(int x, int y, object slot, int amount)
65+
{
66+
TEStorageHeart targetHeart = FindHeart(x, y);
67+
68+
Item toWithdraw = new Item();
69+
toWithdraw.SetDefaults((int)slot);
70+
toWithdraw.stack = amount;
71+
72+
targetHeart.TryWithdraw(toWithdraw);
73+
74+
HandleStorageItemChange(targetHeart);
75+
}
76+
}
77+
}

ContainerAdapters/OmniTurretAdapter.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ internal class OmniTurretAdapter
1515
private int[] fireRate = new int[] { 11, 7, 0 };
1616
private int[] shootSpeed = new int[] { 10, 10, 20 };
1717

18-
public OmniTurretAdapter(Mod m)
18+
public OmniTurretAdapter(Mod mod)
1919
{
20-
mod = m;
20+
this.mod = mod;
2121
}
2222

2323
public void TakeItem(int x, int y, object slot, int amount)
@@ -31,7 +31,7 @@ public IEnumerable<Tuple<Item, object>> EnumerateItems(int x, int y)
3131

3232
public bool InjectItem(int x, int y, Item item)
3333
{
34-
if (!item.consumable || item.ammo == 0 || item.shoot == 0)
34+
if (item.ammo == 0 || item.shoot == 0 || item.ammo == AmmoID.Rocket)
3535
return false;
3636

3737
Tile tile = Main.tile[x, y];
@@ -76,6 +76,9 @@ public bool InjectItem(int x, int y, Item item)
7676
packet.Send();
7777
}
7878

79+
if (item.consumable)
80+
item.stack--;
81+
7982
return true;
8083
}
8184
}

ContainerAdapters/SnowballLauncherAdapter.cs

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public bool InjectItem(int x, int y, Item item)
5454
velocityY *= velocity;
5555

5656
Projectile.NewProjectile(position.X, position.Y, velocityX, velocityY, ProjectileID.SnowBallFriendly, 35, 3.5f, Main.myPlayer, 0, 0);
57+
58+
item.stack--;
5759
return true;
5860
}
5961
}

ContainerAdapters/WeaponRackAdapter.cs

+23-14
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ internal class WeaponRackAdapter
1010
{
1111
//By god, this weapon rack thing is a complete mess...
1212

13-
public Point16 FindOrigin(int x, int y, out bool something)
13+
public Point16 FindOrigin(int x, int y, out bool facingRight)
1414
{
1515
Tile tile = Main.tile[x, y];
1616

17-
int originY = y - tile.frameY % 36 / 18 + 1;
17+
int originY = y - tile.frameY / 18 + 1;
1818

1919
int realFrameX = 0;
2020
int temp = Math.DivRem(tile.frameX, 5000, out realFrameX);
@@ -23,11 +23,11 @@ public Point16 FindOrigin(int x, int y, out bool something)
2323
realFrameX = (temp - 1) * 18;
2424
}
2525

26-
something = false;
26+
facingRight = false;
2727
if (realFrameX >= 54)
2828
{
2929
realFrameX -= 54;
30-
something = true;
30+
facingRight = true;
3131
}
3232

3333
int originX = x - realFrameX / 18;
@@ -46,26 +46,34 @@ public void HandleRackItemChange(int x, int y)
4646

4747
public void TakeItem(int x, int y, object slot, int amount)
4848
{
49-
bool something;
50-
Point16 origin = FindOrigin(x, y, out something);
49+
bool facingRight;
50+
Point16 origin = FindOrigin(x, y, out facingRight);
5151

52-
Main.tile[origin.X, origin.Y].frameX = 0;
53-
Main.tile[origin.X + 1, origin.Y].frameX = 18;
52+
if (facingRight)
53+
{
54+
Main.tile[origin.X, origin.Y].frameX = 54;
55+
Main.tile[origin.X + 1, origin.Y].frameX = 72;
56+
}
57+
else
58+
{
59+
Main.tile[origin.X, origin.Y].frameX = 0;
60+
Main.tile[origin.X + 1, origin.Y].frameX = 18;
61+
}
5462

5563
HandleRackItemChange(origin.X, origin.Y);
5664
}
5765

5866
public IEnumerable<Tuple<Item, object>> EnumerateItems(int x, int y)
5967
{
60-
bool something;
61-
Point16 origin = FindOrigin(x, y, out something);
68+
bool facingRight;
69+
Point16 origin = FindOrigin(x, y, out facingRight);
6270

6371
if (Main.tile[origin.X, origin.Y].frameX < 5000)
6472
yield break; //Empty
6573

6674
Item item = new Item();
6775

68-
if (something)
76+
if (facingRight)
6977
{
7078
item.netDefaults(Main.tile[origin.X, origin.Y].frameX - 20100);
7179
item.prefix = (byte)(Main.tile[origin.X + 1, origin.Y].frameX - 25000);
@@ -84,13 +92,13 @@ public bool InjectItem(int x, int y, Item item)
8492
if (!Main.LocalPlayer.ItemFitsWeaponRack(item))
8593
return false;
8694

87-
bool something;
88-
Point16 origin = FindOrigin(x, y, out something);
95+
bool facingRight;
96+
Point16 origin = FindOrigin(x, y, out facingRight);
8997

9098
if (Main.tile[origin.X, origin.Y].frameX >= 5000)
9199
return false; //Already has item
92100

93-
if (something)
101+
if (facingRight)
94102
{
95103
Main.tile[origin.X, origin.Y].frameX = (short)(item.netID + 20100);
96104
Main.tile[origin.X + 1, origin.Y].frameX = (short)(item.prefix + 25000);
@@ -103,6 +111,7 @@ public bool InjectItem(int x, int y, Item item)
103111

104112
HandleRackItemChange(origin.X, origin.Y);
105113

114+
item.stack--;
106115
return true;
107116
}
108117
}

Interfaces.cs

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Terraria;
2+
using Terraria.DataStructures;
3+
4+
namespace MechTransfer
5+
{
6+
public interface ITransferTarget
7+
{
8+
ushort Type { get; }
9+
10+
bool Receive(TransferUtils agent, Point16 location, Item item);
11+
}
12+
13+
public interface ITransferPassthrough
14+
{
15+
ushort Type { get; }
16+
17+
bool ShouldPassthrough(TransferUtils agent, Point16 location, Item item);
18+
}
19+
}

Items/InverseTransferFilterItem.png

1.14 KB
Loading

Items/InverseTransferFilterItem.xcf

2.51 KB
Binary file not shown.

Items/MagicStorageInterfaceItem.png

1.06 KB
Loading

Items/MagicStorageInterfaceItem.xcf

2.66 KB
Binary file not shown.

0 commit comments

Comments
 (0)