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.
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 materials are used for crafting tools, armor, abilities, and advanced structures.
Crystal plants spread the infection and create unique infected landscapes.
Crystal equipment provides strong protection and a futuristic magical appearance.
Each creature shows different levels of crystal growth and corruption.
END OF DOCUMENT
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.
The Crystal Human is not a monster.
The player keeps:
The transformation is an evolution rather than a curse.
Possible balancing mechanics:
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.
Idle
Walk
Attack
Death
Idle
Walk
Attack
Death
Idle
Movement
Attack
Death
Idle
Movement
Charging
Explosion
Idle
Movement
Teleport
Attack
Death
They would look like a single species of ancient teal crystal monsters from a lost magical dimension.
A fully crystallized teal player would look like a living gemstone warrior — a solid teal crystal body with glowing cyan energy flowing inside.
Start
Air
Landing
Charging
Release
Movement: Smooth + powerful
Material: Solid teal gemstone
Energy: Bright cyan glow
Effects: Floating shards, crystal dust, glowing cracks