Skip to content

Commit 4651827

Browse files
committed
Seasons integration
1 parent 4cc979b commit 4651827

File tree

13 files changed

+268
-0
lines changed

13 files changed

+268
-0
lines changed

common/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dependencies {
2525
compileOnly "maven.modrinth:exposure:${exposure_neoforge_version}"
2626
compileOnly "maven.modrinth:mixed-litter:${mixed_litter_version}"
2727
compileOnly "com.cobblemon:neoforge:${cobblemon_version}"
28+
compileOnly "maven.modrinth:serene-seasons:${serene_seasons_neoforge_version}"
2829

2930
compileOnly group: 'org.spongepowered', name: 'mixin', version: '0.8.5'
3031
compileOnly group: 'org.ow2.asm', name: 'asm-tree', version: '9.6'
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.evandev.fieldguide.api.seasons;
2+
3+
import net.minecraft.network.chat.Component;
4+
5+
public enum Season {
6+
SPRING("spring", "fieldguide.season.spring"),
7+
SUMMER("summer", "fieldguide.season.summer"),
8+
AUTUMN("autumn", "fieldguide.season.autumn"),
9+
WINTER("winter", "fieldguide.season.winter");
10+
11+
private final String id;
12+
private final String translationKey;
13+
14+
Season(String id, String translationKey) {
15+
this.id = id;
16+
this.translationKey = translationKey;
17+
}
18+
19+
public String getId() {
20+
return id;
21+
}
22+
23+
public Component getDisplayName() {
24+
return Component.translatable(translationKey);
25+
}
26+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.evandev.fieldguide.api.seasons;
2+
3+
import com.evandev.fieldguide.api.GuideEntry;
4+
import com.evandev.fieldguide.config.ClientConfig;
5+
import com.evandev.fieldguide.entry.EntryResolver;
6+
import net.minecraft.core.registries.BuiltInRegistries;
7+
import net.minecraft.resources.ResourceLocation;
8+
9+
import java.util.ArrayList;
10+
import java.util.LinkedHashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
14+
public class SeasonsAPI {
15+
private static final List<SeasonsProvider> PROVIDERS = new ArrayList<>();
16+
17+
public static void registerProvider(SeasonsProvider provider) {
18+
PROVIDERS.add(provider);
19+
}
20+
21+
public static List<Season> getGrowingSeasons(Object entry) {
22+
if (!ClientConfig.get().showSeasonIcons) {
23+
return List.of();
24+
}
25+
26+
Set<Season> allSeasons = new LinkedHashSet<>();
27+
28+
// Check the entry itself
29+
resolveAndCheck(entry, allSeasons);
30+
31+
// If it's a GuideEntry, check children too
32+
if (entry instanceof GuideEntry ge) {
33+
if (ge.childEntries() != null) {
34+
for (ResourceLocation childId : ge.childEntries()) {
35+
resolveAndCheck(childId, allSeasons);
36+
}
37+
}
38+
}
39+
40+
return new ArrayList<>(allSeasons);
41+
}
42+
43+
private static void resolveAndCheck(Object entry, Set<Season> allSeasons) {
44+
Object resolved = entry;
45+
if (entry instanceof ResourceLocation id) {
46+
resolved = resolveId(id);
47+
} else if (entry instanceof GuideEntry) {
48+
resolved = EntryResolver.resolveCoreEntry(entry);
49+
}
50+
51+
if (resolved != null) {
52+
for (SeasonsProvider provider : PROVIDERS) {
53+
List<Season> seasons = provider.getGrowingSeasons(resolved);
54+
if (seasons != null) {
55+
allSeasons.addAll(seasons);
56+
}
57+
}
58+
}
59+
}
60+
61+
private static Object resolveId(ResourceLocation id) {
62+
return BuiltInRegistries.BLOCK.getOptional(id)
63+
.map(Object.class::cast)
64+
.or(() -> BuiltInRegistries.ITEM.getOptional(id))
65+
.or(() -> BuiltInRegistries.ENTITY_TYPE.getOptional(id))
66+
.orElse(null);
67+
}
68+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.evandev.fieldguide.api.seasons;
2+
3+
import java.util.List;
4+
5+
public interface SeasonsProvider {
6+
List<Season> getGrowingSeasons(Object entry);
7+
}

common/src/main/java/com/evandev/fieldguide/client/FieldGuideClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.evandev.fieldguide.client.gui.screens.FieldGuideCategoryScreen;
77
import com.evandev.fieldguide.client.gui.screens.FieldGuideEntryScreen;
88
import com.evandev.fieldguide.client.scan.FieldGuideScanner;
9+
import com.evandev.fieldguide.compat.SeasonsCompat;
910
import com.evandev.fieldguide.compat.cobblemon.FieldGuideCobblemonCompat;
1011
import com.evandev.fieldguide.config.ClientConfig;
1112
import com.evandev.fieldguide.mixin.accessor.MobAccessor;
@@ -28,6 +29,8 @@ public class FieldGuideClient {
2829
public static KeyMapping SCAN_KEY;
2930

3031
public static void init() {
32+
SeasonsCompat.init();
33+
3134
OPEN_GUIDE_KEY = new KeyMapping(
3235
"key.fieldguide.open",
3336
InputConstants.Type.KEYSYM,

common/src/main/java/com/evandev/fieldguide/client/gui/screens/FieldGuideEntryScreen.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.evandev.fieldguide.ModDataComponents;
66
import com.evandev.fieldguide.api.Category;
77
import com.evandev.fieldguide.api.GuideEntry;
8+
import com.evandev.fieldguide.api.seasons.Season;
9+
import com.evandev.fieldguide.api.seasons.SeasonsAPI;
810
import com.evandev.fieldguide.api.variant.VariantDef;
911
import com.evandev.fieldguide.api.variant.VariantProvider;
1012
import com.evandev.fieldguide.client.ClientConstants;
@@ -625,9 +627,55 @@ public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, flo
625627
}
626628
}
627629

630+
if (unlocked) {
631+
renderSeasons(guiGraphics, xPos, yPos, mouseX, mouseY);
632+
}
633+
628634
super.render(guiGraphics, mouseX, mouseY, partialTick);
629635
}
630636

637+
private void renderSeasons(GuiGraphics guiGraphics, int x, int y, int mouseX, int mouseY) {
638+
List<Season> seasons = SeasonsAPI.getGrowingSeasons(entry);
639+
if (seasons.isEmpty()) return;
640+
641+
int iconSize = 12;
642+
int spacing = 2;
643+
int totalWidth = (iconSize * seasons.size()) + (spacing * (seasons.size() - 1));
644+
int startX = x - (totalWidth / 2);
645+
int startY = y + 42;
646+
647+
boolean ssLoaded = Services.PLATFORM.isModLoaded("sereneseasons");
648+
ResourceLocation ssTexture = ResourceLocation.fromNamespaceAndPath("sereneseasons", "textures/item/ss_icon.png");
649+
650+
for (int i = 0; i < seasons.size(); i++) {
651+
Season season = seasons.get(i);
652+
int drawX = startX + (i * (iconSize + spacing));
653+
654+
RenderSystem.enableBlend();
655+
if (ssLoaded) {
656+
int u = 0;
657+
int v = 0;
658+
switch (season) {
659+
case SUMMER -> u = 8;
660+
case AUTUMN -> v = 8;
661+
case WINTER -> {
662+
u = 8;
663+
v = 8;
664+
}
665+
}
666+
guiGraphics.blit(ssTexture, drawX, startY, iconSize, iconSize, u, v, 8, 8, 16, 16);
667+
} else {
668+
ResourceLocation texture = ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "textures/gui/icons/" + season.getId() + ".png");
669+
guiGraphics.blit(texture, drawX, startY, 0, 0, iconSize, iconSize, iconSize, iconSize);
670+
}
671+
RenderSystem.disableBlend();
672+
673+
if (Bounds.isMouseOver(mouseX, mouseY, drawX, startY, iconSize, iconSize)) {
674+
guiGraphics.renderTooltip(this.font, season.getDisplayName(), mouseX, mouseY);
675+
}
676+
}
677+
}
678+
631679
private void renderAlignment(GuiGraphics guiGraphics, LivingEntity entity, int mouseX, int mouseY) {
632680
ResourceLocation icon;
633681
Component typeComponent;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.evandev.fieldguide.compat;
2+
3+
import com.evandev.fieldguide.api.seasons.Season;
4+
import com.evandev.fieldguide.api.seasons.SeasonsAPI;
5+
import com.evandev.fieldguide.api.seasons.SeasonsProvider;
6+
import com.evandev.fieldguide.compat.sereneseasons.SereneSeasonsProvider;
7+
import com.evandev.fieldguide.platform.Services;
8+
import net.minecraft.core.registries.BuiltInRegistries;
9+
import net.minecraft.resources.ResourceLocation;
10+
import net.minecraft.world.item.Item;
11+
import net.minecraft.world.level.block.Block;
12+
13+
import java.util.List;
14+
15+
public class SeasonsCompat {
16+
public static void init() {
17+
if (Services.PLATFORM.isModLoaded("sereneseasons")) {
18+
SeasonsAPI.registerProvider(new SereneSeasonsProvider());
19+
}
20+
21+
if (Services.PLATFORM.isModLoaded("fabric-seasons")) {
22+
// Fabric Seasons integration would go here
23+
}
24+
25+
if (Services.PLATFORM.isModLoaded("eclipticseasons")) {
26+
// Ecliptic Seasons integration would go here
27+
}
28+
}
29+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.evandev.fieldguide.compat.sereneseasons;
2+
3+
import com.evandev.fieldguide.api.seasons.Season;
4+
import com.evandev.fieldguide.api.seasons.SeasonsProvider;
5+
import net.minecraft.core.registries.BuiltInRegistries;
6+
import net.minecraft.resources.ResourceLocation;
7+
import net.minecraft.tags.TagKey;
8+
import net.minecraft.world.item.Item;
9+
import net.minecraft.world.item.Items;
10+
import net.minecraft.world.level.block.Block;
11+
import net.minecraft.world.level.block.Blocks;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class SereneSeasonsProvider implements SeasonsProvider {
17+
private static final String MOD_ID = "sereneseasons";
18+
19+
private static final TagKey<Block> SPRING_BLOCKS = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "spring_crops"));
20+
private static final TagKey<Block> SUMMER_BLOCKS = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "summer_crops"));
21+
private static final TagKey<Block> AUTUMN_BLOCKS = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "autumn_crops"));
22+
private static final TagKey<Block> WINTER_BLOCKS = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "winter_crops"));
23+
24+
private static final TagKey<Item> SPRING_ITEMS = TagKey.create(BuiltInRegistries.ITEM.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "spring_crops"));
25+
private static final TagKey<Item> SUMMER_ITEMS = TagKey.create(BuiltInRegistries.ITEM.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "summer_crops"));
26+
private static final TagKey<Item> AUTUMN_ITEMS = TagKey.create(BuiltInRegistries.ITEM.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "autumn_crops"));
27+
private static final TagKey<Item> WINTER_ITEMS = TagKey.create(BuiltInRegistries.ITEM.key(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "winter_crops"));
28+
29+
@Override
30+
public List<Season> getGrowingSeasons(Object entry) {
31+
List<Season> seasons = new ArrayList<>();
32+
33+
if (entry instanceof Block block) {
34+
checkBlock(block, seasons);
35+
if (seasons.isEmpty()) {
36+
checkItem(block.asItem(), seasons);
37+
}
38+
} else if (entry instanceof Item item) {
39+
checkItem(item, seasons);
40+
if (seasons.isEmpty()) {
41+
Block block = Block.byItem(item);
42+
if (block != Blocks.AIR) {
43+
checkBlock(block, seasons);
44+
}
45+
}
46+
}
47+
48+
return seasons;
49+
}
50+
51+
private void checkBlock(Block block, List<Season> seasons) {
52+
var state = block.defaultBlockState();
53+
if (state.is(SPRING_BLOCKS)) seasons.add(Season.SPRING);
54+
if (state.is(SUMMER_BLOCKS)) seasons.add(Season.SUMMER);
55+
if (state.is(AUTUMN_BLOCKS)) seasons.add(Season.AUTUMN);
56+
if (state.is(WINTER_BLOCKS)) seasons.add(Season.WINTER);
57+
}
58+
59+
private void checkItem(Item item, List<Season> seasons) {
60+
if (item == Items.AIR) return;
61+
var stack = item.getDefaultInstance();
62+
if (stack.is(SPRING_ITEMS)) seasons.add(Season.SPRING);
63+
if (stack.is(SUMMER_ITEMS)) seasons.add(Season.SUMMER);
64+
if (stack.is(AUTUMN_ITEMS)) seasons.add(Season.AUTUMN);
65+
if (stack.is(WINTER_ITEMS)) seasons.add(Season.WINTER);
66+
}
67+
}

common/src/main/java/com/evandev/fieldguide/config/ClientConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class ClientConfig {
5353

5454
public boolean useRealWorldDate = false;
5555
public boolean showToasts = true;
56+
public boolean showSeasonIcons = true;
5657

5758
public boolean exposureAddPhotographButton = true;
5859
public boolean exposureShowPhotographsInGrid = true;

common/src/main/java/com/evandev/fieldguide/config/ClothConfigIntegration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,15 @@ public static Screen createScreen(Screen parent) {
399399
.setSaveConsumer(newValue -> clientConfig.exposureShowPhotographsInGrid = newValue)
400400
.build());
401401

402+
// Seasons
403+
ConfigCategory seasonsCat = builder.getOrCreateCategory(Component.translatable("category.fieldguide.seasons"));
404+
405+
seasonsCat.addEntry(entryBuilder.startBooleanToggle(Component.translatable("option.fieldguide.show_season_icons"), clientConfig.showSeasonIcons)
406+
.setDefaultValue(true)
407+
.setTooltip(Component.translatable("option.fieldguide.show_season_icons.tooltip"))
408+
.setSaveConsumer(newValue -> clientConfig.showSeasonIcons = newValue)
409+
.build());
410+
402411
return builder.build();
403412
}
404413

0 commit comments

Comments
 (0)