diff --git a/build.gradle b/build.gradle index 6aa42570..ea8a5851 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,16 @@ buildscript { repositories { + mavenCentral() maven { url = 'https://maven.minecraftforge.net' } maven { url = "https://plugins.gradle.org/m2/" } - mavenCentral() + maven { url = 'https://repo.spongepowered.org/maven' } + maven { url = 'https://maven.parchmentmc.org' } } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true classpath "net.dumbcode.gradlehook:GradleHook:2.0.2" + classpath 'org.spongepowered:mixingradle:0.7.+' + classpath 'org.parchmentmc:librarian:1.+' } } @@ -14,6 +18,8 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: "net.dumbcode.gradlehook" apply plugin: 'eclipse' apply plugin: 'maven-publish' +apply plugin: 'org.spongepowered.mixin' +apply plugin: 'org.parchmentmc.librarian.forgegradle' version = '1.16.5-' + (System.getenv("GITHUB_ACTIONS") ? System.getenv("GITHUB_RUN_NUMBER") : 'dev') group = 'net.dumbcode.projectnublar' // http://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -30,8 +36,12 @@ sourceSets { } } +mixin { + add sourceSets.main, "projectnublar.refmap.json" +} + minecraft { - mappings channel: 'official', version: '1.16.5' + mappings channel: 'parchment', version: '2022.03.06-1.16.5' accessTransformer( @@ -44,7 +54,9 @@ minecraft { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' - + property 'mixin.env.remapRefMap', 'true' + arg "-mixin.config=projectnublar.mixins.json" + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" mods { projectnublar { source sourceSets.main @@ -101,10 +113,11 @@ repositories { } } dependencies { - minecraft 'net.minecraftforge:forge:1.16.5-36.2.20' + minecraft 'net.minecraftforge:forge:1.16.5-36.2.34' implementation 'org.projectlombok:lombok:1.18.12' annotationProcessor 'org.projectlombok:lombok:1.18.12' + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.0' implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.1' @@ -125,7 +138,10 @@ jar { "Implementation-Title": project.name, "Implementation-Version": "${version}", "Implementation-Vendor" :"examplemodsareus", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + "TweakClass": "org.spongepowered.asm.launch.MixinTweaker", + "TweakOrder": 0, + "MixinConfigs": "projectnublar.mixins.json" ]) } } @@ -152,3 +168,4 @@ gradlehook { addField 'payload_json', '{ "embeds": [{ "title":"' + System.getenv("COMMIT_MESSAGE") + " - " + System.getenv("COMMIT_AUTHOR") + '", "timestamp": "{{datetime}}" }] }' addArtifact jar } +apply from: "https://moddingtutorials.org/applesilicon.gradle" \ No newline at end of file diff --git a/dumb_library b/dumb_library index dc5fa004..ad06615f 160000 --- a/dumb_library +++ b/dumb_library @@ -1 +1 @@ -Subproject commit dc5fa004681472327150ca134224ec130b35c983 +Subproject commit ad06615f11baad72524dfadc3069e8e105b328f4 diff --git a/gradle.properties b/gradle.properties index 784899a6..53f20dbb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# Sets default memory used for gradle commands. Can be overridden by user or command line BlockStateProperties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false + +mc_version=1.16.5 \ No newline at end of file diff --git a/machine_upgrades_stats.md b/machine_upgrades_stats.md index 7ce18692..884c16ab 100644 --- a/machine_upgrades_stats.md +++ b/machine_upgrades_stats.md @@ -2,12 +2,12 @@ A list of all the currently updated machine parts ## Fossil Processor ### Tanks -Effects the capacity of the water tanks. +Affects the capacity of the water tanks. - Default -> 2 buckets - 1 -> 3 buckets - 2 -> 4 buckets ### Computer Chip -Effects the time taken to convert fossil to genetic material . +Affects the time taken to convert fossil to genetic material . - default -> 4 minutes - 1 -> 3 minutes - 2 -> 2 minutes @@ -21,7 +21,7 @@ at full durability is the base efficiency, and at 0 durability is 25% of the bas - Diamond -> 100% base efficiency, 500 durability ## Drill Extractor ### Drill Bit -Effects the time taken to convert amber into genetic material, and the rough amount of genetic material it produces. +Affects the time taken to convert amber into genetic material, and the rough amount of genetic material it produces. - Default -> 6 minutes, ~1 genetic material - 1 -> 5.5 minutes, ~2 genetic material - 2 -> 5 minutes, ~3 genetic material @@ -30,7 +30,7 @@ Effects the time taken to convert amber into genetic material, and the rough amo - 5 -> 3.5 minutes, ~6 genetic material ## Sequencer ### Tanks -Effects the capacity of the water, bone, sugar and plant tanks. Water is measured in buckets while bone/sugar/plant +Affects the capacity of the water, bone, sugar and plant tanks. Water is measured in buckets while bone/sugar/plant is measured in matter. - Default -> 1 bucket, 16 matter - 1 -> 1.5 bucket, 24 matter @@ -38,18 +38,18 @@ is measured in matter. - 3 -> 2.5 bucket, 40 matter - 4 -> 3 bucket, 48 matter ### Computer Chip -Effects the time taken to convert the water, bone, sugar, plant matter and selected dna values into a dna test tube. +Affects the time taken to convert the water, bone, sugar, plant matter and selected dna values into a dna test tube. - Default -> 10 minutes - 1 -> 7 minutes - 2 -> 4 minutes ### Storage Type -The item used to store the data on. Gets put into the storage slot. Effects the time taken to convert a syringe or +The item used to store the data on. Gets put into the storage slot. Effects the dinosaurAge taken to convert a syringe or genetic material into data and put the data into the storage item. - hdd -> 10 seconds - ssd -> 5 seconds ## 3D Printer ### Computer Chip -Effects the time taken to use embryo and bone meal and 3d print it into an artificial egg. +Affects the time taken to use embryo and bone meal and 3d print it into an artificial egg. - Default -> 10 minutes - 1 -> 8 minutes - 2 -> 6 minutes @@ -60,25 +60,25 @@ Adding this upgrade will remove the change of a broken egg occurring. - 1 -> 0% chance ## Incubator ### Tanks -Effects the capacity of the plant matter tank. +Affects the capacity of the plant matter tank. - Default -> 100 plant matter - 1 -> 150 plant matter - 2 -> 200 plant matter ### Bulb -Effects the time taken to incubate an egg. +Affects the time taken to incubate an egg. - Default -> 30 minutes (18s per %) - 1 -> 25 minutes (15s per %) - 2 -> 20 minutes (12s per %) - 3 -> 15 minutes (9s per %) ### Container (needs renaming) -Effects the number of eggs that can be incubated at once on a single incubator. +Affects the number of eggs that can be incubated at once on a single incubator. - Default -> 3 eggs - 1 -> 6 eggs - 2 -> 9 eggs ## Generator ### Turbines -Effects the amount of energy (FE) a tick from burning items. +Affects the amount of energy (FE) a tick from burning items. - Default -> 2000 - 1 -> 3000 - 2 -> 4000 \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/client/ProjectNublarBlockRenderLayers.java b/src/main/java/net/dumbcode/projectnublar/client/ProjectNublarBlockRenderLayers.java index 99632c78..66c8de20 100644 --- a/src/main/java/net/dumbcode/projectnublar/client/ProjectNublarBlockRenderLayers.java +++ b/src/main/java/net/dumbcode/projectnublar/client/ProjectNublarBlockRenderLayers.java @@ -3,13 +3,8 @@ import static net.minecraft.client.renderer.RenderTypeLookup.setRenderLayer; import static net.dumbcode.projectnublar.server.block.BlockHandler.*; -import net.dumbcode.dumblibrary.server.registry.RegistryMap; -import net.dumbcode.projectnublar.server.block.BlockHandler; -import net.dumbcode.projectnublar.server.block.FossilBlock; -import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderType; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import java.util.Arrays; import java.util.HashSet; @@ -23,12 +18,7 @@ public static void setRenderLayers() { setRenderLayers(UNBUILT_INCUBATOR.get(), RenderType.solid(), RenderType.cutout(), RenderType.translucent()); - for (RegistryMap map : FOSSIL.values()) { - for (FossilBlock block : map.values()) { - setRenderLayers(block, RenderType.cutout()); - } - } - + setRenderLayers(FOSSIL_BLOCK.get(), RenderType.translucent(), RenderType.solid()); } private static void setRenderLayers(Block block, RenderType... types) { diff --git a/src/main/java/net/dumbcode/projectnublar/client/files/SkeletalBuilderFileHandler.java b/src/main/java/net/dumbcode/projectnublar/client/files/SkeletalBuilderFileHandler.java index 37bc5b07..2e017094 100644 --- a/src/main/java/net/dumbcode/projectnublar/client/files/SkeletalBuilderFileHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/client/files/SkeletalBuilderFileHandler.java @@ -45,7 +45,7 @@ // zos.close(); // } // } catch (IOException e) { -// ProjectNublar.getLogger().error("There was an issue serializing {}", infomation.getDinosaurLocation().getNamespace()); +// ProjectNublar.LOGGER.error("There was an issue serializing {}", infomation.getDinosaurLocation().getNamespace()); // } // } // } @@ -83,7 +83,7 @@ // lineNum++; // } // } catch (IOException e) { -// ProjectNublar.getLogger().error("Unable to load file" + e); +// ProjectNublar.LOGGER.error("Unable to load file" + e); // } // return new SkeletalBuilderFileInfomation(fileLocation, map); // } diff --git a/src/main/java/net/dumbcode/projectnublar/client/gui/machines/IncubatorScreen.java b/src/main/java/net/dumbcode/projectnublar/client/gui/machines/IncubatorScreen.java index cd8ffcad..3d0189e8 100644 --- a/src/main/java/net/dumbcode/projectnublar/client/gui/machines/IncubatorScreen.java +++ b/src/main/java/net/dumbcode/projectnublar/client/gui/machines/IncubatorScreen.java @@ -2,11 +2,9 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; -import net.dumbcode.dumblibrary.DumbLibrary; import net.dumbcode.projectnublar.client.gui.tab.MachineContainerScreen; import net.dumbcode.projectnublar.client.gui.tab.TabInformationBar; import net.dumbcode.projectnublar.server.ProjectNublar; -import net.dumbcode.projectnublar.server.block.entity.EggPrinterBlockEntity; import net.dumbcode.projectnublar.server.block.entity.IncubatorBlockEntity; import net.dumbcode.projectnublar.server.block.entity.MachineModuleBlockEntity; import net.dumbcode.projectnublar.server.containers.machines.MachineModuleContainer; @@ -59,7 +57,7 @@ public IncubatorScreen(IncubatorBlockEntity blockEntity, MachineModuleContainer try { shaderManager = new ShaderInstance(Minecraft.getInstance().getResourceManager(), ProjectNublar.MODID + ":incubator_bed"); } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to load incubator bed shader :/", e); + ProjectNublar.LOGGER.error("Unable to load incubator bed shader :/", e); } } } diff --git a/src/main/java/net/dumbcode/projectnublar/client/gui/tablet/setuppages/PhotoBackgroundSetup.java b/src/main/java/net/dumbcode/projectnublar/client/gui/tablet/setuppages/PhotoBackgroundSetup.java index b1b8272c..398746ab 100644 --- a/src/main/java/net/dumbcode/projectnublar/client/gui/tablet/setuppages/PhotoBackgroundSetup.java +++ b/src/main/java/net/dumbcode/projectnublar/client/gui/tablet/setuppages/PhotoBackgroundSetup.java @@ -15,7 +15,6 @@ import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.NativeImage; import net.minecraft.client.resources.I18n; -import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; @@ -85,7 +84,7 @@ public void initPage(int x, int y) { try { ProjectNublar.NETWORK.sendToServer(new CS2UploadPhotoBackgroundImage(!this.userTab, image.asByteArray())); } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to write image", e); + ProjectNublar.LOGGER.error("Unable to write image", e); } })); this.uploadButton.active = this.currentTestImage != null; @@ -203,7 +202,7 @@ private void setAsCurrent(Path path) { this.currentTestImage = image; this.uploadButton.active = true; } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to read file " + path.toAbsolutePath() + " as an image", e); + ProjectNublar.LOGGER.error("Unable to read file " + path.toAbsolutePath() + " as an image", e); } } diff --git a/src/main/java/net/dumbcode/projectnublar/client/model/ModelUtils.java b/src/main/java/net/dumbcode/projectnublar/client/model/ModelUtils.java new file mode 100644 index 00000000..9900ad57 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/client/model/ModelUtils.java @@ -0,0 +1,66 @@ +package net.dumbcode.projectnublar.client.model; + +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; + +import java.util.Arrays; + +import static java.lang.Float.floatToRawIntBits; +import static java.lang.Float.intBitsToFloat; + +public class ModelUtils { + + /** + * Retextures the quad to the atlas sprite, offset by a specific amount + * @param quad The original quad + * @param sprite The texture to replace + * @param offset The offset. Setting this to 0 will mean the quad will be at the exact same position + * as before, causing z-fighting if both quads are rendered. To fix this, apply a very small + * offset to physically move the vertexes the direction of the quad + * @return The new remapped quad + */ + public static BakedQuad retextureQuad(BakedQuad quad, TextureAtlasSprite sprite, float offset) { + int[] data = Arrays.copyOf(quad.getVertices(), quad.getVertices().length); + for (int i = 0; i < 4; i++) { + int j = DefaultVertexFormats.BLOCK.getIntegerSize() * i; + + float x = intBitsToFloat(data[j]) + offset*quad.getDirection().getStepX(); + float y = intBitsToFloat(data[j+1]) + offset*quad.getDirection().getStepY(); + float z = intBitsToFloat(data[j+2]) + offset*quad.getDirection().getStepZ(); + + data[j] = floatToRawIntBits(x); + data[j+1] = floatToRawIntBits(y); + data[j+2] = floatToRawIntBits(z); + + float ui; + float vi; + + // This is figured out from trial and error, I think the discrepancy is due to + // weird vanilla axis-flipping behaviour + switch (quad.getDirection().getAxis()) { + case X: + ui = z; + vi = 1-y; + break; + case Y: + default: + ui = x; + vi = z; + break; + case Z: + ui = x; + vi = 1-y; + break; + } + + data[j+4] = floatToRawIntBits(sprite.getU(ui*16F)); + data[j+5] = floatToRawIntBits(sprite.getV(vi*16F)); + + data[j+6] = (240 << 16) | 240; + } + + return new BakedQuad(data, -1, quad.getDirection(), sprite, quad.isShade()); + } + +} diff --git a/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBakedModel.java b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBakedModel.java new file mode 100644 index 00000000..27c66d24 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBakedModel.java @@ -0,0 +1,133 @@ +package net.dumbcode.projectnublar.client.model.fossil; + +import net.dumbcode.projectnublar.client.model.ModelUtils; +import net.dumbcode.projectnublar.client.render.model.ProjectNublarModelHandler; +import net.dumbcode.projectnublar.server.block.entity.FossilBlockEntity; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.base.FossilTier; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockModelShapes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockDisplayReader; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.client.model.data.IDynamicBakedModel; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelProperty; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; + +import static net.minecraft.inventory.container.PlayerContainer.BLOCK_ATLAS; + +public class FossilBakedModel implements IDynamicBakedModel { + + @Nonnull + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { + BlockState baseState = getOrDefault(extraData, FossilBlockEntity.STONE_TYPE, StoneTypeHandler.GRANITE.get()).baseState.get(); + IBakedModel baseModel = Minecraft.getInstance().getModelManager().getModel(BlockModelShapes.stateToModelLocation(baseState)); + + List solidQuads = baseModel.getQuads(state, side, rand, extraData); + + // The fossil model can be rendered in both the solid, and translucent render layers. + // If, it's the solid render layer, render the block as normal. + // Otherwise, render the retextured quads. + if (MinecraftForgeClient.getRenderLayer() == RenderType.solid()) { + return solidQuads; + } + + + Fossil fossil = getOrDefault(extraData, FossilBlockEntity.FOSSIL, FossilHandler.AMMONITE.get()); + FossilTier tier = getOrDefault(extraData, FossilBlockEntity.TIER, FossilTier.WEATHERED); + + // Get the texture + ResourceLocation texture = fossil.getTextureForDNAValue(tier.getDnaValue()); + ResourceLocation finalTexture = new ResourceLocation(texture.getNamespace(), "block/fossil/" + texture.getPath() + "overlay/" + fossil.textureName); + TextureAtlasSprite overlay = Minecraft.getInstance().getModelManager().getAtlas(BLOCK_ATLAS).getSprite(finalTexture); + + TextureAtlasSprite crack = this.getCrackTexture(tier); + + List out = new ArrayList<>(); + for (BakedQuad quad : solidQuads) { + out.add(ModelUtils.retextureQuad(quad, overlay, 0.001F)); + if (crack != null) { + out.add(ModelUtils.retextureQuad(quad, crack, 0.002F)); + } + } + return out; + } + + private TextureAtlasSprite getCrackTexture(FossilTier tier) { + switch (tier.getCrackLevel()) { + case 0: + return null; + case 1: + return ProjectNublarModelHandler.fossilCrackLow; + case 2: + return ProjectNublarModelHandler.fossilCrackMedium; + default: + return ProjectNublarModelHandler.fossilCrackFull; + } + } + + @Nonnull + @Override + public IModelData getModelData(@Nonnull IBlockDisplayReader world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull IModelData tileData) { + return Objects.requireNonNull(world.getBlockEntity(pos)).getModelData(); + } + + public static T getOrDefault(IModelData data, ModelProperty property, T fallback) { + if (data.hasProperty(property)) { + return data.getData(property); + } + return fallback; + } + + @Override + public boolean useAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return true; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Nonnull + @Override + public TextureAtlasSprite getParticleIcon() { + return Minecraft.getInstance().getModelManager().getMissingModel().getParticleIcon(); + } + + @Override + public TextureAtlasSprite getParticleTexture(@Nonnull IModelData data) { + BlockState baseState = getOrDefault(data, FossilBlockEntity.STONE_TYPE, StoneTypeHandler.GRANITE.get()).baseState.get(); + IBakedModel baseModel = Minecraft.getInstance().getModelManager().getModel(BlockModelShapes.stateToModelLocation(baseState)); + return baseModel.getParticleTexture(data); + } + + @Nonnull + @Override + public ItemOverrideList getOverrides() { + return ItemOverrideList.EMPTY; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBlockItemBakedModel.java b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBlockItemBakedModel.java new file mode 100644 index 00000000..274c6e59 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilBlockItemBakedModel.java @@ -0,0 +1,117 @@ +package net.dumbcode.projectnublar.client.model.fossil; + +import net.dumbcode.projectnublar.client.model.ModelUtils; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.base.StoneType; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilBlockItem; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms; +import net.minecraft.client.renderer.model.ItemOverrideList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.data.IDynamicBakedModel; +import net.minecraftforge.client.model.data.IModelData; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import static net.minecraft.inventory.container.PlayerContainer.BLOCK_ATLAS; + +public class FossilBlockItemBakedModel implements IDynamicBakedModel { + @Nonnull + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { + return Collections.emptyList(); + } + + @Override + public boolean useAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return Minecraft.getInstance().getModelManager().getMissingModel().getParticleIcon(); + } + + @Override + public ItemOverrideList getOverrides() { + return StackAwareItemOverrides.INSTANCE; + } + + private static class StackAwareItemOverrides extends ItemOverrideList { + + public static final StackAwareItemOverrides INSTANCE = new StackAwareItemOverrides(); + + @Nullable + @Override + public IBakedModel resolve(IBakedModel model, ItemStack itemStack, @Nullable ClientWorld p_239290_3_, @Nullable LivingEntity p_239290_4_) { + return new StackAwareModelBlock(FossilBlockItem.getStoneType(itemStack), FossilBlockItem.getFossil(itemStack)); + } + } + + private static class StackAwareModelBlock extends FossilBlockItemBakedModel { + private final Fossil fossil; + + private final IBakedModel base; + + private StackAwareModelBlock(StoneType type, Fossil fossil) { + this.fossil = fossil; + this.base = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(new ItemStack(type.baseState.get().getBlock())); + } + + @Nonnull + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { + List quads = base.getQuads(state, side, rand, extraData); + List out = new ArrayList<>(quads); + + //TODO + ResourceLocation texture = fossil.getTextureForDNAValue(1); + ResourceLocation finalTexture = new ResourceLocation(texture.getNamespace(), "block/fossil/" + texture.getPath() + "overlay/" + fossil.textureName); + TextureAtlasSprite overlay = Minecraft.getInstance().getModelManager().getAtlas(BLOCK_ATLAS).getSprite(finalTexture); + + for (BakedQuad quad : quads) { + out.add(ModelUtils.retextureQuad(quad, overlay, 0.001F)); + } + + return out; + } + + @Override + public ItemCameraTransforms getTransforms() { + return this.base.getTransforms(); + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return base.getParticleIcon(); + } + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemBakedModel.java b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemBakedModel.java new file mode 100644 index 00000000..d26e85ca --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemBakedModel.java @@ -0,0 +1,324 @@ +package net.dumbcode.projectnublar.client.model.fossil; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import net.dumbcode.dumblibrary.client.TransformingBakedQuadGenerator; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.model.*; +import net.minecraft.client.renderer.texture.MissingTextureSprite; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.TransformationMatrix; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.client.model.BakedItemModel; +import net.minecraftforge.common.model.TransformationHelper; +import net.minecraftforge.resource.IResourceType; +import net.minecraftforge.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.resource.VanillaResourceType; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; + +import static net.minecraft.inventory.container.PlayerContainer.BLOCK_ATLAS; + +@SuppressWarnings("deprecation") +public class FossilItemBakedModel extends BakedItemModel implements ISelectiveResourceReloadListener { + private TextureAtlasSprite baseSprite = null; + private final List sprites; + private final TransformationMatrix transform; + /* Cache the result of quads, using a location combination */ + private static final Map> cache = new HashMap<>(); + + private static final float NORTH_Z = 7.496f / 16f; + private static final float SOUTH_Z = 8.504f / 16f; + + public FossilItemBakedModel(Function modelGetter) { + super(ImmutableList.of(), Minecraft.getInstance().getTextureAtlas(BLOCK_ATLAS).apply(MissingTextureSprite.getLocation()), getTransformMap(modelGetter), new FossilItemOverrideList(RenderMaterial::sprite), false, true); + this.sprites = new ArrayList<>(); + this.transform = TransformationMatrix.identity(); + } + + private static ImmutableMap getTransformMap(Function modelGetter) { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + + ItemCameraTransforms parent = ((BlockModel) modelGetter.apply(new ResourceLocation("item/handheld"))).getTransforms(); + addTransform(builder, ItemCameraTransforms.TransformType.GUI, parent.gui); + addTransform(builder, ItemCameraTransforms.TransformType.FIXED, parent.fixed); + addTransform(builder, ItemCameraTransforms.TransformType.GROUND, parent.ground); + addTransform(builder, ItemCameraTransforms.TransformType.HEAD, parent.head); + addTransform(builder, ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, parent.firstPersonLeftHand); + addTransform(builder, ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND, parent.firstPersonRightHand); + addTransform(builder, ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND, parent.thirdPersonLeftHand); + addTransform(builder, ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND, parent.thirdPersonRightHand); + return builder.build(); + } + + private static void addTransform(ImmutableMap.Builder builder, ItemCameraTransforms.TransformType type, ItemTransformVec3f vec) { + builder.put(type, TransformationHelper.toTransformation(vec)); + } + + private FossilItemBakedModel(FossilItemBakedModel originalModel, List spritesIn) { + super(ImmutableList.of(), originalModel.particle, originalModel.transforms, originalModel.overrides, originalModel.transform.isIdentity(), originalModel.isSideLit); + + this.baseSprite = originalModel.baseSprite; + this.sprites = spritesIn; + this.transform = originalModel.transform; + } + + @Nonnull + @Override + public ItemOverrideList getOverrides() { + return new FossilItemOverrideList(RenderMaterial::sprite); + } + + + private ImmutableList genQuads() { + String cacheKey = this.getCacheKeyString(); + + /* Check if this sprite location combination is already baked or not */ + if (FossilItemBakedModel.cache.containsKey(cacheKey)) { + return FossilItemBakedModel.cache.get(cacheKey); + } + + ImmutableList.Builder quads = ImmutableList.builder(); + List sprites = new ArrayList<>(); + + if (this.baseSprite != null) { + sprites.add(this.baseSprite); + } + sprites.addAll(this.sprites); + + if (!sprites.isEmpty()) { + /* North & South Side */ + generateZQuads(quads); + /* Up & Down-Side */ + generateTopDownQuads(quads); + /* West & East Side */ + generateLeftRightQuads(quads); + } + + ImmutableList returnQuads = quads.build(); + FossilItemBakedModel.cache.put(cacheKey, returnQuads); + + return returnQuads; + } + + private void generateLeftRightQuads(ImmutableList.Builder quads) { + for (int iy = 0; iy <= 15; iy++) { + float yStart = (16 - (iy + 1)) / 16.0f; + float yEnd = (16 - iy) / 16.0f; + + /* Scan from Left to Right, find the pixel not transparent, use that to build West quads */ + boolean isTransparent = true; + for (int ix = 0; ix <= 15; ix++) { + TextureAtlasSprite sprite = FossilItemBakedModel.findLastNotTransparent(ix, iy, sprites); + if (sprite == null) { + isTransparent = true; + continue; + } + if (isTransparent) { + quads.add(this.createQuad( + new Vector3f(ix / 16.0f, yStart, FossilItemBakedModel.NORTH_Z) + , new Vector3f(ix / 16.0f, yStart, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(ix / 16.0f, yEnd, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(ix / 16.0f, yEnd, FossilItemBakedModel.NORTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.WEST)); + + isTransparent = false; + } + } + /* Scan from Right to Left, find the pixel not transparent, use that to build East quads */ + isTransparent = true; + for (int ix = 15; ix >= 0; ix--) { + TextureAtlasSprite sprite = FossilItemBakedModel.findLastNotTransparent(ix, iy, sprites); + if (sprite == null) { + isTransparent = true; + continue; + } + if (isTransparent) { + quads.add(this.createQuad( + new Vector3f((ix + 1) / 16.0f, yStart, FossilItemBakedModel.NORTH_Z) + , new Vector3f((ix + 1) / 16.0f, yEnd, FossilItemBakedModel.NORTH_Z) + , new Vector3f((ix + 1) / 16.0f, yEnd, FossilItemBakedModel.SOUTH_Z) + , new Vector3f((ix + 1) / 16.0f, yStart, FossilItemBakedModel.SOUTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.EAST)); + + isTransparent = false; + } + } + } + } + + private void generateTopDownQuads(ImmutableList.Builder quads) { + for (int ix = 0; ix <= 15; ix++) { + float xStart = ix / 16.0f; + float xEnd = (ix + 1) / 16.0f; + + /* Scan from Up to Bottom, find the pixel not transparent, use that to build Top quads */ + boolean isTransparent = true; + for (int iy = 0; iy <= 15; iy++) { + TextureAtlasSprite sprite = FossilItemBakedModel.findLastNotTransparent(ix, iy, sprites); + if (sprite == null) { + isTransparent = true; + continue; + } + + if (isTransparent) { + quads.add(this.createQuad( + new Vector3f(xStart, (16 - iy) / 16.0f, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xStart, (16 - iy) / 16.0f, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xEnd, (16 - iy) / 16.0f, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xEnd, (16 - iy) / 16.0f, FossilItemBakedModel.NORTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.UP)); + + isTransparent = false; + } + } + + /* Scan from Bottom to Up, find the pixel not transparent, use that to build Down quads */ + isTransparent = true; + for (int iy = 15; iy >= 0; iy--) { + TextureAtlasSprite sprite = FossilItemBakedModel.findLastNotTransparent(ix, iy, sprites); + if (sprite == null) { + isTransparent = true; + continue; + } + + if (isTransparent) { + quads.add(this.createQuad( + new Vector3f(xStart, (16 - (iy + 1)) / 16.0f, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xEnd, (16 - (iy + 1)) / 16.0f, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xEnd, (16 - (iy + 1)) / 16.0f, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xStart, (16 - (iy + 1)) / 16.0f, FossilItemBakedModel.SOUTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.DOWN)); + + isTransparent = false; + } + } + } + } + + private void generateZQuads(ImmutableList.Builder quads) { + for (int ix = 0; ix <= 15; ix++) { + for (int iy = 0; iy <= 15; iy++) { + /* Find the last pixel not transparent in sprites, use that to build North/South quads */ + TextureAtlasSprite sprite = FossilItemBakedModel.findLastNotTransparent(ix, iy, sprites); + if (sprite == null) continue; + + float xStart = ix / 16.0f; + float xEnd = (ix + 1) / 16.0f; + + float yStart = (16 - (iy + 1)) / 16.0f; + float yEnd = (16 - iy) / 16.0f; + + BakedQuad a = this.createQuad( + new Vector3f(xStart, yStart, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xStart, yEnd, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xEnd, yEnd, FossilItemBakedModel.NORTH_Z) + , new Vector3f(xEnd, yStart, FossilItemBakedModel.NORTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.NORTH); + + BakedQuad b = this.createQuad( + new Vector3f(xStart, yStart, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xEnd, yStart, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xEnd, yEnd, FossilItemBakedModel.SOUTH_Z) + , new Vector3f(xStart, yEnd, FossilItemBakedModel.SOUTH_Z) + , ix, ix + 1, iy, iy + 1 + , sprite, Direction.SOUTH); + + if (a != null) { + quads.add(a); + } + if (b != null) { + quads.add(b); + } + } + } + } + + /* Give four corner, generate a quad */ + private BakedQuad createQuad(Vector3f v1, Vector3f v2, Vector3f v3, Vector3f v4 + , int xStart, int xEnd, int yStart, int yEnd, TextureAtlasSprite sprite + , Direction orientation) { + + TransformingBakedQuadGenerator consumer = new TransformingBakedQuadGenerator(sprite, transform); + + FossilItemBakedModel.putVertex(consumer, v1, xStart, yEnd, sprite, orientation); + FossilItemBakedModel.putVertex(consumer, v2, xStart, yStart, sprite, orientation); + FossilItemBakedModel.putVertex(consumer, v3, xEnd, yStart, sprite, orientation); + FossilItemBakedModel.putVertex(consumer, v4, xEnd, yEnd, sprite, orientation); + + List quads = consumer.poll(); + // we are only putting 4 vertices, so we don't need to worry about there being more quads but in case something goes horribly wrong, we throw + if (quads.size() != 1) { + throw new IllegalStateException("Model should not have put more than four vertices! Something is horribly wrong here!"); + } + return quads.get(0); + } + + /* Put data into the consumer */ + private static void putVertex(TransformingBakedQuadGenerator consumer, Vector3f vec, double u, double v, TextureAtlasSprite sprite, Direction orientation) { + float fu = sprite.getU(u); + float fv = sprite.getV(v); + + consumer.vertex(vec.x(), vec.y(), vec.z()) + .normal((float) orientation.getStepX(), (float) orientation.getStepY(), (float) orientation.getStepZ()) + .uv(fu, fv) + .endVertex(); + } + + /* Find the last sprite not transparent in sprites with given position */ + @Nullable + private static TextureAtlasSprite findLastNotTransparent(int x, int y, List sprites){ + for(int spriteIndex = sprites.size() - 1; spriteIndex >= 0; spriteIndex--){ + TextureAtlasSprite sprite = sprites.get(spriteIndex); + if (sprite != null) { + if (!sprite.isTransparent(0, x, y)) { + return sprite; + } + } + } + return null; + } + + /* Give a BakedItemModel base on data in this, can use directly to display */ + public BakedItemModel getNewBakedItemModel(){ + return new BakedItemModel(this.genQuads(), this.particle, transforms, this.overrides, false, this.isSideLit); + } + + public FossilItemBakedModel setSprites(List spritesIn){ + return new FossilItemBakedModel(this, spritesIn); + } + + /* Get a combination string of locations, used in cache's key */ + private String getCacheKeyString(){ + List locations = new ArrayList<>(); + if(this.baseSprite != null) + locations.add(this.baseSprite.getName().toString()); + + for(TextureAtlasSprite sprite : this.sprites) { + if (sprite != null) { + locations.add(sprite.getName().toString()); + } + } + + return String.join(",", locations); + } + + @Override + public void onResourceManagerReload(@Nonnull IResourceManager resourceManager, Predicate resourcePredicate) { + if (resourcePredicate.test(VanillaResourceType.MODELS)) { + cache.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemOverrideList.java b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemOverrideList.java new file mode 100644 index 00000000..8e9a8b17 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/client/model/fossil/FossilItemOverrideList.java @@ -0,0 +1,55 @@ +package net.dumbcode.projectnublar.client.model.fossil; + +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemOverrideList; +import net.minecraft.client.renderer.model.RenderMaterial; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; + +import static net.minecraft.inventory.container.PlayerContainer.BLOCK_ATLAS; + +public class FossilItemOverrideList extends ItemOverrideList { + private final Function spriteGetter; + + public FossilItemOverrideList(Function spriteGetterIn) { + this.spriteGetter = spriteGetterIn; + } + + /* Read NBT data from stack and choose what textures in use and merge them */ + @Override + public IBakedModel resolve(@Nonnull IBakedModel model, ItemStack stack, ClientWorld worldIn, LivingEntity entityIn) { + if (stack.getItem() instanceof FossilItem && model instanceof FossilItemBakedModel) { + AtomicReference finalWandModel = new AtomicReference<>((FossilItemBakedModel) model); + List sprites = new ArrayList<>(); + + TextureAtlasSprite sprite = spriteGetter.apply(getFossil(stack)); + sprites.add(sprite); + finalWandModel.set(finalWandModel.get().setSprites(sprites)); + return finalWandModel.get().getNewBakedItemModel(); + } + return model; + } + + private RenderMaterial getFossil(ItemStack stack) { + Fossil fossil = FossilHandler.FOSSIL_REGISTRY.get().getValue(new ResourceLocation(Objects.requireNonNull(stack.getTagElement(ProjectNublar.MODID)).getString("fossil"))); + assert fossil != null; + double dnaValue = 5; // TODO: get the fossil DNA value? + ResourceLocation location = fossil.getTextureForDNAValue(dnaValue); + ResourceLocation resourceLocation = new ResourceLocation(location.getNamespace(), "block/fossil/" + location.getPath() + "item/" + fossil.textureName.replace(" ", "_").toLowerCase()); + return new RenderMaterial(BLOCK_ATLAS, resourceLocation); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/client/render/model/ProjectNublarModelHandler.java b/src/main/java/net/dumbcode/projectnublar/client/render/model/ProjectNublarModelHandler.java index 131d8eec..6219e1d1 100644 --- a/src/main/java/net/dumbcode/projectnublar/client/render/model/ProjectNublarModelHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/client/render/model/ProjectNublarModelHandler.java @@ -1,17 +1,23 @@ package net.dumbcode.projectnublar.client.render.model; import net.dumbcode.dumblibrary.client.component.ComponentRenderer; +import net.dumbcode.projectnublar.client.model.fossil.FossilBakedModel; +import net.dumbcode.projectnublar.client.model.fossil.FossilBlockItemBakedModel; +import net.dumbcode.projectnublar.client.model.fossil.FossilItemBakedModel; import net.dumbcode.projectnublar.client.render.entity.DinosaurEggRenderer; import net.dumbcode.projectnublar.client.render.entity.EntityPartRenderer; import net.dumbcode.projectnublar.client.render.entity.GyrosphereRenderer; import net.dumbcode.projectnublar.server.ProjectNublar; import net.dumbcode.projectnublar.server.block.BlockHandler; -import net.dumbcode.projectnublar.server.dinosaur.eggs.EnumDinosaurEggTypes; import net.dumbcode.projectnublar.server.entity.EntityHandler; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.item.ItemHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.BlockModelShapes; import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.util.ResourceLocation; @@ -24,6 +30,7 @@ import net.minecraftforge.fml.common.Mod; import java.util.Map; +import java.util.Objects; @Mod.EventBusSubscriber(value = Dist.CLIENT, modid = ProjectNublar.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ProjectNublarModelHandler { @@ -34,12 +41,34 @@ public class ProjectNublarModelHandler { private static final ResourceLocation ELECTRIC_FENCE_WARNING_LOCATION = new ResourceLocation(ProjectNublar.MODID, "block/voltage_warning"); private static TextureAtlasSprite electricFenceWarning; + private static final ResourceLocation FOSSIL_CRACK_LOW = new ResourceLocation(ProjectNublar.MODID, "block/cracks_low"); + public static TextureAtlasSprite fossilCrackLow; + + private static final ResourceLocation FOSSIL_CRACK_MEDIUM = new ResourceLocation(ProjectNublar.MODID, "block/cracks_medium"); + public static TextureAtlasSprite fossilCrackMedium; + + private static final ResourceLocation FOSSIL_CRACK_FULL = new ResourceLocation(ProjectNublar.MODID, "block/cracks_full"); + public static TextureAtlasSprite fossilCrackFull; + @SubscribeEvent public static void onTextureStitch(TextureStitchEvent.Pre event) { if(PlayerContainer.BLOCK_ATLAS.equals(event.getMap().location())) { event.addSprite(ELECTRIC_FENCE_LOCATION); event.addSprite(ELECTRIC_FENCE_WARNING_LOCATION); + + for (Fossil fossil : FossilHandler.FOSSIL_REGISTRY.get()) { + for (ResourceLocation texture : fossil.allTextures()) { + if (texture != null) { + event.addSprite(new ResourceLocation(texture.getNamespace(), "block/fossil/" + texture.getPath() + "item/" + fossil.textureName)); + event.addSprite(new ResourceLocation(texture.getNamespace(), "block/fossil/" + texture.getPath() + "overlay/" + fossil.textureName)); + } + } + } + + event.addSprite(FOSSIL_CRACK_LOW); + event.addSprite(FOSSIL_CRACK_MEDIUM); + event.addSprite(FOSSIL_CRACK_FULL); } } @@ -48,6 +77,10 @@ public static void onTextureStitched(TextureStitchEvent.Post event) { if(PlayerContainer.BLOCK_ATLAS.equals(event.getMap().location())) { electricFence = event.getMap().getSprite(ELECTRIC_FENCE_LOCATION); electricFenceWarning = event.getMap().getSprite(ELECTRIC_FENCE_WARNING_LOCATION); + + fossilCrackLow = event.getMap().getSprite(FOSSIL_CRACK_LOW); + fossilCrackMedium = event.getMap().getSprite(FOSSIL_CRACK_MEDIUM); + fossilCrackFull = event.getMap().getSprite(FOSSIL_CRACK_FULL); } } @@ -81,6 +114,22 @@ public static void onModelBake(ModelBakeEvent event) { registry.computeIfPresent(BlockModelShapes.stateToModelLocation(state), (rl, model) -> new FencePoleBakedModel(electricFence, model)); } } + + //TODO: convert this to a custom model wrapper. + registry.put( + BlockModelShapes.stateToModelLocation(BlockHandler.FOSSIL_BLOCK.get().defaultBlockState()), + new FossilBakedModel() + ); + + registry.put( + new ModelResourceLocation(BlockHandler.FOSSIL_BLOCK.get().getRegistryName(), "inventory"), + new FossilBlockItemBakedModel() + ); + + registry.put( + new ModelResourceLocation(Objects.requireNonNull(ItemHandler.FOSSIL_ITEM.get().getRegistryName()), "inventory"), + new FossilItemBakedModel(resourceLocation -> event.getModelLoader().getModel(resourceLocation)) + ); } } diff --git a/src/main/java/net/dumbcode/projectnublar/mixin/BlockLootTablesInvoker.java b/src/main/java/net/dumbcode/projectnublar/mixin/BlockLootTablesInvoker.java new file mode 100644 index 00000000..0c6a72b5 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/mixin/BlockLootTablesInvoker.java @@ -0,0 +1,18 @@ +package net.dumbcode.projectnublar.mixin; + +import net.minecraft.block.Block; +import net.minecraft.data.BlockModelProvider; +import net.minecraft.data.IFinishedBlockState; +import net.minecraft.data.loot.BlockLootTables; +import net.minecraft.loot.LootTable; +import net.minecraft.util.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockLootTables.class) +public class BlockLootTablesInvoker { + @Invoker("createSlabItemTable") + public static LootTable.Builder createSlabItemTable(Block block) { + throw new AssertionError(); + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/mixin/BlockModelProviderInvoker.java b/src/main/java/net/dumbcode/projectnublar/mixin/BlockModelProviderInvoker.java new file mode 100644 index 00000000..62909026 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/mixin/BlockModelProviderInvoker.java @@ -0,0 +1,31 @@ +package net.dumbcode.projectnublar.mixin; + +import net.minecraft.block.Block; +import net.minecraft.data.BlockModelProvider; +import net.minecraft.data.IFinishedBlockState; +import net.minecraft.util.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockModelProvider.class) +public class BlockModelProviderInvoker { + @Invoker("createFence") + public static IFinishedBlockState createFence(Block block, ResourceLocation resourceLocation, ResourceLocation resourceLocation1) { + throw new AssertionError(); + } + + @Invoker("createFenceGate") + public static IFinishedBlockState createFenceGate(Block block, ResourceLocation resourceLocation, ResourceLocation resourceLocation1, ResourceLocation resourceLocation2, ResourceLocation resourceLocation3) { + throw new AssertionError(); + } + + @Invoker("createStairs") + public static IFinishedBlockState createStairs(Block block, ResourceLocation resourceLocation, ResourceLocation resourceLocation1, ResourceLocation resourceLocation2) { + throw new AssertionError(); + } + + @Invoker("createWall") + public static IFinishedBlockState createWall(Block block, ResourceLocation resourceLocation, ResourceLocation resourceLocation1, ResourceLocation resourceLocation2) { + throw new AssertionError(); + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/mixin/PlayerInventoryMixin.java b/src/main/java/net/dumbcode/projectnublar/mixin/PlayerInventoryMixin.java new file mode 100644 index 00000000..1bee3876 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/mixin/PlayerInventoryMixin.java @@ -0,0 +1,18 @@ +package net.dumbcode.projectnublar.mixin; + +import net.dumbcode.projectnublar.server.utils.PickupUtil; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PlayerInventory.class) +public class PlayerInventoryMixin { + + @Inject(method = "add(Lnet/minecraft/item/ItemStack;)Z", at = @At("HEAD"), cancellable = true) + private void interceptItems(ItemStack stack, CallbackInfoReturnable cir) { + if (PickupUtil.interceptItem((PlayerInventory) (Object) this, stack)) cir.setReturnValue(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/mixin/SimpleBakedModelAccessor.java b/src/main/java/net/dumbcode/projectnublar/mixin/SimpleBakedModelAccessor.java new file mode 100644 index 00000000..43502f1a --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/mixin/SimpleBakedModelAccessor.java @@ -0,0 +1,19 @@ +package net.dumbcode.projectnublar.mixin; + +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.SimpleBakedModel; +import net.minecraft.util.Direction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Map; + +@Mixin(SimpleBakedModel.class) +public interface SimpleBakedModelAccessor { + @Accessor + List getUnculledFaces(); + + @Accessor + Map> getCulledFaces(); +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/ProjectNublar.java b/src/main/java/net/dumbcode/projectnublar/server/ProjectNublar.java index 75f212c0..ba9c96f6 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/ProjectNublar.java +++ b/src/main/java/net/dumbcode/projectnublar/server/ProjectNublar.java @@ -2,7 +2,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.mojang.brigadier.arguments.ArgumentType; import net.dumbcode.dumblibrary.client.YRotatedModel; import net.dumbcode.dumblibrary.server.animation.AnimationContainer; import net.dumbcode.dumblibrary.server.ecs.component.impl.AgeStage; @@ -25,6 +24,7 @@ import net.dumbcode.projectnublar.server.command.DinosaurArgument; import net.dumbcode.projectnublar.server.containers.ProjectNublarContainers; import net.dumbcode.projectnublar.server.data.ProjectNublarBlockTagsProvider; +import net.dumbcode.projectnublar.server.data.ProjectNublarFossilOreModelProvider; import net.dumbcode.projectnublar.server.data.ProjectNublarRecipeProvider; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.dinosaur.DinosaurHandler; @@ -35,6 +35,8 @@ import net.dumbcode.projectnublar.server.entity.DataSerializerHandler; import net.dumbcode.projectnublar.server.entity.EntityHandler; import net.dumbcode.projectnublar.server.entity.system.impl.*; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; import net.dumbcode.projectnublar.server.item.EmptySyringeItemHandler; import net.dumbcode.projectnublar.server.item.ItemHandler; import net.dumbcode.projectnublar.server.network.*; @@ -47,7 +49,6 @@ import net.dumbcode.projectnublar.server.tablet.backgrounds.TabletBackground; import net.dumbcode.projectnublar.server.utils.JsonHandlers; import net.minecraft.block.Block; -import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.command.arguments.ArgumentSerializer; import net.minecraft.command.arguments.ArgumentTypes; @@ -87,8 +88,6 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; @@ -102,7 +101,7 @@ public class ProjectNublar { public static final boolean DEBUG = false; - private static Logger logger = LogManager.getLogger(MODID); + public static final Logger LOGGER = LogManager.getLogger(MODID); private static final String PROTOCOL_VERSION = "1"; @@ -132,6 +131,8 @@ public ProjectNublar() { SoundHandler.REGISTER.register(bus); GeneticHandler.REGISTER.register(bus); DinosaurHandler.REGISTER.register(bus); + FossilHandler.DR.register(bus); + StoneTypeHandler.DR.register(bus); PlantHandler.REGISTER.register(bus); ProjectNublarRecipesSerializers.REGISTER.register(bus); ComponentHandler.REGISTER.register(bus); @@ -166,8 +167,6 @@ public void clientSetup() { forgeBus.addListener(this::registerCommands); BlockEntityIncubatorRenderer.markResolvers(); - - } public void registerCommands(RegisterCommandsEvent event) { @@ -181,6 +180,7 @@ public void gatherData(GatherDataEvent event) { if (event.includeServer()) { gen.addProvider(new ProjectNublarBlockTagsProvider(gen, helper)); gen.addProvider(new ProjectNublarRecipeProvider(gen)); + gen.addProvider(new ProjectNublarFossilOreModelProvider(gen, helper)); } } @@ -190,7 +190,6 @@ public void clientPreInit(FMLClientSetupEvent event) { IResourceManager manager = Minecraft.getInstance().getResourceManager(); ((SimpleReloadableResourceManager)manager).add(new DinoItemResourcePack()); - ProjectNublarBlockRenderLayers.setRenderLayers(); IReloadableResourceManager resourceManager = (IReloadableResourceManager) event.getMinecraftSupplier().get().getResourceManager(); resourceManager.registerReloadListener(create(BlockEntityEggPrinterRenderer::onResourceManagerReload, VanillaResourceType.MODELS)); @@ -279,7 +278,7 @@ public void preInit(FMLCommonSetupEvent event) { try (FileWriter writer = new FileWriter(jsonFile)) { gson.toJson(dino, writer); } catch (IOException e) { - logger.warn("There was an issue writing to {}", jsonFile.getName()); + LOGGER.warn("There was an issue writing to {}", jsonFile.getName()); } }); } @@ -298,11 +297,6 @@ public static void register(RegisterSystemsEvent event) { event.registerSystem(new HuntSystem()); } - public static Logger getLogger() { - return logger; - } - - private static void registerJsonDinosaurs() { GsonBuilder builder = new GsonBuilder(); JsonHandlers.registerAllHandlers(builder); diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/BlockHandler.java b/src/main/java/net/dumbcode/projectnublar/server/block/BlockHandler.java index fa1c9403..e8e3fd62 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/BlockHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/BlockHandler.java @@ -6,6 +6,7 @@ import net.dumbcode.projectnublar.server.block.entity.*; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.dinosaur.DinosaurHandler; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilBlock; import net.dumbcode.projectnublar.server.item.ItemHandler; import net.dumbcode.projectnublar.server.item.MachineModuleBuildPart; import net.dumbcode.projectnublar.server.item.MachineModuleParts; @@ -45,6 +46,8 @@ public class BlockHandler { public static final RegistryObject EGG_PRINTER = REGISTER.register("egg_printer", () -> new DyableMachineModuleBlock(EggPrinterBlockEntity::new, 1, MachineModuleParts.EGG_PRINTER, of(Material.HEAVY_METAL))); public static final RegistryObject INCUBATOR = REGISTER.register("incubator", () -> new MachineModuleBlock(IncubatorBlockEntity::new, 1, MachineModuleParts.INCUBATOR, of(Material.HEAVY_METAL))); public static final RegistryObject COAL_GENERATOR = REGISTER.register("coal_generator", () -> new MachineModuleBlock(CoalGeneratorBlockEntity::new, 1, MachineModuleParts.COAL_GENERATOR, of(Material.HEAVY_METAL))); + public static final RegistryObject FOSSIL_BLOCK = REGISTER.register("fossil_block", () -> new FossilBlock(of(Material.STONE))); + public static final RegistryObject UNBUILT_FOSSIL_PROCESSOR = REGISTER.register("unbuilt_fossil_processor", () -> new UnbuiltMachineModuleBlock(FOSSIL_PROCESSOR, of(Material.HEAVY_METAL), create("body", ItemHandler.FOSSIL_PROCESSOR_BODY), @@ -74,12 +77,6 @@ public class BlockHandler { public static final RegistryObject UNNAMED_SCIENTIST_BLOCK = REGISTER.register("unnamed_scientist_block", () -> new Block(of(Material.METAL))); public static final RegistryObject UNNAMED_PALEONTOLOGIST_BLOCK = REGISTER.register("unnamed_paleontologist_block", () -> new Block(of(Material.METAL))); - public static final Map> FOSSIL = REGISTER.beforeRegister(new HashMap<>(), map -> { - for(FossilBlock.FossilType value : FossilBlock.FossilType.values()) { - map.put(value, createMap("%s_fossil_" + value.getName(), dinosaur -> new FossilBlock(dinosaur, value, copy(value.getCopy())))); - } - }); - private static RegistryMap createMap(String nameFormat, Function supplier) { RegistryMap map = new RegistryMap<>(); for (Dinosaur dinosaur : DinosaurHandler.getRegistry()) { diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/FossilBlock.java b/src/main/java/net/dumbcode/projectnublar/server/block/FossilBlock.java deleted file mode 100644 index c6672b16..00000000 --- a/src/main/java/net/dumbcode/projectnublar/server/block/FossilBlock.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.dumbcode.projectnublar.server.block; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import net.dumbcode.projectnublar.server.data.ProjectNublarBlockTags; -import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.material.Material; -import net.minecraft.block.material.MaterialColor; - -//TODO: move to a simple classs -public class FossilBlock extends Block implements IItemBlock { - - @Getter private final Dinosaur dinosaur; - - @Getter private final FossilType fossilType; - - public FossilBlock(Dinosaur dinosaur, FossilType fossilType, Properties properties) { - super(properties); - this.dinosaur = dinosaur; - this.fossilType = fossilType; - } - - @Getter - @RequiredArgsConstructor - public enum FossilType { - STONE("stone", Blocks.STONE), - SANDSTONE("sandstone", Blocks.SANDSTONE), - CLAY("clay", Blocks.CLAY); - - private final String name; - private final Block copy; - - public static BlockState guess(BlockState state, Dinosaur dino) { - if(state.is(ProjectNublarBlockTags.FOSSIL_CLAY_REPLACEMENT)) { - return BlockHandler.FOSSIL.get(CLAY).get(dino).defaultBlockState(); - } - if(state.is(ProjectNublarBlockTags.FOSSIL_SANDSTONE_REPLACEMENT)) { - return BlockHandler.FOSSIL.get(SANDSTONE).get(dino).defaultBlockState(); - } - return BlockHandler.FOSSIL.get(STONE).get(dino).defaultBlockState(); - } - } - - -} diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/SkeletalBuilderBlock.java b/src/main/java/net/dumbcode/projectnublar/server/block/SkeletalBuilderBlock.java index d5df5fe2..0fbc4583 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/SkeletalBuilderBlock.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/SkeletalBuilderBlock.java @@ -5,7 +5,7 @@ import net.dumbcode.projectnublar.server.block.entity.SkeletalBuilderBlockEntity; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.entity.ComponentHandler; -import net.dumbcode.projectnublar.server.item.FossilItem; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -51,12 +51,11 @@ public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerE if(tileEntity instanceof SkeletalBuilderBlockEntity) { SkeletalBuilderBlockEntity sb = (SkeletalBuilderBlockEntity) tileEntity; if(stack.getItem() instanceof FossilItem) { - FossilItem item = (FossilItem)stack.getItem(); - Dinosaur dinosaur = item.getDinosaur(); + Dinosaur dinosaur = FossilItem.getFossil(stack).dinosaur.get(); if(!sb.getDinosaur().isPresent()) { sb.setDinosaur(dinosaur); } - this.setBonesInHandler(sb, dinosaur, stack, item.getVariant()); + this.setBonesInHandler(sb, dinosaur, stack, FossilItem.getFossil(stack).name); return ActionResultType.SUCCESS; } else if(stack.isEmpty()) { if (sb.getDinosaur().isPresent()) { diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/entity/FossilBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/server/block/entity/FossilBlockEntity.java new file mode 100644 index 00000000..abbac639 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/block/entity/FossilBlockEntity.java @@ -0,0 +1,153 @@ +package net.dumbcode.projectnublar.server.block.entity; + +import com.google.common.collect.Range; +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.base.FossilTier; +import net.dumbcode.projectnublar.server.fossil.base.FossilType; +import net.dumbcode.projectnublar.server.fossil.base.StoneType; +import net.dumbcode.projectnublar.server.item.ItemHandler; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; + +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class FossilBlockEntity extends TileEntity { + + public static final ModelProperty STONE_TYPE = new ModelProperty<>(); + + public static final ModelProperty FOSSIL = new ModelProperty<>(); + public static final ModelProperty TIER = new ModelProperty<>(); + public static final ModelProperty TYPE = new ModelProperty<>(); + public static final ModelProperty CRACKS_TEX = new ModelProperty<>(); + + private StoneType stoneType; + + private Fossil fossil; + private FossilTier tier; + private FossilType type; + + public FossilBlockEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + public FossilBlockEntity() { + this(ProjectNublarBlockEntities.FOSSIL.get()); + this.stoneType = StoneTypeHandler.GRANITE.get(); + this.fossil = FossilHandler.AMMONITE.get(); + this.tier = FossilTier.randomTier(); + this.type = FossilType.randomType(); + } + + @Override + public void load(@Nonnull BlockState state, CompoundNBT nbt) { + this.stoneType = StoneTypeHandler.STONE_TYPE_REGISTRY.get().getValue(new ResourceLocation(nbt.getString("stone_type"))); + this.fossil = FossilHandler.FOSSIL_REGISTRY.get().getValue(new ResourceLocation(nbt.getString("fossil"))); + this.tier = FossilTier.valueOf(nbt.getString("tier").toUpperCase()); + this.type = FossilType.valueOf(nbt.getString("type").toUpperCase()); + super.load(state, nbt); + } + + @Nonnull + @Override + public CompoundNBT save(CompoundNBT nbt) { + nbt.putString("stone_type", this.stoneType.getRegistryName().toString()); + nbt.putString("fossil", this.fossil.getRegistryName().toString()); + nbt.putString("tier", this.tier.name().toLowerCase()); + nbt.putString("type", this.type.name().toLowerCase()); + return super.save(nbt); + } + + @Override + public CompoundNBT getUpdateTag() { + return this.save(new CompoundNBT()); + } + + public Fossil getFossil() { + return fossil; + } + + public void setFossil(Fossil fossil) { + this.fossil = fossil; + this.requestModelDataUpdate(); + } + + public StoneType getStoneType() { + return stoneType; + } + + public void setStoneType(StoneType stoneType) { + this.stoneType = stoneType; + this.requestModelDataUpdate(); + } + + public FossilTier getTier() { + return tier; + } + + public void setTier(FossilTier tier) { + this.tier = tier; + this.requestModelDataUpdate(); + } + + + public FossilType getFossilType() { + return type; + } + + public void setType(FossilType type) { + this.type = type; + this.requestModelDataUpdate(); + } + + @Nonnull + @Override + public IModelData getModelData() { + if(this.remove) { + return super.getModelData(); + } + ModelDataMap.Builder builder = new ModelDataMap.Builder() + .withInitial(FOSSIL, this.fossil) + .withInitial(STONE_TYPE, this.stoneType) + .withInitial(TIER, this.tier) + .withInitial(TYPE, this.type); + +// .withInitial(CRACKS_TEX, ((FossilBlock)this.getBlockState().getBlock()).fossil.crackTexture.toString()); + return builder.build(); + } + + public List drops() { + int amountOfItemToDrop = chooseValueWithinRange(tier.getAmountOfFossilsToDrop()); + + ItemStack stack = new ItemStack(ItemHandler.FOSSIL_ITEM.get(), amountOfItemToDrop); + CompoundNBT nbt = new CompoundNBT(); + nbt.putString("fossil", fossil.getRegistryName().toString()); + nbt.putFloat("tierDNAMultiplier", tier.getDNAGatherChance()); + nbt.putFloat("typeDNAMultiplier", type.getDNAMultiplier()); +//TODO: nbt.putFloat("stoneTypeDNAMultiplier", stoneType.getDNAMultiplier()); +//TODO: nbt.putFloat("fossilDNAMultiplier", fossil.getDNAMultiplier()); + stack.addTagElement(ProjectNublar.MODID, nbt); + + return Collections.singletonList(stack); + } + + private int chooseValueWithinRange(Range amountOfFossilsToDrop) { + int lowerBound = amountOfFossilsToDrop.lowerEndpoint(); + int upperBound = amountOfFossilsToDrop.upperEndpoint(); + + return ThreadLocalRandom.current().nextInt(lowerBound, upperBound + 1); + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/entity/IncubatorBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/server/block/entity/IncubatorBlockEntity.java index bf29b9f2..3e20078e 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/entity/IncubatorBlockEntity.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/entity/IncubatorBlockEntity.java @@ -143,7 +143,7 @@ public void placeEgg(int x, int y, ItemStack stack) { } while(armPos.distanceTo(position.add(normal.scale(handLength))) > 1.1 && times++ < 5000); if(times >= 5000) { - ProjectNublar.getLogger().warn("Invalid placement position for egg. Contact DumbCode and tell them to adjust the distance limit."); + ProjectNublar.LOGGER.warn("Invalid placement position for egg. Contact DumbCode and tell them to adjust the distance limit."); return; } for (int i = 0; i < this.eggList.length; i++) { diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/entity/MachineModuleBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/server/block/entity/MachineModuleBlockEntity.java index 5d9cb726..9247aec6 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/entity/MachineModuleBlockEntity.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/entity/MachineModuleBlockEntity.java @@ -49,7 +49,6 @@ import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fml.network.NetworkHooks; -import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import org.apache.commons.lang3.ArrayUtils; @@ -198,7 +197,7 @@ public void tick() { recipe.onRecipeStarted(asB(), process); } } else { - ProjectNublar.getLogger().error("Unable to find recipe " + process.getCurrentRecipe() + " as it does not exist."); + ProjectNublar.LOGGER.error("Unable to find recipe " + process.getCurrentRecipe() + " as it does not exist."); } } else { energy.extractRaw(process.getCurrentConsumptionPerTick()); // consume energy for process diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/entity/ProjectNublarBlockEntities.java b/src/main/java/net/dumbcode/projectnublar/server/block/entity/ProjectNublarBlockEntities.java index 84ad8108..32c38ac6 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/entity/ProjectNublarBlockEntities.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/entity/ProjectNublarBlockEntities.java @@ -39,8 +39,9 @@ public class ProjectNublarBlockEntities { public static final RegistryObject> ELECTRIC_FENCE = REGISTER.register("electric_fence", () -> TileEntityType.Builder.of(BlockEntityElectricFence::new, BlockHandler.ELECTRIC_FENCE.get()).build(new EmptyPart())); + + public static RegistryObject> FOSSIL = REGISTER.register("fossil", () -> TileEntityType.Builder.of(FossilBlockEntity::new, BlockHandler.FOSSIL_BLOCK.get()).build(new EmptyPart()));; public static final RegistryObject> ELECTRIC_FENCE_POLE = REGISTER.register("electric_fence_pole", () -> TileEntityType.Builder.of(BlockEntityElectricFencePole::new, BlockHandler.HIGH_SECURITY_ELECTRIC_FENCE_POLE.get(), BlockHandler.LOW_SECURITY_ELECTRIC_FENCE_POLE.get()).build(new EmptyPart())); - } diff --git a/src/main/java/net/dumbcode/projectnublar/server/block/entity/SequencingSynthesizerBlockEntity.java b/src/main/java/net/dumbcode/projectnublar/server/block/entity/SequencingSynthesizerBlockEntity.java index 3a85f526..6baaa262 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/block/entity/SequencingSynthesizerBlockEntity.java +++ b/src/main/java/net/dumbcode/projectnublar/server/block/entity/SequencingSynthesizerBlockEntity.java @@ -592,7 +592,7 @@ public int getSlots() { } DriveUtils.DriveEntry entry = collected.get(this.selectedDNAs[i].key); if(entry == null) { - ProjectNublar.getLogger().warn("Illegal Drive Entry. Tried to get {} in list of {}", this.selectedDNAs[i].key, collected.keySet()); + ProjectNublar.LOGGER.warn("Illegal Drive Entry. Tried to get {} in list of {}", this.selectedDNAs[i].key, collected.keySet()); continue; } if(entry.getDriveType() == DriveUtils.DriveType.OTHER) { diff --git a/src/main/java/net/dumbcode/projectnublar/server/containers/ProjectNublarContainers.java b/src/main/java/net/dumbcode/projectnublar/server/containers/ProjectNublarContainers.java index 34368068..566deefc 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/containers/ProjectNublarContainers.java +++ b/src/main/java/net/dumbcode/projectnublar/server/containers/ProjectNublarContainers.java @@ -8,10 +8,13 @@ import net.dumbcode.projectnublar.server.block.entity.MachineModuleBlockEntity; import net.dumbcode.projectnublar.server.block.entity.TrackingBeaconBlockEntity; import net.dumbcode.projectnublar.server.containers.machines.MachineModuleContainer; +import net.dumbcode.projectnublar.server.containers.pouch.FossilPouchMenu; +import net.dumbcode.projectnublar.server.containers.pouch.FossilPouchScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScreenManager; import net.minecraft.client.gui.screen.IngameMenuScreen; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.container.Container; @@ -21,6 +24,7 @@ import net.minecraft.util.text.ITextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.extensions.IForgeContainerType; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.network.IContainerFactory; import net.minecraftforge.registries.DeferredRegister; @@ -48,6 +52,9 @@ public class ProjectNublarContainers { }) ); + + public static final RegistryObject> SACK_MENU = registerMenuType(FossilPouchMenu::new, "sack_menu"); + public static final RegistryObject> TRACKING_BEACON = REGISTER.register("tracking_beacon", create((windowId, inv, data) -> { BlockPos blockPos = data.readBlockPos(); TileEntity entity = inv.player.level.getBlockEntity(blockPos); @@ -77,6 +84,7 @@ public static void registerScreens() { } return be.createScreen(container, inventory, title, bar, container.getTab()); }); + ScreenManager.register(ProjectNublarContainers.SACK_MENU.get(), FossilPouchScreen::new); ScreenManager.register(TRACKING_BEACON.get(), (container, inventory, title) -> new GuiTrackingBeacon(container)); } @@ -87,4 +95,8 @@ public static Optional getFromMenu(Class expected, @ } return Optional.empty(); } + + private static RegistryObject> registerMenuType(IContainerFactory factory, String name) { + return REGISTER.register(name, () -> IForgeContainerType.create(factory)); + } } diff --git a/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchInventory.java b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchInventory.java new file mode 100644 index 00000000..80209d4e --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchInventory.java @@ -0,0 +1,96 @@ +package net.dumbcode.projectnublar.server.containers.pouch; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.NonNullList; + +public class FossilPouchInventory extends Inventory /*SimpleContainer*/ { + protected final ItemStack itemStack; + protected final int SIZE; + + protected final int stackLimit; + public FossilPouchInventory(ItemStack stack, int SIZE, int stackLimit) { + super(getStacks(stack, SIZE).toArray(new ItemStack[SIZE])); + itemStack = stack; + this.SIZE = SIZE; + this.stackLimit = stackLimit; + } + + public ItemStack getHolderStack() { + return itemStack; + } + + public static String getNBTTag() { + return "Inventory"; + } + + public static NonNullList getStacks(ItemStack usedStack, int SIZE) { + CompoundNBT compoundTag = usedStack.getTagElement(getNBTTag()); + NonNullList itemStacks = NonNullList.withSize(SIZE, ItemStack.EMPTY); + if (compoundTag != null && compoundTag.contains("Items", 9)) { + loadAllItems(compoundTag, itemStacks); + } + return itemStacks; + } + + public static void loadAllItems(CompoundNBT pTag, NonNullList pList) { + ListNBT listtag = pTag.getList("Items", 10); + + for(int i = 0; i < listtag.size(); ++i) { + CompoundNBT compoundtag = listtag.getCompound(i); + int j = compoundtag.getByte("Slot") & 255; + if (j >= 0 && j < pList.size()) { + pList.set(j, ItemStack.of(compoundtag)); + } + } + + } + + @Override + public void setChanged() { + super.setChanged(); + CompoundNBT itemTag = itemStack.getTagElement(getNBTTag()); + if (itemTag == null) + itemTag = itemStack.getOrCreateTagElement(getNBTTag()); + + if (isEmpty()) { + if (itemTag.contains("Items")) itemTag.remove("Items"); + } else { + NonNullList itemStacks = NonNullList.withSize(SIZE, ItemStack.EMPTY); + for (int i = 0; i < getContainerSize(); i++) { + itemStacks.set(i, getItem(i)); + } + // containerHelper in new versions + ItemStackHelper.saveAllItems(itemTag, itemStacks); + } + + if (shouldDeleteNBT(itemTag)) { + itemStack.removeTagKey(getNBTTag()); + } + } + + public boolean shouldDeleteNBT(CompoundNBT blockEntityTag) { + if (!blockEntityTag.contains("Items")) + return blockEntityTag.getAllKeys().isEmpty(); + return isEmpty(); + } + + @Override + public int getMaxStackSize() { + return stackLimit; + } + + @Override + public void stopOpen(PlayerEntity playerEntity) { + if (itemStack.getCount() > 1) { + int count = itemStack.getCount(); + itemStack.setCount(1); + playerEntity.addItem(new ItemStack(itemStack.getItem(), count - 1)); + } + setChanged(); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchMenu.java b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchMenu.java new file mode 100644 index 00000000..bddcd895 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchMenu.java @@ -0,0 +1,209 @@ +package net.dumbcode.projectnublar.server.containers.pouch; + +import lombok.Getter; +import net.dumbcode.projectnublar.server.containers.ProjectNublarContainers; +import net.dumbcode.projectnublar.server.containers.pouch.slot.PouchSlot; +import net.dumbcode.projectnublar.server.item.FossilPouchItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.ClickType; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.NonNullList; + +import java.util.UUID; + +public class FossilPouchMenu extends Container { + + private final FossilPouchInventory inv; + @Getter + private final int width; + public final NonNullList playerInvSlots = NonNullList.create(); + @Getter + private final int height; + private final UUID uuid; + + //gets called clientside. The real inv does not matter + public FossilPouchMenu(int syncId, PlayerInventory playerInventory, PacketBuffer /*FriendlyByteBuf*/ packetByteBuf) { + this(syncId, playerInventory, packetByteBuf.readInt(), packetByteBuf.readInt(), packetByteBuf.readUUID(), Items.AIR.getDefaultInstance()); + } + + public FossilPouchMenu(int syncId, PlayerInventory playerInv, int width, int height, UUID uuid, ItemStack stack) { + super(ProjectNublarContainers.SACK_MENU.get(), syncId); + this.inv = new FossilPouchInventory(stack, width * height, 64); + this.width = width; + this.height = height; + this.uuid = uuid; + // Backpack inventory + for (int n = 0; n < height; ++n) { + for (int m = 0; m < width; ++m) { + this.addSlot(new PouchSlot(inv, m + n * width, 8 + m * 18, 18 + n * 18, 64), true); + } + } + + // Player inventory + for (int n = 0; n < 3; ++n) { + for (int m = 0; m < 9; ++m) { + this.addSlot(new Slot(playerInv, m + n * 9 + 9, 8 + (width * 18 - 162) / 2 + m * 18, 31 + (height + n) * 18), false); + } + } + + // Player hotbar + for (int n = 0; n < 9; ++n) { + this.addSlot(new Slot(playerInv, n, 8 + (width * 18 - 162) / 2 + n * 18, 89 + height * 18), false); + } + + this.inv.startOpen(playerInv.player); + } + + @Override + public boolean stillValid(PlayerEntity player) { + if (player.level.isClientSide) return true; + + ItemStack stack = inv.getHolderStack(); + boolean uuidMatch = FossilPouchItem.isUUIDMatch(stack, this.uuid); + + return !stack.isEmpty() && stack.getItem() instanceof FossilPouchItem && uuidMatch; + } + + @Override + public ItemStack quickMoveStack(PlayerEntity player, int index) { + ItemStack stack = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + + if (slot != null && slot.hasItem()) { + final ItemStack stack2 = slot.getItem(); + stack = stack2.copy(); + + if (index < this.inv.getContainerSize()) { + if (!this.moveItemStackTo(stack2, this.inv.getContainerSize(), this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(stack2, 0, this.inv.getContainerSize(), false)) { + return ItemStack.EMPTY; + } + + if (stack2.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + + return stack; + } + + @Override + public ItemStack clicked(int slotIndex, int button, ClickType type, PlayerEntity player) { + if (slotIndex >= 0 && player.inventory.selected + 27 + this.inv.getContainerSize() == slotIndex) { + if (type != ClickType.CLONE) { + return ItemStack.EMPTY; + } + } + super.clicked(slotIndex, button, type, player); + return ItemStack.EMPTY; + } + + public void addSlot(Slot slot, boolean isSack) { + if (isSack) { + this.addSlot(slot); + return; + } + playerInvSlots.add(slot); + this.addSlot(slot); + } + + @Override + public void removed(PlayerEntity player) { + super.removed(player); + this.inv.stopOpen(player); + } + + @Override + protected boolean moveItemStackTo(ItemStack stack, int startIndex, int endIndex, boolean reverseDirection) { + boolean flag = false; + int i = startIndex; + if (reverseDirection) { + i = endIndex - 1; + } + + if (stack.isStackable()) { + while(!stack.isEmpty()) { + if (reverseDirection) { + if (i < startIndex) { + break; + } + } else if (i >= endIndex) { + break; + } + + Slot slot = this.slots.get(i); + ItemStack itemstack = slot.getItem(); + if (!itemstack.isEmpty() && ItemStack.tagMatches(stack, itemstack) && ItemStack.matches(stack, itemstack)) { + int j = itemstack.getCount() + stack.getCount(); + int maxSize = stack.getMaxStackSize() == 1 ? 1: slot.getMaxStackSize(); + if (j <= maxSize) { + stack.setCount(0); + itemstack.setCount(j); + slot.setChanged(); + flag = true; + } else if (itemstack.getCount() < maxSize) { + stack.shrink(maxSize - itemstack.getCount()); + itemstack.setCount(maxSize); + slot.setChanged(); + flag = true; + } + } + + if (reverseDirection) { + --i; + } else { + ++i; + } + } + } + + if (!stack.isEmpty()) { + if (reverseDirection) { + i = endIndex - 1; + } else { + i = startIndex; + } + + while(true) { + if (reverseDirection) { + if (i < startIndex) { + break; + } + } else if (i >= endIndex) { + break; + } + + Slot slot1 = this.slots.get(i); + ItemStack itemstack1 = slot1.getItem(); + if (itemstack1.isEmpty() && slot1.mayPlace(stack)) { + if (stack.getCount() > slot1.getMaxStackSize()) { + slot1.set(stack.split(slot1.getMaxStackSize())); + } else { + slot1.set(stack.split(stack.getCount())); + } + + slot1.setChanged(); + flag = true; + break; + } + + if (reverseDirection) { + --i; + } else { + ++i; + } + } + } + + return flag; + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchScreen.java b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchScreen.java new file mode 100644 index 00000000..3b3b02b8 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/FossilPouchScreen.java @@ -0,0 +1,106 @@ +package net.dumbcode.projectnublar.server.containers.pouch; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; + +public class FossilPouchScreen extends ContainerScreen { + + public static final ResourceLocation GENERIC_54 = new ResourceLocation("textures/gui/container/generic_54.png"); + + public FossilPouchScreen(FossilPouchMenu handler, PlayerInventory inventory, ITextComponent title) { + super(handler, inventory, title); + this.imageWidth = handler.getWidth() * 18 + 17; + this.imageHeight = (handler.getHeight() + 4) * 18 + 41; + this.inventoryLabelY = handler.getHeight() * 18 + 20; + } + + @Override + public void renderBg(MatrixStack matrices, float delta, int mouseX, int mouseY) { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getInstance().textureManager.bind(GENERIC_54); + matrices.pushPose(); + matrices.translate(this.leftPos, this.topPos, 0.0D); + + // Background storage texture pseudo-generation // + + // Upper-left corner + blit(matrices, 0, 0, 0, 0, 7, 17); + + // Top + blit(matrices, 7, 0, menu.getWidth() * 18, 17, 7, 0, 1, 17, 256, 256); + + // Upper-right corner + blit(matrices, 7 + menu.getWidth() * 18, 0, 169, 0, 7, 17); + + // Left + blit(matrices, 0, 17, 7, (menu.getHeight() + 4) * 18 + 22, 0, 17, 7, 1, 256, 256); + + // Lower-left corner + blit(matrices, 0, (menu.getHeight() + 4) * 18 + 34, 0, 215, 7, 7); + + // Lower + blit(matrices, 7, (menu.getHeight() + 4) * 18 + 34, menu.getWidth() * 18, 7, 7, 215, 1, 7, 256, 256); + + // Lower-right corner + blit(matrices, (menu.getWidth() * 18 + 7), (menu.getHeight() + 4) * 18 + 34, 169, 215, 7, 7); + + // Right + blit(matrices, (menu.getWidth() * 18 + 7), 17, 7, (menu.getHeight() + 4) * 18 + 17, 169, 17, 7, 1, 256, 256); + + // Background fill + fill(matrices, 7, 17, this.imageWidth - 10, this.imageHeight - 7, 0xFFC6C6C6); + + this.menu.slots.forEach(s -> { + blit(matrices, s.x - 1, s.y - 1, 7, 17, 18, 18); + }); + +// renderInvSlots(matrices); + + matrices.popPose(); + } + + private void renderInvSlots(MatrixStack matrices) { + float amountOfPixelsToScaleSlotsTo = 18; + + if (menu.getHeight() * menu.getWidth() > 54) { + amountOfPixelsToScaleSlotsTo = ((float) 54 / (menu.getWidth() * menu.getHeight())) * 18; + } + + float scale = amountOfPixelsToScaleSlotsTo / 18; + + + float newAmountOfPixelsToScaleTo = 18; + if (menu.getHeight() > 6 || menu.getWidth() > 9) { + if ((menu.getHeight() - 6) > (menu.getWidth() - 9)) { + newAmountOfPixelsToScaleTo = ((float) 6 / menu.getHeight()) * 18; + } + if ((menu.getHeight() - 6) < (menu.getWidth() - 9)) { + newAmountOfPixelsToScaleTo = ((float) 9 / menu.getWidth()) * 18; + } + } + + float newScale = newAmountOfPixelsToScaleTo / 18; + + + + matrices.scale(newScale, newScale, newScale); + + for (int n = 0; n < menu.getHeight(); ++n) { + for (int m = 0; m < menu.getWidth(); ++m) { + blit(matrices, (int) (7 + (m + 1) * Math.floor(newAmountOfPixelsToScaleTo)), (int) (17 + (n + 1) * Math.floor(newAmountOfPixelsToScaleTo)), 7, 17, 18, 18); + } + } + } + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + this.renderBackground(matrices); + super.render(matrices, mouseX, mouseY, delta); + this.renderTooltip(matrices, mouseX, mouseY); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/slot/PouchSlot.java b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/slot/PouchSlot.java new file mode 100644 index 00000000..86d784b2 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/containers/pouch/slot/PouchSlot.java @@ -0,0 +1,24 @@ +package net.dumbcode.projectnublar.server.containers.pouch.slot; + +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; + +public class PouchSlot extends Slot { + private final int stackLimit; + public PouchSlot(IInventory inventory, int index, int x, int y, int stackLimit) { + super(inventory, index, x, y); + this.stackLimit = stackLimit; + } + + @Override + public boolean mayPlace(ItemStack stack) { + return stack.getItem() instanceof FossilItem; + } + + @Override + public int getMaxStackSize(ItemStack stack) { + return stack.getMaxStackSize() == 1 ? 1: stackLimit; + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/data/ProjectNublarFossilOreModelProvider.java b/src/main/java/net/dumbcode/projectnublar/server/data/ProjectNublarFossilOreModelProvider.java new file mode 100644 index 00000000..c3b0d6a1 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/data/ProjectNublarFossilOreModelProvider.java @@ -0,0 +1,25 @@ +package net.dumbcode.projectnublar.server.data; + +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.recipes.crafting.ProjectNublarRecipesSerializers; +import net.minecraft.data.CustomRecipeBuilder; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.data.RecipeProvider; +import net.minecraftforge.client.model.generators.BlockModelProvider; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ModelProvider; +import net.minecraftforge.common.data.ExistingFileHelper; + +import java.util.function.Consumer; + +public class ProjectNublarFossilOreModelProvider extends BlockStateProvider { + public ProjectNublarFossilOreModelProvider(DataGenerator generator, ExistingFileHelper helper) { + super(generator, ProjectNublar.MODID, helper); + } + + @Override + protected void registerStatesAndModels() { + + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/dinosaur/DinosaurHandler.java b/src/main/java/net/dumbcode/projectnublar/server/dinosaur/DinosaurHandler.java index cc16d998..f003001c 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/dinosaur/DinosaurHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/dinosaur/DinosaurHandler.java @@ -21,8 +21,8 @@ public class DinosaurHandler { public static final RegistryObject TYRANNOSAURUS = REGISTER.register("tyrannosaurus", Tyrannosaurus::new); public static final RegistryObject DILOPHOSAURUS = REGISTER.register("dilophosaurus", Dilophosaurus::new); - public static final RegistryObject VELOCIRAPTOR_JP = REGISTER.register("velociraptor_jp", VelociraptorJP::new); - public static final RegistryObject VELOCIRAPTOR_JP3 = REGISTER.register("velociraptor_jp3", VelociraptorJP::new); + public static final RegistryObject VELOCIRAPTOR_JP = REGISTER.register("velociraptor_jp", VelociraptorJP::new); + public static final RegistryObject VELOCIRAPTOR_JP3 = REGISTER.register("velociraptor_jp3", VelociraptorJP::new); public static IForgeRegistry getRegistry() { return DINOSAUR_REGISTRY.get(); diff --git a/src/main/java/net/dumbcode/projectnublar/server/dinosaur/data/DinosaurPeriod.java b/src/main/java/net/dumbcode/projectnublar/server/dinosaur/data/DinosaurPeriod.java index 8f204c95..9e6b0ecf 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/dinosaur/data/DinosaurPeriod.java +++ b/src/main/java/net/dumbcode/projectnublar/server/dinosaur/data/DinosaurPeriod.java @@ -1,9 +1,15 @@ package net.dumbcode.projectnublar.server.dinosaur.data; +import net.dumbcode.projectnublar.server.fossil.base.DinosaurAge; import net.minecraft.util.math.MathHelper; import java.util.Random; + +/** + * For removal soon. Use {@link DinosaurAge Time} instead + */ +@Deprecated public enum DinosaurPeriod { QUATERNARY("quaternary", 2.588F, 0.0F), NEOGENE("neogene", 23.03F, 2.589F), diff --git a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurCompatComponent.java b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurCompatComponent.java index 0871a6be..8b785706 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurCompatComponent.java +++ b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurCompatComponent.java @@ -15,7 +15,7 @@ public void finalizeAdditiveComponent(ComponentAccess entity) { if(entity instanceof ComponentWriteAccess) { for (EntityComponentAttacher.ComponentPair pair : dinosaurComponent.getDinosaur().getAttacher().getDefaultConfig().getTypes()) { if(!entity.matchesAll(pair.getType())) { - ProjectNublar.getLogger().info("Attaching un-found component {}", pair.getType().getIdentifier()); + ProjectNublar.LOGGER.info("Attaching un-found component {}", pair.getType().getIdentifier()); pair.attach((ComponentWriteAccess) entity); } } diff --git a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurComponent.java b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurComponent.java index 613c2b77..77a221f5 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurComponent.java +++ b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurComponent.java @@ -42,7 +42,7 @@ public void deserialize(CompoundNBT compound) { if (DinosaurHandler.getRegistry().containsKey(identifier)) { this.dinosaur = DinosaurHandler.getRegistry().getValue(identifier); } else { - ProjectNublar.getLogger().warn("Parsed invalid dinosaur component '{}'", identifier); + ProjectNublar.LOGGER.warn("Parsed invalid dinosaur component '{}'", identifier); this.dinosaur = DinosaurHandler.TYRANNOSAURUS.get(); } } diff --git a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurDropsComponent.java b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurDropsComponent.java index b3702534..f2784795 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurDropsComponent.java +++ b/src/main/java/net/dumbcode/projectnublar/server/entity/component/impl/DinosaurDropsComponent.java @@ -13,7 +13,6 @@ import net.dumbcode.dumblibrary.server.ecs.component.additionals.ItemDropComponent; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.entity.ComponentHandler; -import net.dumbcode.projectnublar.server.item.ItemHandler; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; @@ -53,9 +52,10 @@ public void deserialize(CompoundNBT compound) { @Override public void collectItems(ComponentAccess access, Consumer itemPlacer) { Dinosaur dino = access.get(ComponentHandler.DINOSAUR).orElseThrow(IllegalArgumentException::new).getDinosaur(); - for (String fossil : this.fossilList) { - itemPlacer.accept(new ItemStack(ItemHandler.FOSSIL_ITEMS.get(dino).get(fossil))); - } +// TODO +// for (String fossil : this.fossilList) { +// itemPlacer.accept(new ItemStack(Fossils.ITEMS.get(fossil))); +// } } @Accessors(chain = true) diff --git a/src/main/java/net/dumbcode/projectnublar/server/entity/tracking/info/PregnancyInformation.java b/src/main/java/net/dumbcode/projectnublar/server/entity/tracking/info/PregnancyInformation.java index 4d95972b..af70da85 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/entity/tracking/info/PregnancyInformation.java +++ b/src/main/java/net/dumbcode/projectnublar/server/entity/tracking/info/PregnancyInformation.java @@ -1,6 +1,6 @@ package net.dumbcode.projectnublar.server.entity.tracking.info; -import io.netty.buffer.ByteBuf; +import lombok.EqualsAndHashCode; import lombok.Value; import net.dumbcode.projectnublar.server.entity.tracking.TooltipInformation; import net.minecraft.client.resources.I18n; @@ -10,12 +10,13 @@ import java.util.*; import java.util.stream.IntStream; +@EqualsAndHashCode(callSuper = true) @Value public class PregnancyInformation extends TooltipInformation { public static final String KEY = "pregnancy_information"; - private int[] ticksTillGiveBirth; + int[] ticksTillGiveBirth; @Override protected String getTypeName() { diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/FossilHandler.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/FossilHandler.java new file mode 100644 index 00000000..deaa3426 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/FossilHandler.java @@ -0,0 +1,82 @@ +package net.dumbcode.projectnublar.server.fossil; + +import com.mojang.datafixers.util.Pair; +import net.dumbcode.dumblibrary.server.registry.PostEarlyDeferredRegister; +import net.dumbcode.dumblibrary.server.registry.RegistryMap; +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; +import net.dumbcode.projectnublar.server.dinosaur.DinosaurHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; +import org.apache.commons.lang3.text.WordUtils; + +import java.util.function.Function; +import java.util.function.Supplier; + +public class FossilHandler { + public static final PostEarlyDeferredRegister DR = PostEarlyDeferredRegister.create(Fossil.class, ProjectNublar.MODID); + + public static final Supplier> FOSSIL_REGISTRY = DR.makeRegistry("fossils", () -> new RegistryBuilder() + .setDefaultKey(new ResourceLocation(ProjectNublar.MODID, "ammonite"))); + + public static RegistryObject AMMONITE = DR.register("ammonite", () -> new Fossil(201, 66, null, "trilobite", "Ammonite", null, null) + .withTexture(1, new ResourceLocation(ProjectNublar.MODID, "fragmented/misc/"))); + public static RegistryObject TRILOBITE = DR.register("trilobite", () -> new Fossil(521, 320, null, "trilobite", "Trilobite", null, null) + .withTexture(1, new ResourceLocation(ProjectNublar.MODID, "fragmented/misc/"))); + public static RegistryObject REX_FOOT = createSimpleFossilWithOneItemTexture("tyrannosaurus_foot", 83.6, 66, "tyrannosaurus_foot", DinosaurHandler.TYRANNOSAURUS, "foot", "misc/"); + public static RegistryObject REX_HAND = createSimpleFossilWithOneItemTexture("tyrannosaurus_hand", 83.6, 66, "tyrannosaurus_hand", DinosaurHandler.TYRANNOSAURUS, "hand", "misc/"); + public static RegistryObject REX_LEG = createSimpleFossilWithOneItemTexture("tyrannosaurus_leg", 83.6, 66, "tyrannosaurus_leg", DinosaurHandler.TYRANNOSAURUS, "leg", "misc/"); + public static RegistryObject REX_NECK = createSimpleFossilWithOneItemTexture("tyrannosaurus_neck_part", 83.6, 66, "tyrannosaurus_neck", DinosaurHandler.TYRANNOSAURUS, "neck", "misc/"); + public static RegistryObject REX_PELVIS = createSimpleFossilWithOneItemTexture("tyrannosaurus_pelvis", 83.6, 66, "tyrannosaurus_pelvis", DinosaurHandler.TYRANNOSAURUS, "pelvis", "misc/"); + public static RegistryObject REX_RIBCAGE = createSimpleFossilWithOneItemTexture("tyrannosaurus_ribcage", 83.6, 66, "tyrannosaurus_ribcage", DinosaurHandler.TYRANNOSAURUS, "ribcage", "misc/"); + public static RegistryObject REX_TAIL = createSimpleFossilWithOneItemTexture("tyrannosaurus_tail", 83.6, 66, "tyrannosaurus_tail", DinosaurHandler.TYRANNOSAURUS, "tail", "misc/"); + + public static RegistryMap FEATHERS = createSimpleFossilMap("feather", 150, 0, "common/", "feather"); + public static RegistryMap FEET = createSimpleFossilMap("feet", 150, 0, "common/", "feet"); + public static RegistryMap TOOTH = createSimpleFossilMap("tooth", 150, 0, "common/", "tooth"); + + private static RegistryObject createSimpleFossil(String name, double timeStart, double timeEnd, String textureName, Supplier dinosaur, String partName, String itemTexture) { + return DR.register(name, () -> new Fossil( + timeStart, timeEnd, null, textureName + , WordUtils.capitalizeFully(name.replace("_", " ")), dinosaur, partName) + .withTextures( + new Pair<>(0.3, new ResourceLocation(ProjectNublar.MODID, "fragmented/" + itemTexture)), + new Pair<>(0.6, new ResourceLocation(ProjectNublar.MODID, "fossilized/" + itemTexture)), + new Pair<>(1D, new ResourceLocation(ProjectNublar.MODID, "fresh/" + itemTexture)) + )); + }; + + private static RegistryObject createSimpleFossilWithOneItemTexture(String name, double timeStart, double timeEnd, String textureName, Supplier dinosaur, String partName, String itemTexture) { + return DR.register(name, () -> new Fossil( + timeStart, timeEnd, null, textureName + , WordUtils.capitalizeFully(name.replace("_", " ")), dinosaur, partName) + .withTexture(1, new ResourceLocation(ProjectNublar.MODID, "fresh/" + itemTexture))); + }; + + private static RegistryMap createSimpleFossilMap(String fossilName, double timeStart, double timeEnd, String itemTexture, String textureName) { + return createMap("%s_" + fossilName, dinosaur -> + new Fossil(timeStart, timeEnd, null, textureName, + dinosaur.getFormattedName() + " " + WordUtils.capitalize(fossilName), () -> dinosaur, fossilName) + .withTextures( + new Pair<>(0.3, new ResourceLocation(ProjectNublar.MODID, "fragmented/" + itemTexture)), + new Pair<>(0.6, new ResourceLocation(ProjectNublar.MODID, "fossilized/" + itemTexture)), + new Pair<>(1D, new ResourceLocation(ProjectNublar.MODID, "fresh/" + itemTexture)) + )); + } + private static RegistryMap createMap(String format, Function supplier) { + RegistryMap map = new RegistryMap<>(); + DR.beforeRegister(() -> { + for (Dinosaur dinosaur : DinosaurHandler.getRegistry()) { + map.putRegistry(dinosaur, DR.register( + String.format(format, dinosaur.getFormattedName()), + () -> supplier.apply(dinosaur) + )); + } + }); + return map; + } + +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/StoneTypeHandler.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/StoneTypeHandler.java new file mode 100644 index 00000000..6ca1b64f --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/StoneTypeHandler.java @@ -0,0 +1,42 @@ +package net.dumbcode.projectnublar.server.fossil; + +import net.dumbcode.dumblibrary.server.registry.PostEarlyDeferredRegister; +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.fossil.base.StoneType; +import net.minecraft.block.Blocks; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; + +import java.util.function.Supplier; + +public class StoneTypeHandler { + public static final PostEarlyDeferredRegister DR = PostEarlyDeferredRegister.create(StoneType.class, ProjectNublar.MODID); + + public static final Supplier> STONE_TYPE_REGISTRY = DR.makeRegistry("stone_type", () -> new RegistryBuilder() + .setDefaultKey(new ResourceLocation(ProjectNublar.MODID, "granite"))); + + public static RegistryObject GRANITE = DR.register("granite", () -> new StoneType(1000, 0, Blocks.GRANITE::defaultBlockState, 50)); + public static RegistryObject DIORITE = DR.register("diorite", () -> new StoneType(1000, 0, Blocks.DIORITE::defaultBlockState, 50)); + public static RegistryObject COBBLESTONE = DR.register("cobblestone", () -> new StoneType(1000, 0, Blocks.COBBLESTONE::defaultBlockState, 50)); + public static RegistryObject CLAY = DR.register("clay", () -> new StoneType(1000, 0, Blocks.CLAY::defaultBlockState, 50)); + public static RegistryObject TERRACOTTA = DR.register("terracotta", () -> new StoneType(1000, 0, Blocks.TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject WHITE_TERRACOTTA = DR.register("white_terracotta", () -> new StoneType(1000, 0, Blocks.WHITE_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject ORANGE_TERRACOTTA = DR.register("orange_terracotta", () -> new StoneType(1000, 0, Blocks.ORANGE_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject MAGENTA_TERRACOTTA = DR.register("magenta_terracotta", () -> new StoneType(1000, 0, Blocks.MAGENTA_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject LIGHT_BLUE_TERRACOTTA = DR.register("light_blue_terracotta", () -> new StoneType(1000, 0, Blocks.LIGHT_BLUE_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject YELLOW_TERRACOTTA = DR.register("yellow_terracotta", () -> new StoneType(1000, 0, Blocks.YELLOW_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject LIME_TERRACOTTA = DR.register("lime_terracotta", () -> new StoneType(1000, 0, Blocks.LIME_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject PINK_TERRACOTTA = DR.register("pink_terracotta", () -> new StoneType(1000, 0, Blocks.PINK_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject GRAY_TERRACOTTA = DR.register("gray_terracotta", () -> new StoneType(1000, 0, Blocks.GRAY_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject LIGHT_GRAY_TERRACOTTA = DR.register("light_gray_terracotta", () -> new StoneType(1000, 0, Blocks.LIGHT_GRAY_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject CYAN_TERRACOTTA = DR.register("cyan_terracotta", () -> new StoneType(1000, 0, Blocks.CYAN_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject PURPLE_TERRACOTTA = DR.register("purple_terracotta", () -> new StoneType(1000, 0, Blocks.PURPLE_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject BROWN_TERRACOTTA = DR.register("brown_terracotta", () -> new StoneType(1000, 0, Blocks.BROWN_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject GREEN_TERRACOTTA = DR.register("green_terracotta", () -> new StoneType(1000, 0, Blocks.GREEN_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject RED_TERRACOTTA = DR.register("red_terracotta", () -> new StoneType(1000, 0, Blocks.RED_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject BLACK_TERRACOTTA = DR.register("black_terracotta", () -> new StoneType(1000, 0, Blocks.BLACK_TERRACOTTA::defaultBlockState, 50)); + public static RegistryObject NETHERRACK = DR.register("netherrack", () -> new StoneType(1000, 0, Blocks.NETHERRACK::defaultBlockState, 50)); + public static RegistryObject BLACKSTONE = DR.register("blackstone", () -> new StoneType(1000, 0, Blocks.BLACKSTONE::defaultBlockState, 50)); +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/base/DinosaurAge.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/DinosaurAge.java new file mode 100644 index 00000000..8c03b6ff --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/DinosaurAge.java @@ -0,0 +1,132 @@ +package net.dumbcode.projectnublar.server.fossil.base; + +import com.google.common.collect.Range; +import com.mojang.datafixers.util.Pair; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; + +import java.util.ArrayList; +import java.util.List; + +import static net.minecraft.util.math.MathHelper.clamp; + +//TODO: HAVE ROCKS AND FOSSILS IDENTIFY TIME PERIODS TO USE FOR SPAWNING +//TODO: add deviation stuff +//TODO: rock strata +public enum DinosaurAge { + QUATERNARY_HOLOCENE(0.0117, 0), + QUATERNARY_PLEISTOCENE(2.58, 0.0117), + NEOGENE_PLIOCENE(5.333, 2.58), + NEOGENE_MIOCENE(23.03, 5.333), + PALEOGENE_OLIGOCENE(33.9, 23.03), + PALEOGENE_EOCENE(56.0, 33.9), + PALEOGENE_PALEOCENE(66.0, 56.0), + CRETACEOUS_UPPER(100.5, 66.0), + CRETACEOUS_LOWER(145, 100.5), + JURASSIC_UPPER(161.5 /*+-1*/, 145), + JURASSIC_MIDDLE(174.7 /*+-0.8*/, 161.5 /*+-1*/), + JURASSIC_LOWER(201.4 /*+-0.2*/, 174.7 /*+-0.8*/), + TRIASSIC_UPPER(237, 201.4 /*+-0.2*/), + TRIASSIC_MIDDLE(247.2, 237), + TRIASSIC_LOWER(251.902 /*+-0.024*/, 247.2), + PERMIAN_LOPINGIAN(259.51 /*0.21*/, 251.902 /*+-0.024*/), + PERMIAN_GUADALUPIAN(273.01 /*+-0.14*/, 259.51 /*+-0.21*/), + PERMIAN_CISURALIAN(298.9 /*+-0.15*/, 273.01 /*+-0.14*/), + CARBONIFEROUS_PENNSYLVANIAN_UPPER(307 /*+-0.1*/, 298.9 /*+-0.15*/), + CARBONIFEROUS_PENNSYLVANIAN_MIDDLE(315.2 /*+-0.2*/, 307 /*+-0.1*/), + CARBONIFEROUS_PENNSYLVANIAN_LOWER(323.2 /*+-0.4*/, 215.2 /*+-0.2*/), + CARBONIFEROUS_MISSISSIPPIAN_UPPER(330.9 /*+-0.2*/, 323.2 /*+-0.4*/), + CARBONIFEROUS_MISSISSIPPIAN_MIDDLE(346.7 /*+-0.4*/, 330.9 /*+-0.2*/), + CARBONIFEROUS_MISSISSIPPIAN_LOWER(358.9 /*+-0.4*/, 346.7 /*+-0.4*/), + DEVONIAN_UPPER(382.7 /*+-1.6*/, 358.9 /*+-0.4*/), + DEVONIAN_MIDDLE(393.3 /*+-1.2*/, 382.7 /*+-1.6*/), + DEVONIAN_LOWER(419.2 /*+-3.2*/, 393.3 /*+-1.2*/), + SILURIAN_PRIDOLI(423 /*+-2.3*/, 419.2 /*+-3.2*/), + SILURIAN_LUDLOW(427.4 /*+-0.5*/, 423 /*+-2.3*/), + SILURIAN_WENLOCK(433.4 /*+-0.8*/, 427.4 /*+-0.5*/), + SILURIAN_LLANDOVERY(443.8 /*+-1.5*/, 433.4 /*+-0.8*/), + ORDOVICIAN_UPPER(458.4 /*+-0.9*/, 443.8 /*+-1.5*/), + ORDOVICIAN_MIDDLE(470 /*+-1.4*/, 458.4 /*+-0.9*/), + ORDOVICIAN_LOWER(485.4 /*+-1.9*/, 470 /*+-1.4*/), + CAMBRIAN_FURONGIAN(497, 485.4 /*+-1.9*/), + CAMBRIAN_MIAOLINGIAN(509, 497), + CAMBRIAN_SERIES_2(521, 509), + CAMBRIAN_TERRENEUVIAN(538.8 /*+-0.2*/, 521), + PROTEROZOIC_NEOPROTEROZOIC_EDIACARAN(635, 538 /*+-0.2*/), + PROTEROZOIC_NEOPROTEROZOIC_CRYOGENIAN(720, 635), + PROTEROZOIC_NEOPROTEROZOIC_TONIAN(1000, 720), + PROTEROZOIC_MESOPROTER0ZOIC_STENIAN(1200, 1000), + PROTEROZOIC_MESOPROTER0ZOIC_ECTASIAN(1400, 1200), + PROTEROZOIC_MESOPROTER0ZOIC_CALYMMIAN(1600, 1400), + PROTEROZOIC_PALEOPROTEROZOIC_STATHERIAN(1800, 1600), + PROTEROZOIC_PALEOPROTEROZOIC_OROSIRIAN(2050, 1800), + PROTEROZOIC_PALEOPROTEROZOIC_RHYACIAN(2300, 2050), + PROTEROZOIC_PALEOPROTEROZOIC_SIDERIAN(2500, 2300), + ARCHEAN_NEOARCHEAN(2800, 2500), + ARCHEAN_MESOARCHEAN(3200, 2800), + ARCHEAN_PALEOARCHEAN(3600, 3200), + ARCHEAN_EOARCHEAN(4000, 3600), + HADEAN(4567, 4000); + + + private final double start; + private final double end; + + DinosaurAge(double start, double end) { + if (end > start) { + throw new IllegalArgumentException("End time cannot be greater than start"); + } + this.start = start; + this.end = end; + } + + DinosaurAge() { + this.start = 0; + this.end = 0; + } + + public Pair getTimeSpan() { + return new Pair<>(start, end); + } + + public static List findAllTimePeriodsThatMatchRange(double start, double end) { + List dinosaurAges = new ArrayList<>(); + for (DinosaurAge dinosaurAge : values()) { + if (Range.closed(end, start).contains(dinosaurAge.start) || Range.closed(end, start).contains(dinosaurAge.end)) { + dinosaurAges.add(dinosaurAge); + } + } + return dinosaurAges; + } + + public static List findAllStoneTypesThatMatchRange(double start, double end) { + List stoneTypes = new ArrayList<>(); + for (StoneType type : StoneTypeHandler.STONE_TYPE_REGISTRY.get()) { + if (Range.closed(end, start).contains(type.start) || Range.closed(end, start).contains(type.end)) { + stoneTypes.add(type); + } + } + return stoneTypes; + } + + public static List findAllStoneTypesThatMatchTimePeriods(List dinosaurAges) { + List stoneTypes = new ArrayList<>(); + for (DinosaurAge dinosaurAge : dinosaurAges) { + for (StoneType type : StoneTypeHandler.STONE_TYPE_REGISTRY.get()) { + if (Range.closed(dinosaurAge.end, dinosaurAge.start).contains(type.start) || Range.closed(dinosaurAge.end, dinosaurAge.start).contains(type.end)) { + stoneTypes.add(type); + } + } + } + return stoneTypes; + } + + public static Range getYLevelsFromTime(int max, double timeStart, double timeEnd) { + int y = normalize(timeEnd, 4567, 0, 0, max); + int y1 = normalize(timeStart, 4567, 0, 0, max); + return Range.closed(y, y1); + } + + private static int normalize(double value, int minValue, int maxValue, int min, int max) { + return (int) ((value - minValue) / (minValue - maxValue) * (max - min) + min); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/base/Fossil.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/Fossil.java new file mode 100644 index 00000000..aee066bb --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/Fossil.java @@ -0,0 +1,83 @@ +package net.dumbcode.projectnublar.server.fossil.base; + +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.ForgeRegistryEntry; +import org.apache.commons.lang3.AnnotationUtils; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Getter +public class Fossil extends ForgeRegistryEntry { + + public final double timeStart; + public final double timeEnd; + @Nullable + private final List> stoneTypes; + public final String textureName; + public final String name; + @Nullable + public final Supplier dinosaur; + public final String partName; + + // TODO get the item texture from the registry name? + // 0.0, "fossilised", + // 0.5, "fresh", + // 0.7, "amazing" + // means: + // - 0.0 - 0.5 is "fossilised", + // - 0.5 - 0.7 is "fresh", + // - 0.7 - 1.0 is "amazing" + // + // See: getTextureForDNAValue + // The list HAS to be ordered correctly (as above) + private final List> textures = new ArrayList<>(); + + @Nonnull + public Collection getStoneTypes() { + if(this.stoneTypes == null) { + return StoneTypeHandler.STONE_TYPE_REGISTRY.get().getValues(); + } + return stoneTypes.stream().map(RegistryObject::get).collect(Collectors.toList()); + } + + public Fossil withTexture(double dnaValue, ResourceLocation texture) { + textures.add(Pair.of(dnaValue, texture)); + return this; + } + + @SafeVarargs + public final Fossil withTextures(Pair... textures) { + this.textures.addAll(Lists.newArrayList(textures)); + return this; + } + + public ResourceLocation getTextureForDNAValue(double dnaValue) { + ResourceLocation result = this.textures.get(0).getSecond(); + for (Pair texture : this.textures) { + if (dnaValue < texture.getFirst()) { + break; + } + result = texture.getSecond(); + } + if (result == null) { + throw new NullPointerException("Result cannot be null. Are there any textures added at all for " + this.getRegistryName() + "?"); + } + return result; + } + + public Collection allTextures() { + return this.textures.stream().map(Pair::getSecond).collect(Collectors.toList()); + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilTier.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilTier.java new file mode 100644 index 00000000..8d0d02f2 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilTier.java @@ -0,0 +1,57 @@ +package net.dumbcode.projectnublar.server.fossil.base; + +import com.google.common.collect.Range; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public enum FossilTier { + WEATHERED(0, 40, 0.3, 1, Range.closed(0, 1)), + FRAGMENTED(0.05f, 20, 0.3, 2, Range.closed(2, 3)), + COMMON(0.1f, 15, 0.3, 3, Range.closed(3, 5)), + UNEARTHED(0.2f, 10, 0.6, 1, Range.closed(4, 5)), + ANCIENT(0.3f, 5, 0.6, 1, Range.closed(3, 5)), + WELL_PRESERVED(0.4f, 4, 0.6, 2, Range.closed(4, 5)), + EXQUISITE(0.5f, 3, 0.6, 2, Range.closed(5, 7)), + RARE(0.7f, 1.5f, 0.6, 3, Range.closed(6, 8)), + PRIMAL(0.9f, 1, 0.6, 3, Range.closed(9, 11)), + TIMELESS(1, 0.5f, 1, 0, Range.closed(10, 12)); + + /** + * float from 0-1 + * A percentage divided by 100 so that it is normalized to between 0 and 1 + */ + @Getter + private final float DNAGatherChance; + /** + * Must add up to 100. Essentially percent spawn rate + */ + private final float weight; + @Getter + private final double dnaValue; + @Getter + private final int crackLevel; + @Getter + private final Range amountOfFossilsToDrop; +// FossilTier(float DNAGatherChance, float weight, double dnaValue, int crackLevel, Range amountOfFossilsToDrop) { +// this.DNAGatherChance = DNAGatherChance; +// this.weight = weight; +// this.dnaValue = dnaValue; +// this.crackLevel = crackLevel; +// this.amountOfFossilsToDrop = amountOfFossilsToDrop; +// } + + public static FossilTier randomTier() { + double totalWeight = 0.0; + for (FossilTier tier : values()) { + totalWeight += tier.weight; + } + + int idx = 0; + for (double r = Math.random() * totalWeight; idx < values().length - 1; ++idx) { + r -= values()[idx].weight; + if (r <= 0.0) break; + } + return values()[idx]; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilType.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilType.java new file mode 100644 index 00000000..ddd4ba36 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/FossilType.java @@ -0,0 +1,27 @@ +package net.dumbcode.projectnublar.server.fossil.base; + +import lombok.Getter; + +import java.util.Random; + +public enum FossilType { + PETRIFIED(0.8F), + MOLD_CAST(0.6F), + CARBON_FILM(0.7F), + TRACE(0.5F), + PRESERVED_REMAINS(0.9F), + COMPRESSION(0.4F), + IMPRESSION(0.3F), + PSEUDO(0.2F); + + @Getter + private final float DNAMultiplier; + + FossilType(float DNAMultiplier) { + this.DNAMultiplier = DNAMultiplier; + } + + public static FossilType randomType() { + return values()[new Random().nextInt(values().length)]; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/base/StoneType.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/StoneType.java new file mode 100644 index 00000000..c09ff323 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/base/StoneType.java @@ -0,0 +1,17 @@ +package net.dumbcode.projectnublar.server.fossil.base; + +import lombok.Value; +import net.minecraft.block.BlockState; +import net.minecraftforge.registries.ForgeRegistryEntry; + +import java.util.function.Supplier; + +@Value +public class StoneType extends ForgeRegistryEntry { + public double start; + public double end; + // We can't use just a BlockState as when the StoneType is initialised + // The Blocks may not be initialised + public Supplier baseState; + public int maxStrataSize; +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlock.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlock.java new file mode 100644 index 00000000..7c2a044d --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlock.java @@ -0,0 +1,86 @@ +package net.dumbcode.projectnublar.server.fossil.blockitem; + +import net.dumbcode.projectnublar.server.block.IItemBlock; +import net.dumbcode.projectnublar.server.block.entity.FossilBlockEntity; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.base.StoneType; +import net.dumbcode.projectnublar.server.tabs.TabHandler; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.text.IFormattableTextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraftforge.common.ToolType; +import org.apache.commons.lang3.text.WordUtils; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +public class FossilBlock extends Block implements IItemBlock { + public FossilBlock(Properties properties) { + super(properties); + } + + + @Override + public Item createItem(Item.Properties properties) { + return new FossilBlockItem(this, properties.tab(TabHandler.FOSSIL_TAB)); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return new FossilBlockEntity(); + } + + @Override + public List getDrops(BlockState pState, LootContext.Builder pBuilder) { + TileEntity entity = pBuilder.getOptionalParameter(LootParameters.BLOCK_ENTITY); + if (entity instanceof FossilBlockEntity) { + FossilBlockEntity fossilBlockEntity = (FossilBlockEntity) entity; + return fossilBlockEntity.drops(); + } + return super.getDrops(pState, pBuilder); + } + + // Methods to delegate to the base state: + // TODO (wp): make this get it from the block entity +// @Override +// public VoxelShape getShape(BlockState pState, IBlockReader pLevel, BlockPos pPos, ISelectionContext pContext) { +// return this.stone.baseState.get().getShape(pLevel, pPos); +// } +// +// @Override +// public int getHarvestLevel(BlockState state) { +// return this.stone.baseState.get().getHarvestLevel(); +// } +// +// @Nullable +// @Override +// public ToolType getHarvestTool(BlockState state) { +// return this.stone.baseState.get().getHarvestTool(); +// } +// +// @Override +// public SoundType getSoundType(BlockState state, IWorldReader world, BlockPos pos, @Nullable Entity entity) { +// return this.stone.baseState.get().getSoundType(world, pos, entity); +// } + +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlockItem.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlockItem.java new file mode 100644 index 00000000..f12b0eb8 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilBlockItem.java @@ -0,0 +1,93 @@ +package net.dumbcode.projectnublar.server.fossil.blockitem; + +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.block.BlockHandler; +import net.dumbcode.projectnublar.server.block.entity.FossilBlockEntity; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.StoneTypeHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.fossil.base.StoneType; +import net.dumbcode.projectnublar.server.item.ItemHandler; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import org.apache.commons.lang3.text.WordUtils; + +import javax.annotation.Nullable; + +public class FossilBlockItem extends BlockItem { + + public FossilBlockItem(Block block, Properties properties) { + super(block, properties); + } + + @Override + public void fillItemCategory(ItemGroup pGroup, NonNullList pItems) { + if (this.allowdedIn(pGroup)) { + FossilHandler.FOSSIL_REGISTRY.get().getValues().forEach(fossil -> + fossil.getStoneTypes().forEach(stoneType -> pItems.add(setFossilStack(fossil, stoneType))) + ); + } + } + + @Override + protected boolean updateCustomBlockEntityTag(BlockPos pPos, World pLevel, @Nullable PlayerEntity pPlayer, ItemStack pStack, BlockState pState) { + if (super.updateCustomBlockEntityTag(pPos, pLevel, pPlayer, pStack, pState)) { + return true; + } + Fossil fossil = getFossil(pStack); + StoneType stoneType = getStoneType(pStack); + + TileEntity blockEntity = pLevel.getBlockEntity(pPos); + if (blockEntity instanceof FossilBlockEntity) { + FossilBlockEntity fbe = (FossilBlockEntity) blockEntity; + fbe.setFossil(fossil); + fbe.setStoneType(stoneType); + + return true; + } + + return false; + } + + @Override + public ITextComponent getName(ItemStack stack) { + StoneType stone = getStoneType(stack); + Fossil fossil = getFossil(stack); + return new TranslationTextComponent("projectnublar.fossil", stone.baseState.get().getBlock().getName(), WordUtils.capitalizeFully(fossil.name)); + } + + public static ItemStack setFossilStack(Fossil fossil, StoneType stoneType) { + return setFossilStack(new ItemStack(BlockHandler.FOSSIL_BLOCK.get()), fossil, stoneType); + } + + public static ItemStack setFossilStack(ItemStack base, Fossil fossil, StoneType stoneType) { + CompoundNBT nbt = base.getOrCreateTagElement(ProjectNublar.MODID); + + nbt.putString("fossil", fossil.getRegistryName().toString()); + nbt.putString("stone_type", stoneType.getRegistryName().toString()); + + return base; + } + + public static Fossil getFossil(ItemStack base) { + CompoundNBT nbt = base.getOrCreateTagElement(ProjectNublar.MODID); + return FossilHandler.FOSSIL_REGISTRY.get().getValue(new ResourceLocation(nbt.getString("fossil"))); + } + + public static StoneType getStoneType(ItemStack base) { + CompoundNBT nbt = base.getOrCreateTagElement(ProjectNublar.MODID); + return StoneTypeHandler.STONE_TYPE_REGISTRY.get().getValue(new ResourceLocation(nbt.getString("stone_type"))); + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilItem.java b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilItem.java new file mode 100644 index 00000000..70000e28 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/fossil/blockitem/FossilItem.java @@ -0,0 +1,49 @@ +package net.dumbcode.projectnublar.server.fossil.blockitem; + +import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.base.Fossil; +import net.dumbcode.projectnublar.server.item.ItemHandler; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import org.apache.commons.lang3.text.WordUtils; + +//TODO: tint the item model fossil overlay +public class FossilItem extends Item { + public FossilItem(Properties properties) { + super(properties); + } + + @Override + public void fillItemCategory(ItemGroup pGroup, NonNullList pItems) { + if (this.allowdedIn(pGroup)) { + for (Fossil fossil : FossilHandler.FOSSIL_REGISTRY.get()) { + pItems.add(stackWithFossil(fossil)); + } + } + } + + @Override + public ITextComponent getName(ItemStack stack) { + Fossil fossil = getFossil(stack); + return new TranslationTextComponent("projectnublar.fossil", "", WordUtils.capitalizeFully(fossil.name)); + } + + public static Fossil getFossil(ItemStack stack) { + CompoundNBT nbt = stack.getOrCreateTagElement(ProjectNublar.MODID); + return FossilHandler.FOSSIL_REGISTRY.get().getValue(new ResourceLocation(nbt.getString("fossil"))); + } + + public static ItemStack stackWithFossil(Fossil fossil) { + ItemStack stack = new ItemStack(ItemHandler.FOSSIL_ITEM.get()); + CompoundNBT nbt = stack.getOrCreateTagElement(ProjectNublar.MODID); + nbt.putString("fossil", fossil.getRegistryName().toString()); + return stack; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/item/FossilItem.java b/src/main/java/net/dumbcode/projectnublar/server/item/FossilItem.java deleted file mode 100644 index 0f2fb713..00000000 --- a/src/main/java/net/dumbcode/projectnublar/server/item/FossilItem.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.dumbcode.projectnublar.server.item; - -import lombok.Getter; -import net.dumbcode.projectnublar.server.ProjectNublar; -import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; -import net.minecraft.item.Item; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; - -import java.util.function.Consumer; - -public class FossilItem extends BasicDinosaurItem { - - @Getter - private final String variant; - - public FossilItem(Dinosaur dinosaur, String translationKey, String variant, Properties properties) { - super(dinosaur, translationKey, properties); - this.variant = variant; - } - - @Override - protected void addTranslation(Consumer consumer) { - super.addTranslation(consumer); - consumer.accept(ProjectNublar.translate("item.fossil.type." + this.variant)); - } -} diff --git a/src/main/java/net/dumbcode/projectnublar/server/item/FossilPouchItem.java b/src/main/java/net/dumbcode/projectnublar/server/item/FossilPouchItem.java new file mode 100644 index 00000000..b8cd6cfd --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/item/FossilPouchItem.java @@ -0,0 +1,114 @@ +package net.dumbcode.projectnublar.server.item; + +import net.dumbcode.projectnublar.server.containers.pouch.FossilPouchInventory; +import net.dumbcode.projectnublar.server.containers.pouch.FossilPouchMenu; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.fml.network.NetworkHooks; + +import java.util.Objects; +import java.util.UUID; + +public class FossilPouchItem extends Item { + private int width = 9; + private int height = 3; + + + public FossilPouchItem(Properties properties) { + super(properties); + } + + public static FossilPouchInventory getInv(ItemStack pouch) { + return new FossilPouchInventory(pouch, getSackSize(pouch), 64); + } + + @Override + public ActionResult use(World level, PlayerEntity player, Hand hand) { +// SackHelper.openSackGui(player, player.getItemInHand(hand)); + if (!level.isClientSide) { + openScreen((ServerPlayerEntity) player, hand); + } + return super.use(level, player, hand); + } + + public static void openScreen(ServerPlayerEntity user, Hand hand) { + final ItemStack stack = user.getItemInHand(hand); + // Getting existing UUID or generated new one + UUID uuid = getOrBindUUID(stack); + + int width = getPouchWidth(stack); + int height = getPouchHeight(stack); + + INamedContainerProvider provider = new INamedContainerProvider() { + @Override + public ITextComponent getDisplayName() { + return new TranslationTextComponent("projectnublar.fossil_pouch.menu.title"); + } + + @Override + public Container createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new FossilPouchMenu(syncId, inv, width, height, uuid, stack); + } + }; + + NetworkHooks.openGui(user, provider, (buf) -> { + buf.writeInt(width); + buf.writeInt(height); + buf.writeUUID(uuid); + }); + + } + + + public static UUID bindUid(ItemStack stack) { + UUID uuid = UUID.randomUUID(); + stack.getOrCreateTag().putUUID("SackUUID", uuid); + + return uuid; + } + + public static UUID getOrBindUUID(ItemStack stack) { + UUID foundUid = getUUID(stack); + + if (foundUid == null) { + return bindUid(stack); + } + + return foundUid; + } + + public static UUID getUUID(ItemStack stack) { + try { + return stack.getOrCreateTag().getUUID("SackUUID"); + } catch (Exception e) { + return null; + } + } + + public static boolean isUUIDMatch(ItemStack stack, UUID uid) { + UUID uuid = getUUID(stack); + return uuid != null && uuid.equals(uid); + } + + public static int getPouchWidth(ItemStack stack){ + return 9; + } + + public static int getPouchHeight(ItemStack stack){ + return 3; + } + + public static int getSackSize(ItemStack stack){ + return getPouchHeight(stack) * getPouchWidth(stack); + } +} \ No newline at end of file diff --git a/src/main/java/net/dumbcode/projectnublar/server/item/ItemHandler.java b/src/main/java/net/dumbcode/projectnublar/server/item/ItemHandler.java index 402c5d0b..fb342cf4 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/item/ItemHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/item/ItemHandler.java @@ -2,14 +2,12 @@ import net.dumbcode.dumblibrary.server.registry.PostEarlyDeferredRegister; import net.dumbcode.dumblibrary.server.registry.RegistryMap; -import net.dumbcode.dumblibrary.server.utils.JavaUtils; import net.dumbcode.projectnublar.server.ProjectNublar; import net.dumbcode.projectnublar.server.block.BlockHandler; import net.dumbcode.projectnublar.server.block.IItemBlock; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.dinosaur.DinosaurHandler; -import net.dumbcode.projectnublar.server.entity.ComponentHandler; -import net.dumbcode.projectnublar.server.entity.component.impl.DinosaurDropsComponent; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; import net.dumbcode.projectnublar.server.tablet.TabletModuleHandler; import net.dumbcode.projectnublar.server.tabs.TabHandler; import net.minecraft.block.Block; @@ -30,7 +28,7 @@ public final class ItemHandler { - private static final ItemGroup TAB = TabHandler.TAB; + public static final ItemGroup TAB = TabHandler.TAB; private static final Supplier BASIC_ITEM = () -> new Item(new Item.Properties().tab(TAB)); @@ -106,9 +104,11 @@ public final class ItemHandler { public static final RegistryObject SEQUENCER_COMPUTER = REGISTER.register("sequencer_computer", BASIC_ITEM); public static final RegistryObject MONITOR = REGISTER.register("monitor", BASIC_ITEM); + public static final RegistryObject FOSSIL_POUCH = REGISTER.register("fossil_pouch", () -> + new FossilPouchItem(new Item.Properties().tab(TAB).stacksTo(1))); - - + public static final RegistryObject FOSSIL_ITEM = + REGISTER.register("fossil_item", () -> new FossilItem(new Item.Properties().tab(TabHandler.FOSSIL_TAB))); public static final RegistryMap RAW_MEAT_ITEMS = createMap("%s_raw_meat", d -> new BasicDinosaurItem(d, "raw_meat", new Item.Properties().tab(TAB).food(new Food.Builder() @@ -131,12 +131,6 @@ public final class ItemHandler { public static final RegistryMap DINOSAUR_UNINCUBATED_EGG = createMap("%s_unincubated_egg", d -> new UnincubatedEggItem(d, "unincubated_egg", new Item.Properties().tab(TAB))); public static final RegistryMap DINOSAUR_INCUBATED_EGG = createMap("%s_incubated_egg", d -> new DinosaurEggItem(d, "incubated_egg", new Item.Properties().tab(TAB))); - public static final Map> FOSSIL_ITEMS = createNestedMap( - "%s_fossil_%s", - dino -> JavaUtils.nullOr(dino.getAttacher().getStorageOrNull(ComponentHandler.ITEM_DROPS.get()), DinosaurDropsComponent.Storage::getFossilList), - (dinosaur, fossil) -> new FossilItem(dinosaur, "fossil", fossil, new Item.Properties().tab(TAB)) - ); - public static void registerAllItemBlocks(RegistryEvent.Register event) { for (RegistryObject entry : BlockHandler.REGISTER.getEntries()) { Block block = entry.get(); diff --git a/src/main/java/net/dumbcode/projectnublar/server/network/C2SRequestBackgroundImage.java b/src/main/java/net/dumbcode/projectnublar/server/network/C2SRequestBackgroundImage.java index 93b49567..aef1824e 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/network/C2SRequestBackgroundImage.java +++ b/src/main/java/net/dumbcode/projectnublar/server/network/C2SRequestBackgroundImage.java @@ -35,7 +35,7 @@ public static void handle(C2SRequestBackgroundImage packet, Supplier { INSTANCE; @@ -26,7 +25,7 @@ public boolean accepts(FossilProcessorBlockEntity blockEntity, MachineModuleBloc MachineModuleItemStackHandler handler = blockEntity.getHandler(); ItemStack inSlot = process.getInputStack(0); Item item = inSlot.getItem(); - return item instanceof FossilItem && ItemHandler.FOSSIL_ITEMS.get(((FossilItem) item).getDinosaur()).containsValue(item) + return item instanceof FossilItem // TODO (wp): && Fossils.ITEMS.get(((FossilItem) item).getFossil().dinosaur) != null && handler.getStackInSlot(3).getItem() instanceof FilterItem && blockEntity.getTank().getFluidAmount() >= FLUID_AMOUNT && handler.getStackInSlot(2).getItem() == ItemHandler.EMPTY_TEST_TUBE.get(); @@ -55,7 +54,7 @@ public void onRecipeFinished(FossilProcessorBlockEntity blockEntity, MachineModu //Damage the filter item. ItemStack filter = handler.getStackInSlot(3); float efficiency = ((FilterItem)filter.getItem()).getEfficiency(filter); - if (filter.hurt(1, blockEntity.getLevel().getRandom(), null)) { + if (filter.hurt(1, Objects.requireNonNull(blockEntity.getLevel()).getRandom(), null)) { filter.shrink(1); } @@ -67,8 +66,8 @@ public void onRecipeFinished(FossilProcessorBlockEntity blockEntity, MachineModu blockEntity.getTank().drainInternal(FLUID_AMOUNT, IFluidHandler.FluidAction.EXECUTE); //Insert the output item - if(item instanceof DinosaurProvider) { - ItemStack stack = new ItemStack(ItemHandler.TEST_TUBES_GENETIC_MATERIAL.get(((FossilItem) item).getDinosaur())); + if(item instanceof FossilItem) { + ItemStack stack = new ItemStack(ItemHandler.TEST_TUBES_GENETIC_MATERIAL.get(FossilItem.getFossil(inputStack).dinosaur.get())); //Sets the size. //See here: https://www.desmos.com/calculator/c59djyd7c8 for a distribution for the 3 different filter types. //Where: @@ -89,7 +88,7 @@ public void onRecipeFinished(FossilProcessorBlockEntity blockEntity, MachineModu @Override public boolean acceptsInputSlot(FossilProcessorBlockEntity blockEntity, int slotIndex, ItemStack testStack, MachineModuleBlockEntity.MachineProcess process) { Item item = testStack.getItem(); - return slotIndex == 0 && item instanceof FossilItem && ItemHandler.FOSSIL_ITEMS.get(((FossilItem) item).getDinosaur()).containsValue(item); + return slotIndex == 0 && item instanceof FossilItem; // TODO (wp): && Fossils.ITEMS.containsValue(item); } @Override diff --git a/src/main/java/net/dumbcode/projectnublar/server/recipes/SequencingSynthesizerRecipe.java b/src/main/java/net/dumbcode/projectnublar/server/recipes/SequencingSynthesizerRecipe.java index d478cd06..4b22135c 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/recipes/SequencingSynthesizerRecipe.java +++ b/src/main/java/net/dumbcode/projectnublar/server/recipes/SequencingSynthesizerRecipe.java @@ -4,7 +4,6 @@ import net.dumbcode.dumblibrary.server.utils.CollectorUtils; import net.dumbcode.projectnublar.server.ProjectNublar; import net.dumbcode.projectnublar.server.block.entity.MachineModuleBlockEntity; -import net.dumbcode.projectnublar.server.block.entity.MachineModuleItemStackHandler; import net.dumbcode.projectnublar.server.block.entity.SequencingSynthesizerBlockEntity; import net.dumbcode.projectnublar.server.dinosaur.DinosaurHandler; import net.dumbcode.projectnublar.server.item.ItemHandler; @@ -19,7 +18,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; public enum SequencingSynthesizerRecipe implements MachineRecipe{ INSTANCE; @@ -126,7 +124,7 @@ private ItemStack createStack(SequencingSynthesizerBlockEntity blockEntity) { } return stack; } - ProjectNublar.getLogger().warn("Unable to complete recipe, {} was not a dinosaur", location); + ProjectNublar.LOGGER.warn("Unable to complete recipe, {} was not a dinosaur", location); return ItemStack.EMPTY; } diff --git a/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletBGImageHandler.java b/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletBGImageHandler.java index fa7412c7..3ca3ba29 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletBGImageHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletBGImageHandler.java @@ -12,7 +12,6 @@ import net.minecraftforge.fml.server.ServerLifecycleHooks; import org.apache.commons.io.FilenameUtils; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -70,7 +69,7 @@ private static List getAllIcons() { .filter(Files::isDirectory) .forEach(p -> getAllIcons(p, entries)); } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to walk icons", e); + ProjectNublar.LOGGER.error("Unable to walk icons", e); } return entries; } @@ -88,7 +87,7 @@ private static List getAllIcons(Path folder, List list) { .filter(p -> !p.toString().endsWith("_icon.png")) .forEach(p -> list.add(new IconEntry(folderName, FilenameUtils.getBaseName(p.toString())))); } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to walk icons", e); + ProjectNublar.LOGGER.error("Unable to walk icons", e); } } return list; @@ -102,7 +101,7 @@ public Optional getFullImage(World world, String uploaderUUID, Stri try { return Optional.of(NativeImage.read(Files.newInputStream(file))); } catch (IOException e) { - ProjectNublar.getLogger().error("Unable to load file " + file, e); + ProjectNublar.LOGGER.error("Unable to load file " + file, e); } return Optional.empty(); } diff --git a/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletItemStackHandler.java b/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletItemStackHandler.java index 07059158..6701c3ac 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletItemStackHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/tablet/TabletItemStackHandler.java @@ -48,7 +48,7 @@ public void read() { } this.entryList.add(new Entry(value, storage)); } else { - ProjectNublar.getLogger().warn("Unable to find module with identifier {}", identifier); + ProjectNublar.LOGGER.warn("Unable to find module with identifier {}", identifier); } } diff --git a/src/main/java/net/dumbcode/projectnublar/server/tabs/TabHandler.java b/src/main/java/net/dumbcode/projectnublar/server/tabs/TabHandler.java index ec3d17ca..336b0c15 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/tabs/TabHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/tabs/TabHandler.java @@ -1,6 +1,8 @@ package net.dumbcode.projectnublar.server.tabs; import net.dumbcode.projectnublar.server.ProjectNublar; +import net.dumbcode.projectnublar.server.fossil.FossilHandler; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; import net.dumbcode.projectnublar.server.item.ItemHandler; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -20,4 +22,16 @@ public boolean hasSearchBar() { } }; + public static final ItemGroup FOSSIL_TAB = new ItemGroup(ProjectNublar.MODID + ".fossils") { + @Override + public ItemStack makeIcon() { + return FossilItem.stackWithFossil(FossilHandler.AMMONITE.get()); + } + + @Override + public boolean hasSearchBar() { + return true; + } + }; + } diff --git a/src/main/java/net/dumbcode/projectnublar/server/utils/PickupUtil.java b/src/main/java/net/dumbcode/projectnublar/server/utils/PickupUtil.java new file mode 100644 index 00000000..3f764b50 --- /dev/null +++ b/src/main/java/net/dumbcode/projectnublar/server/utils/PickupUtil.java @@ -0,0 +1,133 @@ +package net.dumbcode.projectnublar.server.utils; + +import net.dumbcode.projectnublar.server.containers.pouch.FossilPouchInventory; +import net.dumbcode.projectnublar.server.fossil.blockitem.FossilItem; +import net.dumbcode.projectnublar.server.item.FossilPouchItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraftforge.items.ItemHandlerHelper; + +import java.util.ArrayList; +import java.util.List; + +public class PickupUtil { + + /** + * @param inv Player Inventory to add the item to + * @param incoming the itemstack being picked up + * @return if the item was completely picked up by the sack(s) + */ + public static boolean interceptItem(PlayerInventory inv, ItemStack incoming) { + PlayerEntity player = inv.player; + if (player.level.isClientSide || incoming.isEmpty()) {//thanks Hookshot + return false; + } + for (int i = 0; i < inv.getContainerSize(); i++) { + ItemStack stack = inv.getItem(i); + if (stack.getItem() instanceof FossilPouchItem && onItemPickup(player, incoming, stack)) { + return true; + } + } + return false; + } + + public static boolean onItemPickup(PlayerEntity player, ItemStack pickStack, ItemStack pouch) { + if (pickStack.getItem() instanceof FossilItem) { + boolean canPickup = pickStack.getItem() instanceof FossilItem; + if (!canPickup) { + return false; + } + FossilPouchItem sackItem = (FossilPouchItem) pouch.getItem(); + FossilPouchInventory inventory = FossilPouchItem.getInv(pouch); + + int count = pickStack.getCount(); + List existing = new ArrayList<>(); + for (int i = 0; i < inventory.getContainerSize(); i++) { + ItemStack stack = inventory.getItem(i); + if (!stack.isEmpty()) { + boolean exists = false; + for (ItemStack stack1 : existing) { + if (areItemStacksCompatible(stack, stack1)) { + exists = true; + } + } + if (!exists) { + existing.add(stack.copy()); + } + } + } + + for (int i = 0; i < inventory.getContainerSize(); i++) { + pickup(inventory, i, pickStack); + if (pickStack.isEmpty()) break; + } + + //leftovers + if (pickStack.getCount() != count) { + pouch.setPopTime(5); + player.level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ITEM_PICKUP, SoundCategory.PLAYERS, 0.2F, ((player.getRandom().nextFloat() - player.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F); + } + return pickStack.isEmpty(); + } + return false; + } + + private static boolean areItemStacksCompatible(ItemStack stack, ItemStack stack1) { + return ItemStack.tagMatches(stack, stack1) && ItemStack.isSame(stack, stack1); + } + + public static void voidPickup(FossilPouchInventory inv, int slot, ItemStack toInsert, List filter) { + ItemStack existing = inv.getItem(slot); + + if (doesItemStackExist(toInsert, filter) && areItemStacksCompatible(existing, toInsert)) { + int stackLimit = inv.getMaxStackSize(); + int total = Math.min(toInsert.getCount() + existing.getCount(), stackLimit); + + inv.setItem(slot, ItemHandlerHelper.copyStackWithSize(existing, total)); + toInsert.setCount(0); + } + } + + public static void pickup(FossilPouchInventory inv, int slot, ItemStack pickup) { + ItemStack existing = inv.getItem(slot); + + if (existing.isEmpty()) { + int stackLimit = inv.getMaxStackSize(); + int total = pickup.getCount(); + int remainder = total - stackLimit; + //no overflow + if (remainder <= 0) { + inv.setItem(slot, pickup.copy()); + pickup.setCount(0); + } else { + inv.setItem(slot, ItemHandlerHelper.copyStackWithSize(pickup, stackLimit)); + pickup.setCount(remainder); + } + return; + } + + if (ItemHandlerHelper.canItemStacksStack(pickup, existing)) { + int stackLimit = inv.getMaxStackSize(); + int total = pickup.getCount() + existing.getCount(); + int remainder = total - stackLimit; + //no overflow + if (remainder <= 0) { + inv.setItem(slot, ItemHandlerHelper.copyStackWithSize(existing, total)); + pickup.setCount(0); + } else { + inv.setItem(slot, ItemHandlerHelper.copyStackWithSize(pickup, stackLimit)); + pickup.setCount(remainder); + } + } + } + + public static boolean doesItemStackExist(ItemStack stack, List filter) { + for (ItemStack filterStack : filter) { + if (areItemStacksCompatible(stack, filterStack)) return true; + } + return false; + } +} diff --git a/src/main/java/net/dumbcode/projectnublar/server/villager/VillagerHandler.java b/src/main/java/net/dumbcode/projectnublar/server/villager/VillagerHandler.java index e081c6f7..2d5f9f79 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/villager/VillagerHandler.java +++ b/src/main/java/net/dumbcode/projectnublar/server/villager/VillagerHandler.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; import net.dumbcode.dumblibrary.server.registry.RegistryMap; import net.dumbcode.projectnublar.server.ProjectNublar; import net.dumbcode.projectnublar.server.block.BlockHandler; @@ -56,12 +57,13 @@ public static void registerTrades(VillagerTradesEvent event) { new BasicTrade(7, new ItemStack(Items.STONE_PICKAXE), 4, 2, 0.5F), new BasicTrade(7, new ItemStack(Items.STONE_SHOVEL), 4, 2, 0.5F) )) - .put(2, Arrays.asList( - RandomChoiceCheckTrade.ofNestedMap(4, 7, 8, 2, 0.5F, ItemHandler.FOSSIL_ITEMS), - new UseEmeraldToCookRawMeat(3, 6, 16, 2, 0.5F), - new BasicTrade(11, new ItemStack(Items.IRON_PICKAXE), 4, 1, 0.5F), - new BasicTrade(11, new ItemStack(Items.IRON_SHOVEL), 4, 1, 0.5F) - )) + //TODO (wp)s +// .put(2, Arrays.asList( +// RandomChoiceCheckTrade.ofMap(4, 7, 8, 2, 0.5F, Fossils.ITEMS), +// new UseEmeraldToCookRawMeat(3, 6, 16, 2, 0.5F), +// new BasicTrade(11, new ItemStack(Items.IRON_PICKAXE), 4, 1, 0.5F), +// new BasicTrade(11, new ItemStack(Items.IRON_SHOVEL), 4, 1, 0.5F) +// )) .build() ); } @@ -166,6 +168,20 @@ public RandomChoiceCheckTrade(int emeralds, int result, int maxTrades, int xp, f this.mul = mul; } + public static RandomChoiceCheckTrade ofMap(int emeralds, int result, int maxTrades, int xp, float mul, Map map) { + return new RandomChoiceCheckTrade(emeralds, result, maxTrades, xp, mul, map.values().stream() + .map(ItemStack::new) + .toArray(ItemStack[]::new) + ); + } + + public static RandomChoiceCheckTrade ofMap(int emeralds, int result, int maxTrades, int xp, float mul, Multimap map) { + return new RandomChoiceCheckTrade(emeralds, result, maxTrades, xp, mul, map.values().stream() + .map(ItemStack::new) + .toArray(ItemStack[]::new) + ); + } + public static RandomChoiceCheckTrade ofMap(int emeralds, int result, int maxTrades, int xp, float mul, RegistryMap map) { return new RandomChoiceCheckTrade(emeralds, result, maxTrades, xp, mul, map.values().stream() .map(ItemStack::new) diff --git a/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/Digsite.java b/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/Digsite.java index fab4d175..4fc1b3c6 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/Digsite.java +++ b/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/Digsite.java @@ -5,13 +5,11 @@ import lombok.AllArgsConstructor; import net.dumbcode.dumblibrary.server.utils.CollectorUtils; import net.dumbcode.dumblibrary.server.utils.WorldUtils; -import net.dumbcode.projectnublar.server.block.FossilBlock; import net.dumbcode.projectnublar.server.dinosaur.Dinosaur; import net.dumbcode.projectnublar.server.utils.BlockUtils; import net.dumbcode.projectnublar.server.world.LootTableHandler; import net.dumbcode.projectnublar.server.world.constants.ConstantDefinition; import net.dumbcode.projectnublar.server.world.constants.StructureConstants; -import net.dumbcode.projectnublar.server.world.gen.DigsiteStructureNetwork; import net.dumbcode.projectnublar.server.world.structures.Structure; import net.dumbcode.projectnublar.server.world.structures.StructureInstance; import net.dumbcode.projectnublar.server.world.structures.structures.template.data.DataHandler; @@ -362,11 +360,12 @@ private int getTopSolid(BlockPos pos) { } private void setFossils(Set fossilPositions, Dinosaur dinosaur) { - for (BlockPos pos : fossilPositions) { - if (!this.world.getBlockState(pos).canBeReplaced(Fluids.EMPTY)) { - this.world.setBlock(pos, FossilBlock.FossilType.guess(this.world.getBlockState(pos), dinosaur), 2); - } - } + //TODO +// for (BlockPos pos : fossilPositions) { +// if (!this.world.getBlockState(pos).canBeReplaced(Fluids.EMPTY)) { +// this.world.setBlock(pos, FossilBlock.FossilType.guess(this.world.getBlockState(pos), dinosaur), 2); +// } +// } } public void iterateCircle(double distX, double distZ, float xSize, float zSize, int radius, BiConsumer consumer) { diff --git a/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/template/NBTTemplate.java b/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/template/NBTTemplate.java index fea7f316..f179ca31 100644 --- a/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/template/NBTTemplate.java +++ b/src/main/java/net/dumbcode/projectnublar/server/world/structures/structures/template/NBTTemplate.java @@ -241,7 +241,7 @@ public static NBTTemplate readFromFile(ResourceLocation location, @Nullable Stru @Cleanup InputStream stream = ProjectNublar.class.getResourceAsStream("/assets/" + location.getNamespace() + "/structures/" + location.getPath() + ".nbt"); template.load(CompressedStreamTools.readCompressed(stream)); } catch (IOException e) { - ProjectNublar.getLogger().error("Error loading structure " + location, e); + ProjectNublar.LOGGER.error("Error loading structure " + location, e); } return new NBTTemplate(template, placement == null ? StructurePlacement.EMPTY : placement); diff --git a/src/main/resources/assets/projectnublar/lang/en_us.json b/src/main/resources/assets/projectnublar/lang/en_us.json index b3853f52..9cd73832 100644 --- a/src/main/resources/assets/projectnublar/lang/en_us.json +++ b/src/main/resources/assets/projectnublar/lang/en_us.json @@ -5,6 +5,8 @@ "projectnublar.gui.skeletal_builder": "Skeletal Builder", + "projectnublar.fossil": "%s %s Fossil", + "projectnublar.gui.tracking.health": "Health:", "projectnublar.gui.tracking.dinosaur": "Dinosaur: %s", "projectnublar.gui.tracking.pregnancy": "Pregnancy Information:", diff --git a/src/main/resources/assets/projectnublar/models/block/fossil.json b/src/main/resources/assets/projectnublar/models/block/fossil.json index 1c683fa7..c70156ed 100644 --- a/src/main/resources/assets/projectnublar/models/block/fossil.json +++ b/src/main/resources/assets/projectnublar/models/block/fossil.json @@ -23,7 +23,19 @@ "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } + } + }, + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#cracks", "cullface": "north" }, + "east": { "uv": [0, 0, 16, 16], "texture": "#cracks", "cullface": "east" }, + "south": { "uv": [0, 0, 16, 16], "texture": "#cracks", "cullface": "south" }, + "west": { "uv": [0, 0, 16, 16], "texture": "#cracks", "cullface": "west" }, + "up": { "uv": [16, 16, 0, 0], "texture": "#cracks", "cullface": "up" }, + "down": { "uv": [16, 0, 0, 16], "texture": "#cracks", "cullface": "down" } } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/projectnublar/textures/block/cracks_full.png b/src/main/resources/assets/projectnublar/textures/block/cracks_full.png new file mode 100644 index 00000000..72ed3a12 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/cracks_full.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/cracks_low.png b/src/main/resources/assets/projectnublar/textures/block/cracks_low.png new file mode 100644 index 00000000..26353808 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/cracks_low.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/cracks_medium.png b/src/main/resources/assets/projectnublar/textures/block/cracks_medium.png new file mode 100644 index 00000000..65d34664 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/cracks_medium.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_arm.png new file mode 100755 index 00000000..2e6c9faf Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_leg.png new file mode 100755 index 00000000..1fba4db0 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..4cc96873 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/neck.png new file mode 100755 index 00000000..60cab36e Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/pterosaur_tail.png new file mode 100755 index 00000000..eb222328 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/quadruple_leg.png new file mode 100755 index 00000000..4ed92c06 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/ribcage.png new file mode 100755 index 00000000..0e34bc35 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/sauroped_neck.png new file mode 100755 index 00000000..9f0355e6 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/wing.png new file mode 100755 index 00000000..0d787d5f Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/item/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_arm.png new file mode 100755 index 00000000..aa4820b3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_leg.png new file mode 100755 index 00000000..fc75d6ae Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..4e0ea804 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/neck.png new file mode 100755 index 00000000..c074f4f5 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/pterosaur_tail.png new file mode 100755 index 00000000..7faf4a44 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/quadruple_leg.png new file mode 100755 index 00000000..62a3bc51 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/ribcage.png new file mode 100755 index 00000000..09e49e91 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/sauroped_neck.png new file mode 100755 index 00000000..3ce08480 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/wing.png new file mode 100755 index 00000000..e14c788d Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/common/overlay/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/ammonite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/ammonite.png new file mode 100644 index 00000000..b0dae682 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/ammonite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/fish.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/fish.png new file mode 100644 index 00000000..25a3e3e3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/fish.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/lizard.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/lizard.png new file mode 100644 index 00000000..c8e9e6a2 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/lizard.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/trilobite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/trilobite.png new file mode 100644 index 00000000..72906c6b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/misc/item/trilobite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/brachiosaurus_skull.png new file mode 100755 index 00000000..2ac577ee Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/dilophosaurus_skull.png new file mode 100755 index 00000000..595f8398 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/gallimimus_skull.png new file mode 100755 index 00000000..f7ec6fd1 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/triceratops_skull.png new file mode 100755 index 00000000..3ab3579a Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/tyrannosaurus_skull.png new file mode 100755 index 00000000..f38e53be Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/velociraptor_skull.png new file mode 100755 index 00000000..549fb021 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/item/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/brachiosaurus_skull.png new file mode 100755 index 00000000..3f133db3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/dilophosaurus_skull.png new file mode 100755 index 00000000..3ea47d1a Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/gallimimus_skull.png new file mode 100755 index 00000000..353f4aee Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/triceratops_skull.png new file mode 100755 index 00000000..7bade70f Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/tyrannosaurus_skull.png new file mode 100755 index 00000000..75ea7a8d Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/velociraptor_skull.png new file mode 100755 index 00000000..36e0e7cf Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fossilized/skull/overlay/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_arm.png new file mode 100755 index 00000000..0567b59e Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_leg.png new file mode 100755 index 00000000..f2a5f93c Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..aec04938 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/neck.png new file mode 100755 index 00000000..8f15f230 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/pterosaur_tail.png new file mode 100755 index 00000000..2f0d8616 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/quadruple_leg.png new file mode 100755 index 00000000..cafc869e Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/ribcage.png new file mode 100755 index 00000000..5390cb41 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/sauroped_neck.png new file mode 100755 index 00000000..48a06323 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/wing.png new file mode 100755 index 00000000..713bcf24 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/item/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_arm.png new file mode 100755 index 00000000..b6b253bf Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_leg.png new file mode 100755 index 00000000..9d16eecc Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..6edcca8a Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/neck.png new file mode 100755 index 00000000..f46895cd Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/pterosaur_tail.png new file mode 100755 index 00000000..ee3c4e41 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/quadruple_leg.png new file mode 100755 index 00000000..0f6e5ccc Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/ribcage.png new file mode 100755 index 00000000..459dd513 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/sauroped_neck.png new file mode 100755 index 00000000..8f6753cd Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/wing.png new file mode 100755 index 00000000..7f45da50 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/common/overlay/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/ammonite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/ammonite.png new file mode 100644 index 00000000..b0dae682 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/ammonite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/fish.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/fish.png new file mode 100644 index 00000000..25a3e3e3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/fish.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/lizard.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/lizard.png new file mode 100644 index 00000000..c8e9e6a2 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/lizard.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/trilobite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/trilobite.png new file mode 100644 index 00000000..72906c6b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/item/trilobite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/ammonite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/ammonite.png new file mode 100644 index 00000000..b0dae682 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/ammonite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/fish.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/fish.png new file mode 100644 index 00000000..25a3e3e3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/fish.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/lizard.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/lizard.png new file mode 100644 index 00000000..c8e9e6a2 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/lizard.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/trilobite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/trilobite.png new file mode 100644 index 00000000..72906c6b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/misc/overlay/trilobite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/brachiosaurus_skull.png new file mode 100755 index 00000000..9a360775 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/dilophosaurus_skull.png new file mode 100755 index 00000000..e28a54c9 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/gallimimus_skull.png new file mode 100755 index 00000000..9b8d675f Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/triceratops_skull.png new file mode 100755 index 00000000..3a6dd7fb Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/tyrannosaurus_skull.png new file mode 100755 index 00000000..36e16cc7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/velociraptor_skull.png new file mode 100755 index 00000000..4814e629 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/item/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/brachiosaurus_skull.png new file mode 100755 index 00000000..4f41f627 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/dilophosaurus_skull.png new file mode 100755 index 00000000..072ac77c Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/gallimimus_skull.png new file mode 100755 index 00000000..d44bb563 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/triceratops_skull.png new file mode 100755 index 00000000..2daae7ab Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/tyrannosaurus_skull.png new file mode 100755 index 00000000..4ce62235 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/velociraptor_skull.png new file mode 100755 index 00000000..4ebb8b9d Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fragmented/skull/overlay/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_arm.png new file mode 100755 index 00000000..d01f4c7c Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_leg.png new file mode 100755 index 00000000..5b7f24a0 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..3d6abb73 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/neck.png new file mode 100755 index 00000000..dad63d71 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/pterosaur_tail.png new file mode 100755 index 00000000..abcbce96 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/quadruple_leg.png new file mode 100755 index 00000000..fe1dcef5 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/ribcage.png new file mode 100755 index 00000000..4fb2abf4 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/sauroped_neck.png new file mode 100755 index 00000000..051e372b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/wing.png new file mode 100755 index 00000000..73465ad5 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/item/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_arm.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_arm.png new file mode 100755 index 00000000..4c96a380 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_arm.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_leg.png new file mode 100755 index 00000000..14a16612 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_sickle_claw_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_sickle_claw_leg.png new file mode 100755 index 00000000..18558455 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/bipedal_sickle_claw_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feather.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feather.png new file mode 100644 index 00000000..dbb7c103 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feather.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feet.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feet.png new file mode 100644 index 00000000..d087a997 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/feet.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/imprint.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/imprint.png new file mode 100644 index 00000000..5e6cf240 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/imprint.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/neck.png new file mode 100755 index 00000000..1ab9386b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/pterosaur_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/pterosaur_tail.png new file mode 100755 index 00000000..0d67380f Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/pterosaur_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/quadruple_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/quadruple_leg.png new file mode 100755 index 00000000..613965bb Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/quadruple_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/ribcage.png new file mode 100755 index 00000000..b188a322 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/sauroped_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/sauroped_neck.png new file mode 100755 index 00000000..1338e463 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/sauroped_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/tooth.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/tooth.png new file mode 100644 index 00000000..613453b7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/tooth.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/wing.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/wing.png new file mode 100755 index 00000000..85f812b0 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/common/overlay/wing.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/ammonite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/ammonite.png new file mode 100644 index 00000000..b0dae682 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/ammonite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/fish.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/fish.png new file mode 100644 index 00000000..25a3e3e3 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/fish.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/lizard.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/lizard.png new file mode 100644 index 00000000..c8e9e6a2 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/lizard.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/trilobite.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/trilobite.png new file mode 100644 index 00000000..72906c6b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/trilobite.png differ diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_foot.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_foot.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_foot.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_foot.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_claw.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_hand.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_claw.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_hand.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_leg.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_leg.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_leg.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_neck.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_neck.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_neck.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_pelvis.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_pelvis.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_pelvis.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_pelvis.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_ribcage.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_ribcage.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_ribcage.png diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_tail.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_tail.png rename to src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/item/tyrannosaurus_tail.png diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_foot.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_foot.png new file mode 100755 index 00000000..60087e9f Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_foot.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_hand.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_hand.png new file mode 100755 index 00000000..278cfcda Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_hand.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_leg.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_leg.png new file mode 100755 index 00000000..477a4a42 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_leg.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_neck.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_neck.png new file mode 100755 index 00000000..7d420d5b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_neck.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_pelvis.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_pelvis.png new file mode 100755 index 00000000..f137c3d8 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_pelvis.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_ribcage.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_ribcage.png new file mode 100755 index 00000000..445ee8f7 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_ribcage.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_tail.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_tail.png new file mode 100755 index 00000000..c5f686ef Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/misc/overlay/tyrannosaurus_tail.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/brachiosaurus_skull.png new file mode 100755 index 00000000..1b7406ce Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/dilophosaurus_skull.png new file mode 100755 index 00000000..334fc2d1 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/gallimimus_skull.png new file mode 100755 index 00000000..18fdc44b Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/triceratops_skull.png new file mode 100755 index 00000000..a0bc8116 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/tyrannosaurus_skull.png new file mode 100755 index 00000000..9c286adc Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/velociraptor_skull.png new file mode 100755 index 00000000..87bce3c1 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/item/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/brachiosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/brachiosaurus_skull.png new file mode 100755 index 00000000..71df24c4 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/brachiosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/dilophosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/dilophosaurus_skull.png new file mode 100755 index 00000000..ceab95b6 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/dilophosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/gallimimus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/gallimimus_skull.png new file mode 100755 index 00000000..d21a1d88 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/gallimimus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/triceratops_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/triceratops_skull.png new file mode 100755 index 00000000..1b542a01 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/triceratops_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/tyrannosaurus_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/tyrannosaurus_skull.png new file mode 100755 index 00000000..04d7f87c Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/tyrannosaurus_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/velociraptor_skull.png b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/velociraptor_skull.png new file mode 100755 index 00000000..ab8b81b6 Binary files /dev/null and b/src/main/resources/assets/projectnublar/textures/block/fossil/fresh/skull/overlay/velociraptor_skull.png differ diff --git a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_skull.png b/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_skull.png deleted file mode 100644 index 875c3841..00000000 Binary files a/src/main/resources/assets/projectnublar/textures/item/tyrannosaurus_fossil_skull.png and /dev/null differ diff --git a/src/main/resources/projectnublar.mixins.json b/src/main/resources/projectnublar.mixins.json new file mode 100644 index 00000000..1aeb8cf9 --- /dev/null +++ b/src/main/resources/projectnublar.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "package": "net.dumbcode.projectnublar.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "projectnublar.refmap.json", + "mixins": [ + "BlockLootTablesInvoker", + "BlockModelProviderInvoker", + "PlayerInventoryMixin", + ], + "client": [ + "SimpleBakedModelAccessor" + ], + "minVersion": "0.8" +} \ No newline at end of file