CrystalInfection/
├── src/main/java/com/example/crystalinfection/
│ ├── CrystalInfection.java
│ │
│ ├── registry/
│ │ ├── ModBlocks.java
│ │ ├── ModItems.java
│ │ ├── ModEntities.java
│ │ ├── ModEffects.java
│ │ └── ModCreativeTab.java
│ │
│ ├── entity/
│ │ ├── CrystalBruteEntity.java
│ │ ├── CrystalGuardianEntity.java
│ │ ├── CrystalBossEntity.java
│ │ ├── CrystalZombieEntity.java
│ │ ├── CrystalSkeletonEntity.java
│ │ ├── CrystalSpiderEntity.java
│ │ ├── CrystalCreeperEntity.java
│ │ └── CrystalEndermanEntity.java
│ │
│ ├── player/
│ │ ├── CrystalPlayerData.java
│ │ ├── CrystalTransformation.java
│ │ └── CrystalAbilities.java
│ │
│ ├── infection/
│ │ ├── InfectionManager.java
│ │ ├── MeteorManager.java
│ │ └── CrystalSpread.java
│ │
│ ├── world/
│ │ ├── CrystalMeteorEntity.java
│ │ └── CrystalWorldEvents.java
│ │
│ └── client/
│ ├── renderer/
│ └── model/
│
└── src/main/resources/
└── assets/crystalinfection/
├── textures/
├── models/
├── sounds/
└── lang/
ModBlocks.java
CRYSTAL_GRASS
CRYSTAL_DIRT
CRYSTAL_STONE
CRYSTAL_DEEPSLATE
CRYSTAL_SAND
CRYSTAL_GRAVEL
CRYSTAL_ICE
CRYSTAL_LOG
CRYSTAL_LEAVES
CRYSTAL_PLANKS
CRYSTAL_HEART
CRYSTAL_SPIKES
CRYSTAL_LANTERN
CRYSTAL_PORTAL_FRAME
CRYSTAL_FIRE
ANIMATED_CRYSTAL_ORE
ANIMATED_CRYSTAL_HEART
ModItems.java
CRYSTAL_SHARD
REFINED_CRYSTAL
CRYSTAL_CORE
CRYSTAL_SWORD
CRYSTAL_PICKAXE
CRYSTAL_AXE
CRYSTAL_SHOVEL
CRYSTAL_HOE
CRYSTAL_HELMET
CRYSTAL_CHESTPLATE
CRYSTAL_LEGGINGS
CRYSTAL_BOOTS
public enum CrystalStage {
HUMAN,
BRUTE,
GUARDIAN,
BOSS
}
if(infectedBlocks >= 500){
stage = CrystalStage.BRUTE;
}
if(infectedBlocks >= 2500){
stage = CrystalStage.GUARDIAN;
}
if(infectedBlocks >= 10000){
stage = CrystalStage.BOSS;
}
public enum BossPhase {
CORRUPTION,
GUARDIAN_SUMMON,
APOCALYPSE,
FINAL_EVOLUTION
}
public class CrystalMeteorEvent {
public static int MAX_METEORS =
5 + new Random().nextInt(6);
public static void spawnMeteor(ServerLevel level){
if(MeteorManager.count >= MAX_METEORS)
return;
CrystalMeteorEntity meteor =
new CrystalMeteorEntity(
ModEntities.CRYSTAL_METEOR.get(),
level);
meteor.setPos(
level.random.nextInt(5000)-2500,
250,
level.random.nextInt(5000)-2500);
level.addFreshEntity(meteor);
MeteorManager.count++;
}
}
public class CrystalSpread {
public static void infectBlock(
ServerLevel level,
BlockPos pos){
if(level.getBlockState(pos)
.is(Blocks.GRASS_BLOCK)){
level.setBlock(
pos,
ModBlocks.CRYSTAL_GRASS
.get()
.defaultBlockState(),
3);
}
}
}
public class CrystalAbilities {
public static void crystalBarrier(Player player){
player.addEffect(
new MobEffectInstance(
MobEffects.DAMAGE_RESISTANCE,
200,
2));
}
public static void crystalDash(Player player){
player.setDeltaMovement(
player.getLookAngle()
.scale(2));
}
public static void spreadCrystal(Player player){
BlockPos pos =
player.blockPosition();
player.level()
.setBlock(
pos,
ModBlocks.CRYSTAL_STONE
.get()
.defaultBlockState(),
3);
}
}
assets/crystalinfection/textures/entity/
crystal_human.png
crystal_brute.png
crystal_guardian.png
crystal_boss.png
crystal_zombie.png
crystal_skeleton.png
crystal_spider.png
crystal_creeper.png
crystal_enderman.png
32x32 player skins
64x64 mobs
No transparency
Solid teal crystal
Cyan glowing cracks
Vanilla pixel style