Skip to content

Commit 6703e01

Browse files
暴食者jei适配
1 parent 25c6225 commit 6703e01

16 files changed

Lines changed: 248 additions & 76 deletions

File tree

src/generated/resources/.cache/34d21386915eed570c73c4b9e3f5f51c4ec8c9d7

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
// 1.21.1 2025-10-14T16:04:38.8837183 Item Models: futurefood
1+
// 1.21.1 2025-10-20T15:23:03.6825627 Item Models: futurefood
22
66684eb356b1463e5b38e36b309206e7968c3d4a assets/futurefood/models/item/antimatter_snack.json
33
fcf4bfffde1b1679c846c63b7bd6d6f74079bf27 assets/futurefood/models/item/atom_cola.json
44
8f780145ad2000b0300eb2dfb01eb5f356276c2e assets/futurefood/models/item/battery.json
55
62ef6d666a86540db90c7ee3cdbab1e25769a29f assets/futurefood/models/item/black_hole_cake.json
66
d0a59be612dbaf93cb4d5963ff91c314b55fde23 assets/futurefood/models/item/cyber_wrench.json
77
ff3d03ebf37b304e0ea3e99381627eb8a4ee898b assets/futurefood/models/item/entropy_stew.json
8-
9a7633c527c0e8844bacf67659be721449eaa758 assets/futurefood/models/item/food_essence.json
8+
939de49376d8b37f26c3602097e6469f28ca3333 assets/futurefood/models/item/food_essence.json
99
558b99d41471bba5ece3ff7c757173383db95d30 assets/futurefood/models/item/food_essence1.json
1010
92955f95517826b1a46f49009ebf9252b894998d assets/futurefood/models/item/gluttony.json
1111
8f780145ad2000b0300eb2dfb01eb5f356276c2e assets/futurefood/models/item/infinite_battery.json
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
// 1.21.1 2025-10-17T22:26:22.6712916 Languages: zh_cn for mod: futurefood
2-
c92837c5b0cbe8c7590655d80419e35c0bb01521 assets/futurefood/lang/zh_cn.json
1+
// 1.21.1 2025-10-20T15:23:03.6870948 Languages: zh_cn for mod: futurefood
2+
b005fef6148adb095016f1b7407fc3b219688c60 assets/futurefood/lang/zh_cn.json

src/generated/resources/assets/futurefood/lang/zh_cn.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@
4646
"item.futurefood.white_hole_cake": "白洞蛋糕",
4747
"item.futurefood.wormhole_cookie": "虫洞曲奇",
4848
"itemGroup.futurefood": "未来食物",
49-
"recipe.particle_collider,jei": "粒子对撞器",
50-
"recipe.particle_collider,processingTime": "处理时间:%s",
51-
"recipe.particle_collider.energy": "能量消耗:%s"
49+
"recipe.gluttony.energy": "能量产生:%s",
50+
"recipe.gluttony.jei": "暴食者",
51+
"recipe.gluttony.processingTime": "处理时间:%s",
52+
"recipe.particle_collider.energy": "能量消耗:%s",
53+
"recipe.particle_collider.jei": "粒子对撞器",
54+
"recipe.particle_collider.processingTime": "处理时间:%s"
5255
}

src/generated/resources/assets/futurefood/models/item/food_essence.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
"parent": "minecraft:item/generated",
33
"overrides": [
44
{
5-
"model": "futurefood:item/food_essence1",
5+
"model": "futurefood:item/food_essence",
66
"predicate": {
7-
"futurefood:stacking": 0.07
7+
"futurefood:stacking": 0.0
88
}
99
},
1010
{
11-
"model": "futurefood:item/food_essence",
11+
"model": "futurefood:item/food_essence1",
1212
"predicate": {
13-
"futurefood:stacking": 0.0
13+
"futurefood:stacking": 0.07
1414
}
1515
}
1616
],

src/main/java/top/ctnstudio/futurefood/common/block/tile/GluttonyBlockEntity.java

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.minecraft.util.Mth;
88
import net.minecraft.world.entity.player.Inventory;
99
import net.minecraft.world.entity.player.Player;
10-
import net.minecraft.world.food.FoodProperties;
1110
import net.minecraft.world.inventory.ContainerData;
1211
import net.minecraft.world.item.ItemStack;
1312
import net.minecraft.world.level.Level;
@@ -18,20 +17,20 @@
1817
import top.ctnstudio.futurefood.api.adapter.ModItemStackHandler;
1918
import top.ctnstudio.futurefood.common.block.GluttonyEntityBlock;
2019
import top.ctnstudio.futurefood.common.menu.GluttonyMenu;
21-
import top.ctnstudio.futurefood.core.init.ModItem;
2220
import top.ctnstudio.futurefood.core.init.ModTileEntity;
21+
import top.ctnstudio.futurefood.core.recipe.GluttonyRecipe;
22+
import top.ctnstudio.futurefood.core.recipe_manager.GluttonyRecipeManager;
2323
import top.ctnstudio.futurefood.util.EnergyUtil;
2424

25-
import java.util.Objects;
26-
2725
// TODO 添加配置功能
2826
// TODO 根据方向调整物品抽入
2927
public class GluttonyBlockEntity extends BaseEnergyStorageBlockEntity<GluttonyMenu> {
28+
public static final int MAX_WORK_TICK = 20 * 5;
3029
private int remainingTick;
3130
private int maxWorkTick;
3231
private final ContainerData workProgress;
3332
// 缓存
34-
private RecipeEntry cacheRecipeEntry;
33+
private GluttonyRecipe recipe;
3534

3635
public GluttonyBlockEntity(BlockPos pos, BlockState blockState) {
3736
super(ModTileEntity.GLUTTONY.get(), pos, blockState,
@@ -85,11 +84,11 @@ private void working(@NotNull Level level, @NotNull BlockPos pos) {
8584

8685
// 此次是避免直接修改工作进度导致配方为空
8786
// 获取缓存配方
88-
if (cacheRecipeEntry == null) {
89-
ItemStack stackInSlot = itemHandler.getStackInSlot(1).copy();
87+
if (recipe == null) {
88+
final var stackInSlot = itemHandler.getStackInSlot(1).copy();
9089
if (!stackInSlot.isEmpty()) {
9190
produceProducts(stackInSlot);
92-
if (cacheRecipeEntry == null) {
91+
if (recipe == null) {
9392
resetProducts();
9493
resetProgress();
9594
return;
@@ -102,8 +101,8 @@ private void working(@NotNull Level level, @NotNull BlockPos pos) {
102101
}
103102

104103
// 存储值避免移除输入槽导致值为空
105-
ItemStack outputItem = cacheRecipeEntry.outputItem.copy();
106-
int outputEnergy = cacheRecipeEntry.outputEnergy;
104+
ItemStack outputItem = recipe.outputItem().copy();
105+
int outputEnergy = recipe.outputEnergy();
107106
// 如果输入槽为空,则重置进度
108107
if (itemHandler.extractItem(1, 1, true).isEmpty()) {
109108
resetProducts();
@@ -156,7 +155,7 @@ public void resetProgress() {
156155
}
157156

158157
public void resetProducts() {
159-
cacheRecipeEntry = null;
158+
recipe = null;
160159
}
161160

162161
@Override
@@ -185,36 +184,15 @@ protected void produceProducts(ItemStack item) {
185184
resetProgress();
186185
return;
187186
}
188-
if (cacheRecipeEntry != null
189-
&& ItemStack.isSameItem(item, cacheRecipeEntry.inputItem)
190-
&& item.get(DataComponents.FOOD).equals(cacheRecipeEntry.inputItem.get(DataComponents.FOOD))) {
187+
if (recipe != null
188+
&& ItemStack.isSameItem(item, recipe.inputItem())
189+
&& item.get(DataComponents.FOOD).equals(recipe.inputItem().get(DataComponents.FOOD))) {
191190
return;
192191
}
193192

194-
maxWorkTick = 20 * 5;
193+
maxWorkTick = MAX_WORK_TICK;
195194
remainingTick = maxWorkTick;
196-
cacheRecipeEntry = getProduct(item);
197-
}
198-
199-
/**
200-
* 计算产物
201-
*
202-
* @return 产物
203-
*/
204-
protected RecipeEntry getProduct(ItemStack item) {
205-
FoodProperties food = item.get(DataComponents.FOOD);
206-
int nutritionFactor = food.nutrition();
207-
int saturationFactor = (int) (food.saturation() * 5);
208-
int effectFactor = food.effects().stream()
209-
.map(e -> e.probability() >= 1 ? e.effect() : null)
210-
.filter(Objects::nonNull)
211-
.mapToInt(e -> (int) (Math.max(1, (e.getDuration() / 20.0)) * e.getAmplifier() + 1)).sum();
212-
213-
ItemStack outputItem = ModItem.FOOD_ESSENCE.get().getDefaultInstance();
214-
int count = Math.max(1, Math.min(outputItem.getMaxStackSize(), (int) (((nutritionFactor * saturationFactor) / 3.5f + effectFactor / 5.0f) / 10.0f)));
215-
outputItem.setCount(count);
216-
int outputEnergy = ((nutritionFactor * saturationFactor) * 5 + effectFactor * 10) * 2;
217-
return new RecipeEntry(item, outputEnergy, outputItem);
195+
recipe = GluttonyRecipeManager.findRecipe(item);
218196
}
219197

220198
public boolean isWorking() {
@@ -249,9 +227,6 @@ protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider provider) {
249227
return new GluttonyMenu(containerId, playerInventory, itemHandler, energyData, workProgress);
250228
}
251229

252-
public record RecipeEntry(ItemStack inputItem, int outputEnergy, ItemStack outputItem) {
253-
}
254-
255230
public record Data(GluttonyBlockEntity blockEntity) implements ContainerData {
256231
@Override
257232
public int get(int index) {

src/main/java/top/ctnstudio/futurefood/common/block/tile/ParticleColliderBlockEntity.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
import top.ctnstudio.futurefood.api.adapter.ModEnergyStorage;
2424
import top.ctnstudio.futurefood.api.adapter.ModItemStackHandler;
2525
import top.ctnstudio.futurefood.api.block.IUnlimitedEntityReceive;
26-
import top.ctnstudio.futurefood.api.recipe.ParticleColliderRecipe;
2726
import top.ctnstudio.futurefood.common.block.ParticleColliderEntityBlock;
2827
import top.ctnstudio.futurefood.common.menu.ParticleColliderMenu;
29-
import top.ctnstudio.futurefood.core.ParticleColliderRecipeManager;
3028
import top.ctnstudio.futurefood.core.init.ModTileEntity;
31-
32-
import java.util.Optional;
29+
import top.ctnstudio.futurefood.core.recipe.ParticleColliderRecipe;
30+
import top.ctnstudio.futurefood.core.recipe_manager.ParticleColliderRecipeManager;
3331

3432
// TODO 让外部无法提取能源
3533
// TODO 根据方向调整物品抽入
@@ -145,7 +143,7 @@ private void processRecipe() {
145143
ItemStack input1 = itemHandler.getStackInSlot(INPUT_SLOT_1);
146144
ItemStack input2 = itemHandler.getStackInSlot(INPUT_SLOT_2);
147145

148-
Optional<ParticleColliderRecipe> recipe = ParticleColliderRecipeManager.findRecipe(input1, input2);
146+
final var recipe = ParticleColliderRecipeManager.findRecipe(input1, input2);
149147

150148
if (recipe.isEmpty()) {
151149
progressTick = 0;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package top.ctnstudio.futurefood.core.recipe;
2+
3+
import net.minecraft.core.component.DataComponents;
4+
import net.minecraft.core.registries.BuiltInRegistries;
5+
import net.minecraft.world.item.ItemStack;
6+
import top.ctnstudio.futurefood.core.init.ModItem;
7+
8+
import java.util.Objects;
9+
10+
public record GluttonyRecipe(ItemStack inputItem, int outputEnergy, ItemStack outputItem) {
11+
public boolean matches(ItemStack inputItem) {
12+
return ItemStack.isSameItemSameComponents(this.inputItem, inputItem);
13+
}
14+
15+
/**
16+
* 计算产物
17+
*
18+
* @return 产物
19+
*/
20+
public static GluttonyRecipe getRecipe(ItemStack item) {
21+
var food = item.get(DataComponents.FOOD);
22+
if (food == null) {
23+
throw new NullPointerException(String.format("%s ItemStack do not have %s DataComponents",
24+
item,
25+
BuiltInRegistries.DATA_COMPONENT_TYPE.getKey(DataComponents.FOOD)));
26+
}
27+
int nutritionFactor = food.nutrition();
28+
int saturationFactor = (int) (food.saturation() * 5);
29+
int effectFactor = food.effects().stream()
30+
.map(e -> e.probability() >= 1 ? e.effect() : null)
31+
.filter(Objects::nonNull)
32+
.mapToInt(e -> (int) (Math.max(1, (e.getDuration() / 20.0)) * e.getAmplifier() + 1)).sum();
33+
34+
ItemStack outputItem = ModItem.FOOD_ESSENCE.get().getDefaultInstance();
35+
int count = Math.max(1, Math.min(outputItem.getMaxStackSize(), (int) (((nutritionFactor * saturationFactor) / 3.5f + effectFactor / 5.0f) / 10.0f)));
36+
outputItem.setCount(count);
37+
int outputEnergy = ((nutritionFactor * saturationFactor) * 5 + effectFactor * 10) * 2;
38+
return new GluttonyRecipe(item, outputEnergy, outputItem);
39+
}
40+
}

src/main/java/top/ctnstudio/futurefood/api/recipe/ParticleColliderRecipe.java renamed to src/main/java/top/ctnstudio/futurefood/core/recipe/ParticleColliderRecipe.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package top.ctnstudio.futurefood.api.recipe;
1+
package top.ctnstudio.futurefood.core.recipe;
22

33
import net.minecraft.world.item.ItemStack;
44
import net.minecraft.world.item.crafting.Ingredient;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package top.ctnstudio.futurefood.core.recipe_manager;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.Sets;
5+
import net.minecraft.core.component.DataComponents;
6+
import net.minecraft.core.registries.BuiltInRegistries;
7+
import net.minecraft.world.item.Item;
8+
import net.minecraft.world.item.ItemStack;
9+
import top.ctnstudio.futurefood.core.recipe.GluttonyRecipe;
10+
11+
import java.util.List;
12+
import java.util.Set;
13+
14+
public class GluttonyRecipeManager {
15+
private static final Set<GluttonyRecipe> RECIPES = Sets.newHashSet();
16+
private static boolean needsInitialization = true;
17+
18+
public static void initRecipes() {
19+
BuiltInRegistries.ITEM.stream()
20+
.map(Item::getDefaultInstance)
21+
.filter(item -> item.has(DataComponents.FOOD))
22+
.map(GluttonyRecipe::getRecipe)
23+
.forEach(GluttonyRecipeManager::addRecipe);
24+
}
25+
26+
public static void checkAndInit() {
27+
if (!needsInitialization) {
28+
return;
29+
}
30+
initRecipes();
31+
needsInitialization = false;
32+
}
33+
34+
public static void addRecipe(GluttonyRecipe recipe) {
35+
RECIPES.add(recipe);
36+
}
37+
38+
public static GluttonyRecipe findRecipe(ItemStack itemStack) {
39+
checkAndInit();
40+
return RECIPES.stream()
41+
.filter(recipe -> recipe.matches(itemStack))
42+
.findFirst()
43+
.orElseGet(() -> {
44+
var recipe = GluttonyRecipe.getRecipe(itemStack);
45+
// 添加进缓存
46+
addRecipe(recipe);
47+
return recipe;
48+
});
49+
}
50+
51+
public static List<GluttonyRecipe> getALLRecipes() {
52+
checkAndInit();
53+
return ImmutableList.copyOf(RECIPES);
54+
}
55+
}

src/main/java/top/ctnstudio/futurefood/core/ParticleColliderRecipeManager.java renamed to src/main/java/top/ctnstudio/futurefood/core/recipe_manager/ParticleColliderRecipeManager.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package top.ctnstudio.futurefood.core;
1+
package top.ctnstudio.futurefood.core.recipe_manager;
22

33
import com.google.common.collect.ImmutableList;
44
import com.google.common.collect.Sets;
55
import net.minecraft.world.item.ItemStack;
66
import net.minecraft.world.item.Items;
77
import net.minecraft.world.item.crafting.Ingredient;
8-
import top.ctnstudio.futurefood.api.recipe.ParticleColliderRecipe;
98
import top.ctnstudio.futurefood.core.init.ModItem;
9+
import top.ctnstudio.futurefood.core.recipe.ParticleColliderRecipe;
1010

1111
import java.util.List;
1212
import java.util.Optional;
@@ -112,10 +112,11 @@ public static void initRecipes(){
112112
}
113113

114114
public static void checkAndInit() {
115-
if (needsInitialization) {
116-
initRecipes();
117-
needsInitialization = false;
115+
if (!needsInitialization) {
116+
return;
118117
}
118+
initRecipes();
119+
needsInitialization = false;
119120
}
120121

121122
public static void addRecipe(ParticleColliderRecipe recipe) {
@@ -130,6 +131,7 @@ public static Optional<ParticleColliderRecipe> findRecipe(ItemStack input1, Item
130131
}
131132

132133
public static List<ParticleColliderRecipe> getALLRecipes(){
134+
checkAndInit();
133135
return ImmutableList.copyOf(RECIPES);
134136
}
135137
}

0 commit comments

Comments
 (0)