package com.TheRPGAdventurer.server.entity.breeds; import java.util.HashSet; import java.util.Random; import java.util.Set; import javax.annotation.Nullable; import com.TheRPGAdventurer.RealmOfTheDragonsSoundEvents; import com.TheRPGAdventurer.server.entity.EntityTameableDragon; import net.minecraft.block.Block; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.util.DamageSource; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; /** * Base class for dragon breeds. * */ public abstract class DragonBreed { private final String skin; private final int color; private final Set immunities = new HashSet<>(); private final Set breedBlocks = new HashSet<>(); private final Set biomes = new HashSet<>(); protected final Random rand = new Random(); DragonBreed(String skin, int color) { this.skin = skin; this.color = color; // ignore suffocation damage addImmunity(DamageSource.drown); addImmunity(DamageSource.inWall); // assume that cactus needles don't do much damage to animals with horned scales addImmunity(DamageSource.cactus); // ignore damage from vanilla ender dragon addImmunity(DamageSource.dragonBreath); } public String getSkin() { return skin; } public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEFINED; } public int getColor() { return color; } public float getColorR() { return ((color >> 16) & 0xFF) / 255f; } public float getColorG() { return ((color >> 8) & 0xFF) / 255f; } public float getColorB() { return (color & 0xFF) / 255f; } protected final void addImmunity(DamageSource dmg) { immunities.add(dmg.damageType); } public boolean isImmuneToDamage(DamageSource dmg) { if (immunities.isEmpty()) { return false; } return immunities.contains(dmg.damageType); } //disabled protected final void addHabitatBlock(Block block) { breedBlocks.add(block); } //disabled public boolean isHabitatBlock(Block block) { return breedBlocks.contains(block); } //disabled protected final void addHabitatBiome(Biome biome) { biomes.add(biome); } //disabled public boolean isHabitatBiome(Biome biome) { return biomes.contains(biome); } //disabled the original mod used this to change the egg's breed on whatever environment it is on but It doesn't fit on me. public boolean isHabitatEnvironment(EntityTameableDragon dragon) { return false; } public Item[] getFoodItems() { return new Item[] { Items.PORKCHOP, Items.BEEF, Items.CHICKEN, Items.ROTTEN_FLESH, Items.WHEAT, Items.BEETROOT, Items.RABBIT, Items.CARROT, Items.COOKED_FISH, Items.COOKED_BEEF, Items.COOKED_CHICKEN, Items.COOKED_MUTTON, Items.COOKED_PORKCHOP, Items.COOKED_RABBIT}; } public Item getBreedingItem() { return Items.FISH; } public void onUpdate(EntityTameableDragon dragon) { placeFootprintBlocks(dragon); } protected void placeFootprintBlocks(EntityTameableDragon dragon) { // only apply on server if (!dragon.isServer()) { return; } // only apply on adult dragons that don't fly if (!dragon.isAdult() || dragon.isFlying()) { return; } // only apply if footprints are enabled float footprintChance = getFootprintChance(); if (footprintChance == 0) { return; } // footprint loop, from EntitySnowman.onLivingUpdate with slight tweaks World world = dragon.worldObj; for (int i = 0; i < 4; i++) { // place only if randomly selected if (world.rand.nextFloat() > footprintChance) { continue; } // get footprint position double bx = dragon.posX + (i % 2 * 2 - 1) * 0.25; double by = dragon.posY + 0.5; double bz = dragon.posZ + (i / 2 % 2 * 2 - 1) * 0.25; BlockPos pos = new BlockPos(bx, by, bz); // footprints can only be placed on empty space if (world.isAirBlock(pos)) { continue; } placeFootprintBlock(dragon, pos); } } protected void placeFootprintBlock(EntityTameableDragon dragon, BlockPos blockPos) { } protected float getFootprintChance() { return 0; } public abstract void onEnable(EntityTameableDragon dragon); public abstract void onDisable(EntityTameableDragon dragon); public abstract void onDeath(EntityTameableDragon dragon); public SoundEvent getLivingSound() { if (rand.nextInt(3) == 0) { return RealmOfTheDragonsSoundEvents.ENTITY_DRAGON_GROWL; } else { return RealmOfTheDragonsSoundEvents.ENTITY_DRAGON_BREATHE; } } public SoundEvent getHurtSound() { return SoundEvents.ENTITY_ENDERDRAGON_HURT; } public SoundEvent getDeathSound() { return RealmOfTheDragonsSoundEvents.ENTITY_DRAGON_DEATH; } public SoundEvent getWingsSound() { return SoundEvents.ENTITY_ENDERDRAGON_FLAP; } public SoundEvent getStepSound() { return RealmOfTheDragonsSoundEvents.ENTITY_DRAGON_STEP; } public SoundEvent getEatSound() { return SoundEvents.ENTITY_GENERIC_EAT; } public SoundEvent getAttackSound() { return SoundEvents.ENTITY_GENERIC_EAT; } public float getSoundPitch(SoundEvent sound) { return 1; } public float getSoundVolume(SoundEvent sound) { return 1; } }