Skip to content

Commit

Permalink
Changed spawn config back to BiomeDictionary, as it got re-added to F…
Browse files Browse the repository at this point in the history
…orge

Added config option for spawn block, Closes #25
  • Loading branch information
GirafiStudios committed Nov 12, 2020
1 parent 39198e8 commit 787d8a2
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 18 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ build
# other
eclipse
run
libs
libs
logs
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
minecraft_version=1.16.3
forge_version=34.0.7
mappings=20200723-1.16.1
mod_version=0.8.9
minecraft_version=1.16.4
forge_version=35.0.15
mappings=20201028-1.16.3
mod_version=0.8.10

org.gradle.jvmargs=-Xmx4G
org.gradle.daemon=false
12 changes: 12 additions & 0 deletions src/main/java/com/girafi/waddles/entity/AdeliePenguinEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.girafi.waddles.init.PenguinRegistry;
import com.girafi.waddles.init.WaddlesSounds;
import com.girafi.waddles.utils.ConfigurationHandler;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.entity.*;
import net.minecraft.entity.ai.attributes.AttributeModifierMap;
Expand All @@ -20,6 +21,7 @@
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;

Expand Down Expand Up @@ -55,6 +57,16 @@ public static AttributeModifierMap.MutableAttribute getAttributes() {
return MobEntity.func_233666_p_().createMutableAttribute(Attributes.MAX_HEALTH, 8.0D).createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.16D);
}

@Override
public float getBlockPathWeight(@Nonnull BlockPos pos, @Nonnull IWorldReader world) {
Block blockDown = world.getBlockState(pos.down()).getBlock();
if (blockDown.getRegistryName() != null && ConfigurationHandler.GENERAL.spawnBlocks.get().contains(blockDown.getRegistryName().toString())) {
return 10.0F;
} else {
return super.getBlockPathWeight(pos, world);
}
}

@Override
protected SoundEvent getAmbientSound() {
return this.isChild() ? WaddlesSounds.ADELIE_BABY_AMBIENT : WaddlesSounds.ADELIE_AMBIENT;
Expand Down
28 changes: 24 additions & 4 deletions src/main/java/com/girafi/waddles/init/PenguinSpawn.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,44 @@
package com.girafi.waddles.init;

import com.girafi.waddles.Waddles;
import com.girafi.waddles.utils.BiomeDictionaryHelper;
import com.girafi.waddles.utils.ConfigurationHandler;
import net.minecraft.entity.EntityClassification;
import net.minecraft.util.RegistryKey;
import net.minecraft.util.registry.WorldGenRegistries;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.MobSpawnInfo;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

@Mod.EventBusSubscriber(modid = Waddles.MOD_ID)
public class PenguinSpawn {

@SubscribeEvent(priority = EventPriority.HIGH)
@SubscribeEvent(priority = EventPriority.HIGH)
public static void addSpawn(BiomeLoadingEvent event) {
Biome biome = ForgeRegistries.BIOMES.getValue(event.getName());
if (biome != null && (ConfigurationHandler.SPAWN.biomeCategoryBiomes.get().contains(biome.getCategory().getName()) || ConfigurationHandler.SPAWN.additionalBiomes.get().contains(event.getName().toString()))) {
event.getSpawns().getSpawner(EntityClassification.CREATURE).add(new MobSpawnInfo.Spawners(PenguinRegistry.ADELIE_PENGUIN, ConfigurationHandler.SPAWN.weight.get(), ConfigurationHandler.SPAWN.min.get(), ConfigurationHandler.SPAWN.max.get()));
if (event.getName() != null) {
Biome biome = ForgeRegistries.BIOMES.getValue(event.getName());
if (biome != null && WorldGenRegistries.BIOME.containsKey(event.getName())) {
RegistryKey<Biome> biomeKey = RegistryKey.getOrCreateKey(ForgeRegistries.Keys.BIOMES, event.getName());
List<BiomeDictionary.Type> includeList = Arrays.asList(BiomeDictionaryHelper.toBiomeTypeArray(ConfigurationHandler.SPAWN.include.get()));
List<BiomeDictionary.Type> excludeList = Arrays.asList(BiomeDictionaryHelper.toBiomeTypeArray(ConfigurationHandler.SPAWN.exclude.get()));
if (!includeList.isEmpty()) {
Set<BiomeDictionary.Type> biomeTypes = BiomeDictionary.getTypes(biomeKey);
if (biomeTypes.stream().noneMatch(excludeList::contains) && biomeTypes.stream().anyMatch(includeList::contains)) {
event.getSpawns().getSpawner(EntityClassification.CREATURE).add(new MobSpawnInfo.Spawners(PenguinRegistry.ADELIE_PENGUIN, ConfigurationHandler.SPAWN.weight.get(), ConfigurationHandler.SPAWN.min.get(), ConfigurationHandler.SPAWN.max.get()));
}
} else {
throw new IllegalArgumentException("Do not leave the BiomeDictionary type inclusion list empty. If you wish to disable spawning of an entity, set the weight to 0 instead.");
}
}
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/girafi/waddles/utils/BiomeDictionaryHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.girafi.waddles.utils;

import net.minecraftforge.common.BiomeDictionary;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class BiomeDictionaryHelper {

/**
* Retrieves a #BiomeDictionary.Type
* Based on {@link BiomeDictionary.Type#getType(String, BiomeDictionary.Type...)}, but doesn't create a new {@link BiomeDictionary.Type} if the input is not already a {@link BiomeDictionary.Type}
*
* @param name The name of this #BiomeDictionary.Type
* @return An instance of this #BiomeDictionary.Type
*/
public static BiomeDictionary.Type getType(String name) {
Map<String, BiomeDictionary.Type> byName = BiomeDictionary.Type.getAll().stream().collect(Collectors.toMap(BiomeDictionary.Type::getName, Function.identity()));
name = name.toUpperCase();
return byName.get(name);
}

/**
* Converts a List <? extends String> to a {@link BiomeDictionary.Type} array
*
* @param strings string array containing valid #BiomeDictionary.Types
* @return {@link BiomeDictionary.Type} based on the string input
*/
public static BiomeDictionary.Type[] toBiomeTypeArray(List<? extends String> strings) {
BiomeDictionary.Type[] types = new BiomeDictionary.Type[strings.size()];
for (int i = 0; i < strings.size(); i++) {
String string = strings.get(i);
types[i] = getType(string);
}
return types;
}
}
20 changes: 12 additions & 8 deletions src/main/java/com/girafi/waddles/utils/ConfigurationHandler.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package com.girafi.waddles.utils;

import com.google.common.collect.Lists;
import net.minecraft.block.Blocks;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import static net.minecraftforge.common.BiomeDictionary.Type.*;

public class ConfigurationHandler {
public static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();
Expand All @@ -18,6 +20,7 @@ public class ConfigurationHandler {
public static class General {
public final ForgeConfigSpec.BooleanValue dropFish;
public final ForgeConfigSpec.BooleanValue dropExp;
public final ForgeConfigSpec.ConfigValue<List<? extends String>> spawnBlocks;

General(ForgeConfigSpec.Builder builder) {
builder.push("general");
Expand All @@ -29,6 +32,7 @@ public static class General {
.comment("Penguins should drop experience?")
.translation("waddles.configgui.dropExp")
.define("dropExp", true);
spawnBlocks = builder.defineList("spawn blocks", Collections.singletonList(Blocks.GRASS_BLOCK.getRegistryName().toString()),o -> ForgeRegistries.BLOCKS.getKeys().contains(new ResourceLocation(String.valueOf(o))));
builder.pop();
}
}
Expand All @@ -37,19 +41,19 @@ public static class Spawn {
public final ForgeConfigSpec.IntValue min;
public final ForgeConfigSpec.IntValue max;
public final ForgeConfigSpec.IntValue weight;
public final ForgeConfigSpec.ConfigValue<List<? extends String>> biomeCategoryBiomes;
public final ForgeConfigSpec.ConfigValue<List<? extends String>> additionalBiomes;
public final ForgeConfigSpec.ConfigValue<List<? extends String>> include;
public final ForgeConfigSpec.ConfigValue<List<? extends String>> exclude;

Spawn(ForgeConfigSpec.Builder builder) {
builder.push("spawn chances");
builder.comment("Configure penguins spawn weight & min/max group size. Set weight to 0 to disable.");
min = builder.defineInRange("min", 1, 0, 64);
max = builder.defineInRange("max", 4, 0, 64);
weight = builder.defineInRange("weight", 6, 0, 100);
weight = builder.defineInRange("weight", 7, 0, 100);
builder.pop();
builder.push("spawnable biomes");
biomeCategoryBiomes = builder.defineList("biome categories", Collections.singletonList(Biome.Category.ICY.getName()), o -> Lists.newArrayList(Biome.Category.values()).contains(Biome.Category.func_235103_a_(String.valueOf(o).toLowerCase(Locale.ROOT))));
additionalBiomes = builder.defineList("additional biomes (Syntax: minecraft:plains)", Collections.emptyList(), o -> ForgeRegistries.BIOMES.containsKey(new ResourceLocation(String.valueOf(o))));
include = builder.defineList("include", Collections.singletonList(SNOWY.toString()), o -> BiomeDictionary.Type.getAll().contains(BiomeDictionaryHelper.getType(String.valueOf(o))));
exclude = builder.defineList("exclude", Arrays.asList(FOREST.toString(), MOUNTAIN.toString(), OCEAN.toString(), NETHER.toString()), o -> BiomeDictionary.Type.getAll().contains(BiomeDictionaryHelper.getType(String.valueOf(o))));
builder.pop();
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/META-INF/mods.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ license="GNU General Public License v3.0"
[[dependencies.waddles]]
modId="forge"
mandatory=true
versionRange="[34.0.5,)"
versionRange="[34.1.21,)"
ordering="AFTER"
side="BOTH"

0 comments on commit 787d8a2

Please sign in to comment.