Skip to content

Commit a85eb91

Browse files
authored
Merge pull request #625 from Multiverse/feat/inv-max-size
Add customisable inventory max sizes
2 parents 993a208 + 5475811 commit a85eb91

File tree

6 files changed

+104
-15
lines changed

6 files changed

+104
-15
lines changed

src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfig.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,36 @@ public Try<Void> setRegisterPapiHook(boolean registerPapiHook) {
281281
return this.configHandle.set(configNodes.registerPapiHook, registerPapiHook);
282282
}
283283

284+
@ApiStatus.AvailableSince("5.2")
285+
public int getMaxInventoryItemsSize() {
286+
return this.configHandle.get(configNodes.maxInventoryItemsSize);
287+
}
288+
289+
@ApiStatus.AvailableSince("5.2")
290+
public Try<Void> setMaxInventoryItemsSize(int maxInventoryItemsSize) {
291+
return this.configHandle.set(configNodes.maxInventoryItemsSize, maxInventoryItemsSize);
292+
}
293+
294+
@ApiStatus.AvailableSince("5.2")
295+
public int getMaxEnderChestItemsSize() {
296+
return this.configHandle.get(configNodes.maxEnderChestItemsSize);
297+
}
298+
299+
@ApiStatus.AvailableSince("5.2")
300+
public Try<Void> setMaxEnderChestItemsSize(int maxEnderChestItemsSize) {
301+
return this.configHandle.set(configNodes.maxEnderChestItemsSize, maxEnderChestItemsSize);
302+
}
303+
304+
@ApiStatus.AvailableSince("5.2")
305+
public int getMaxArmorItemsSize() {
306+
return this.configHandle.get(configNodes.maxArmorItemsSize);
307+
}
308+
309+
@ApiStatus.AvailableSince("5.2")
310+
public Try<Void> setMaxArmorItemsSize(int maxArmorItemsSize) {
311+
return this.configHandle.set(configNodes.maxArmorItemsSize, maxArmorItemsSize);
312+
}
313+
284314
/**
285315
* Tells whether this is the first time the plugin has run as set by a config flag.
286316
*

src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfigNodes.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.mvplugins.multiverse.core.config.node.serializer.NodeSerializer;
99
import org.mvplugins.multiverse.inventories.share.Sharables;
1010
import org.mvplugins.multiverse.inventories.share.Shares;
11+
import org.mvplugins.multiverse.inventories.util.PlayerStats;
1112

1213
import java.util.ArrayList;
1314
import java.util.List;
@@ -156,7 +157,6 @@ public Object serialize(Shares sharables, Class<Shares> aClass) {
156157
.build());
157158

158159
final ConfigNode<Boolean> applyPlayerdataOnJoin = node(ConfigNode.builder("performance.apply-playerdata-on-join", Boolean.class)
159-
.comment("")
160160
.comment("This will only work if save-playerdata-on-quit is set to true.")
161161
.comment("Minecraft will already load the most up-to-date player data and this option will generally be redundant.")
162162
.comment("The only possible edge case uses is if you have a need to always modify the mvinv playerdata while the player is offline.")
@@ -236,6 +236,33 @@ public Object serialize(Shares sharables, Class<Shares> aClass) {
236236
.name("register-papi-hook")
237237
.build());
238238

239+
private final ConfigHeaderNode maxItemsSizeHeader = node(ConfigHeaderNode.builder("misc.max-items-size")
240+
.comment("")
241+
.comment("These are the maximum sizes for each inventory type. You should not change these values unless")
242+
.comment("you have a plugin or feature that changes the size of these inventories.")
243+
.comment("-------")
244+
.comment("Changing these values without a plugin or feature that increases the size of these inventories")
245+
.comment("may result in errors and loss of items when switching worlds/groups. This config option is merely")
246+
.comment("to resolve compatibility issues with other plugins/features that alter inventory sizes.")
247+
.comment("-------")
248+
.comment("One notable example is if you used purpur's config option to increase ender chest size.")
249+
.build());
250+
251+
final ConfigNode<Integer> maxInventoryItemsSize = node(ConfigNode.builder("misc.max-items-size.inventory", Integer.class)
252+
.defaultValue(PlayerStats.INVENTORY_SIZE)
253+
.name("max-player-inventory-size")
254+
.build());
255+
256+
final ConfigNode<Integer> maxEnderChestItemsSize = node(ConfigNode.builder("misc.max-items-size.ender-chest", Integer.class)
257+
.defaultValue(PlayerStats.ENDER_CHEST_SIZE)
258+
.name("max-ender-chest-size")
259+
.build());
260+
261+
final ConfigNode<Integer> maxArmorItemsSize = node(ConfigNode.builder("misc.max-items-size.armor", Integer.class)
262+
.defaultValue(PlayerStats.ARMOR_SIZE)
263+
.name("max-inventory-title-length")
264+
.build());
265+
239266
final ConfigNode<Boolean> firstRun = node(ConfigNode.builder("first-run", Boolean.class)
240267
.comment("")
241268
.comment("")

src/main/java/org/mvplugins/multiverse/inventories/share/InventorySerializer.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.mvplugins.multiverse.inventories.share;
22

3+
import org.mvplugins.multiverse.inventories.MultiverseInventoriesApi;
34
import org.mvplugins.multiverse.inventories.util.ItemStackConverter;
45
import org.mvplugins.multiverse.inventories.util.MinecraftTools;
56
import org.bukkit.Material;
@@ -12,13 +13,7 @@
1213
* A simple {@link SharableSerializer} usable with ItemStack[] which converts the ItemStack[] to the string format
1314
* that is used by default in Multiverse-Inventories.
1415
*/
15-
final class InventorySerializer implements SharableSerializer<ItemStack[]> {
16-
17-
private final int inventorySize;
18-
19-
public InventorySerializer(final int inventorySize) {
20-
this.inventorySize = inventorySize;
21-
}
16+
abstract class InventorySerializer implements SharableSerializer<ItemStack[]> {
2217

2318
@Override
2419
public ItemStack[] deserialize(Object obj) {
@@ -42,7 +37,7 @@ private Map<String, Object> mapSlots(ItemStack[] itemStacks) {
4237
}
4338

4439
private ItemStack[] unmapSlots(Object obj) {
45-
ItemStack[] inventory = new ItemStack[inventorySize];
40+
ItemStack[] inventory = new ItemStack[getInventorySize()];
4641
if (!(obj instanceof Map invMap)) {
4742
return MinecraftTools.fillWithAir(inventory);
4843
}
@@ -61,4 +56,27 @@ private ItemStack[] unmapSlots(Object obj) {
6156
}
6257
return inventory;
6358
}
59+
60+
protected abstract int getInventorySize();
61+
62+
static final class MainInventorySerializer extends InventorySerializer {
63+
@Override
64+
protected int getInventorySize() {
65+
return MultiverseInventoriesApi.get().getInventoriesConfig().getMaxInventoryItemsSize();
66+
}
67+
}
68+
69+
static final class EnderChestSerializer extends InventorySerializer {
70+
@Override
71+
protected int getInventorySize() {
72+
return MultiverseInventoriesApi.get().getInventoriesConfig().getMaxEnderChestItemsSize();
73+
}
74+
}
75+
76+
static final class ArmorSerializer extends InventorySerializer {
77+
@Override
78+
protected int getInventorySize() {
79+
return MultiverseInventoriesApi.get().getInventoriesConfig().getMaxArmorItemsSize();
80+
}
81+
}
6482
}

src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.bukkit.Material;
77
import org.bukkit.World;
88
import org.bukkit.advancement.AdvancementProgress;
9+
import org.bukkit.inventory.Inventory;
910
import org.jetbrains.annotations.ApiStatus;
1011
import org.mvplugins.multiverse.core.economy.MVEconomist;
1112
import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter;
@@ -111,16 +112,21 @@ public void updateProfile(ProfileData profile, Player player) {
111112
@Override
112113
public boolean updatePlayer(Player player, ProfileData profile) {
113114
ItemStack[] value = profile.get(ENDER_CHEST);
115+
Inventory enderChest = player.getEnderChest();
114116
if (value == null) {
115-
player.getEnderChest().setContents(MinecraftTools.fillWithAir(
116-
new ItemStack[PlayerStats.ENDER_CHEST_SIZE]));
117+
enderChest.setContents(MinecraftTools.fillWithAir(
118+
new ItemStack[enderChest.getSize()]));
117119
return false;
118120
}
119-
player.getEnderChest().setContents(value);
121+
if (value.length != enderChest.getSize()) {
122+
Logging.fine("Mismatch ender chest size found in profile for player " + player.getName()
123+
+ ". Expected " + enderChest.getSize() + " but got " + value.length + ".");
124+
}
125+
enderChest.setContents(value);
120126
return true;
121127
}
122128
}).serializer(new ProfileEntry(false, DataStrings.ENDER_CHEST_CONTENTS),
123-
new InventorySerializer(PlayerStats.ENDER_CHEST_SIZE)).altName("ender").build();
129+
new InventorySerializer.EnderChestSerializer()).altName("ender").build();
124130

125131
/**
126132
* Sharing Inventory.
@@ -144,7 +150,7 @@ public boolean updatePlayer(Player player, ProfileData profile) {
144150
return true;
145151
}
146152
}).serializer(new ProfileEntry(false, DataStrings.PLAYER_INVENTORY_CONTENTS),
147-
new InventorySerializer(PlayerStats.INVENTORY_SIZE)).build();
153+
new InventorySerializer.MainInventorySerializer()).build();
148154

149155
/**
150156
* Sharing Armor.
@@ -168,7 +174,7 @@ public boolean updatePlayer(Player player, ProfileData profile) {
168174
return true;
169175
}
170176
}).serializer(new ProfileEntry(false, DataStrings.PLAYER_ARMOR_CONTENTS),
171-
new InventorySerializer(PlayerStats.ARMOR_SIZE)).altName("armor").build();
177+
new InventorySerializer.ArmorSerializer()).altName("armor").build();
172178

173179
/**
174180
* Sharing Offhand.

src/test/resources/config/fresh_config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ performance:
2727

2828
misc:
2929
register-papi-hook: true
30+
max-items-size:
31+
inventory: 36
32+
ender-chest: 27
33+
armor: 4
3034

3135
first-run: true
3236
version: 5.0

src/test/resources/config/migrated_config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ performance:
2828

2929
misc:
3030
register-papi-hook: true
31+
max-items-size:
32+
inventory: 36
33+
ender-chest: 27
34+
armor: 4
3135

3236
first-run: true
3337
version: 5.0

0 commit comments

Comments
 (0)