9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 03:19:14 +00:00

支持封装空物品

This commit is contained in:
XiaoMoMi
2025-07-10 22:43:12 +08:00
parent 07f837d137
commit 2146206415
78 changed files with 454 additions and 156 deletions

View File

@@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
import net.momirealms.craftengine.core.sound.SoundSource;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.world.BlockPos;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -17,7 +18,7 @@ public abstract class Player extends AbstractEntity implements NetWorkUser {
public abstract boolean isSecondaryUseActive();
@Nullable
@NotNull
public abstract Item<?> getItemInHand(InteractionHand hand);
@Override

View File

@@ -23,6 +23,11 @@ public class AbstractItem<W extends ItemWrapper<I>, I> implements Item<I> {
this.item = item;
}
@Override
public boolean isEmpty() {
return this.factory.isEmpty(this.item);
}
@Override
public Item<I> itemModel(String data) {
this.factory.itemModel(this.item, data);

View File

@@ -24,6 +24,8 @@ import java.util.Optional;
*/
public interface Item<I> {
boolean isEmpty();
Optional<CustomItem<I>> getCustomItem();
Optional<List<ItemBehavior>> getItemBehavior();

View File

@@ -202,4 +202,6 @@ public abstract class ItemFactory<W extends ItemWrapper<I>, I> {
protected abstract W transmuteCopy(W item, Key newItem, int amount);
protected abstract W unsafeTransmuteCopy(W item, Object newItem, int count);
protected abstract boolean isEmpty(W item);
}

View File

@@ -13,6 +13,7 @@ import net.momirealms.craftengine.core.registry.Holder;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;
import org.incendo.cloud.suggestion.Suggestion;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -36,14 +37,17 @@ public interface ItemManager<T> extends Manageable, ModelGenerator {
Collection<Key> vanillaItems();
@Nullable
T buildCustomItemStack(Key id, @Nullable Player player);
@Nullable
T buildItemStack(Key id, @Nullable Player player);
Item<T> createCustomWrappedItem(Key id, @Nullable Player player);
Item<T> createWrappedItem(Key id, @Nullable Player player);
@NotNull
Item<T> wrap(T itemStack);
Item<T> fromByteArray(byte[] bytes);

View File

@@ -8,6 +8,8 @@ import net.momirealms.craftengine.core.world.BlockHitResult;
import net.momirealms.craftengine.core.world.BlockPos;
import net.momirealms.craftengine.core.world.Vec3d;
import net.momirealms.craftengine.core.world.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class UseOnContext {
private final Player player;
@@ -24,7 +26,7 @@ public class UseOnContext {
this(player.world(), player, hand, stack, hit);
}
public UseOnContext(World world, Player player, InteractionHand hand, Item<?> stack, BlockHitResult hit) {
public UseOnContext(@NotNull World world, Player player, InteractionHand hand, @NotNull Item<?> stack, BlockHitResult hit) {
this.player = player;
this.hand = hand;
this.hitResult = hit;
@@ -52,6 +54,7 @@ public class UseOnContext {
return this.hitResult.isInside();
}
@NotNull
public Item<?> getItem() {
return this.itemStack;
}

View File

@@ -4,5 +4,11 @@ public enum CraftingRecipeCategory {
BUILDING,
REDSTONE,
EQUIPMENT,
MISC
MISC;
public static final CraftingRecipeCategory[] VALUES = CraftingRecipeCategory.values();
public static CraftingRecipeCategory byId(final int id) {
return VALUES[id];
}
}

View File

@@ -0,0 +1,33 @@
package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Obsolete
public class LegacyIngredient {
private final Item<Object>[] items;
public LegacyIngredient(Item<Object>[] items) {
this.items = items;
}
public Item<?>[] items() {
return items;
}
@SuppressWarnings("unchecked")
public static LegacyIngredient read(FriendlyByteBuf buf) {
Item<Object>[] items = buf.readArray(byteBuf -> CraftEngine.instance().itemManager().decode(byteBuf), Item.class);
return new LegacyIngredient(items);
}
public void applyClientboundData(Player player) {
for (int i = 0; i < items.length; i++) {
Item<Object> item = items[i];
this.items[i] = CraftEngine.instance().itemManager().s2c(item, player);
}
}
}

View File

@@ -0,0 +1,34 @@
package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.jetbrains.annotations.ApiStatus;
import java.util.function.Function;
@ApiStatus.Obsolete
public interface LegacyRecipe {
void write(FriendlyByteBuf buf);
static LegacyRecipe read(FriendlyByteBuf buf) {
if (VersionHelper.isOrAbove1_20_5()) {
Key id = buf.readKey();
Key type = buf.readKey();
return BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(id, buf);
} else {
Key type = buf.readKey();
Key id = buf.readKey();
return BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(id, buf);
}
}
record Type(Function<FriendlyByteBuf, LegacyRecipe> reader) {
public LegacyRecipe read(Key id, FriendlyByteBuf buf) {
return this.reader.apply(buf);
}
}
}

View File

@@ -0,0 +1,34 @@
package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Obsolete
public final class LegacyRecipeTypes {
private LegacyRecipeTypes() {}
public static final Key SHAPED_RECIPE = Key.of("crafting_shaped");
public static final Key SHAPELESS_RECIPE = Key.of("crafting_shapeless");
public static final Key ARMOR_DYE = Key.of("crafting_special_armordye");
public static final Key BOOK_CLONING = Key.of("crafting_special_bookcloning");
public static final Key MAP_CLONING = Key.of("crafting_special_mapcloning");
public static final Key MAP_EXTENDING = Key.of("crafting_special_mapextending");
public static final Key FIREWORK_ROCKET = Key.of("crafting_special_firework_rocket");
public static final Key FIREWORK_STAR = Key.of("crafting_special_firework_star");
public static final Key FIREWORK_STAR_FADE = Key.of("crafting_special_firework_star_fade");
public static final Key TIPPED_ARROW = Key.of("crafting_special_tippedarrow");
public static final Key BANNER_DUPLICATE = Key.of("crafting_special_bannerduplicate");
public static final Key SHIELD_DECORATION = Key.of("crafting_special_shielddecoration");
public static final Key SHULKER_BOX_COLORING = Key.of("crafting_special_shulkerboxcoloring");
public static final Key SUSPICIOUS_STEW = Key.of("crafting_special_suspiciousstew");
public static final Key REPAIR_ITEM = Key.of("crafting_special_repairitem");
public static final Key SMELTING_RECIPE = Key.of("smelting");
public static final Key BLASTING_RECIPE = Key.of("blasting");
public static final Key SMOKING_RECIPE = Key.of("smoking");
public static final Key CAMPFIRE_COOKING_RECIPE = Key.of("campfire_cooking");
public static final Key STONECUTTER = Key.of("stonecutting");
public static final Key SMITHING_TRANSFORM = Key.of("smithing_transform");
public static final Key SMITHING_TRIM = Key.of("smithing_trim");
public static final Key DECORATED_POT_RECIPE = Key.of("crafting_decorated_pot");
}

View File

@@ -0,0 +1,75 @@
package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.jetbrains.annotations.ApiStatus;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
@ApiStatus.Obsolete
public class LegacyShapedRecipe implements LegacyRecipe {
private final int width;
private final int height;
private final List<LegacyIngredient> ingredients;
private final Item<?> result;
private final Key id;
private final String group;
private final CraftingRecipeCategory category;
private final boolean showNotification;
public LegacyShapedRecipe(int width, int height, List<LegacyIngredient> ingredients, Item<?> result, Key id, String group, CraftingRecipeCategory category, boolean showNotification) {
this.category = category;
this.width = width;
this.height = height;
this.ingredients = ingredients;
this.result = result;
this.id = id;
this.group = group;
this.showNotification = showNotification;
}
private static final BiFunction<Key, FriendlyByteBuf, LegacyShapedRecipe> READER = VersionHelper.isOrAbove1_20_3() ?
(id, buf) -> {
String group = buf.readUtf();
int category = buf.readVarInt();
int width = buf.readVarInt();
int height = buf.readVarInt();
int size = width * height;
List<LegacyIngredient> ingredients = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
ingredients.set(i, LegacyIngredient.read(buf));
}
Item<?> result = CraftEngine.instance().itemManager().decode(buf);
boolean flag = buf.readBoolean();
return new LegacyShapedRecipe(width, height, ingredients, result, id, group, CraftingRecipeCategory.byId(category), flag);
} :
(id, buf) -> {
int width = buf.readVarInt();
int height = buf.readVarInt();
String group = buf.readUtf();
int category = buf.readVarInt();
int size = width * height;
List<LegacyIngredient> ingredients = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
ingredients.set(i, LegacyIngredient.read(buf));
}
Item<?> result = CraftEngine.instance().itemManager().decode(buf);
boolean flag = buf.readBoolean();
return new LegacyShapedRecipe(width, height, ingredients, result, id, group, CraftingRecipeCategory.byId(category), flag);
};
public static LegacyShapedRecipe read(Key id, FriendlyByteBuf buf) {
return READER.apply(id, buf);
}
@Override
public void write(FriendlyByteBuf buf) {
}
}

View File

@@ -1,8 +1,8 @@
package net.momirealms.craftengine.core.item.recipe.network;
package net.momirealms.craftengine.core.item.recipe.network.modern;
import com.mojang.datafixers.util.Either;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network;
package net.momirealms.craftengine.core.item.recipe.network.modern;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network;
package net.momirealms.craftengine.core.item.recipe.network.modern;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Holder;
@@ -8,6 +8,8 @@ import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceKey;
public final class RecipeDisplays {
private RecipeDisplays() {}
public static final Key CRAFTING_SHAPELESS = Key.of("crafting_shapeless");
public static final Key CRAFTING_SHAPED = Key.of("crafting_shaped");
public static final Key FURNACE = Key.of("furnace");

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.core.item.recipe.network.display;
package net.momirealms.craftengine.core.item.recipe.network.modern.display;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.NotNull;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.Item;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Holder;
@@ -8,6 +8,8 @@ import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceKey;
public final class SlotDisplays {
private SlotDisplays() {}
public static final Key EMPTY = Key.of("empty");
public static final Key ANY_FUEL = Key.of("any_fuel");
public static final Key ITEM = Key.of("item");

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import com.mojang.datafixers.util.Either;
import net.kyori.adventure.text.Component;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.item.recipe.network.display.slot;
package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;

View File

@@ -7,8 +7,8 @@ import net.momirealms.craftengine.core.entity.projectile.ProjectileManager;
import net.momirealms.craftengine.core.font.FontManager;
import net.momirealms.craftengine.core.item.ItemManager;
import net.momirealms.craftengine.core.item.recipe.RecipeManager;
import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplays;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplays;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplays;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplays;
import net.momirealms.craftengine.core.loot.VanillaLootManager;
import net.momirealms.craftengine.core.pack.PackManager;
import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender;

View File

@@ -8,8 +8,9 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe;
import net.momirealms.craftengine.core.item.recipe.RecipeFactory;
import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipe;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.loot.LootContext;
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
@@ -74,6 +75,7 @@ public class BuiltInRegistries {
public static final Registry<EquipmentFactory> EQUIPMENT_FACTORY = createRegistry(Registries.EQUIPMENT_FACTORY);
public static final Registry<SlotDisplay.Type> SLOT_DISPLAY_TYPE = createRegistry(Registries.SLOT_DISPLAY_TYPE);
public static final Registry<RecipeDisplay.Type> RECIPE_DISPLAY_TYPE = createRegistry(Registries.RECIPE_DISPLAY_TYPE);
public static final Registry<LegacyRecipe.Type> LEGACY_RECIPE_TYPE = createRegistry(Registries.LEGACY_RECIPE_TYPE);
private static <T> Registry<T> createRegistry(ResourceKey<? extends Registry<T>> key) {
return new MappedRegistry<>(key);

View File

@@ -8,8 +8,9 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
import net.momirealms.craftengine.core.item.equipment.EquipmentFactory;
import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe;
import net.momirealms.craftengine.core.item.recipe.RecipeFactory;
import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipe;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay;
import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplay;
import net.momirealms.craftengine.core.loot.LootContext;
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
@@ -75,4 +76,5 @@ public class Registries {
public static final ResourceKey<Registry<EquipmentFactory>> EQUIPMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("equipment_factory"));
public static final ResourceKey<Registry<SlotDisplay.Type>> SLOT_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display_type"));
public static final ResourceKey<Registry<RecipeDisplay.Type>> RECIPE_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type"));
public static final ResourceKey<Registry<LegacyRecipe.Type>> LEGACY_RECIPE_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("legacy_recipe_type"));
}

View File

@@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
@@ -48,20 +49,34 @@ public class FriendlyByteBuf extends ByteBuf {
public <T, C extends Collection<T>> C readCollection(IntFunction<C> collectionFactory, Reader<T> reader) {
int i = this.readVarInt();
C c0 = (C)(collectionFactory.apply(i));
C collection = collectionFactory.apply(i);
for(int j = 0; j < i; ++j) {
c0.add(reader.apply(this));
collection.add(reader.apply(this));
}
return c0;
return collection;
}
public <T> void writeCollection(Collection<T> collection, Writer<T> writer) {
this.writeVarInt(collection.size());
for (T t : collection) {
writer.accept(this, t);
}
}
for (T t0 : collection) {
writer.accept(this, t0);
@SuppressWarnings("unchecked")
public <T> T[] readArray(Reader<T> reader, Class<T> type) {
int i = this.readVarInt();
T[] array = (T[]) Array.newInstance(type, i);
for(int j = 0; j < i; ++j) {
array[j] = reader.apply(this);
}
return array;
}
public <T> void writeArray(T[] array, Writer<T> writer) {
this.writeVarInt(array.length);
for(T t : array) {
writer.accept(this, t);
}
}

View File

@@ -0,0 +1,12 @@
package net.momirealms.craftengine.core.util;
import net.momirealms.craftengine.core.item.Item;
public final class ItemUtils {
private ItemUtils() {
}
public static boolean isEmpty(Item<?> item) {
return item == null || item.isEmpty();
}
}