Overview

Crystal Infection is a Minecraft mod centered around a mysterious crystalline corruption that spreads through the world. Unlike a normal infection, the crystal can become a source of power, allowing the player to transform and control the infection.

Core Theme

A living crystal force is changing the world. Players can discover its secrets, survive infected creatures, and eventually become part of the crystal itself.


Crystal Blocks

Terrain

Special Blocks


Resources

Ores and Materials

Crystal materials are used for crafting tools, armor, abilities, and advanced structures.


Plants and Environment

Crystal Flora

Crystal plants spread the infection and create unique infected landscapes.


Crystal Equipment

Tools

Armor

Crystal equipment provides strong protection and a futuristic magical appearance.


Infected Creatures

Hostile Mobs

Each creature shows different levels of crystal growth and corruption.


Texture Style

Texture Pack Settings


END OF DOCUMENT

Crystal Human — Player Transformation Document

Overview

The Crystal Human is the ultimate transformation in the Crystal Infection mod. Instead of losing control, the player becomes a fully crystallized being while keeping their identity, abilities, and decisions.


Appearance

Crystal Human Form

Texture Specifications


Player Control

The Crystal Human is not a monster.

The player keeps:

The transformation is an evolution rather than a curse.


Crystal Human Abilities

Defensive Powers

Regeneration

Crystal Growth

Mobility


Weaknesses

Possible balancing mechanics:


Transformation Progression

  1. Discover the Crystal Heart.
  2. Become infected by the crystal.
  3. Fully transformed into the Crystal Human.
  4. Unlock abilities through Crystal Shards.
  5. Master the Crystal Infection and decide its future.

Crystal Human Variants

Possible future forms:

public class TealMeteorEntity extends FallingBlockEntity {

    @Override

    public void tick() {

        super.tick();

        // Smoke trail

        level().addParticle(

                ParticleTypes.SOUL_FIRE_FLAME,

                getX(),

                getY(),

                getZ(),

                0,

                -0.1,

                0

        );

        // Impact

        if (this.onGround()) {

            BlockPos center = this.blockPosition();

            // Small explosion (doesn't destroy everything)

            level().explode(

                    this,

                    center.getX(),

                    center.getY(),

                    center.getZ(),

                    4.0F,

                    Level.ExplosionInteraction.NONE

            );

            // Create infection crater

            createCrystalCrater(center);

            discard();

        }

    }

}

private void createCrystalCrater(BlockPos center) {

    int radius = 8;

    for (int x = -radius; x <= radius; x++) {

        for (int y = -3; y <= 2; y++) {

            for (int z = -radius; z <= radius; z++) {

                BlockPos pos = center.offset(x, y, z);

                double distance = Math.sqrt(x*x + y*y + z*z);

                if(distance <= radius) {

                    if(level().getRandom().nextFloat() < 0.7F){

                        level().setBlock(

                                pos,

                                ModBlocks.TEAL_CRYSTAL_BLOCK.get().defaultBlockState(),

                                3

                        );

                    }

                }

            }

        }

    }

}

AABB area = new AABB(center).inflate(20);

for(LivingEntity entity :

        level().getEntitiesOfClass(LivingEntity.class, area)){

    entity.addEffect(new MobEffectInstance(

            ModEffects.TEAL_INFECTION.get(),

            1200,

            0

    ));

}

@SubscribeEvent

public static void worldTick(LevelTickEvent.Post event){

    Level level = event.getLevel();

    if(level.getRandom().nextInt(24000) == 0){

        BlockPos spawn = new BlockPos(

                level.getRandom().nextInt(5000) - 2500,

                250,

                level.getRandom().nextInt(5000) - 2500

        );

        TealMeteorEntity meteor =

                new TealMeteorEntity(level);

        meteor.setPos(

                spawn.getX(),

                spawn.getY(),

                spawn.getZ()

        );

        level.addFreshEntity(meteor);

    }

}

public class MeteorManager {

    // Total meteors that will ever fall

    public static final int MAX_METEORS =

            5 + new Random().nextInt(6); // 5-10

    public static int meteorsSpawned = 0;

    public static boolean canSpawnMeteor() {

        return meteorsSpawned < MAX_METEORS;

    }

    public static void meteorSpawned() {

        meteorsSpawned++;

    }

}

@SubscribeEvent

public static void onWorldTick(LevelTickEvent.Post event) {

    Level level = event.getLevel();

    // Stop if we've reached the limit

    if (!MeteorManager.canSpawnMeteor()) {

        return;

    }

    // Random chance every tick

    if (level.getRandom().nextInt(24000) == 0) {

        BlockPos spawnPos = new BlockPos(

                level.getRandom().nextInt(5000) - 2500,

                250,

                level.getRandom().nextInt(5000) - 2500

        );

        TealMeteorEntity meteor = new TealMeteorEntity(level);

        meteor.setPos(spawnPos.getX(), spawnPos.getY(), spawnPos.getZ());

        level.addFreshEntity(meteor);

        MeteorManager.meteorSpawned();

        System.out.println(

                "Meteor " +

                MeteorManager.meteorsSpawned +

                " of " +

                MeteorManager.MAX_METEORS

        );

    }

}

if (MeteorManager.meteorsSpawned >= MeteorManager.MAX_METEORS) {

    for (ServerPlayer player : server.getPlayerList().getPlayers()) {

        player.sendSystemMessage(Component.literal(

            "§bThe final Teal Crystal Meteor has fallen. The infection has begun..."

        ));

    }

    // Start global infection phase here.

}

for (ServerPlayer player : server.getPlayerList().getPlayers()) {

    player.sendSystemMessage(Component.literal(

        "§3A Teal Crystal Meteor has crashed! (" +

        MeteorManager.meteorsSpawned +

        "/" +

        MeteorManager.MAX_METEORS +

        ")"

    ));

}

public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =

        DeferredRegister.create(Registries.CREATIVE_MODE_TAB, "tealcrystal");

public static final RegistryObject<CreativeModeTab> TEAL_CRYSTAL_TAB =

        CREATIVE_MODE_TABS.register("teal_crystal_tab",

                () -> CreativeModeTab.builder()

                        .title(Component.literal("Teal Crystal Infection"))

                        .icon(() -> new ItemStack(ModItems.TEAL_CRYSTAL.get()))

                        .displayItems((params, output) -> {

                            output.accept(ModBlocks.TEAL_CRYSTAL_BLOCK.get());

                            output.accept(ModBlocks.INFECTED_STONE.get());

                            output.accept(ModItems.TEAL_CRYSTAL.get());

                            output.accept(ModItems.TEAL_CRYSTAL_SHARD.get());

                            output.accept(ModItems.INFECTED_SPAWN_EGG.get());

                            output.accept(ModItems.CRYSTAL_BEAST_SPAWN_EGG.get());

                        })

                        .build());

@SubscribeEvent

public static void onPlayerTick(PlayerTickEvent event) {

    Player player = event.player;

    BlockPos below = player.blockPosition().below();

    if (player.level().getBlockState(below).is(ModBlocks.TEAL_CRYSTAL_BLOCK.get())) {

        InfectionData data = InfectionData.get(player);

        data.progress++;

        player.addEffect(new MobEffectInstance(

                MobEffects.MOVEMENT_SLOWDOWN,

                10,

                1,

                false,

                false

        ));

        player.level().addParticle(

                ParticleTypes.SCULK_SOUL,

                player.getX(),

                player.getY() + 1,

                player.getZ(),

                0,

                0.03,

                0

        );

        if (data.progress >= 200) {

            data.setInfected(true);

        }

    } else {

        InfectionData.get(player).progress = 0;

    }

}

controller.setAnimation(

    RawAnimation.begin().thenPlay("animation.player.infect")

);

if(grabTimer > 0){

    victim.addEffect(

        new MobEffectInstance(

            MobEffects.MOVEMENT_SLOWDOWN,

            20,

            4

        )

    );

    infectionProgress += 2;

}

if(infectionProgress >= 100){

    victim.turnIntoInfected();

}

Player walks onto crystal

        ↓

Crystal particles appear

        ↓

Legs crystallize

        ↓

Movement slows

        ↓

Infected human notices player

        ↓

Runs toward player

        ↓

Grab animation starts

        ↓

Player struggles

        ↓

Crystal spreads across body

        ↓

Player becomes infected

package com.example.tealinfection;

import net.minecraft.core.BlockPos;

import net.minecraft.server.level.ServerLevel;

import net.minecraft.world.effect.MobEffectInstance;

import net.minecraft.world.effect.MobEffects;

import net.minecraft.world.entity.LivingEntity;

import net.minecraft.world.level.block.Block;

import net.minecraft.world.level.block.Blocks;

import java.util.HashMap;

import java.util.UUID;

public class InfectionManager {

    public static HashMap<UUID, Integer> infection = new HashMap<>();

    // Replace with your custom block

    public static final Block CRYSTAL_BLOCK = Blocks.PRISMARINE;

    public static void infect(LivingEntity entity) {

        infection.putIfAbsent(entity.getUUID(), 1);

    }

    public static boolean infected(LivingEntity entity) {

        return infection.containsKey(entity.getUUID());

    }

    public static void tick(ServerLevel world, LivingEntity entity) {

        if (!infected(entity))

            return;

        int stage = infection.get(entity.getUUID());

        stage++;

        infection.put(entity.getUUID(), stage);

        entity.addEffect(new MobEffectInstance(

                MobEffects.MOVEMENT_SLOWDOWN,

                40,

                Math.min(stage / 200,4)

        ));

        entity.addEffect(new MobEffectInstance(

                MobEffects.DIG_SLOWDOWN,

                40,

                Math.min(stage / 200,4)

        ));

        spreadToEntities(world, entity);

        infectGround(world, entity);

    }

    private static void spreadToEntities(ServerLevel world, LivingEntity source){

        double radius = 3.5;

        for(LivingEntity target : world.getEntitiesOfClass(

                LivingEntity.class,

                source.getBoundingBox().inflate(radius))){

            if(target == source)

                continue;

            if(!infected(target)){

                if(world.random.nextFloat() < 0.03f){

                    infect(target);

                }

            }

        }

    }

    private static void infectGround(ServerLevel world, LivingEntity entity){

        BlockPos center = entity.blockPosition();

        for(int x=-2;x<=2;x++){

            for(int z=-2;z<=2;z++){

                BlockPos pos = center.offset(x,-1,z);

                if(world.random.nextFloat() < 0.04f){

                    world.setBlockAndUpdate(pos,

                            CRYSTAL_BLOCK.defaultBlockState());

                }

            }

        }

    }

}

@SubscribeEvent

public static void onLivingTick(LivingEvent.LivingTickEvent event){

    if(event.getEntity().level().isClientSide())

        return;

    InfectionManager.tick(

        (ServerLevel)event.getEntity().level(),

        event.getEntity()

    );

}

@SubscribeEvent

public static void attacked(LivingAttackEvent event){

    if(!(event.getSource().getEntity() instanceof LivingEntity attacker))

        return;

    LivingEntity victim = event.getEntity();

    if(InfectionManager.infected(attacker)){

        if(Math.random() < 0.40){

            InfectionManager.infect(victim);

        }

    }

}

if(entity.level().getBlockState(entity.blockPosition().below())

        .is(InfectionManager.CRYSTAL_BLOCK)){

    InfectionManager.infect(entity);

}

{"prompt":"Create a Minecraft-style pixel art texture sheet for a teal crystal infection mod. Arrange three separate 16x16 textures on a transparent background:\n\n1. Infected Grass: the entire block is completely overtaken by bright teal crystal, with no visible grass remaining. It should look like a solid crystal block with faceted cyan, aqua, and turquoise crystals.\n\n2. Infected Dirt: also completely transformed into the same solid teal crystal block, matching the infected grass exactly.\n\n3. Infected Stone: mostly gray stone, but with glowing teal crystals growing through it, on its surface, embedded inside it, and protruding from cracks. The stone should still be recognizable while heavily infested by crystal.\n\nStyle: Minecraft vanilla-inspired pixel art, crisp 16x16 textures, seamless tiling, high contrast, suitable for a Minecraft Java mod resource pack."}

if(target instanceof LivingEntity living){

    if(!CrystalData.isInfected(living)){

        living.hurt(source, damage);

        if(random.nextFloat() < 0.35F){

            CrystalData.infect(living);

        }

    }

}

Stone

 ↓

Crystal Stone

Dirt

 ↓

Crystal Block

Grass

 ↓

Crystal Block

Sand

 ↓

Crystal Sand

Logs

 ↓

Crystal Wood

Leaves

 ↓

Crystal Leaves

Healthy

   ↓

Infected

   ↓

Crystal Growth

   ↓

Almost Encased

   ↓

Crystal Human

Making all of them solid teal crystal gives them a unified ancient gemstone theme. Their bodies are no longer blue, purple, or green — they are carved from a powerful teal crystal mineral with glowing cyan energy inside.

💎 Teal Crystal Zombie

Appearance

Animations

Idle

Walk

Attack

Death


💎 Teal Crystal Skeleton

Appearance

Animations

Idle

Walk

Attack

Death


💎 Teal Crystal Spider

Appearance

Animations

Idle

Movement

Attack

Death


💎 Teal Crystal Creeper

Appearance

Animations

Idle

Movement

Charging

Explosion


💎 Teal Crystal Enderman

Appearance

Animations

Idle

Movement

Teleport

Attack

Death


🌊 Shared Teal Crystal Theme

They would look like a single species of ancient teal crystal monsters from a lost magical dimension.

💎 Teal Crystal Player Animation Set

A fully crystallized teal player would look like a living gemstone warrior — a solid teal crystal body with glowing cyan energy flowing inside.

💎 Appearance


🧍 Idle Animation


🚶 Walking Animation


🏃 Running Animation


🦘 Jump Animation

Start

Air

Landing


⚔️ Attack Animation

Punch

Sword Swing

Mining


🛡️ Damage Animation


✨ Special Ability Animation: Crystal Power

Charging

Release


💤 Sleeping Animation


☠️ Death Animation


🌊 Overall Style

Movement: Smooth + powerful
Material: Solid teal gemstone
Energy: Bright cyan glow
Effects: Floating shards, crystal dust, glowing cracks