diff --git a/src/main/java/com/minelittlepony/unicopia/CloudType.java b/src/main/java/com/minelittlepony/unicopia/CloudType.java index e56e385a..9237eade 100644 --- a/src/main/java/com/minelittlepony/unicopia/CloudType.java +++ b/src/main/java/com/minelittlepony/unicopia/CloudType.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia; -import com.minelittlepony.unicopia.entity.EntityCloud; +import com.minelittlepony.unicopia.entity.CloudEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; @@ -26,15 +26,15 @@ public enum CloudType { return true; } - return Predicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)e) - || (Predicates.MAGI.test(e) && EntityCloud.getFeatherEnchantStrength((PlayerEntity)e) > 0); + return EquinePredicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)e) + || (EquinePredicates.MAGI.test(e) && CloudEntity.getFeatherEnchantStrength((PlayerEntity)e) > 0); } if (e instanceof ItemEntity) { - return Predicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e); + return EquinePredicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e); } - if (e instanceof EntityCloud && e.hasVehicle()) { + if (e instanceof CloudEntity && e.hasVehicle()) { return canInteract(e.getVehicle()); } diff --git a/src/main/java/com/minelittlepony/unicopia/UConfig.java b/src/main/java/com/minelittlepony/unicopia/Config.java similarity index 92% rename from src/main/java/com/minelittlepony/unicopia/UConfig.java rename to src/main/java/com/minelittlepony/unicopia/Config.java index 48eee173..f3319836 100644 --- a/src/main/java/com/minelittlepony/unicopia/UConfig.java +++ b/src/main/java/com/minelittlepony/unicopia/Config.java @@ -15,16 +15,16 @@ import com.google.gson.annotations.Expose; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -public class UConfig { +public class Config { - private static UConfig instance = new UConfig(); + private static Config instance = new Config(); private static final Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() .setPrettyPrinting() .create(); - public static UConfig instance() { + public static Config instance() { return instance; } @@ -34,14 +34,14 @@ public class UConfig { try { if (file.exists()) { try(JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file)));) { - instance = gson.fromJson(reader, UConfig.class); + instance = gson.fromJson(reader, Config.class); } } } catch (IOException e) { e.printStackTrace(); } finally { if (instance == null) { - instance = new UConfig(); + instance = new Config(); } } @@ -112,7 +112,7 @@ public class UConfig { try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file)))) { writer.setIndent(" "); - gson.toJson(this, UConfig.class, writer); + gson.toJson(this, Config.class, writer); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/com/minelittlepony/unicopia/Predicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java similarity index 98% rename from src/main/java/com/minelittlepony/unicopia/Predicates.java rename to src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index 9c4d1bf4..190674fd 100644 --- a/src/main/java/com/minelittlepony/unicopia/Predicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -6,7 +6,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -public final class Predicates { +public final class EquinePredicates { public static final Predicate INTERACT_WITH_CLOUDS = player -> { return player != null && SpeciesList.instance().getPlayer(player).getSpecies().canInteractWithClouds(); }; diff --git a/src/main/java/com/minelittlepony/unicopia/MineLP.java b/src/main/java/com/minelittlepony/unicopia/MineLP.java index 94500a34..e9541e75 100644 --- a/src/main/java/com/minelittlepony/unicopia/MineLP.java +++ b/src/main/java/com/minelittlepony/unicopia/MineLP.java @@ -1,21 +1,20 @@ package com.minelittlepony.unicopia; -import net.minecraft.client.MinecraftClient; - public final class MineLP { private static boolean checkComplete; private static boolean modIsActive; + // TODO: /** * Returns true if mine little pony is present. That's all we need. */ static boolean modIsActive() { if (!checkComplete) { try { - MineLittlePony.getInstance(); + // MineLittlePony.instance(); // always true, but this will throw if we don't have what we need. - modIsActive = PonyRace.HUMAN.isHuman(); + // modIsActive = PonyRace.HUMAN.isHuman(); } catch (Exception e) { modIsActive = false; } @@ -29,7 +28,7 @@ public final class MineLP { return Race.HUMAN; } - switch (IPony.forPlayer(MinecraftClient.getInstance().player).getRace(false)) { + /*switch (IPony.forPlayer(MinecraftClient.getInstance().player).getRace(false)) { case ALICORN: return Race.ALICORN; case CHANGELING: @@ -49,6 +48,7 @@ public final class MineLP { default: return Race.EARTH; - } + }*/ + return Race.EARTH; } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/SpeciesList.java b/src/main/java/com/minelittlepony/unicopia/SpeciesList.java index e9f7f137..ff9f26dc 100644 --- a/src/main/java/com/minelittlepony/unicopia/SpeciesList.java +++ b/src/main/java/com/minelittlepony/unicopia/SpeciesList.java @@ -5,10 +5,11 @@ import java.util.UUID; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.UConfig; +import com.minelittlepony.unicopia.Config; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.entity.IEntity; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -21,17 +22,17 @@ public class SpeciesList { } public boolean whiteListRace(Race race) { - boolean result = UConfig.instance().getSpeciesWhiteList().add(race); + boolean result = Config.instance().getSpeciesWhiteList().add(race); - UConfig.instance().save(); + Config.instance().save(); return result; } public boolean unwhiteListRace(Race race) { - boolean result = UConfig.instance().getSpeciesWhiteList().remove(race); + boolean result = Config.instance().getSpeciesWhiteList().remove(race); - UConfig.instance().save(); + Config.instance().save(); return result; } @@ -41,7 +42,7 @@ public class SpeciesList { return false; } - return race.isDefault() || UConfig.instance().getSpeciesWhiteList().isEmpty() || UConfig.instance().getSpeciesWhiteList().contains(race); + return race.isDefault() || Config.instance().getSpeciesWhiteList().isEmpty() || Config.instance().getSpeciesWhiteList().contains(race); } public Race validate(Race race, PlayerEntity sender) { diff --git a/src/main/java/com/minelittlepony/unicopia/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/UBlocks.java index dc134ab7..ad07bef3 100644 --- a/src/main/java/com/minelittlepony/unicopia/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/UBlocks.java @@ -91,7 +91,7 @@ public class UBlocks { public static final Block apple_leaves = register(new FruitLeavesBlock() .growthChance(1200) .tint(0xFFEE81) - .fruit(ItemApple::getRandomItemStack) + .fruit(AppleItem::getRandomItemStack) .compost(w -> new ItemStack(UItems.rotten_apple)), "apple_leaves"); diff --git a/src/main/java/com/minelittlepony/unicopia/UClient.java b/src/main/java/com/minelittlepony/unicopia/UClient.java index 386c7732..094626b8 100644 --- a/src/main/java/com/minelittlepony/unicopia/UClient.java +++ b/src/main/java/com/minelittlepony/unicopia/UClient.java @@ -5,8 +5,9 @@ import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.minelittlepony.unicopia.client.UnicopiaClient; import com.minelittlepony.unicopia.entity.EntityFakeServerPlayer; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.mojang.authlib.GameProfile; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/minelittlepony/unicopia/UEffects.java b/src/main/java/com/minelittlepony/unicopia/UEffects.java index 9ad4cffb..7819c4de 100644 --- a/src/main/java/com/minelittlepony/unicopia/UEffects.java +++ b/src/main/java/com/minelittlepony/unicopia/UEffects.java @@ -1,6 +1,7 @@ package com.minelittlepony.unicopia; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.util.MagicalDamageSource; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.effect.StatusEffect; @@ -10,22 +11,20 @@ import net.minecraft.potion.Potion; public class UEffects { - public static final DamageSource food_poisoning = new DamageSource("food_poisoning").bypassesArmor(); - public static final StatusEffect FOOD_POISONING = new UPotion(Unicopia.MODID, "food_poisoning", true, 3484199) .setIconIndex(3, 1) .setSilent() .setEffectiveness(0.25) .setApplicator((p, e, i) -> { - StatusEffectInstance nausea = e.getActivePotionEffect(StatusEffects.NAUSEA); + StatusEffectInstance nausea = e.getStatusEffect(StatusEffects.NAUSEA); if (nausea == null) { - StatusEffect foodEffect = e.getActivePotionEffect(p); + StatusEffectInstance foodEffect = e.getStatusEffect(p); nausea = new StatusEffectInstance(StatusEffects.NAUSEA, foodEffect.getDuration(), foodEffect.getAmplifier(), foodEffect.getIsAmbient(), foodEffect.doesShowParticles()); e.addPotionEffect(nausea); } - e.attackEntityFrom(food_poisoning, i); + e.damage(MagicalDamageSource.FOOD_POISONING, i); }); } diff --git a/src/main/java/com/minelittlepony/unicopia/UEntities.java b/src/main/java/com/minelittlepony/unicopia/UEntities.java index b55b1385..d56664b9 100644 --- a/src/main/java/com/minelittlepony/unicopia/UEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/UEntities.java @@ -1,87 +1,70 @@ package com.minelittlepony.unicopia; -import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.client.render.entity.ButterflyEntityRenderer; -import com.minelittlepony.unicopia.client.render.entity.RenderCloud; -import com.minelittlepony.unicopia.client.render.entity.RenderCuccoon; -import com.minelittlepony.unicopia.client.render.entity.RenderGem; -import com.minelittlepony.unicopia.client.render.entity.RenderProjectile; -import com.minelittlepony.unicopia.client.render.entity.RenderRainbow; -import com.minelittlepony.unicopia.client.render.entity.RenderSpear; -import com.minelittlepony.unicopia.client.render.entity.RenderSpellbook; -import com.minelittlepony.unicopia.entity.EntityButterfly; -import com.minelittlepony.unicopia.entity.EntityCloud; -import com.minelittlepony.unicopia.entity.EntityConstructionCloud; +import com.minelittlepony.unicopia.entity.ButterflyEntity; +import com.minelittlepony.unicopia.entity.CloudEntity; +import com.minelittlepony.unicopia.entity.AdvancedProjectileEntity; +import com.minelittlepony.unicopia.entity.ConstructionCloudEntity; import com.minelittlepony.unicopia.entity.EntityCuccoon; import com.minelittlepony.unicopia.entity.EntityRacingCloud; -import com.minelittlepony.unicopia.entity.EntityRainbow; +import com.minelittlepony.unicopia.entity.RainbowEntity; import com.minelittlepony.unicopia.entity.EntitySpear; import com.minelittlepony.unicopia.entity.SpellcastEntity; -import com.minelittlepony.unicopia.entity.EntitySpellbook; -import com.minelittlepony.unicopia.entity.EntityWildCloud; -import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity; -import com.minelittlepony.unicopia.forgebullshit.BiomeBS; -import com.minelittlepony.unicopia.forgebullshit.EntityType; +import com.minelittlepony.util.collection.ListHelper; +import com.minelittlepony.unicopia.entity.SpellbookEntity; +import com.minelittlepony.unicopia.entity.WildCloudEntity; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeEnd; -import net.minecraft.world.biome.BiomeForest; -import net.minecraft.world.biome.BiomeHell; -import net.minecraft.world.biome.BiomeHills; -import net.minecraft.world.biome.BiomePlains; -import net.minecraft.world.biome.BiomeRiver; -import net.minecraftforge.common.BiomeManager; -import net.minecraftforge.fml.client.registry.RenderingRegistry; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.registries.IForgeRegistry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityCategory; +import net.minecraft.entity.EntityType; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.EndBiome; +import net.minecraft.world.biome.ForestBiome; +import net.minecraft.world.biome.MountainsBiome; +import net.minecraft.world.biome.NetherBiome; +import net.minecraft.world.biome.OceanBiome; +import net.minecraft.world.biome.PlainsBiome; +import net.minecraft.world.biome.RiverBiome; public class UEntities { + public static final EntityType SPELLBOOK = register("spellbook", EntityType.Builder.create(SpellbookEntity::new, EntityCategory.MISC).setDimensions(0.6f, 0.6f)); + public static final EntityType MAGIC_SPELL = register("magic_spell", EntityType.Builder.create(SpellcastEntity::new, EntityCategory.MISC).setDimensions(0.6F, 0.25F)); + public static final EntityType CLOUD = register("cloud", EntityType.Builder.create(CloudEntity::new, EntityCategory.CREATURE)); + public static final EntityType WILD_CLOUD = register("wild_cloud", EntityType.Builder.create(WildCloudEntity::new, EntityCategory.CREATURE)); + public static final EntityType RACING_CLOUD = register("racing_cloud", EntityType.Builder.create(EntityRacingCloud::new, EntityCategory.CREATURE)); + public static final EntityType CONSTRUCTION_CLOUD = register("construction_cloud", EntityType.Builder.create(ConstructionCloudEntity::new, EntityCategory.CREATURE)); - static void init(IForgeRegistry registry) { - EntityType builder = EntityType.builder(Unicopia.MODID); - registry.registerAll( - builder.creature(EntityCloud.class, "cloud").withEgg(0x4169e1, 0x7fff00), - builder.creature(EntityWildCloud.class, "wild_cloud"), - builder.creature(EntityRacingCloud.class, "racing_cloud"), - builder.creature(EntityConstructionCloud.class, "construction_cloud"), - builder.creature(SpellcastEntity.class, "magic_spell"), - builder.creature(EntitySpellbook.class, "spellbook"), - builder.creature(EntityRainbow.Spawner.class, "rainbow_spawner"), - builder.creature(EntityCuccoon.class, "cuccoon"), - builder.creature(EntityButterfly.class, "butterfly").withEgg(0x222200, 0xaaeeff), - builder.projectile(EntityRainbow.class, "rainbow", 500, 5), - builder.projectile(AdvancedProjectileEntity.class, "thrown_item", 100, 10), - builder.projectile(EntitySpear.class, "spear", 100, 10) - ); + public static final EntityType RAINBOW = register("rainbow", EntityType.Builder.create(RainbowEntity::new, EntityCategory.AMBIENT)); + public static final EntityType RAINBOW_SPAWNER = register("rainbow_spawner", EntityType.Builder.create(RainbowEntity.Spawner::new, EntityCategory.MISC)); + + public static final EntityType CUCCOON = register("cuccoon", EntityType.Builder.create(EntityCuccoon::new, EntityCategory.MISC).setDimensions(0.6f, 0.6f)); + + public static final EntityType BUTTERFLY = register("butterfly", EntityType.Builder.create(ButterflyEntity::new, EntityCategory.AMBIENT)); + + public static final EntityType THROWN_ITEM = register("thrown_item", EntityType.Builder.create(AdvancedProjectileEntity::new, EntityCategory.MISC)); + public static final EntityType THROWN_SPEAR = register("thrown_spear", EntityType.Builder.create(EntitySpear::new, EntityCategory.MISC)); + + //builder.creature(CloudEntity.class, "cloud").withEgg(0x4169e1, 0x7fff00), + //builder.creature(ButterflyEntity.class, "butterfly").withEgg(0x222200, 0xaaeeff), + // builder.projectile(AdvancedProjectileEntity.class, "thrown_item", 100, 10), + // builder.projectile(EntitySpear.class, "spear", 100, 10) + + private static EntityType register(String name, EntityType.Builder builder) { + return Registry.register(Registry.ENTITY_TYPE, name, builder.build(name)); } - public static void preInit() { - RenderingRegistry.registerEntityRenderingHandler(EntityCloud.class, RenderCloud::new); - RenderingRegistry.registerEntityRenderingHandler(SpellcastEntity.class, RenderGem::new); - RenderingRegistry.registerEntityRenderingHandler(AdvancedProjectileEntity.class, RenderProjectile::new); - RenderingRegistry.registerEntityRenderingHandler(EntitySpellbook.class, RenderSpellbook::new); - RenderingRegistry.registerEntityRenderingHandler(EntityRainbow.class, RenderRainbow::new); - RenderingRegistry.registerEntityRenderingHandler(EntityButterfly.class, ButterflyEntityRenderer::new); - RenderingRegistry.registerEntityRenderingHandler(EntityCuccoon.class, RenderCuccoon::new); - RenderingRegistry.registerEntityRenderingHandler(EntitySpear.class, RenderSpear::new); - } + static void bootstrap() { + Registry.BIOME.forEach(biome -> { + if (!(biome instanceof NetherBiome || biome instanceof EndBiome)) { + ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.AMBIENT), biome instanceof OceanBiome ? WildCloudEntity.SPAWN_ENTRY_OCEAN : WildCloudEntity.SPAWN_ENTRY_LAND); + ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.CREATURE), RainbowEntity.SPAWN_ENTRY); + } - public static void registerSpawnEntries(Biome biome) { - if (!(biome instanceof BiomeHell || biome instanceof BiomeEnd)) { - - BiomeBS.addSpawnEntry(biome, EnumCreatureType.AMBIENT, EntityWildCloud.class, b -> - BiomeManager.oceanBiomes.contains(b) ? EntityWildCloud.SPAWN_ENTRY_OCEAN : EntityWildCloud.SPAWN_ENTRY_LAND - ); - - BiomeBS.addSpawnEntry(biome, EnumCreatureType.CREATURE, EntityRainbow.Spawner.class, b -> EntityRainbow.SPAWN_ENTRY); - } - - if (biome instanceof BiomePlains - || biome instanceof BiomeRiver - || biome instanceof BiomeHills - || biome instanceof BiomeForest) { - BiomeBS.addSpawnEntry(biome, EnumCreatureType.AMBIENT, EntityButterfly.class, b -> EntityButterfly.SPAWN_ENTRY); - } + if (biome instanceof PlainsBiome + || biome instanceof RiverBiome + || biome instanceof MountainsBiome + || biome instanceof ForestBiome) { + ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.AMBIENT), ButterflyEntity.SPAWN_ENTRY); + } + }); } } diff --git a/src/main/java/com/minelittlepony/unicopia/UItems.java b/src/main/java/com/minelittlepony/unicopia/UItems.java index 2ab7168b..e35ab927 100644 --- a/src/main/java/com/minelittlepony/unicopia/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/UItems.java @@ -5,24 +5,29 @@ import com.minelittlepony.unicopia.item.ItemAppleMultiType; import com.minelittlepony.unicopia.item.ItemCereal; import com.minelittlepony.unicopia.item.AppleItem; import com.minelittlepony.unicopia.item.CloudPlacerItem; -import com.minelittlepony.unicopia.item.ItemCurse; -import com.minelittlepony.unicopia.item.ItemFruitLeaves; +import com.minelittlepony.unicopia.item.ExtendedShearsItem; +import com.minelittlepony.unicopia.item.CursedMagicGemItem; import com.minelittlepony.unicopia.item.ItemMagicStaff; -import com.minelittlepony.unicopia.item.ItemMoss; +import com.minelittlepony.unicopia.item.MossItem; import com.minelittlepony.unicopia.item.ItemOfHolding; -import com.minelittlepony.unicopia.item.ItemRottenApple; -import com.minelittlepony.unicopia.item.ItemRottenTomato; +import com.minelittlepony.unicopia.item.RottenAppleItem; +import com.minelittlepony.unicopia.item.RottenTomatoItem; import com.minelittlepony.unicopia.item.ItemSpear; -import com.minelittlepony.unicopia.item.ItemSpell; -import com.minelittlepony.unicopia.item.ItemSpellbook; +import com.minelittlepony.unicopia.item.MagicGemItem; +import com.minelittlepony.unicopia.item.SpellbookItem; import com.minelittlepony.unicopia.item.ItemStaff; -import com.minelittlepony.unicopia.item.ItemTomato; -import com.minelittlepony.unicopia.item.ItemTomatoSeeds; +import com.minelittlepony.unicopia.item.TomatoItem; +import com.minelittlepony.unicopia.item.TomatoSeedsItem; import com.minelittlepony.unicopia.item.ItemZapApple; import com.minelittlepony.unicopia.item.PredicatedBlockItem; +import com.minelittlepony.unicopia.item.StickItem; import com.minelittlepony.unicopia.item.URecord; -import com.minelittlepony.unicopia.item.override.ItemShear; -import com.minelittlepony.unicopia.item.override.ItemStick; +import com.minelittlepony.unicopia.item.consumables.BushToxicityDeterminent; +import com.minelittlepony.unicopia.item.consumables.CookedToxicityDeterminent; +import com.minelittlepony.unicopia.item.consumables.FlowerToxicityDeterminent; +import com.minelittlepony.unicopia.item.consumables.MultiItemEdible; +import com.minelittlepony.unicopia.item.consumables.Toxicity; +import com.minelittlepony.unicopia.item.consumables.UItemFoodDelegate; import com.minelittlepony.unicopia.magic.spells.SpellRegistry; import net.minecraft.item.Item; @@ -38,49 +43,43 @@ import net.minecraft.item.Items; import net.minecraft.item.TallBlockItem; import net.minecraft.item.Item.Settings; import net.minecraft.util.Identifier; +import net.minecraft.util.UseAction; import net.minecraft.util.registry.Registry; -import static com.minelittlepony.unicopia.Predicates.*; +import static com.minelittlepony.unicopia.EquinePredicates.*; import javax.annotation.Nullable; import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.edibles.BushToxicityDeterminent; -import com.minelittlepony.unicopia.edibles.CookedToxicityDeterminent; -import com.minelittlepony.unicopia.edibles.FlowerToxicityDeterminent; -import com.minelittlepony.unicopia.edibles.MultiItemEdible; -import com.minelittlepony.unicopia.edibles.Toxicity; -import com.minelittlepony.unicopia.edibles.UItemFoodDelegate; -import com.minelittlepony.unicopia.entity.EntityConstructionCloud; +import com.minelittlepony.unicopia.entity.ConstructionCloudEntity; import com.minelittlepony.unicopia.entity.EntityRacingCloud; -import com.minelittlepony.unicopia.entity.EntityWildCloud; +import com.minelittlepony.unicopia.entity.WildCloudEntity; import com.minelittlepony.unicopia.forgebullshit.BuildInTexturesBakery; import com.minelittlepony.unicopia.forgebullshit.OreReplacer; import com.minelittlepony.unicopia.forgebullshit.UnFuckedItemSnow; public class UItems { - private static final ItemStick stick = register(new ItemStick(new Item.Settings()), "minecraft", "stick"); - private static final ItemShear shears = register(new ItemShear(), "minecraft", "shears"); + private static final StickItem stick = register(new StickItem(), "minecraft", "stick"); + private static final ExtendedShearsItem shears = register(new ExtendedShearsItem(), "minecraft", "shears"); public static final AppleItem red_apple = register(new AppleItem(FoodComponents.APPLE), "minecraft", "apple"); public static final AppleItem green_apple = register(new AppleItem(FoodComponents.APPLE), "apple_green"); public static final AppleItem sweet_apple = register(new AppleItem(FoodComponents.APPLE), "apple_sweet"); public static final AppleItem sour_apple = register(new AppleItem(FoodComponents.APPLE), "apple_sour"); - public static final ItemAppleMultiType zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple") - .setSubTypes("zap_apple", "red", "green", "sweet", "sour", "zap"); + public static final ItemAppleMultiType zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple").setSubTypes("zap_apple", "red", "green", "sweet", "sour", "zap"); - public static final AppleItem rotten_apple = new ItemRottenApple(Unicopia.MODID, "rotten_apple"); + public static final AppleItem rotten_apple = register(new RottenAppleItem(FoodComponents.APPLE), "rotten_apple"); public static final AppleItem cooked_zap_apple = register(new AppleItem(FoodComponents.APPLE), "cooked_zap_apple"); public static final Item cloud_matter = register(new Item(new Item.Settings().group(ItemGroup.MATERIALS)), "cloud_matter"); public static final Item dew_drop = register(new Item(new Item.Settings().group(ItemGroup.MATERIALS)), "dew_drop"); public static final CloudPlacerItem racing_cloud_spawner = register(new CloudPlacerItem(EntityRacingCloud::new), "racing_cloud_spawner"); - public static final CloudPlacerItem construction_cloud_spawner = register(new CloudPlacerItem(EntityConstructionCloud::new), "construction_cloud_spawner"); - public static final CloudPlacerItem wild_cloud_spawner = register(new CloudPlacerItem(EntityWildCloud::new), "wild_cloud_spawner"); + public static final CloudPlacerItem construction_cloud_spawner = register(new CloudPlacerItem(ConstructionCloudEntity::new), "construction_cloud_spawner"); + public static final CloudPlacerItem wild_cloud_spawner = register(new CloudPlacerItem(WildCloudEntity::new), "wild_cloud_spawner"); public static final Item cloud_block = register(new PredicatedBlockItem(UBlocks.normal_cloud, new Item.Settings().group(ItemGroup.MATERIALS), INTERACT_WITH_CLOUDS), "cloud_block"); public static final Item enchanted_cloud = register(new PredicatedBlockItem(UBlocks.enchanted_cloud, new Item.Settings().group(ItemGroup.MATERIALS), INTERACT_WITH_CLOUDS), "enchanted_cloud_block"); @@ -94,7 +93,7 @@ public class UItems { public static final Item anvil = register(new PredicatedBlockItem(UBlocks.anvil, new Item.Settings().group(ItemGroup.DECORATIONS), INTERACT_WITH_CLOUDS), "cloud_anvil"); public static final Item record_crusade = register(new URecord(USounds.RECORD_CRUSADE), "crusade"); - public static final Item record_pet = register(new URecord(USounds.RECORD_PET, "pet"); + public static final Item record_pet = register(new URecord(USounds.RECORD_PET), "pet"); public static final Item record_popular = register(new URecord(USounds.RECORD_POPULAR), "popular"); public static final Item record_funk = register(new URecord(USounds.RECORD_FUNK), "funk"); @@ -116,19 +115,19 @@ public class UItems { public static final Item enchanted_cloud_slab = new PredicatedBlockItem(UBlocks.enchanted_cloud_slab, new Item.Settings().group(ItemGroup.BUILDING_BLOCKS), INTERACT_WITH_CLOUDS); public static final Item packed_cloud_slab = new PredicatedBlockItem(UBlocks.packed_cloud_slab, new Item.Settings().group(ItemGroup.BUILDING_BLOCKS), INTERACT_WITH_CLOUDS); - public static final ItemSpell spell = new ItemSpell(Unicopia.MODID, "gem"); - public static final ItemSpell curse = new ItemCurse(Unicopia.MODID, "corrupted_gem"); + public static final MagicGemItem spell = register(new MagicGemItem(), "gem"); + public static final MagicGemItem curse = register(new CursedMagicGemItem(), "corrupted_gem"); public static final ItemOfHolding bag_of_holding = new ItemOfHolding(Unicopia.MODID, "bag_of_holding"); public static final ItemAlicornAmulet alicorn_amulet = new ItemAlicornAmulet(Unicopia.MODID, "alicorn_amulet"); - public static final ItemSpellbook spellbook = new ItemSpellbook(Unicopia.MODID, "spellbook"); + public static final SpellbookItem spellbook = register(new SpellbookItem(), "spellbook"); public static final Item staff_meadow_brook = new ItemStaff(Unicopia.MODID, "staff_meadow_brook").setMaxDamage(2); public static final Item staff_remembrance = new ItemMagicStaff(Unicopia.MODID, "staff_remembrance", new SpellScorch()); public static final Item spear = new ItemSpear(Unicopia.MODID, "spear"); - public static final ItemMoss moss = new ItemMoss(Unicopia.MODID, "moss"); + public static final MossItem moss = new MossItem(Unicopia.MODID, "moss"); public static final Item alfalfa_seeds = new ItemSeedFood(1, 4, UBlocks.alfalfa, Blocks.FARMLAND) .setTranslationKey("alfalfa_seeds") @@ -144,17 +143,17 @@ public class UItems { public static final Item cereal = new ItemCereal(Unicopia.MODID, "cereal", 9, 0.8F).setSugarAmount(1); public static final Item sugar_cereal = new ItemCereal(Unicopia.MODID, "sugar_cereal", 20, -2).setSugarAmount(110).setAlwaysEdible(); - public static final ItemTomato tomato = new ItemTomato(Unicopia.MODID, "tomato", 4, 34); - public static final ItemRottenTomato rotten_tomato = new ItemRottenTomato(Unicopia.MODID, "rotten_tomato", 4, 34); + public static final TomatoItem tomato = new TomatoItem(Unicopia.MODID, "tomato", 4, 34); + public static final RottenTomatoItem rotten_tomato = new RottenTomatoItem(Unicopia.MODID, "rotten_tomato", 4, 34); - public static final ItemTomato cloudsdale_tomato = new ItemTomato(Unicopia.MODID, "cloudsdale_tomato", 16, 4); - public static final ItemRottenTomato rotten_cloudsdale_tomato = new ItemRottenTomato(Unicopia.MODID, "rotten_cloudsdale_tomato", 4, 34); + public static final TomatoItem cloudsdale_tomato = new TomatoItem(Unicopia.MODID, "cloudsdale_tomato", 16, 4); + public static final RottenTomatoItem rotten_cloudsdale_tomato = new RottenTomatoItem(Unicopia.MODID, "rotten_cloudsdale_tomato", 4, 34); - public static final ItemTomatoSeeds tomato_seeds = new ItemTomatoSeeds(Unicopia.MODID, "tomato_seeds"); + public static final TomatoSeedsItem tomato_seeds = new TomatoSeedsItem(Unicopia.MODID, "tomato_seeds"); public static final Item apple_seeds = new UItemDecoration(UBlocks.apple_tree, Unicopia.MODID, "apple_seeds"); - public static final Item apple_leaves = new ItemFruitLeaves(UBlocks.apple_leaves); + public static final Item apple_leaves = new BlockItem(UBlocks.apple_leaves); public static final Item double_plant = new UItemFoodDelegate(Blocks.DOUBLE_PLANT, stack -> BlockDoublePlant.EnumPlantType.byMetadata(stack.getMetadata()).getTranslationKey() @@ -198,20 +197,16 @@ public class UItems { public static final Item wheat_worms = new MultiItemEdible(Unicopia.MODID, "wheat_worms", 1, 0, stack -> Toxicity.SEVERE); - public static final Item mug = new Item() - .setTranslationKey("mug") - .setRegistryName(Unicopia.MODID, "mug") - .setCreativeTab(CreativeTabs.MATERIALS) - .setFull3D(); + public static final Item mug = register(new Item(new Item.Settings().group(ItemGroup.MATERIALS)), "mug"); public static final Item apple_cider = new MultiItemEdible(Unicopia.MODID, "apple_cider", 4, 2, stack -> Toxicity.MILD) - .setUseAction(EnumAction.DRINK) + .setUseAction(UseAction.DRINK) .setContainerItem(mug) .setFull3D(); public static final Item juice = new MultiItemEdible(Unicopia.MODID, "juice", 2, 2, stack -> Toxicity.SAFE) - .setUseAction(EnumAction.DRINK) + .setUseAction(UseAction.DRINK) .setContainerItem(Items.GLASS_BOTTLE); public static final Item burned_juice = new MultiItemEdible(Unicopia.MODID, "burned_juice", 3, 1, stack -> Toxicity.FAIR) - .setUseAction(EnumAction.DRINK) + .setUseAction(UseAction.DRINK) .setContainerItem(Items.GLASS_BOTTLE); @@ -227,12 +222,12 @@ public class UItems { BuildInTexturesBakery.getBuiltInTextures().add(new Identifier(Unicopia.MODID, "items/empty_slot_gem")); } - FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F); - FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0); - FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(cuccoon), new ItemStack(chitin_shell), 0.3F); + FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F); + FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0); + FurnaceRecipes.instance().addSmeltingRecipe(new ItemStack(cuccoon), new ItemStack(chitin_shell), 0.3F); } - public static void fixRecipes() { + static void fixRecipes() { new OreReplacer() .registerAll(stack -> stack.getItem().getRegistryName().equals(red_apple.getRegistryName())) .done(); @@ -254,4 +249,6 @@ public class UItems { return 0xffffff; }, spell, curse); } + + static void bootstrap() {} } diff --git a/src/main/java/com/minelittlepony/unicopia/UParticles.java b/src/main/java/com/minelittlepony/unicopia/UParticles.java index 2369b565..e83106fc 100644 --- a/src/main/java/com/minelittlepony/unicopia/UParticles.java +++ b/src/main/java/com/minelittlepony/unicopia/UParticles.java @@ -8,8 +8,6 @@ import com.minelittlepony.unicopia.client.particle.ParticleUnicornMagic; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.particles.ParticleFactoryRegistry; -import net.fabricmc.fabric.api.particles.ParticleTypeRegistry; import net.minecraft.particle.DefaultParticleType; import net.minecraft.util.Identifier; @@ -21,13 +19,4 @@ public class UParticles { public static final DefaultParticleType SPHERE = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "sphere")); public static final DefaultParticleType DISK = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "disk")); - - @Environment(EnvType.CLIENT) - public void onInitializeClient() { - ParticleFactoryRegistry.getInstance().register(UNICORN_MAGIC, ParticleUnicornMagic::new); - ParticleFactoryRegistry.getInstance().register(CHANGELING_MAGIC, ParticleChangelingMagic::new); - ParticleFactoryRegistry.getInstance().register(RAIN_DROPS, ParticleRaindrops::new); - ParticleFactoryRegistry.getInstance().register(SPHERE, ParticleSphere::new); - ParticleFactoryRegistry.getInstance().register(DISK, ParticleDisk::new); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/UPotion.java b/src/main/java/com/minelittlepony/unicopia/UPotion.java index 43aad008..e7c00cdd 100644 --- a/src/main/java/com/minelittlepony/unicopia/UPotion.java +++ b/src/main/java/com/minelittlepony/unicopia/UPotion.java @@ -54,17 +54,17 @@ public class UPotion extends StatusEffect { } @Override - public boolean shouldRender(PotionEffect effect) { + public boolean shouldRender(StatusEffectInstance effect) { return !isSilent; } @Override - public boolean shouldRenderInvText(PotionEffect effect) { + public boolean shouldRenderInvText(StatusEffectInstance effect) { return !isSilent; } @Override - public boolean shouldRenderHUD(PotionEffect effect) { + public boolean shouldRenderHUD(StatusEffectInstance effect) { return !isSilent; } diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 010e4add..4af24aac 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia; +import net.fabricmc.api.ModInitializer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; @@ -10,28 +12,26 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.google.gson.JsonObject; -import com.minelittlepony.unicopia.ability.powers.PowersRegistry; -import com.minelittlepony.unicopia.advancements.UAdvancements; +import com.minelittlepony.unicopia.ability.PowersRegistry; import com.minelittlepony.unicopia.command.Commands; -import com.minelittlepony.unicopia.enchanting.AffineIngredients; import com.minelittlepony.unicopia.enchanting.Pages; -import com.minelittlepony.unicopia.enchanting.SpecialRecipe; -import com.minelittlepony.unicopia.enchanting.SpellRecipe; +import com.minelittlepony.unicopia.enchanting.recipe.AffineIngredients; +import com.minelittlepony.unicopia.enchanting.recipe.SpecialRecipe; +import com.minelittlepony.unicopia.enchanting.recipe.SpellRecipe; import com.minelittlepony.unicopia.inventory.gui.SpellBookContainer; import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook; import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.util.crafting.CraftingManager; -import com.minelittlepony.unicopia.world.Hooks; import com.minelittlepony.unicopia.world.UWorld; -public class Unicopia implements IGuiHandler { +public class Unicopia implements ModInitializer { public static final String MODID = "unicopia"; public static final String NAME = "@NAME@"; public static final String VERSION = "@VERSION@"; - public static final Logger log = LogManager.getLogger(); + public static final Logger LOGGER = LogManager.getLogger(); private static IChannel channel; @@ -47,6 +47,7 @@ public class Unicopia implements IGuiHandler { } }; + @Deprecated public static CraftingManager getCraftingManager() { return craftingManager; } @@ -55,21 +56,10 @@ public class Unicopia implements IGuiHandler { return channel; } - public void preInit(FMLPreInitializationEvent event) { - UConfig.init(event.getModConfigurationDirectory()); - UClient.instance().preInit(); - UWorld.instance().init(); - } + @Override + public void onInitialize() { + Config.init(event.getModConfigurationDirectory()); - public void onServerCreated(FMLServerAboutToStartEvent event) { - Fixes.init(event.getServer().getDataFixer()); - } - - public void onServerStart(FMLServerStartingEvent event) { - Commands.init(event); - } - - public void init(FMLInitializationEvent event) { channel = JumpingCastle.subscribeTo(MODID, () -> {}) .listenFor(MsgRequestCapabilities.class) .listenFor(MsgPlayerCapabilities.class) @@ -79,37 +69,21 @@ public class Unicopia implements IGuiHandler { UAdvancements.init(); - FBS.init(); - - NetworkRegistry.INSTANCE.registerGuiHandler(this, this); - - UClient.instance().init(); - } - - public void postInit(FMLPostInitializationEvent event) { craftingManager.load(); Pages.instance().load(); - Biome.REGISTRY.forEach(UEntities::registerSpawnEntries); + UBlocks.bootstrap(); + UItems.bootstrap(); + Commands.bootstrap(); + + + UWorld.instance().init(); + + UClient.instance().preInit(); + UClient.instance().init(); UClient.instance().postInit(); UItems.fixRecipes(); } - - @Override - public Object getServerGuiElement(int ID, PlayerEntity player, World world, int x, int y, int z) { - switch (ID) { - case 0: return new SpellBookContainer(player.inventory, world, new BlockPos(x, y, z)); - default: return null; - } - } - - @Override - public Object getClientGuiElement(int ID, PlayerEntity player, World world, int x, int y, int z) { - switch (ID) { - case 0: return new GuiSpellBook(player); - default: return null; - } - } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/IFlyingPredicate.java b/src/main/java/com/minelittlepony/unicopia/ability/IFlyingPredicate.java index 3830f07c..63f395c1 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/IFlyingPredicate.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/IFlyingPredicate.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.ability; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; /** * Predicate for abilities to control whether a player can fly. diff --git a/src/main/java/com/minelittlepony/unicopia/ability/IHeightPredicate.java b/src/main/java/com/minelittlepony/unicopia/ability/IHeightPredicate.java index 25a46daf..c0fd7ca3 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/IHeightPredicate.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/IHeightPredicate.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.ability; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; /** * Predicate for abilities to control what the player's physical height is. diff --git a/src/main/java/com/minelittlepony/unicopia/ability/IPower.java b/src/main/java/com/minelittlepony/unicopia/ability/IPower.java index 8f95af80..4ee0e56f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/IPower.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/IPower.java @@ -4,7 +4,7 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.client.input.IKeyBindingHandler; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.world.World; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCarry.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerCarry.java similarity index 91% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCarry.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerCarry.java index 716e1006..019cc258 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCarry.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerCarry.java @@ -1,11 +1,9 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.ability.Hit; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.VecHelper; import net.minecraft.client.network.packet.EntityPassengersSetS2CPacket; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCloudBase.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerCloudBase.java similarity index 91% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCloudBase.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerCloudBase.java index 201fbff0..ac74f83a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerCloudBase.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerCloudBase.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import java.util.Optional; @@ -6,9 +6,7 @@ import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.Numeric; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.VecHelper; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerDisguise.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerDisguise.java similarity index 95% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerDisguise.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerDisguise.java index 26b4eef8..b5a42018 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerDisguise.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerDisguise.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import javax.annotation.Nullable; @@ -8,9 +8,8 @@ import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.Hit; import com.minelittlepony.unicopia.entity.IInAnimate; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.spells.SpellDisguise; import com.minelittlepony.util.VecHelper; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerEngulf.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerEngulf.java similarity index 84% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerEngulf.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerEngulf.java index 815c38db..61065023 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerEngulf.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerEngulf.java @@ -1,12 +1,10 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.ability.Hit; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.spells.SpellChangelingTrap; public class PowerEngulf implements IPower { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerFeed.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerFeed.java similarity index 95% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerFeed.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerFeed.java index 8ea041a4..20386804 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerFeed.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerFeed.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import java.util.List; import java.util.stream.Collectors; @@ -8,9 +8,7 @@ import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.ability.Hit; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.VecHelper; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerGrow.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerGrow.java similarity index 92% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerGrow.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerGrow.java index 905d583d..b3e98f9e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerGrow.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerGrow.java @@ -1,12 +1,10 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.Location; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerMagic.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerMagic.java similarity index 86% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerMagic.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerMagic.java index 6525c3a8..7d8191bd 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerMagic.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerMagic.java @@ -1,11 +1,9 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.Hit; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.spells.SpellShield; public class PowerMagic implements IPower { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerStomp.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerStomp.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerStomp.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerStomp.java index 9a84a6e0..9a27bb20 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerStomp.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerStomp.java @@ -1,18 +1,14 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; - import org.lwjgl.glfw.GLFW; import com.google.common.collect.Lists; import com.google.gson.annotations.Expose; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.Location; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.item.AppleItem; import com.minelittlepony.unicopia.world.UWorld; import com.minelittlepony.util.MagicalDamageSource; @@ -36,7 +32,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.ParticleTypes; -import net.minecraft.state.property.Property; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; @@ -301,7 +296,7 @@ public class PowerStomp implements IPower { int breaks = 0; BlockState state; while (variantAndBlockEquals(w.getBlockState(pos.up()), log)) { - if (PosHelper.some(pos, p -> isLeaves(w.getBlockState(p), log), HORIZONTALS)) { + if (PosHelper.some(pos, p -> isLeaves(w.getBlockState(p), log), Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST)) { break; } @@ -462,14 +457,16 @@ public class PowerStomp implements IPower { } private Object getVariant(BlockState state) { - if (state.getBlock() instanceof LeavesBlock) { + // TODO: + /*if (state.getBlock() instanceof LeavesBlock) { return ((LeavesBlock)state.getBlock()).getWoodType(state); } return state.getEntries().entrySet().stream() .filter(i -> i.getKey().getName().contentEquals("variant")) .map(i -> i.getValue()) - .findFirst().orElse(null); + .findFirst().orElse(null);*/ + return null; } protected static class Data extends Location { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerTeleport.java b/src/main/java/com/minelittlepony/unicopia/ability/PowerTeleport.java similarity index 95% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowerTeleport.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowerTeleport.java index 92547264..bc98ff34 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowerTeleport.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowerTeleport.java @@ -1,11 +1,9 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import org.lwjgl.glfw.GLFW; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.Location; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.VecHelper; import net.minecraft.block.Block; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowersRegistry.java b/src/main/java/com/minelittlepony/unicopia/ability/PowersRegistry.java similarity index 88% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/PowersRegistry.java rename to src/main/java/com/minelittlepony/unicopia/ability/PowersRegistry.java index 4a86036b..5d5773e2 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/PowersRegistry.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PowersRegistry.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.ability.powers; +package com.minelittlepony.unicopia.ability; import java.util.ArrayList; import java.util.HashMap; @@ -7,16 +7,14 @@ import java.util.Map; import java.util.Optional; import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.ability.IData; -import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.client.input.Keyboard; public class PowersRegistry { - private static PowersRegistry instance = new PowersRegistry(); + private static final PowersRegistry INSTANCE = new PowersRegistry(); public static PowersRegistry instance() { - return instance; + return INSTANCE; } private final Map>> keyToPowerMap = new HashMap<>(); diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java index 91a864aa..cfc22e96 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java @@ -8,7 +8,7 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.CloudType; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UBlocks; -import com.minelittlepony.unicopia.item.ItemMoss; +import com.minelittlepony.unicopia.item.MossItem; import net.fabricmc.fabric.api.block.FabricBlockSettings; import net.minecraft.block.Block; @@ -56,7 +56,7 @@ public class BlockCloud extends Block implements ICloudBlock, ITillable { pos = pos.offset(Direction.random(rand), 1 + rand.nextInt(2)); state = world.getBlockState(pos); - BlockState converted = ItemMoss.affected.getInverse().getConverted(state); + BlockState converted = MossItem.AFFECTED.getInverse().getConverted(state); if (!state.equals(converted)) { world.setBlockState(pos, converted); diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockDiamondDoor.java b/src/main/java/com/minelittlepony/unicopia/block/BlockDiamondDoor.java index d66a9d08..4f0051d4 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockDiamondDoor.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockDiamondDoor.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import net.minecraft.block.SoundType; import net.minecraft.block.material.MapColor; @@ -32,7 +32,7 @@ public class BlockDiamondDoor extends UDoor { @Override protected boolean canOpen(@Nullable PlayerEntity player) { - return Predicates.MAGI.test(player); + return EquinePredicates.MAGI.test(player); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockGrowingCuccoon.java b/src/main/java/com/minelittlepony/unicopia/block/BlockGrowingCuccoon.java index 8d2ee04c..22d13723 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockGrowingCuccoon.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockGrowingCuccoon.java @@ -5,7 +5,7 @@ import java.util.Random; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UMaterials; import com.minelittlepony.unicopia.USounds; @@ -31,8 +31,6 @@ import net.minecraft.world.World; public class BlockGrowingCuccoon extends Block { - public static final DamageSource DAMAGE_SOURCE = MagicalDamageSource.mundane("acid"); - public static final IntProperty AGE = IntProperty.of("age", 0, 7); public static final EnumProperty SHAPE = EnumProperty.of("shape", Shape.class); @@ -207,11 +205,11 @@ public class BlockGrowingCuccoon extends Block { @Override public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { - if (entity instanceof LivingEntity && !entity.isDead) { + if (entity instanceof LivingEntity && !entity.removed) { LivingEntity living = (LivingEntity)entity; - if (!Predicates.BUGGY.test(living) && living.getHealth() > 0) { - living.attackEntityFrom(DAMAGE_SOURCE, 1); + if (!EquinePredicates.BUGGY.test(living) && living.getHealth() > 0) { + living.damage(MagicalDamageSource.ACID, 1); living.setInWeb(); if (!world.isClient) { @@ -224,8 +222,8 @@ public class BlockGrowingCuccoon extends Block { if (world.rand.nextInt(13000) == 0) { PlayerEntity player = (PlayerEntity)living; - skull.setTagCompound(new NBTTagCompound()); - skull.getTagCompound().setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), player.getGameProfile())); + skull.setTagCompound(new CompoundTag()); + skull.getTagCompound().setTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundTag(), player.getGameProfile())); skull.setItemDamage(3); } else { living.dropItem(Items.SKULL, 1); diff --git a/src/main/java/com/minelittlepony/unicopia/block/ChiselledChitinBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ChiselledChitinBlock.java index 439607db..a0d520f2 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/ChiselledChitinBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/ChiselledChitinBlock.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UMaterials; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.fabricmc.fabric.api.block.FabricBlockSettings; import net.minecraft.block.Block; diff --git a/src/main/java/com/minelittlepony/unicopia/block/ChitinBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ChitinBlock.java index f34c7fb8..7550aa72 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/ChitinBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/ChitinBlock.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.block; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UMaterials; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.fabricmc.fabric.api.block.FabricBlockSettings; import net.minecraft.block.Block; diff --git a/src/main/java/com/minelittlepony/unicopia/block/HiveWallBlock.java b/src/main/java/com/minelittlepony/unicopia/block/HiveWallBlock.java index ff97606a..d5fdd880 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/HiveWallBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/HiveWallBlock.java @@ -9,7 +9,7 @@ import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UMaterials; import com.minelittlepony.unicopia.USounds; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.util.PosHelper; import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.Sphere; diff --git a/src/main/java/com/minelittlepony/unicopia/block/ICloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ICloudBlock.java index 9b9ccaa5..7592b511 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/ICloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/ICloudBlock.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.block; import com.minelittlepony.unicopia.CloudType; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.UClient; import net.minecraft.block.BedBlock; import net.minecraft.block.Block; @@ -58,7 +58,7 @@ public interface ICloudBlock { } } - if (!Predicates.INTERACT_WITH_CLOUDS.apply(player)) { + if (!EquinePredicates.INTERACT_WITH_CLOUDS.apply(player)) { return type != CloudType.ENCHANTED; } diff --git a/src/main/java/com/minelittlepony/unicopia/ClientHooks.java b/src/main/java/com/minelittlepony/unicopia/client/ClientHooks.java similarity index 89% rename from src/main/java/com/minelittlepony/unicopia/ClientHooks.java rename to src/main/java/com/minelittlepony/unicopia/client/ClientHooks.java index 495710c4..921370bf 100644 --- a/src/main/java/com/minelittlepony/unicopia/ClientHooks.java +++ b/src/main/java/com/minelittlepony/unicopia/client/ClientHooks.java @@ -1,8 +1,12 @@ -package com.minelittlepony.unicopia; +package com.minelittlepony.unicopia.client; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.SpeciesList; +import com.minelittlepony.unicopia.UBlocks; +import com.minelittlepony.unicopia.UClient; +import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.client.gui.UHud; -import com.minelittlepony.unicopia.entity.player.ICamera; +import com.minelittlepony.unicopia.entity.capabilities.ICamera; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/com/minelittlepony/unicopia/client/UEntityRenderers.java b/src/main/java/com/minelittlepony/unicopia/client/UEntityRenderers.java new file mode 100644 index 00000000..bbcd56ef --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/UEntityRenderers.java @@ -0,0 +1,45 @@ +package com.minelittlepony.unicopia.client; + +import com.minelittlepony.unicopia.client.render.entity.ButterflyEntityRenderer; +import com.minelittlepony.unicopia.client.render.entity.RenderCloud; +import com.minelittlepony.unicopia.client.render.entity.RenderCuccoon; +import com.minelittlepony.unicopia.client.render.entity.RenderRainbow; +import com.minelittlepony.unicopia.client.render.entity.RenderSpear; +import com.minelittlepony.unicopia.client.render.entity.RenderSpellbook; +import com.minelittlepony.unicopia.client.render.entity.SpellcastEntityRenderer; +import com.minelittlepony.unicopia.entity.AdvancedProjectileEntity; +import com.minelittlepony.unicopia.entity.ButterflyEntity; +import com.minelittlepony.unicopia.entity.CloudEntity; +import com.minelittlepony.unicopia.entity.EntityCuccoon; +import com.minelittlepony.unicopia.entity.EntitySpear; +import com.minelittlepony.unicopia.entity.RainbowEntity; +import com.minelittlepony.unicopia.entity.SpellbookEntity; +import com.minelittlepony.unicopia.entity.SpellcastEntity; +import com.minelittlepony.unicopia.entity.WildCloudEntity; +import com.minelittlepony.util.collection.ListHelper; + +import net.fabricmc.fabric.api.client.render.EntityRendererRegistry; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.entity.FlyingItemEntityRenderer; +import net.minecraft.entity.EntityCategory; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.EndBiome; +import net.minecraft.world.biome.ForestBiome; +import net.minecraft.world.biome.MountainsBiome; +import net.minecraft.world.biome.NetherBiome; +import net.minecraft.world.biome.OceanBiome; +import net.minecraft.world.biome.PlainsBiome; +import net.minecraft.world.biome.RiverBiome; + +public class UEntityRenderers { + static void bootstrap() { + EntityRendererRegistry.INSTANCE.register(CloudEntity.class, RenderCloud::new); + EntityRendererRegistry.INSTANCE.register(SpellcastEntity.class, SpellcastEntityRenderer::new); + EntityRendererRegistry.INSTANCE.register(AdvancedProjectileEntity.class, (manager, context) -> new FlyingItemEntityRenderer<>(manager, MinecraftClient.getInstance().getItemRenderer())); + EntityRendererRegistry.INSTANCE.register(SpellbookEntity.class, RenderSpellbook::new); + EntityRendererRegistry.INSTANCE.register(RainbowEntity.class, RenderRainbow::new); + EntityRendererRegistry.INSTANCE.register(ButterflyEntity.class, ButterflyEntityRenderer::new); + EntityRendererRegistry.INSTANCE.register(EntityCuccoon.class, RenderCuccoon::new); + EntityRendererRegistry.INSTANCE.register(EntitySpear.class, RenderSpear::new); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/UParticles.java b/src/main/java/com/minelittlepony/unicopia/client/UParticles.java new file mode 100644 index 00000000..770807d3 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/UParticles.java @@ -0,0 +1,22 @@ +package com.minelittlepony.unicopia.client; + +import com.minelittlepony.unicopia.client.particle.ParticleChangelingMagic; +import com.minelittlepony.unicopia.client.particle.ParticleDisk; +import com.minelittlepony.unicopia.client.particle.ParticleRaindrops; +import com.minelittlepony.unicopia.client.particle.ParticleSphere; +import com.minelittlepony.unicopia.client.particle.ParticleUnicornMagic; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.Identifier; + +class UParticles extends com.minelittlepony.unicopia.UParticles { + static void bootstrap() { + ParticleFactoryRegistry.instance().register(UNICORN_MAGIC, ParticleUnicornMagic::new); + ParticleFactoryRegistry.instance().register(CHANGELING_MAGIC, ParticleChangelingMagic::new); + ParticleFactoryRegistry.instance().register(RAIN_DROPS, ParticleRaindrops::new); + ParticleFactoryRegistry.instance().register(SPHERE, ParticleSphere::new); + ParticleFactoryRegistry.instance().register(DISK, ParticleDisk::new); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java similarity index 89% rename from src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java rename to src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index 1515e440..1372c419 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia; +package com.minelittlepony.unicopia.client; import java.util.List; import java.util.UUID; @@ -6,12 +6,20 @@ import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.ability.powers.render.DisguiseRenderer; +import com.minelittlepony.unicopia.MineLP; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.SpeciesList; +import com.minelittlepony.unicopia.UClient; +import com.minelittlepony.unicopia.Config; +import com.minelittlepony.unicopia.UEntities; +import com.minelittlepony.unicopia.UParticles; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.client.ability.render.DisguiseRenderer; import com.minelittlepony.unicopia.client.gui.SettingsScreen; import com.minelittlepony.unicopia.client.input.Keyboard; import com.minelittlepony.unicopia.client.input.MouseControl; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.client.input.InversionAwareKeyboardInput; -import com.minelittlepony.unicopia.entity.player.IPlayer; import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.mojang.authlib.GameProfile; @@ -34,7 +42,7 @@ public class UnicopiaClient extends UClient { private static Race clientPlayerRace = getclientPlayerRace(); private static Race getclientPlayerRace() { - if (!UConfig.instance().ignoresMineLittlePony() + if (!Config.instance().ignoresMineLittlePony() && MinecraftClient.getInstance().player != null) { Race race = MineLP.getPlayerPonyRace(); @@ -44,7 +52,7 @@ public class UnicopiaClient extends UClient { } - return UConfig.instance().getPrefferedRace(); + return Config.instance().getPrefferedRace(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/powers/render/DisguiseRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/ability/render/DisguiseRenderer.java similarity index 92% rename from src/main/java/com/minelittlepony/unicopia/ability/powers/render/DisguiseRenderer.java rename to src/main/java/com/minelittlepony/unicopia/client/ability/render/DisguiseRenderer.java index 80f496d4..399de603 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/powers/render/DisguiseRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/ability/render/DisguiseRenderer.java @@ -1,6 +1,6 @@ -package com.minelittlepony.unicopia.ability.powers.render; +package com.minelittlepony.unicopia.client.ability.render; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.spells.SpellDisguise; import net.minecraft.client.MinecraftClient; @@ -49,7 +49,7 @@ public class DisguiseRenderer { public boolean renderDisguiseToGui(IPlayer player) { SpellDisguise effect = player.getEffect(SpellDisguise.class, false); - if (effect == null || effect.getDead()) { + if (effect == null || effect.isDead()) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/FlightExperienceBar.java b/src/main/java/com/minelittlepony/unicopia/client/gui/FlightExperienceBar.java index 004ac580..40288de8 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/FlightExperienceBar.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/FlightExperienceBar.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.client.gui; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.gui.DrawableHelper; diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/IHudElement.java b/src/main/java/com/minelittlepony/unicopia/client/gui/IHudElement.java index 1e34d5b8..466d713e 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/IHudElement.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/IHudElement.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.client.gui; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; public interface IHudElement { diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/UHud.java b/src/main/java/com/minelittlepony/unicopia/client/gui/UHud.java index 6266f9a1..afdd7624 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/UHud.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/UHud.java @@ -5,7 +5,7 @@ import java.util.List; import org.lwjgl.opengl.GL11; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/com/minelittlepony/unicopia/client/input/InversionAwareKeyboardInput.java b/src/main/java/com/minelittlepony/unicopia/client/input/InversionAwareKeyboardInput.java index 893db26d..e7ea3c0f 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/input/InversionAwareKeyboardInput.java +++ b/src/main/java/com/minelittlepony/unicopia/client/input/InversionAwareKeyboardInput.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.client.input; import com.minelittlepony.unicopia.UClient; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.input.Input; diff --git a/src/main/java/com/minelittlepony/unicopia/client/input/KeyBindingsHandler.java b/src/main/java/com/minelittlepony/unicopia/client/input/KeyBindingsHandler.java index a10f2543..e99ab4aa 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/input/KeyBindingsHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/client/input/KeyBindingsHandler.java @@ -5,8 +5,8 @@ import java.util.List; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.ability.powers.PowersRegistry; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.ability.PowersRegistry; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/ParticleSphere.java b/src/main/java/com/minelittlepony/unicopia/client/particle/ParticleSphere.java index 76cab45e..c155e617 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/ParticleSphere.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/ParticleSphere.java @@ -7,6 +7,7 @@ import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Camera; import net.minecraft.entity.Entity; import net.minecraft.particle.ParticleEffect; +import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; @@ -74,12 +75,12 @@ public class ParticleSphere extends Particle implements IAttachableParticle { super.tick(); if (caster != null) { - if (!caster.hasEffect() || caster.getEffect().getDead() || caster.getEntity().removed) { + if (!caster.hasEffect() || caster.getEffect().isDead() || caster.getEntity().removed) { markDead(); } else { Entity e = caster.getEntity(); - if (!caster.getWorld().loadedEntityList.contains(caster.getEntity())) { + if (caster.getWorld().getEntityById(e.getEntityId()) == null) { markDead(); } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/ButterflyEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/ButterflyEntityRenderer.java index 1a30d8bf..fce09f1c 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/ButterflyEntityRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/ButterflyEntityRenderer.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.client.render.entity; import com.minelittlepony.unicopia.client.render.entity.model.ButterflyEntityModel; -import com.minelittlepony.unicopia.entity.EntityButterfly; +import com.minelittlepony.unicopia.entity.ButterflyEntity; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.render.entity.EntityRenderDispatcher; @@ -9,24 +9,24 @@ import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; -public class ButterflyEntityRenderer extends LivingEntityRenderer { +public class ButterflyEntityRenderer extends LivingEntityRenderer { public ButterflyEntityRenderer(EntityRenderDispatcher rm) { super(rm, new ButterflyEntityModel(), 0.25F); } @Override - protected Identifier getTexture(EntityButterfly entity) { + protected Identifier getTexture(ButterflyEntity entity) { return entity.getVariety().getSkin(); } @Override - protected void scale(EntityButterfly entity, float ticks) { + protected void scale(ButterflyEntity entity, float ticks) { GlStateManager.scalef(0.35F, 0.35F, 0.35F); } @Override - protected void setupTransforms(EntityButterfly entity, float age, float yaw, float ticks) { + protected void setupTransforms(ButterflyEntity entity, float age, float yaw, float ticks) { if (!entity.isResting()) { GlStateManager.translated(0, MathHelper.cos(age / 3F) / 10F, 0); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCloud.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCloud.java index 7bac0b85..eb8a129a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCloud.java @@ -1,26 +1,26 @@ package com.minelittlepony.unicopia.client.render.entity; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; +import net.fabricmc.fabric.api.client.render.EntityRendererRegistry; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.util.Identifier; import org.lwjgl.opengl.GL11; import com.minelittlepony.unicopia.client.render.entity.model.ModelCloud; -import com.minelittlepony.unicopia.entity.EntityCloud; +import com.minelittlepony.unicopia.entity.CloudEntity; import com.minelittlepony.util.WorldHelper; -public class RenderCloud extends RenderLiving { +public class RenderCloud extends LivingEntityRenderer { private static final Identifier cloud = new Identifier("unicopia", "textures/entity/clouds.png"); private static final Identifier rainCloud = new Identifier("unicopia", "textures/entity/clouds_storm.png"); - public RenderCloud(RenderManager rendermanagerIn) { - super(rendermanagerIn, new ModelCloud(), 1f); + public RenderCloud(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) { + super(manager, new ModelCloud(), 1f); } @Override - public float prepareScale(EntityCloud entity, float par2) { + public float prepareScale(CloudEntity entity, float par2) { float scale = entity.getCloudSize(); GL11.glScalef(scale, scale, scale); @@ -28,7 +28,7 @@ public class RenderCloud extends RenderLiving { } @Override - protected void renderModel(EntityCloud entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { + protected void renderModel(CloudEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { if (!entity.isDead) { GlStateManager.pushMatrix(); @@ -54,7 +54,7 @@ public class RenderCloud extends RenderLiving { } @Override - protected Identifier getEntityTexture(EntityCloud entity) { + protected Identifier getEntityTexture(CloudEntity entity) { if (entity.getIsRaining() && entity.getIsThundering()) { return rainCloud; } @@ -62,12 +62,12 @@ public class RenderCloud extends RenderLiving { } @Override - protected int getColorMultiplier(EntityCloud par1LivingEntity, float yaw, float pitch) { + protected int getColorMultiplier(CloudEntity par1LivingEntity, float yaw, float pitch) { return 0; } @Override - protected float getDeathMaxRotation(EntityCloud par1LivingEntity) { + protected float getDeathMaxRotation(CloudEntity par1LivingEntity) { return 0; } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCuccoon.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCuccoon.java index a942a8ad..9d7d1f70 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCuccoon.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderCuccoon.java @@ -36,7 +36,7 @@ public class RenderCuccoon extends RenderLivingBase { if (entity.isBeingRidden()) { Entity rider = entity.getPassengers().get(0); - if (!(rider == MinecraftClient.getInstance().player) || UClient.instance().getViewMode() != 0) { + if (!(rider == MinecraftClient.instance().player) || UClient.instance().getViewMode() != 0) { GlStateManager.enableAlpha(); GlStateManager.enableBlend(); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderProjectile.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderProjectile.java deleted file mode 100644 index 0e3664d0..00000000 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderProjectile.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.minelittlepony.unicopia.client.render.entity; - -import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RenderSnowball; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; - -public class RenderProjectile extends RenderSnowball { - - public RenderProjectile(RenderManager renderManager) { - super(renderManager, Items.POTIONITEM, MinecraftClient.getInstance().getRenderItem()); - } - - @Override - public ItemStack getStackToRender(AdvancedProjectileEntity entity) { - return entity.getItem(); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderRainbow.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderRainbow.java index c4df7d86..0cfc9072 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderRainbow.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderRainbow.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.client.render.entity; import org.lwjgl.opengl.GL11; -import com.minelittlepony.unicopia.entity.EntityRainbow; +import com.minelittlepony.unicopia.entity.RainbowEntity; import com.minelittlepony.util.WorldHelper; import net.minecraft.client.Minecraft; @@ -14,7 +14,7 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.Identifier; -public class RenderRainbow extends Render { +public class RenderRainbow extends Render { public RenderRainbow(RenderManager renderManager) { super(renderManager); @@ -22,9 +22,9 @@ public class RenderRainbow extends Render { private static final Identifier TEXTURE = new Identifier("unicopia", "textures/environment/rainbow.png"); - public void doRender(EntityRainbow entity, double x, double y, double z, float entityYaw, float partialTicks) { - float distance = MinecraftClient.getInstance().getRenderViewEntity().getDistance(entity); - float maxDistance = 16 * MinecraftClient.getInstance().gameSettings.renderDistanceChunks; + public void doRender(RainbowEntity entity, double x, double y, double z, float entityYaw, float partialTicks) { + float distance = MinecraftClient.instance().getRenderViewEntity().getDistance(entity); + float maxDistance = 16 * MinecraftClient.instance().gameSettings.renderDistanceChunks; double r = entity.getRadius(); float light = WorldHelper.getDaylightBrightness(entity.getEntityWorld(), partialTicks); @@ -49,7 +49,7 @@ public class RenderRainbow extends Render { GlStateManager.color(1, 1, 1, opacity); - Tessellator tessellator = Tessellator.getInstance(); + Tessellator tessellator = Tessellator.instance(); BufferBuilder bufferbuilder = tessellator.getBuffer(); bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); @@ -67,7 +67,7 @@ public class RenderRainbow extends Render { } @Override - protected Identifier getEntityTexture(EntityRainbow entity) { + protected Identifier getEntityTexture(RainbowEntity entity) { return TEXTURE; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderSpellbook.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderSpellbook.java index 317bb57c..7181dbf9 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderSpellbook.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderSpellbook.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.client.render.entity; import com.minelittlepony.unicopia.client.render.entity.model.ModelSpellbook; -import com.minelittlepony.unicopia.entity.EntitySpellbook; +import com.minelittlepony.unicopia.entity.SpellbookEntity; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.entity.RenderLiving; @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.util.math.MathHelper; import net.minecraft.util.Identifier; -public class RenderSpellbook extends RenderLiving { +public class RenderSpellbook extends RenderLiving { private static final Identifier BLUE = new Identifier("unicopia", "textures/entity/enchanting_table_book_blue.png"); private static final Identifier NORMAL = new Identifier("unicopia", "textures/entity/enchanting_table_book.png"); @@ -19,17 +19,17 @@ public class RenderSpellbook extends RenderLiving { } @Override - protected Identifier getEntityTexture(EntitySpellbook entity) { + protected Identifier getEntityTexture(SpellbookEntity entity) { return entity.getIsAltered() ? BLUE : NORMAL; } @Override - protected float getDeathMaxRotation(EntitySpellbook entity) { + protected float getDeathMaxRotation(SpellbookEntity entity) { return 0; } @Override - protected void renderModel(EntitySpellbook entity, float time, float walkSpeed, float stutter, float yaw, float pitch, float increment) { + protected void renderModel(SpellbookEntity entity, float time, float walkSpeed, float stutter, float yaw, float pitch, float increment) { float breath = MathHelper.sin(((float)entity.ticksExisted + stutter) / 20) * 0.01F + 0.1F; @@ -40,14 +40,14 @@ public class RenderSpellbook extends RenderLiving { if (first_page_rot > 1) first_page_rot = 1; if (second_page_rot > 1) second_page_rot = 1; - if (!((EntitySpellbook)entity).getIsOpen()) { + if (!((SpellbookEntity)entity).getIsOpen()) { GlStateManager.translate(0, 1.44f, 0); } else { GlStateManager.translate(0, 1.2f + breath, 0); } GlStateManager.pushMatrix(); - if (!((EntitySpellbook)entity).getIsOpen()) { + if (!((SpellbookEntity)entity).getIsOpen()) { first_page_rot = second_page_rot = open_angle = 0; GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F); GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F); @@ -63,12 +63,12 @@ public class RenderSpellbook extends RenderLiving { } @Override - protected void applyRotations(EntitySpellbook entity, float p_77043_2_, float p_77043_3_, float partialTicks) { + protected void applyRotations(SpellbookEntity entity, float p_77043_2_, float p_77043_3_, float partialTicks) { GlStateManager.rotate(-interpolateRotation(entity.prevRotationYaw, entity.rotationYaw, partialTicks), 0, 1, 0); } @Override - protected boolean canRenderName(EntitySpellbook targetEntity) { + protected boolean canRenderName(SpellbookEntity targetEntity) { return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender() || targetEntity.hasCustomName() && targetEntity == renderManager.pointedEntity); } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderGem.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/SpellcastEntityRenderer.java similarity index 63% rename from src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderGem.java rename to src/main/java/com/minelittlepony/unicopia/client/render/entity/SpellcastEntityRenderer.java index 1cf15bad..cde68175 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/RenderGem.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/SpellcastEntityRenderer.java @@ -3,16 +3,19 @@ package com.minelittlepony.unicopia.client.render.entity; import com.minelittlepony.unicopia.client.render.entity.model.ModelGem; import com.minelittlepony.unicopia.entity.SpellcastEntity; +import net.fabricmc.fabric.api.client.render.EntityRendererRegistry; +import net.minecraft.client.render.Frustum; +import net.minecraft.client.render.VisibleRegion; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.util.Identifier; -public class RenderGem extends LivingEntityRenderer { +public class SpellcastEntityRenderer extends LivingEntityRenderer { private static final Identifier gem = new Identifier("unicopia", "textures/entity/gem.png"); - public RenderGem(EntityRenderDispatcher rendermanagerIn) { - super(rendermanagerIn, new ModelGem(), 0); + public SpellcastEntityRenderer(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) { + super(manager, new ModelGem(), 0); } @Override @@ -21,7 +24,7 @@ public class RenderGem extends LivingEntityRenderer { } @Override - public boolean shouldRender(SpellcastEntity livingEntity, ICamera camera, double camX, double camY, double camZ) { + public boolean isVisible(SpellcastEntity livingEntity, VisibleRegion camera, double camX, double camY, double camZ) { return true; } @@ -33,6 +36,6 @@ public class RenderGem extends LivingEntityRenderer { @Override protected boolean canRenderName(SpellcastEntity targetEntity) { return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender() - || targetEntity.hasCustomName() && targetEntity == renderManager.pointedEntity); + || targetEntity.hasCustomName() && targetEntity == renderManager.targetedEntity); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/model/ButterflyEntityModel.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/model/ButterflyEntityModel.java index 9f635c95..8716903c 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/model/ButterflyEntityModel.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/model/ButterflyEntityModel.java @@ -1,13 +1,13 @@ package com.minelittlepony.unicopia.client.render.entity.model; -import com.minelittlepony.unicopia.entity.EntityButterfly; +import com.minelittlepony.unicopia.entity.ButterflyEntity; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.model.Cuboid; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.util.math.MathHelper; -public class ButterflyEntityModel extends EntityModel { +public class ButterflyEntityModel extends EntityModel { private Cuboid body; @@ -55,7 +55,7 @@ public class ButterflyEntityModel extends EntityModel { } @Override - public void render(EntityButterfly entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { + public void render(ButterflyEntity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { setAngles(entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); @@ -67,7 +67,7 @@ public class ButterflyEntityModel extends EntityModel { } @Override - public void setAngles(EntityButterfly entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { + public void setAngles(ButterflyEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { float flap = MathHelper.cos(ageInTicks) * (float)Math.PI / 4; diff --git a/src/main/java/com/minelittlepony/unicopia/command/CommandDisguise.java b/src/main/java/com/minelittlepony/unicopia/command/CommandDisguise.java index 5eb0229e..afddb040 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/CommandDisguise.java +++ b/src/main/java/com/minelittlepony/unicopia/command/CommandDisguise.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.command; import java.util.List; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.spells.SpellDisguise; import net.minecraft.command.CommandException; @@ -64,13 +64,13 @@ class CommandDisguise extends Command { } protected Entity constructDisguiseEntity(World world, String[] args) throws CommandException { - NBTTagCompound nbt = getEntityNBT(args); + CompoundTag nbt = getEntityNBT(args); nbt.setString("id", args[1]); return AnvilChunkLoader.readWorldEntityPos(nbt, world, 0, 0, 0, false); } - protected NBTTagCompound getEntityNBT(String[] args) throws CommandException { + protected CompoundTag getEntityNBT(String[] args) throws CommandException { if (args.length > 2) { try { return JsonToNBT.getTagFromJson(buildString(args, 2)); @@ -79,7 +79,7 @@ class CommandDisguise extends Command { } } - return new NBTTagCompound(); + return new CompoundTag(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/command/CommandGravity.java b/src/main/java/com/minelittlepony/unicopia/command/CommandGravity.java index c176c054..91381259 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/CommandGravity.java +++ b/src/main/java/com/minelittlepony/unicopia/command/CommandGravity.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.command; import java.util.List; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minelittlepony/unicopia/command/CommandOverrideGameMode.java b/src/main/java/com/minelittlepony/unicopia/command/CommandOverrideGameMode.java index 6db15b5c..69451be3 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/CommandOverrideGameMode.java +++ b/src/main/java/com/minelittlepony/unicopia/command/CommandOverrideGameMode.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.command; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.command.CommandException; import net.minecraft.command.CommandGameMode; diff --git a/src/main/java/com/minelittlepony/unicopia/command/Commands.java b/src/main/java/com/minelittlepony/unicopia/command/Commands.java index 549157a0..71874cf6 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/Commands.java +++ b/src/main/java/com/minelittlepony/unicopia/command/Commands.java @@ -1,10 +1,7 @@ package com.minelittlepony.unicopia.command; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; - public class Commands { - - public static void init(FMLServerStartingEvent event) { + public static void bootstrap() { event.registerServerCommand(new CommandOverrideGameMode()); event.registerServerCommand(new CommandSpecies()); event.registerServerCommand(new CommandRacelist()); diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/ItemEdible.java b/src/main/java/com/minelittlepony/unicopia/edibles/ItemEdible.java deleted file mode 100644 index 620a4b45..00000000 --- a/src/main/java/com/minelittlepony/unicopia/edibles/ItemEdible.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.minelittlepony.unicopia.edibles; - -import java.util.List; - -import javax.annotation.Nullable; - -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.UEffects; - -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.StatList; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; -import net.minecraft.world.World; - -public abstract class ItemEdible extends ItemFood implements IEdible { - - private EnumAction useAction = EnumAction.EAT; - - public ItemEdible(int amount, int saturation, boolean isMeat) { - super(amount, saturation, isMeat); - } - - public ItemEdible(String domain, String name, int amount, int saturation, boolean isMeat) { - super(amount, saturation, isMeat); - - setTranslationKey(name); - setRegistryName(domain, name); - } - - public Item setUseAction(EnumAction action) { - useAction = action; - - return this; - } - - public EnumAction getItemUseAction(ItemStack stack) { - return useAction; - } - - protected void onFoodEaten(ItemStack stack, World worldIn, PlayerEntity player) { - Race race = SpeciesList.instance().getPlayer(player).getSpecies(); - Toxicity toxicity = (race.isDefault() || race == Race.CHANGELING) ? Toxicity.LETHAL : getToxicityLevel(stack); - - addSecondaryEffects(player, toxicity, stack); - } - - @Override - public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { - tooltip.add(getToxicityLevel(stack).getTooltip()); - } - - @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) { - - PlayerEntity entityplayer = entityLiving instanceof PlayerEntity ? (PlayerEntity)entityLiving : null; - - if (entityplayer != null) { - entityplayer.getFoodStats().addStats(this, stack); - - worldIn.playSound(null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 0.5F, worldIn.rand.nextFloat() * 0.1F + 0.9F); - - onFoodEaten(stack, worldIn, entityplayer); - - // replaced "this" with "stack.getItem()" - entityplayer.addStat(StatList.getObjectUseStats(stack.getItem())); - - if (entityplayer instanceof ServerPlayerEntity) { - CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayerEntity)entityplayer, stack); - } - } - - if (entityplayer == null || !entityplayer.capabilities.isCreativeMode) { - stack.shrink(1); - } - - ItemStack container = getContainerItem(stack); - - if (!container.isEmpty() && entityplayer != null && !entityplayer.capabilities.isCreativeMode) { - if (stack.isEmpty()) { - return getContainerItem(stack); - } - - entityplayer.inventory.addItemStackToInventory(getContainerItem(stack)); - } - - return stack; - } - - @Override - public TypedActionResult onItemRightClick(World world, PlayerEntity player, EnumHand hand) { - Race race = SpeciesList.instance().getPlayer(player).getSpecies(); - - if (race.isDefault() || race == Race.CHANGELING) { - return new TypedActionResult(EnumActionResult.FAIL, player.getStackInHand(hand)); - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public void addSecondaryEffects(PlayerEntity player, Toxicity toxicity, ItemStack stack) { - - if (toxicity.toxicWhenRaw()) { - player.addPotionEffect(toxicity.getPoisonEffect()); - } - - if (toxicity.isLethal()) { - player.addPotionEffect(new PotionEffect(UEffects.FOOD_POISONING, 300, 7, false, false)); - } else if (toxicity.toxicWhenCooked()) { - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 3, 1, false, false)); - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/MultiItemEdible.java b/src/main/java/com/minelittlepony/unicopia/edibles/MultiItemEdible.java deleted file mode 100644 index 6b6152c8..00000000 --- a/src/main/java/com/minelittlepony/unicopia/edibles/MultiItemEdible.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.minelittlepony.unicopia.edibles; - -import javax.annotation.Nonnull; -import com.minelittlepony.unicopia.forgebullshit.IMultiItem; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -public class MultiItemEdible extends ItemEdible implements IMultiItem { - - private String translationKey; - - private final IEdible toxicityDeterminant; - - public MultiItemEdible(@Nonnull IEdible mapper) { - super(1, 0, false); - - toxicityDeterminant = mapper; - } - - public MultiItemEdible(String domain, String name, int amount, int saturation, @Nonnull IEdible mapper) { - super(domain, name, amount, saturation, false); - - toxicityDeterminant = mapper; - } - - public Item setTranslationKey(String key) { - translationKey = key; - - return super.setTranslationKey(key); - } - - @Override - public void addSecondaryEffects(PlayerEntity player, Toxicity toxicity, ItemStack stack) { - super.addSecondaryEffects(player, toxicity, stack); - - toxicityDeterminant.addSecondaryEffects(player, toxicity, stack); - } - - @Override - public Toxicity getToxicityLevel(ItemStack stack) { - return toxicityDeterminant.getToxicityLevel(stack); - } - - @Override - public String[] getVariants() { - return Toxicity.getVariants(translationKey); - } - - @Override - public boolean variantsAreHidden() { - return true; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/AbstractSpecialRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/AbstractSpecialRecipe.java deleted file mode 100644 index ee2f15f7..00000000 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/AbstractSpecialRecipe.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.minelittlepony.unicopia.enchanting; - -import java.util.ArrayList; -import java.util.List; - -import com.google.common.collect.Lists; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.minelittlepony.unicopia.inventory.gui.SpellBookInventory; - -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.registries.IForgeRegistryEntry.Impl; - -public abstract class AbstractSpecialRecipe extends Impl implements IRecipe { - - private final SpellIngredient spellitem; - - private final NonNullList ingredients; - - static NonNullList parseIngrediants(JsonObject json) { - NonNullList ingredients = NonNullList.create(); - - for (JsonElement i : json.get("ingredients").getAsJsonArray()) { - SpellIngredient ingredient = SpellIngredient.parse(i); - - if (ingredient != null) { - ingredients.add(ingredient); - } - } - - if (ingredients.isEmpty()) { - throw new JsonParseException("Recipe cannot have 0 ingredients"); - } - - return ingredients; - } - - static SpellIngredient parseSingleIngredient(JsonObject json) { - SpellIngredient result = SpellIngredient.parse(json.get("item")); - - if (result == null) { - throw new JsonParseException("Recipe cannot have no enchantable input"); - } - - return result; - } - - public AbstractSpecialRecipe(SpellIngredient spellitem, NonNullList ingredients) { - this.spellitem = spellitem; - this.ingredients = ingredients; - } - - @Override - public boolean matches(InventoryCrafting inv, World worldIn) { - ItemStack enchantedStack = ((SpellBookInventory)inv).getCraftResultMatrix().getStackInSlot(0); - - if (enchantedStack.isEmpty() || enchantedStack.getItem() == null) { - return false; - } - - if (!spellitem.matches(enchantedStack, enchantedStack.getCount())) { - return false; - } - - int materialMult = enchantedStack.getCount(); - - ArrayList toMatch = Lists.newArrayList(ingredients); - - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - - if (!stack.isEmpty()) { - if (toMatch.isEmpty() || !removeMatch(toMatch, stack, materialMult)) { - return false; - } - } - } - - return toMatch.isEmpty(); - } - - private boolean removeMatch(List toMatch, ItemStack stack, int materialMult) { - return toMatch.stream() - .filter(s -> s.matches(stack, materialMult)) - .findFirst() - .filter(toMatch::remove) - .isPresent(); - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting inv) { - return getRecipeOutput(); - } - - @Override - public boolean canFit(int width, int height) { - return width * height < ingredients.size(); - } - - public SpellIngredient getSpellItem() { - return spellitem; - } - - public NonNullList getSpellIngredients() { - return ingredients; - } - - @Override - public ItemStack getRecipeOutput() { - return spellitem.getStack(); - } - - @Override - public NonNullList getRemainingItems(InventoryCrafting inv) { - NonNullList remainers = NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY); - - for (int i = 0; i < remainers.size(); i++) { - ItemStack stack = inv.getStackInSlot(i); - - if (stack != null && stack.getItem().hasContainerItem(stack)) { - remainers.set(i, new ItemStack(stack.getItem().getContainerItem())); - } - } - - return remainers; - } - - -} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/SpecialRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/SpecialRecipe.java deleted file mode 100644 index 3be8985f..00000000 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/SpecialRecipe.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.minelittlepony.unicopia.enchanting; - -import com.google.gson.JsonObject; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.NonNullList; - -public class SpecialRecipe extends AbstractSpecialRecipe { - - private final SpellIngredient output; - - public static IRecipe deserialize(JsonObject json) { - return new SpecialRecipe( - parseSingleIngredient(json.get("input").getAsJsonObject()), - parseSingleIngredient(json.get("output").getAsJsonObject()), - parseIngrediants(json) - ); - } - - public SpecialRecipe(SpellIngredient input, SpellIngredient output, NonNullList ingredients) { - super(input, ingredients); - - this.output = output; - } - - @Override - public ItemStack getRecipeOutput() { - return output.getStack(); - } -} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellCraftingEvent.java b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellCraftingEvent.java index af2bac90..c6e4dc1a 100644 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellCraftingEvent.java +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellCraftingEvent.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; import com.google.gson.JsonObject; import com.google.gson.annotations.Expose; -import com.minelittlepony.unicopia.item.ItemSpell; +import com.minelittlepony.unicopia.item.MagicGemItem; import com.minelittlepony.unicopia.spell.SpellAffinity; import com.minelittlepony.unicopia.spell.SpellRegistry; @@ -50,8 +50,8 @@ public class SpellCraftingEvent { @Override public boolean matches(IPageOwner prop, Event event) { - if (!event.stack.isEmpty() && event.stack.getItem() instanceof ItemSpell) { - return ((ItemSpell)event.stack.getItem()).getAffinity() == affinity + if (!event.stack.isEmpty() && event.stack.getItem() instanceof MagicGemItem) { + return ((MagicGemItem)event.stack.getItem()).getAffinity() == affinity && SpellRegistry.getKeyFromStack(event.stack).equals(spell); } diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellIngredient.java b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellIngredient.java deleted file mode 100644 index 917b1cd1..00000000 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellIngredient.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.minelittlepony.unicopia.enchanting; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import javax.annotation.Nullable; - -import com.google.common.collect.Lists; -import com.google.common.collect.Streams; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.minelittlepony.unicopia.enchanting.AffineIngredients.AffineIngredient; -import com.minelittlepony.unicopia.spell.SpellRegistry; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -public interface SpellIngredient { - - static SpellIngredient EMPTY = new Single(ItemStack.EMPTY, false); - - @Nullable - static SpellIngredient parse(JsonElement json) { - if (json.isJsonArray()) { - return Compound.parse(json.getAsJsonArray()); - } - - return Single.parse(json.getAsJsonObject()); - } - - boolean matches(ItemStack other, int materialMult); - - ItemStack getStack(); - - Stream getStacks(); - - class Compound implements SpellIngredient { - private final List items; - - Compound(List items) { - this.items = items; - } - - public Stream getStacks() { - Stream stacks = Lists.newArrayList().stream(); - - for (SpellIngredient i : items) { - stacks = Streams.concat(stacks, i.getStacks()); - } - - return stacks.distinct(); - } - - @Override - public ItemStack getStack() { - return items.get((int)(Math.random() * items.size())).getStack(); - } - - @Override - public boolean matches(ItemStack other, int materialMult) { - return items.stream().anyMatch(item -> item.matches(other, materialMult)); - } - - @Nullable - static SpellIngredient parse(JsonArray json) { - if (json.size() > 0) { - List items = Lists.newArrayList(); - - for (JsonElement j : json) { - SpellIngredient item = SpellIngredient.parse(j); - - if (item != null) { - items.add(item); - } - } - - if (!items.isEmpty()) { - return new Compound(items); - } - } - - return null; - } - } - - class Single implements SpellIngredient { - - private final ItemStack contained; - private final boolean ignoreMeta; - - Single(ItemStack stack, boolean meta) { - contained = stack; - ignoreMeta = meta; - } - - public Stream getStacks() { - if (ignoreMeta && !contained.isEmpty()) { - NonNullList subItems = NonNullList.create(); - contained.getItem().getSubItems(CreativeTabs.SEARCH, subItems); - - return subItems.stream(); - } - - return Streams.stream(Optional.ofNullable(contained)); - } - - @Override - public ItemStack getStack() { - return contained; - } - - @Override - public boolean matches(ItemStack other, int materialMult) { - if (other.isEmpty() != contained.isEmpty()) { - return false; - } else if (other.isEmpty()) { - return true; - } - - if (other.isEmpty()) { - return false; - } - - if (contained.getItem() == other.getItem() - && (ignoreMeta || other.getMetadata() == contained.getMetadata()) - && ItemStack.areItemStackTagsEqual(contained, other)) { - return other.getCount() >= (materialMult * contained.getCount()); - } - - return false; - } - - @Nullable - public static SpellIngredient parse(JsonObject json) { - Item item = json.has("item") ? Item.getByNameOrId(json.get("item").getAsString()) : null; - - if (item != null) { - int metadata = Math.max(0, json.has("data") ? json.get("data").getAsInt() : 0); - int size = Math.max(1, json.has("count") ? json.get("count").getAsInt() : 1); - String spell = json.has("spell") ? json.get("spell").getAsString() : null; - - ItemStack stack = new ItemStack(item, size, metadata); - - if (spell != null) { - stack = SpellRegistry.getInstance().enchantStack(stack, spell); - } - - return new Single(stack, !(json.has("spell") || json.has("data"))); - } - - if (json.has("id")) { - return AffineIngredient.parse(json); - } - - return null; - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java deleted file mode 100644 index 01df38d5..00000000 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.minelittlepony.unicopia.enchanting; - -import com.google.gson.JsonObject; -import com.minelittlepony.unicopia.inventory.gui.SpellBookInventory; -import com.minelittlepony.unicopia.spell.SpellRegistry; - -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.NonNullList; - -public class SpellRecipe extends AbstractSpecialRecipe { - - private final String spellId; - - public static IRecipe deserialize(JsonObject json) { - - JsonObject resultJson = json.get("result").getAsJsonObject(); - - return new SpellRecipe( - parseSingleIngredient(resultJson), - resultJson.get("spell").getAsString(), - parseIngrediants(json) - ); - } - - public SpellRecipe(SpellIngredient spellitem, String spellName, NonNullList ingredients) { - super(spellitem, ingredients); - this.spellId = spellName; - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting inv) { - SpellBookInventory inventory = (SpellBookInventory)inv; - - IInventory craftResult = inventory.getCraftResultMatrix(); - ItemStack stackToEnchant = craftResult.getStackInSlot(0); - - return SpellRegistry.getInstance().enchantStack(stackToEnchant, spellId); - } - - @Override - public ItemStack getRecipeOutput() { - return SpellRegistry.getInstance().enchantStack(super.getRecipeOutput(), spellId); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AbstractSpecialRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AbstractSpecialRecipe.java new file mode 100644 index 00000000..63e6875e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AbstractSpecialRecipe.java @@ -0,0 +1,100 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.Lists; +import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.inventory.gui.SpellBookInventory; + +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Recipe; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Identifier; +import net.minecraft.world.World; + +public abstract class AbstractSpecialRecipe implements Recipe { + + private final SpellIngredient spellitem; + + private final DefaultedList ingredients; + + private final Identifier id; + + public AbstractSpecialRecipe(Identifier id, SpellIngredient spellitem, DefaultedList ingredients) { + this.id = id; + this.spellitem = spellitem; + this.ingredients = ingredients; + } + + @Override + public boolean matches(CraftingInventory inv, World worldIn) { + ItemStack enchantedStack = ((SpellBookInventory)inv).getCraftResultMatrix().getInvStack(0); + + if (enchantedStack.isEmpty() || enchantedStack.getItem() == null) { + return false; + } + + if (!spellitem.matches(enchantedStack, enchantedStack.getCount())) { + return false; + } + + int materialMult = enchantedStack.getCount(); + + ArrayList toMatch = Lists.newArrayList(ingredients); + + for (int i = 0; i < inv.getInvSize(); i++) { + ItemStack stack = inv.getInvStack(i); + + if (!stack.isEmpty()) { + if (toMatch.isEmpty() || !removeMatch(toMatch, stack, materialMult)) { + return false; + } + } + } + + return toMatch.isEmpty(); + } + + private boolean removeMatch(List toMatch, ItemStack stack, int materialMult) { + return toMatch.stream() + .filter(s -> s.matches(stack, materialMult)) + .findFirst() + .filter(toMatch::remove) + .isPresent(); + } + + @Override + public Identifier getId() { + return id; + } + + @Override + public ItemStack craft(CraftingInventory inv) { + return getOutput(); + } + + @Override + public boolean fits(int width, int height) { + return width * height < ingredients.size(); + } + + @Override + public ItemStack getRecipeKindIcon() { + return new ItemStack(UItems.spell); + } + + public SpellIngredient getSpellItem() { + return spellitem; + } + + public DefaultedList getSpellIngredients() { + return ingredients; + } + + @Override + public ItemStack getOutput() { + return spellitem.getStack(); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/AffineIngredients.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AffineIngredients.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/enchanting/AffineIngredients.java rename to src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AffineIngredients.java index e153095e..66f55aea 100644 --- a/src/main/java/com/minelittlepony/unicopia/enchanting/AffineIngredients.java +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/AffineIngredients.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.enchanting; +package com.minelittlepony.unicopia.enchanting.recipe; import java.util.Map; import java.util.stream.Stream; diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/CompoundSpellIngredient.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/CompoundSpellIngredient.java new file mode 100644 index 00000000..24646c59 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/CompoundSpellIngredient.java @@ -0,0 +1,80 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import java.util.List; +import java.util.stream.Stream; + +import com.google.common.collect.Lists; +import com.google.common.collect.Streams; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import net.minecraft.item.ItemStack; +import net.minecraft.util.PacketByteBuf; + +class CompoundSpellIngredient implements SpellIngredient { + static final Serializer SERIALIZER = new Serializer() { + @Override + public CompoundSpellIngredient read(JsonElement json) { + JsonArray arr = json.getAsJsonArray(); + + if (arr.size() > 0) { + List items = Lists.newArrayList(); + + for (JsonElement j : arr) { + SpellIngredient item = SpellIngredient.parse(j); + + if (item != null) { + items.add(item); + } + } + + if (!items.isEmpty()) { + return new CompoundSpellIngredient(items); + } + } + + throw new JsonParseException("Invalid spell ingredient (compound)"); + } + + @Override + public CompoundSpellIngredient read(PacketByteBuf buff) { + return null; + } + + @Override + public void write(PacketByteBuf buff, CompoundSpellIngredient recipe) { + } + }; + + private final List items; + + CompoundSpellIngredient(List items) { + this.items = items; + } + + @Override + public Stream getStacks() { + Stream stacks = Lists.newArrayList().stream(); + + for (SpellIngredient i : items) { + stacks = Streams.concat(stacks, i.getStacks()); + } + + return stacks.distinct(); + } + + @Override + public ItemStack getStack() { + return items.get((int)(Math.random() * items.size())).getStack(); + } + + @Override + public boolean matches(ItemStack other, int materialMult) { + return items.stream().anyMatch(item -> item.matches(other, materialMult)); + } + + @Override + public Serializer getSerializer() { + return SERIALIZER; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SingleSpellIngredient.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SingleSpellIngredient.java new file mode 100644 index 00000000..4ec0667e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SingleSpellIngredient.java @@ -0,0 +1,108 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import java.util.Optional; +import java.util.stream.Stream; + +import javax.annotation.Nullable; + +import com.google.common.collect.Streams; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.minelittlepony.unicopia.enchanting.recipe.AffineIngredients.AffineIngredient; +import com.minelittlepony.unicopia.enchanting.recipe.SpellIngredient.Serializer; +import com.minelittlepony.unicopia.magic.spells.SpellRegistry; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Identifier; +import net.minecraft.util.PacketByteBuf; +import net.minecraft.util.registry.Registry; + +class SingleSpellIngredient implements SpellIngredient { + static final Serializer SERIALIZER = new Serializer() { + @Override + public SpellIngredient read(JsonElement json) { + JsonObject obj = json.getAsJsonObject(); + Item item = obj.has("item") ? Registry.ITEM.get(new Identifier(obj.get("item").getAsString())) : null; + + if (item != null) { + int size = Math.max(1, obj.has("count") ? obj.get("count").getAsInt() : 1); + String spell = obj.has("spell") ? obj.get("spell").getAsString() : null; + + ItemStack stack = new ItemStack(item, size); + + if (spell != null) { + stack = SpellRegistry.instance().enchantStack(stack, spell); + } + + return new SingleSpellIngredient(stack, !(obj.has("spell") || obj.has("data"))); + } + + if (obj.has("id")) { + return AffineIngredient.parse(obj); + } + + throw new JsonParseException("Invalid spell ingredient (single)"); + } + + @Override + public SingleSpellIngredient read(PacketByteBuf buff) { + return null; + } + + @Override + public void write(PacketByteBuf buff, SpellIngredient recipe) { + } + }; + + private final ItemStack contained; + + SingleSpellIngredient(ItemStack stack, boolean meta) { + contained = stack; + } + + @Override + public Stream getStacks() { + if (!contained.isEmpty()) { + DefaultedList subItems = DefaultedList.of(); + contained.getItem().getSubItems(ItemGroup.SEARCH, subItems); + + return subItems.stream(); + } + + return Streams.stream(Optional.ofNullable(contained)); + } + + @Override + public ItemStack getStack() { + return contained; + } + + @Override + public boolean matches(ItemStack other, int materialMult) { + if (other.isEmpty() != contained.isEmpty()) { + return false; + } else if (other.isEmpty()) { + return true; + } + + if (other.isEmpty()) { + return false; + } + + if (contained.getItem() == other.getItem() + && ItemStack.areItemsEqual(contained, other)) { + return other.getCount() >= (materialMult * contained.getCount()); + } + + return false; + } + + @Override + public Serializer getSerializer() { + return SERIALIZER; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpecialRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpecialRecipe.java new file mode 100644 index 00000000..627bd781 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpecialRecipe.java @@ -0,0 +1,53 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import com.google.gson.JsonObject; + +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Identifier; + +public class SpecialRecipe extends AbstractSpecialRecipe { + + private final SpellIngredient output; + + public static Recipe deserialize(JsonObject json) { + return new SpecialRecipe(null, + SpellIngredient.single(json.get("input").getAsJsonObject()), + SpellIngredient.single(json.get("output").getAsJsonObject()), + SpellIngredient.multiple(json) + ); + } + + public SpecialRecipe(Identifier id, SpellIngredient input, SpellIngredient output, DefaultedList ingredients) { + super(id, input, ingredients); + + this.output = output; + } + + @Override + public ItemStack getOutput() { + return output.getStack(); + } + + @Override + public Identifier getId() { + // TODO Auto-generated method stub + return null; + } + + @Override + public RecipeSerializer getSerializer() { + // TODO Auto-generated method stub + return null; + } + + @Override + public RecipeType getType() { + // TODO Auto-generated method stub + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellIngredient.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellIngredient.java new file mode 100644 index 00000000..b9fd3e97 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellIngredient.java @@ -0,0 +1,83 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import java.util.stream.Stream; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.PacketByteBuf; + +public interface SpellIngredient { + + SpellIngredient EMPTY = new SingleSpellIngredient(ItemStack.EMPTY, false); + + Serializer SERIALIZER = new Serializer() { + @Override + public SpellIngredient read(JsonElement json) { + if (json.isJsonArray()) { + return CompoundSpellIngredient.SERIALIZER.read(json); + } + + return SingleSpellIngredient.SERIALIZER.read(json); + } + + @Override + public SpellIngredient read(PacketByteBuf buff) { + byte type = buff.readByte(); + + if (type == 0) { + return SingleSpellIngredient.SERIALIZER.read(buff); + } + return CompoundSpellIngredient.SERIALIZER.read(buff); + } + + @Override + public void write(PacketByteBuf buff, SpellIngredient recipe) { + buff.writeByte(recipe instanceof SingleSpellIngredient ? 0 : 1); + recipe.write(buff); + } + }; + + static SpellIngredient single(JsonObject json) { + return parse(json.get("item")); + } + + static DefaultedList multiple(JsonObject json) { + DefaultedList ingredients = DefaultedList.of(); + + json.get("ingredients").getAsJsonArray().forEach(i -> ingredients.add(parse(i))); + + if (ingredients.isEmpty()) { + throw new JsonParseException("Recipe cannot have 0 ingredients"); + } + + return ingredients; + } + + static SpellIngredient parse(JsonElement json) { + return SERIALIZER.read(json); + } + + boolean matches(ItemStack other, int materialMult); + + ItemStack getStack(); + + Stream getStacks(); + + Serializer getSerializer(); + + @SuppressWarnings("unchecked") + default void write(PacketByteBuf buff) { + ((Serializer)getSerializer()).write(buff, this); + } + + interface Serializer { + T read(JsonElement json); + + T read(PacketByteBuf buff); + + void write(PacketByteBuf buff, T ingredient); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellRecipe.java new file mode 100644 index 00000000..eb8ffd4f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/recipe/SpellRecipe.java @@ -0,0 +1,96 @@ +package com.minelittlepony.unicopia.enchanting.recipe; + +import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.inventory.gui.SpellBookInventory; +import com.minelittlepony.unicopia.magic.spells.SpellRegistry; + +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Identifier; +import net.minecraft.util.PacketByteBuf; + +public class SpellRecipe extends AbstractSpecialRecipe { + + private final String spellId; + + public SpellRecipe(Identifier id, SpellIngredient spellitem, String spellName, DefaultedList ingredients) { + super(id, spellitem, ingredients); + this.spellId = spellName; + } + + @Override + public ItemStack getRecipeKindIcon() { + return new ItemStack(UItems.spellbook); + } + + @Override + public ItemStack craft(CraftingInventory inv) { + SpellBookInventory inventory = (SpellBookInventory)inv; + + Inventory craftResult = inventory.getCraftResultMatrix(); + ItemStack stackToEnchant = craftResult.getInvStack(0); + + return SpellRegistry.instance().enchantStack(stackToEnchant, spellId); + } + + @Override + public ItemStack getOutput() { + return SpellRegistry.instance().enchantStack(super.getOutput(), spellId); + } + + @Override + public RecipeSerializer getSerializer() { + return null; + } + + @Override + public RecipeType getType() { + return null; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public SpellRecipe read(Identifier id, JsonObject json) { + JsonObject resultJson = json.get("result").getAsJsonObject(); + + return new SpellRecipe(id, + SpellIngredient.single(resultJson), + resultJson.get("spell").getAsString(), + SpellIngredient.multiple(json) + ); + } + + @Override + public SpellRecipe read(Identifier id, PacketByteBuf buff) { + SpellIngredient spellItem = SpellIngredient.SERIALIZER.read(buff); + String spellName = buff.readString(); + + int size = buff.readInt(); + DefaultedList ingredients = DefaultedList.ofSize(0, SpellIngredient.EMPTY); + + while (ingredients.size() < size) { + ingredients.add(SpellIngredient.SERIALIZER.read(buff)); + } + + return new SpellRecipe(id, + spellItem, + spellName, + ingredients); + } + + @Override + public void write(PacketByteBuf buff, SpellRecipe recipe) { + recipe.getSpellItem().write(buff); + buff.writeString(recipe.spellId); + DefaultedList ingredients = recipe.getSpellIngredients(); + buff.writeInt(ingredients.size()); + ingredients.forEach(i -> i.write(buff)); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/item/AdvancedProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/AdvancedProjectileEntity.java similarity index 98% rename from src/main/java/com/minelittlepony/unicopia/entity/item/AdvancedProjectileEntity.java rename to src/main/java/com/minelittlepony/unicopia/entity/AdvancedProjectileEntity.java index 4252904a..76d3cd19 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/item/AdvancedProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/AdvancedProjectileEntity.java @@ -1,8 +1,7 @@ -package com.minelittlepony.unicopia.entity.item; +package com.minelittlepony.unicopia.entity; import java.util.UUID; -import com.minelittlepony.unicopia.entity.IMagicals; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IMagicEffect; @@ -176,7 +175,7 @@ public class AdvancedProjectileEntity extends ThrownItemEntity implements IMagic } if (hasEffect()) { - if (getEffect().getDead()) { + if (getEffect().isDead()) { remove(); } else { getEffect().update(this); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityButterfly.java b/src/main/java/com/minelittlepony/unicopia/entity/ButterflyEntity.java similarity index 94% rename from src/main/java/com/minelittlepony/unicopia/entity/EntityButterfly.java rename to src/main/java/com/minelittlepony/unicopia/entity/ButterflyEntity.java index 343e936f..a802491f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityButterfly.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ButterflyEntity.java @@ -28,21 +28,21 @@ import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.biome.Biome.SpawnEntry; -public class EntityButterfly extends AmbientEntity { +public class ButterflyEntity extends AmbientEntity { - public static final EntityType TYPE = EntityType.Builder.create(EntityButterfly::new, EntityCategory.AMBIENT) + public static final EntityType TYPE = EntityType.Builder.create(ButterflyEntity::new, EntityCategory.AMBIENT) .setDimensions(0.1F, 0.1F) .build("butterfly"); public static final SpawnEntry SPAWN_ENTRY = new SpawnEntry(TYPE, 15, 9, 15); - private static final TrackedData RESTING = DataTracker.registerData(EntityButterfly.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData RESTING = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData VARIANT = DataTracker.registerData(EntityButterfly.class, TrackedDataHandlerRegistry.INTEGER); + private static final TrackedData VARIANT = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.INTEGER); private BlockPos hoveringPosition; - public EntityButterfly(EntityType type, World world) { + public ButterflyEntity(EntityType type, World world) { super(type, world); setVariaty(Variant.random(world.random)); setResting(true); @@ -109,7 +109,7 @@ public class EntityButterfly extends AmbientEntity { } protected boolean isAggressor(Entity e) { - if (e instanceof EntityButterfly) { + if (e instanceof ButterflyEntity) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java b/src/main/java/com/minelittlepony/unicopia/entity/CloudEntity.java similarity index 66% rename from src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java rename to src/main/java/com/minelittlepony/unicopia/entity/CloudEntity.java index 8f50bac3..b90f7542 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/CloudEntity.java @@ -2,14 +2,18 @@ package com.minelittlepony.unicopia.entity; import java.util.Map; -import com.minelittlepony.unicopia.Predicates; +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.ability.powers.PowerCloudBase.ICloudEntity; +import com.minelittlepony.unicopia.ability.PowerCloudBase.ICloudEntity; +import com.minelittlepony.unicopia.particles.ParticleEmitter; +import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.CropBlock; import net.minecraft.block.FarmlandBlock; @@ -18,9 +22,12 @@ import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityData; import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LightningEntity; +import net.minecraft.entity.MovementType; +import net.minecraft.entity.SpawnType; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; @@ -28,24 +35,36 @@ import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.mob.FlyingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; +import net.minecraft.item.ShovelItem; +import net.minecraft.item.SwordItem; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.BlockSoundGroup; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.Heightmap; +import net.minecraft.world.IWorld; +import net.minecraft.world.LocalDifficulty; import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; -public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, IInAnimate { +public class CloudEntity extends FlyingEntity implements ICloudEntity, IInAnimate { - private static final TrackedData RAINTIMER = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.INTEGER); - private static final TrackedData THUNDERING = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData SCALE = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.INTEGER); + private static final TrackedData RAINTIMER = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.INTEGER); + private static final TrackedData THUNDERING = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData SCALE = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.INTEGER); - private static final TrackedData STATIONARY = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData STATIONARY = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.BOOLEAN); protected double targetAltitude; @@ -55,7 +74,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, private final double baseWidth = 3f; private final double baseHeight = 0.8f; - public EntityCloud(EntityType type, World world) { + public CloudEntity(EntityType type, World world) { super(type, world); ignoreCameraFrustum = true; targetAltitude = getRandomFlyingHeight(); @@ -80,20 +99,11 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, return SoundEvents.BLOCK_WOOL_BREAK; } - @Override + // TODO: loot table + /*@Override protected Item getDropItem() { return UItems.cloud_matter; - } - - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean doesEntityNotTriggerPressurePlate() { - return true; - } + }*/ @Override public boolean doesRenderOnFire() { @@ -126,28 +136,28 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } @Override - public void onStruckByLightning(EntityLightningBolt lightningBolt) { + public void onStruckByLightning(LightningEntity lightningBolt) { } @Override - public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, IEntityLivingData pack) { - if (world.random.nextInt(20) == 0 && canRainHere()) { + public EntityData initialize(IWorld world, LocalDifficulty difficulty, SpawnType type, @Nullable EntityData data, @Nullable CompoundTag tag) { + if (random.nextInt(20) == 0 && canRainHere()) { setRaining(); - if (world.random.nextInt(20) == 0) { + if (random.nextInt(20) == 0) { setIsThundering(true); } } setCloudSize(1 + random.nextInt(4)); - return super.onInitialSpawn(difficulty, pack); + return super.initialize(world, difficulty, type, data, tag); } @Override protected void collideWithEntity(Entity other) { - if (other instanceof EntityCloud || other instanceof PlayerEntity) { - if (other.posY > posY) { + if (other instanceof CloudEntity || other instanceof PlayerEntity) { + if (other.y > y) { return; } @@ -158,16 +168,16 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, @Override public void applyEntityCollision(Entity other) { if (other instanceof PlayerEntity) { - if (Predicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)other)) { + if (EquinePredicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)other)) { super.applyEntityCollision(other); } - } else if (other instanceof EntityCloud) { + } else if (other instanceof CloudEntity) { super.applyEntityCollision(other); } } @Override - public void onUpdate() { + public void tick() { Box boundingbox = getBoundingBox(); if (getIsRaining()) { @@ -175,11 +185,11 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, for (int i = 0; i < 30 * getCloudSize(); i++) { double x = MathHelper.nextDouble(random, boundingbox.minX, boundingbox.maxX); double y = getBoundingBox().minY + getHeight()/2; - double z = MathHelper.nextDouble(rand, boundingbox.minZ, boundingbox.maxZ); + double z = MathHelper.nextDouble(random, boundingbox.minZ, boundingbox.maxZ); - int particleId = canSnowHere(new BlockPos(x, y, z)) ? ParticleTypes.ITEM_SNOWBALL.getType() : UParticles.RAIN_DROPS; + ParticleEffect particleId = canSnowHere(new BlockPos(x, y, z)) ? ParticleTypes.ITEM_SNOWBALL : UParticles.RAIN_DROPS; - ParticleTypeRegistry.getTnstance().spawnParticle(particleId, false, x, y, z, 0, 0, 0); + world.addParticle(particleId, x, y, z, 0, 0, 0); } Box rainedArea = boundingbox @@ -194,6 +204,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } } + double width = getDimensions(getPose()).width; BlockPos pos = getGroundPosition( x + random.nextFloat() * width, z + random.nextFloat() * width @@ -215,39 +226,41 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, world.setBlockState(pos, Blocks.AIR.getDefaultState()); } - if (rand.nextInt(20) == 0) { + if (random.nextInt(20) == 0) { BlockPos below = pos.down(); state = world.getBlockState(below); if (state.getBlock() != null) { - if (world.canBlockFreezeWater(below)) { + Biome biome = world.getBiome(below); + + if (biome.canSetIce(world, below)) { world.setBlockState(below, Blocks.ICE.getDefaultState()); } - if (world.canSnowAt(pos, false)) { + if (biome.canSetSnow(world, pos)) { world.setBlockState(pos, Blocks.SNOW.getDefaultState()); } if (state.getBlock() instanceof FarmlandBlock) { - int moisture = state.getValue(FarmlandBlock.MOISTURE); + int moisture = state.get(FarmlandBlock.MOISTURE); if (moisture < 7) { world.setBlockState(below, state.with(FarmlandBlock.MOISTURE, moisture + 1)); } } else if (state.getBlock() instanceof CropBlock) { - int age = state.getValue(CropBlock.AGE); + int age = state.get(CropBlock.AGE); if (age < 7) { world.setBlockState(below, state.with(CropBlock.AGE, age + 1), 2); } } - state.getBlock().fillWithRain(world, below); + state.getBlock().onRainTick(world, below); } } if (setRainTimer(getRainTimer() - 1) == 0) { if (!getStationary()) { - pomf(); + spawnHurtParticles(); if (getCloudSize() > 1) { setIsRaining(false); @@ -266,20 +279,20 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } } - rotationPitch = 0; - rotationYawHead = 0; - rotationYaw = 0; + pitch = 0; + headYaw = 0; + yaw = 0; - for (Entity i : world.getEntitiesInAABBexcluding(this, boundingbox - .grow(1 / (1 + getCloudSize())), Predicates.ENTITY_INTERACT_WITH_CLOUDS)) { - if (i.posY > posY + 0.5) { + for (Entity i : world.getEntities(this, boundingbox + .expand(1 / (1 + getCloudSize())), EquinePredicates.ENTITY_INTERACT_WITH_CLOUDS)) { + if (i.y > y + 0.5) { applyGravityCompensation(i); } } - if (isBurning() && !dead) { + if (isOnFire() && !dead) { for (int i = 0; i < 5; i++) { - world.spawnParticle(ParticleTypes.CLOUD, + world.addParticle(ParticleTypes.CLOUD, MathHelper.nextDouble(random, boundingbox.minX, boundingbox.maxX), MathHelper.nextDouble(random, boundingbox.minY, boundingbox.maxY), MathHelper.nextDouble(random, boundingbox.minZ, boundingbox.maxZ), 0, 0.25, 0); @@ -290,47 +303,48 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, setVelocity(0, 0, 0); } - super.onUpdate(); + super.tick(); double motionFactor = (1 + getCloudSize() / 4); - motionX /= motionFactor; - motionZ /= motionFactor; + Vec3d vel = this.getVelocity(); + this.setVelocity(vel.x / motionFactor, vel.y, vel.z / motionFactor); + hurtTime = 0; } @Override - public double getMountedYOffset() { - return getEntityBoundingBox().maxY - getEntityBoundingBox().minY - 0.25; + public double getMountedHeightOffset() { + return getBoundingBox().maxY - getBoundingBox().minY - 0.25; } @Override - public void moveRelative(float strafe, float up, float forward, float friction) { + public void travel(Vec3d motion) { if (!getStationary()) { - super.moveRelative(strafe, up, forward, friction); + super.travel(motion); } } @Override - public void onCollideWithPlayer(PlayerEntity player) { - if (player.posY >= posY) { + public void onPlayerCollision(PlayerEntity player) { + if (player.y >= y) { if (applyGravityCompensation(player)) { - double difX = player.posX - player.lastTickPosX; - double difZ = player.posZ - player.lastTickPosZ; - double difY = player.posY - player.lastTickPosY; + double difX = player.x - player.prevX; + double difZ = player.z - player.prevZ; + double difY = player.y - player.prevY; - player.distanceWalkedModified = (float)(player.distanceWalkedModified + MathHelper.sqrt(difX * difX + difZ * difZ) * 0.6); - player.distanceWalkedOnStepModified = (float)(player.distanceWalkedOnStepModified + MathHelper.sqrt(difX * difX + difY * difY + difZ * difZ) * 0.6); + player.horizontalSpeed = (float)(player.horizontalSpeed + MathHelper.sqrt(difX * difX + difZ * difZ) * 0.6); + player.distanceWalked = (float)(player.distanceWalked + MathHelper.sqrt(difX * difX + difY * difY + difZ * difZ) * 0.6); if (SpeciesList.instance().getPlayer(player).stepOnCloud()) { - SoundType soundtype = SoundType.CLOTH; + BlockSoundGroup soundtype = BlockSoundGroup.WOOL; player.playSound(soundtype.getStepSound(), soundtype.getVolume() * 0.15F, soundtype.getPitch()); } } } - super.onCollideWithPlayer(player); + super.onPlayerCollision(player); } @Override @@ -352,8 +366,9 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, distance = 0; } - getVelocity().y -= 0.002; - getVelocity().y += (Math.signum(distance) * 0.699999988079071D - getVelocity().y) * 0.10000000149011612D; + Vec3d vel = getVelocity(); + + setVelocity(vel.x, vel.y - 0.002 + (Math.signum(distance) * 0.699999988079071D - vel.y) * 0.10000000149011612D, vel.z); } } } @@ -369,7 +384,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } protected float getMinimumFlyingHeight() { - float ground = world.getDimension().getAverageGroundLevel(); + float ground = world.getBiome(getBlockPos()).getDepth(); float cloud = world.getDimension().getCloudHeight(); float min = Math.min(ground, cloud); @@ -384,12 +399,8 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, @Override public void handleStatus(byte type) { - if (type == 2) { - if (!isOnFire()) { - for (int i = 0; i < 50 * getCloudSize(); i++) { - ParticleTypeRegistry.getTnstance().getEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); - } - } + if (type == 2 && !isOnFire()) { + spawnHurtParticles(); } super.handleStatus(type); } @@ -407,14 +418,13 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } } - pomf(); + spawnHurtParticles(); } - public void pomf() { + public void spawnHurtParticles() { for (int i = 0; i < 50 * getCloudSize(); i++) { - ParticleTypeRegistry.getTnstance().getEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); + ParticleEmitter.instance().emitDiggingParticles(this, UBlocks.normal_cloud); } - playHurtSound(DamageSource.GENERIC); } @@ -423,33 +433,31 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, Entity attacker = source.getAttacker(); if (attacker instanceof PlayerEntity) { - return onAttackByPlayer(source, amount, (PlayerEntity)attacker); + return damage(source, amount, (PlayerEntity)attacker); } return source == DamageSource.IN_WALL || super.damage(source, amount); } - private boolean onAttackByPlayer(DamageSource source, float amount, PlayerEntity player) { + private boolean damage(DamageSource source, float amount, PlayerEntity player) { ItemStack stack = player.getMainHandStack(); boolean canFly = EnchantmentHelper.getEnchantments(stack).containsKey(Enchantments.FEATHER_FALLING) - || Predicates.INTERACT_WITH_CLOUDS.test(player); + || EquinePredicates.INTERACT_WITH_CLOUDS.test(player); boolean stat = getStationary(); if (stat || canFly) { if (!isOnFire()) { - for (int i = 0; i < 50 * getCloudSize(); i++) { - ParticleTypeRegistry.getTnstance().getEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); - } + spawnHurtParticles(); } - if (stack != null && stack.getItem() instanceof ItemSword) { - return super.attackEntityFrom(source, amount); - } else if (stack != null && stack.getItem() instanceof ItemSpade) { - return super.attackEntityFrom(source, amount * 1.5f); + if (stack != null && stack.getItem() instanceof SwordItem) { + return super.damage(source, amount); + } else if (stack != null && stack.getItem() instanceof ShovelItem) { + return super.damage(source, amount * 1.5f); } else if (canFly) { - if (player.y < y || !world.isAirBlock(getPosition())) { + if (player.y < y || !world.isAir(getBlockPos())) { targetAltitude = y + 5; } else if (player.y > y) { targetAltitude = y - 5; @@ -475,89 +483,95 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, clearItemFloatingState(); } - @FUF(reason = "There is no TickEvent.EntityTickEvent. Waiting on mixins...") + //@FUF(reason = "There is no TickEvent.EntityTickEvent. Waiting on mixins...") protected void clearItemFloatingState() { - Box bounds = getEntityBoundingBox().grow(1 / (1 + getCloudSize())).grow(5); + Box bounds = getBoundingBox().expand(1 / (1 + getCloudSize())).expand(5); - for (Entity i : world.getEntitiesInAABBexcluding(this, bounds, this::entityIsFloatingItem)) { + for (Entity i : world.getEntities(this, bounds, this::entityIsFloatingItem)) { i.setNoGravity(false); } } private boolean entityIsFloatingItem(Entity e) { return e instanceof ItemEntity - && Predicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e); + && EquinePredicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e); } @Override - protected void dropFewItems(boolean hitByPlayer, int looting) { + protected void dropEquipment(DamageSource source, int looting, boolean hitByPlayer) { if (hitByPlayer) { - Item item = getDropItem(); - int amount = 13 + world.rand.nextInt(3); + int amount = 13 + world.random.nextInt(3); - dropItem(item, amount * (1 + looting)); + dropItem(UItems.cloud_matter, amount * (1 + looting)); - if (world.rand.nextBoolean()) { + if (world.random.nextBoolean()) { dropItem(UItems.dew_drop, 3 + looting); } } } @Override - public EntityItem entityDropItem(ItemStack stack, float offsetY) { - EntityItem item = super.entityDropItem(stack, offsetY); + public ItemEntity dropItem(ItemConvertible stack, int amount) { + ItemEntity item = super.dropItem(stack, amount); SpeciesList.instance().getEntity(item).setSpecies(Race.PEGASUS); item.setNoGravity(true); - item.motionY = 0; + item.setVelocity(0, 0, 0); return item; } @Override - public void readEntityFromNBT(NBTTagCompound tag) { - super.readEntityFromNBT(tag); + public void readCustomDataFromTag(CompoundTag tag) { + super.readCustomDataFromTag(tag); - setRainTimer(tag.getInteger("RainTimer")); + setRainTimer(tag.getInt("RainTimer")); setIsThundering(tag.getBoolean("IsThundering")); setCloudSize(tag.getByte("CloudSize")); setStationary(tag.getBoolean("IsStationary")); } @Override - public void writeEntityToNBT(NBTTagCompound tag) { - super.writeEntityToNBT(tag); + public void writeCustomDataToTag(CompoundTag tag) { + super.writeCustomDataToTag(tag); - tag.setInteger("RainTimer", getRainTimer()); - tag.setBoolean("IsThundering", getIsThundering()); - tag.setByte("CloudSize", (byte)getCloudSize()); - tag.setBoolean("IsStationary", getStationary()); + tag.putInt("RainTimer", getRainTimer()); + tag.putBoolean("IsThundering", getIsThundering()); + tag.putByte("CloudSize", (byte)getCloudSize()); + tag.putBoolean("IsStationary", getStationary()); } protected boolean applyGravityCompensation(Entity entity) { int floatStrength = getFloatStrength(entity); - if (!isRidingOrBeingRiddenBy(entity) && floatStrength > 0) { + if (!isConnectedThroughVehicle(entity) && floatStrength > 0) { double boundModifier = entity.fallDistance > 80 ? 80 : MathHelper.floor(entity.fallDistance * 10) / 10; entity.onGround = true; - entity.motionY += (((floatStrength > 2 ? 1 : floatStrength/2) * 0.699999998079071D) - entity.motionY + boundModifier * 0.7) * 0.10000000149011612D; + + Vec3d motion = entity.getVelocity(); + double motionX = motion.x; + double motionY = motion.y; + double motionZ = motion.z; + + motionY += (((floatStrength > 2 ? 1 : floatStrength/2) * 0.699999998079071D) - motionY + boundModifier * 0.7) * 0.10000000149011612D; if (!getStationary()) { - entity.motionX += ((motionX - entity.motionX) / getCloudSize()) - 0.002F; + motionX += ((motionX - motionX) / getCloudSize()) - 0.002F; } - if (!getStationary() && entity.motionY > 0.4 && world.rand.nextInt(900) == 0) { - spawnThunderbolt(getPosition()); + if (!getStationary() && motionY > 0.4 && world.random.nextInt(900) == 0) { + spawnThunderbolt(getBlockPos()); } // @FUF(reason = "There is no TickEvents.EntityTickEvent. Waiting on mixins...") - if (getStationary() && entity instanceof EntityItem) { - entity.motionX /= 8; - entity.motionZ /= 8; - entity.motionY /= 16; + if (getStationary() && entity instanceof ItemEntity) { + motionX /= 8; + motionZ /= 8; + motionY /= 16; entity.setNoGravity(true); } + entity.setVelocity(motionX, motionY, motionZ); return true; } @@ -566,13 +580,13 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } @Override - public void move(MoverType type, double x, double y, double z) { - setEntityBoundingBox(getEntityBoundingBox().offset(x, y, z)); - resetPositionToBB(); + public void move(MovementType type, Vec3d delta) { + setBoundingBox(getBoundingBox().offset(delta)); + moveToBoundingBoxCenter(); } public int getFloatStrength(Entity entity) { - if (Predicates.ENTITY_INTERACT_WITH_CLOUDS.test(entity)) { + if (EquinePredicates.ENTITY_INTERACT_WITH_CLOUDS.test(entity)) { return 3; } @@ -596,7 +610,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } private boolean canRainHere() { - return world.getBiome(getBlockPos()).canRain(); + return world.getBiome(getBlockPos()).getRainfall() > 0; } private boolean canSnowHere(BlockPos pos) { @@ -608,16 +622,18 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, } public void spawnThunderbolt(BlockPos pos) { - world.addWeatherEffect(new LightningEntity(world, pos.getX(), pos.getY(), pos.getZ(), false)); + if (world instanceof ServerWorld) { + ((ServerWorld)world).addLightning(new LightningEntity(world, pos.getX(), pos.getY(), pos.getZ(), false)); + } } private BlockPos getGroundPosition(double x, double z) { BlockPos pos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, new BlockPos(x, y, z)); - if (pos.getY() >= posY) { - while (world.isValid(pos)) { + if (pos.getY() >= y) { + while (World.isValid(pos)) { pos = pos.down(); - if (world.getBlockState(pos).isSideSolid(world, pos, Direction.UP)) { + if (world.getBlockState(pos).hasSolidTopSurface(world, pos, this)) { return pos.up(); } } @@ -686,7 +702,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals, protected void setSize(float width, float height) { if (width != this.width || height != this.height) { super.setSize(width, height); - setPosition(posX, posY, posZ); + setPosition(x, y, z); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ConstructionCloudEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/ConstructionCloudEntity.java new file mode 100644 index 00000000..8376f873 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/ConstructionCloudEntity.java @@ -0,0 +1,101 @@ +package com.minelittlepony.unicopia.entity; + +import com.google.common.collect.Lists; +import com.minelittlepony.unicopia.EquinePredicates; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class ConstructionCloudEntity extends CloudEntity { + + public ConstructionCloudEntity(EntityType type, World world) { + super(type, world); + } + + @Override + public boolean getStationary() { + return true; + } + + @Override + public boolean getOpaque() { + return true; + } + + @Override + public ActionResult interactAt(PlayerEntity player, Vec3d vec, Hand hand) { + if (!(hasPassengers() || isConnectedThroughVehicle(player)) && hand == Hand.MAIN_HAND) { + if (EquinePredicates.INTERACT_WITH_CLOUDS.test(player)) { + + if (player.getItemUseTime() > 0) { + return ActionResult.FAIL; + } + + ItemStack stack = player.getStackInHand(hand); + + if (stack != null) { + if (stack.getItem() instanceof BlockItem || stack.getItem() instanceof SpawnEggItem) { + placeBlock(player, stack, hand); + return ActionResult.SUCCESS; + } + } + } + } + + return ActionResult.FAIL; + } + + private void placeBlock(PlayerEntity player, ItemStack stack, Hand hand) { + if (!world.isClient || !(player instanceof ClientPlayerEntity)) { + return; + } + + MinecraftClient mc = MinecraftClient.getInstance(); + + double distance = mc.interactionManager.getReachDistance(); + + float ticks = mc.getTickDelta(); + + Vec3d eye = player.getCameraPosVec(ticks); + Vec3d look = player.getOppositeRotationVector(ticks); + Vec3d ray = eye.add(look.x * distance, look.y * distance, look.z * distance); + + float s = 0.5F; + Box bounds = getBoundingBox().shrink(0, s, 0).shrink(0, -s, 0); + + BlockHitResult hit = Box.rayTrace(Lists.newArrayList(bounds), eye, ray, BlockPos.ORIGIN); + + if (hit != null) { + Direction direction = hit.getSide(); + + mc.hitResult = hit = new BlockHitResult(hit.getPos(), direction, new BlockPos(hit.getPos()), false); + + int oldCount = stack.getCount(); + ActionResult result = mc.interactionManager.interactBlock(((ClientPlayerEntity)player), (ClientWorld)player.world, hand, hit); + + if (result == ActionResult.SUCCESS) { + player.swingHand(hand); + + if (!stack.isEmpty() && (stack.getCount() != oldCount || mc.interactionManager.hasCreativeInventory())) { + mc.gameRenderer.firstPersonRenderer.resetEquipProgress(hand); + } + } + } + + + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityConstructionCloud.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityConstructionCloud.java deleted file mode 100644 index 17e61ae8..00000000 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityConstructionCloud.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.minelittlepony.unicopia.entity; - -import com.minelittlepony.unicopia.Predicates; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.PlayerEntitySP; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.Items; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class EntityConstructionCloud extends EntityCloud { - - public EntityConstructionCloud(World world) { - super(world); - } - - @Override - public boolean getStationary() { - return true; - } - - @Override - public boolean getOpaque() { - return true; - } - - @Override - public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) { - if (!(isBeingRidden() || isRidingOrBeingRiddenBy(player)) && hand == EnumHand.MAIN_HAND) { - if (Predicates.INTERACT_WITH_CLOUDS.test(player)) { - - if (player.getItemInUseCount() > 0) { - return EnumActionResult.FAIL; - } - - ItemStack stack = player.getStackInHand(hand); - - if (stack != null) { - if (stack.getItem() instanceof ItemBlock || stack.getItem() == Items.SPAWN_EGG && stack.getItemDamage() == EntityList.getID(EntityCloud.class)) { - placeBlock(player, stack, hand); - return EnumActionResult.SUCCESS; - } - } - } - } - - return EnumActionResult.FAIL; - } - - private void placeBlock(PlayerEntity player, ItemStack stack, EnumHand hand) { - if (!world.isClient || !(player instanceof PlayerEntitySP)) { - return; - } - - Minecraft mc = MinecraftClient.getInstance(); - - double distance = mc.playerController.getBlockReachDistance(); - - float ticks = mc.getRenderPartialTicks(); - - Vec3d eye = player.getPositionEyes(ticks); - Vec3d look = player.getLook(ticks); - Vec3d ray = eye.add(look.x * distance, look.y * distance, look.z * distance); - - Box bounds = getEntityBoundingBox(); - - float s = 0.5F; - RayTraceResult trace = bounds - .contract(0, s, 0).contract(0, -s, 0) - .calculateIntercept(eye, ray); - - if (trace == null) { - return; - } - - Direction direction = trace.sideHit; - - BlockPos blockPos = new BlockPos(trace.hitVec); - - mc.objectMouseOver = new RayTraceResult(trace.hitVec, direction, blockPos); - - int oldCount = stack.getCount(); - EnumActionResult result = mc.playerController.processRightClickBlock(((PlayerEntitySP)player), (WorldClient)player.world, blockPos, direction, trace.hitVec, hand); - - if (result == EnumActionResult.SUCCESS) { - player.swingArm(hand); - - if (!stack.isEmpty() && (stack.getCount() != oldCount || mc.playerController.isInCreativeMode())) { - mc.entityRenderer.itemRenderer.resetEquippedProgress(hand); - } - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityCuccoon.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityCuccoon.java index ee23cca1..4715c971 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityCuccoon.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityCuccoon.java @@ -5,39 +5,43 @@ import java.util.List; import javax.annotation.Nullable; import com.google.common.collect.Lists; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.IPower; +import com.minelittlepony.unicopia.particles.ParticleEmitter; import com.minelittlepony.util.MagicalDamageSource; import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityDimensions; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.Blocks; -import net.minecraft.init.MobEffects; -import net.minecraft.init.SoundEvents; -import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.datasync.TrackedData; -import net.minecraft.network.datasync.TrackedDataHandlerRegistry; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.EnumHandSide; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundEvent; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.particle.BlockStateParticleEffect; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Arm; +import net.minecraft.util.Hand; import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.GameRules; import net.minecraft.world.World; -import net.minecraftforge.event.ForgeEventFactory; public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate { @@ -47,12 +51,10 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate private boolean captiveLastSneakState; - public EntityCuccoon(World world) { - super(world); - setSize(0.6f, 0.6f); - - width = 1.5F; - height = 1.6F; + public EntityCuccoon(EntityType type, World world) { + super(type, world); + //width = 1.5F; + //height = 1.6F; } @Override @@ -62,11 +64,11 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate } public int getStruggleCount() { - return getDataManager().get(STRUGGLE_COUNT) % 6; + return getDataTracker().get(STRUGGLE_COUNT) % 6; } public void setStruggleCount(int count) { - getDataManager().set(STRUGGLE_COUNT, count % 6); + getDataTracker().set(STRUGGLE_COUNT, count % 6); } @Override @@ -81,50 +83,40 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate } @Override - public boolean attackEntityFrom(DamageSource source, float amount) { + public boolean damage(DamageSource source, float amount) { - if (Predicates.BUGGY.test(source.getTrueSource())) { + if (EquinePredicates.BUGGY.test(source.getSource())) { amount = 0; } - return super.attackEntityFrom(source, amount); + return super.damage(source, amount); } @Override - protected boolean canBeRidden(Entity entity) { - return super.canBeRidden(entity) + protected boolean canAddPassenger(Entity entity) { + return super.canAddPassenger(entity) && !entity.isSneaking() - && !isBeingRidden() + && !hasPassengers() && entity instanceof LivingEntity - && !Predicates.BUGGY.test(entity); + && !EquinePredicates.BUGGY.test(entity); } @Override - public boolean canRenderOnFire() { + public boolean doesRenderOnFire() { return false; } @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public double getMountedYOffset() { + public double getMountedHeightOffset() { return 0; } @Override - public boolean canPassengerSteer() { - return false; - } + public void tick() { + super.tick(); - @Override - public void onUpdate() { - super.onUpdate(); - - if (isBeingRidden()) { - Entity passenger = getPassengers().get(0); + if (hasPassengers()) { + Entity passenger = getPrimaryPassenger(); boolean sneaking = passenger.isSneaking(); @@ -137,76 +129,75 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate if (passenger instanceof LivingEntity) { LivingEntity living = (LivingEntity)passenger; - if (!living.isPotionActive(MobEffects.REGENERATION) && living.getHealth() < living.getMaxHealth()) { - living.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 20, 2)); + if (!living.hasStatusEffect(StatusEffects.REGENERATION) && living.getHealth() < living.getHealthMaximum()) { + living.addPotionEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 20, 2)); } - if (!living.isPotionActive(MobEffects.SLOWNESS) && living.getHealth() < living.getMaxHealth()) { - living.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 2000, 4)); + if (!living.hasStatusEffect(StatusEffects.SLOWNESS) && living.getHealth() < living.getHealthMaximum()) { + living.addPotionEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 2000, 4)); } } } if (world.isClient) { - double x = posX + width * world.rand.nextFloat() - width/2; - double y = posY + height * world.rand.nextFloat(); - double z = posZ + width * world.rand.nextFloat() - width/2; + double x = this.x + width * random.nextFloat() - width/2; + double y = this.y + height * random.nextFloat(); + double z = this.z + width * random.nextFloat() - width/2; - world.spawnParticle(EnumParticleTypes.DRIP_LAVA, x, y, z, 0, 0, 0); + world.addParticle(ParticleTypes.DRIPPING_LAVA, x, y, z, 0, 0, 0); } } @Override - public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) { + public ActionResult interactAt(PlayerEntity player, Vec3d vec, Hand hand) { - if (hand == EnumHand.MAIN_HAND && Predicates.BUGGY.test(player)) { + if (hand == Hand.MAIN_HAND && EquinePredicates.BUGGY.test(player)) { - if (isBeingRidden()) { - Entity passenger = getPassengers().get(0); + if (hasPassengers()) { + Entity passenger = getPrimaryPassenger(); - if (player.canEat(false) || player.getHealth() < player.getMaxHealth()) { + if (player.canConsume(false) || player.getHealth() < player.getHealthMaximum()) { DamageSource d = MagicalDamageSource.causePlayerDamage("feed", player); - IPower.spawnParticles(UParticles.CHANGELING_MAGIC, this, 7); if (passenger instanceof LivingEntity) { - if (player.isPotionActive(MobEffects.NAUSEA)) { - ((LivingEntity)passenger).addPotionEffect(player.removeActivePotionEffect(MobEffects.NAUSEA)); - } else if (world.rand.nextInt(2300) == 0) { - ((LivingEntity)passenger).addPotionEffect(new PotionEffect(MobEffects.WITHER, 20, 1)); + if (player.hasStatusEffect(StatusEffects.NAUSEA)) { + ((LivingEntity)passenger).addPotionEffect(player.removePotionEffect(StatusEffects.NAUSEA)); + } else if (random.nextInt(2300) == 0) { + ((LivingEntity)passenger).addPotionEffect(new StatusEffectInstance(StatusEffects.WITHER, 20, 1)); } } if (passenger instanceof PlayerEntity) { - if (!player.isPotionActive(MobEffects.HEALTH_BOOST)) { - player.addPotionEffect(new PotionEffect(MobEffects.HEALTH_BOOST, 13000, 1)); + if (!player.hasStatusEffect(StatusEffects.HEALTH_BOOST)) { + player.addPotionEffect(new StatusEffectInstance(StatusEffects.HEALTH_BOOST, 13000, 1)); } } - passenger.attackEntityFrom(d, 5); + passenger.damage(d, 5); - if (player.canEat(false)) { - player.getFoodStats().addStats(5, 0); + if (player.canConsume(false)) { + player.getHungerManager().add(5, 0); } else { player.heal(5); } - return EnumActionResult.SUCCESS; + return ActionResult.SUCCESS; } } } - return super.applyPlayerInteraction(player, vec, hand); + return super.interactAt(player, vec, hand); } public float getBreatheAmount(float stutter) { - return MathHelper.sin((ticksExisted + stutter) / 40) / 2 + return MathHelper.sin((age + stutter) / 40) / 2 + hurtTime / 10F; } @Override - public boolean attackable() { + public boolean isAttackable() { return false; } @@ -214,23 +205,13 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate if (captive.isSneaking() != captiveLastSneakState) { setStruggleCount(getStruggleCount() + 1); - for (int k = 0; k < 20; k++) { - double d2 = rand.nextGaussian() * 0.02; - double d0 = rand.nextGaussian() * 0.02; - double d1 = rand.nextGaussian() * 0.02; - - world.spawnParticle(EnumParticleTypes.BLOCK_CRACK, - posX + rand.nextFloat() * width * 2 - width, - posY + rand.nextFloat() * height, - posZ + rand.nextFloat() * width * 2 - width, - d2, d0, d1, Block.getStateId(Blocks.SLIME_BLOCK.getDefaultState())); - } + spawnSlimeParticles(); captive.playSound(USounds.SLIME_RETRACT, 1, 1); this.hurtTime += 15; if (getStruggleCount() == 0) { - setDead(); + remove(); return true; } @@ -239,47 +220,53 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate return false; } - @Override - protected void onDeathUpdate() { - if (++deathTime == 20) { - if (!world.isClient && (isPlayer() || recentlyHit > 0 && canDropLoot() && world.getGameRules().getBoolean("doMobLoot"))) { - int i = ForgeEventFactory.getExperienceDrop(this, attackingPlayer, getExperiencePoints(attackingPlayer)); + private void spawnSlimeParticles() { + EntityDimensions dims = getDimensions(getPose()); - while (i > 0) { - int j = EntityXPOrb.getXPSplit(i); + for (int k = 0; k < 20; k++) { + double d2 = random.nextGaussian() * 0.02; + double d0 = random.nextGaussian() * 0.02; + double d1 = random.nextGaussian() * 0.02; - i -= j; - - world.spawnEntity(new EntityXPOrb(world, posX, posY, posZ, j)); - } - - this.dismountRidingEntity(); - } - - setDead(); - - for (int k = 0; k < 20; k++) { - double d2 = rand.nextGaussian() * 0.02; - double d0 = rand.nextGaussian() * 0.02; - double d1 = rand.nextGaussian() * 0.02; - - world.spawnParticle(EnumParticleTypes.BLOCK_CRACK, - posX + rand.nextFloat() * width * 2 - width, - posY + rand.nextFloat() * height, - posZ + rand.nextFloat() * width * 2 - width, - d2, d0, d1, Block.getStateId(Blocks.SLIME_BLOCK.getDefaultState())); - } + world.addParticle(new BlockStateParticleEffect(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()), + x + random.nextFloat() * dims.width * 2 - dims.width, + y + random.nextFloat() * dims.height, + z + random.nextFloat() * dims.width * 2 - dims.width, + d2, d0, d1); } } + @Override + protected void onDeathUpdate() { + if (++deathTime == 20) { + if (!world.isClient && lastAttackedTicks > 0 && canDropLootAndXp() && world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { + int i = getCurrentExperience(attackingPlayer); + + while (i > 0) { + int j = ExperienceOrbEntity.roundToOrbSize(i); + + i -= j; + + world.spawnEntity(new ExperienceOrbEntity(world, x, y, z, j)); + } + + removeAllPassengers(); + } + + remove(); + spawnSlimeParticles(); + } + } + + @Override @Nullable - public Box getCollisionBox(Entity entity) { - return entity.canBeCollidedWith() ? entity.getEntityBoundingBox() : null; + public Box getHardCollisionBox(Entity entity) { + return entity.collides() ? entity.getBoundingBox() : null; } @Nullable public Box getCollisionBoundingBox() { - return getEntityBoundingBox().shrink(0.2); + return getBoundingBox().contract(0.2); } @Override @@ -292,38 +279,27 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate } } - @Override - public void readEntityFromNBT(NBTTagCompound compound) { - super.readEntityFromNBT(compound); - } - - @Override - public void writeEntityToNBT(NBTTagCompound compound) { - super.writeEntityToNBT(compound); - } - @Override public boolean canInteract(Race race) { return race == Race.CHANGELING; } @Override - public Iterable getArmorInventoryList() { + public Iterable getArmorItems() { return armour; } @Override - public ItemStack getItemStackFromSlot(EntityEquipmentSlot slotIn) { + public ItemStack getEquippedStack(EquipmentSlot slot) { return ItemStack.EMPTY; } @Override - public void setItemStackToSlot(EntityEquipmentSlot slotIn, ItemStack stack) { - + public void setEquippedStack(EquipmentSlot slot, ItemStack stack) { } @Override - public EnumHandSide getPrimaryHand() { - return EnumHandSide.LEFT; + public Arm getMainArm() { + return Arm.LEFT; } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java index 74f27b95..095cae00 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java @@ -28,7 +28,7 @@ public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwn @Nullable protected NetworkPlayerInfo getPlayerInfo() { if (playerInfo == null) { - NetHandlerPlayClient connection = MinecraftClient.getInstance().getConnection(); + NetHandlerPlayClient connection = MinecraftClient.instance().getConnection(); playerInfo = connection.getPlayerInfo(getGameProfile().getId()); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityRacingCloud.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityRacingCloud.java index 68fb1b27..382127e6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityRacingCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityRacingCloud.java @@ -4,20 +4,19 @@ import java.util.List; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -public class EntityRacingCloud extends EntityCloud { +public class EntityRacingCloud extends CloudEntity { - public EntityRacingCloud(World world) { - super(world); + public EntityRacingCloud(EntityType type, World world) { + super(type, world); setCloudSize(1); } @@ -41,7 +40,7 @@ public class EntityRacingCloud extends EntityCloud { @Override public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) { if (!(isBeingRidden() || isRidingOrBeingRiddenBy(player)) && hand == EnumHand.MAIN_HAND) { - if (Predicates.INTERACT_WITH_CLOUDS.test(player)) { + if (EquinePredicates.INTERACT_WITH_CLOUDS.test(player)) { if (!getStationary()) { player.startRiding(this); return EnumActionResult.SUCCESS; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpear.java b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpear.java index 23e9dcfe..63a8eac0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpear.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpear.java @@ -5,6 +5,7 @@ import com.minelittlepony.util.MagicalDamageSource; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; @@ -24,8 +25,8 @@ public class EntitySpear extends ArrowEntity implements IAdvancedProjectile { private static final TrackedData KNOCKBACK = DataTracker.registerData(EntitySpear.class, TrackedDataHandlerRegistry.INTEGER); - public EntitySpear(World world) { - super(world); + public EntitySpear(EntityType type, World world) { + super(type, world); } public EntitySpear(World world, double x, double y, double z) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java deleted file mode 100644 index af80ae20..00000000 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.minelittlepony.unicopia.entity; - -import com.minelittlepony.unicopia.Predicates; -import com.minelittlepony.unicopia.UItems; -import com.minelittlepony.unicopia.Unicopia; - -import net.minecraft.block.SoundType; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.datasync.TrackedData; -import net.minecraft.network.datasync.TrackedDataHandlerRegistry; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class EntitySpellbook extends EntityLiving implements IMagicals { - - private static final TrackedData OPENED = DataTracker.registerData(EntitySpellbook.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData ALTERED = DataTracker.registerData(EntitySpellbook.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData OPENED_USER = DataTracker.registerData(EntitySpellbook.class, TrackedDataHandlerRegistry.BYTE); - - public EntitySpellbook(World worldIn) { - super(worldIn); - setSize(0.6f, 0.6f); - enablePersistence(); - - if (world.rand.nextInt(3) == 0) { - setAltered(); - } - } - - @Override - protected void initDataTracker() { - super.initDataTracker(); - dataManager.register(OPENED, true); - dataManager.register(OPENED_USER, (byte)1); - dataManager.register(ALTERED, false); - } - - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean isPushedByWater() { - return false; - } - - @Override - public boolean canRenderOnFire() { - return false; - } - - public boolean getIsAltered() { - return dataManager.get(ALTERED); - } - - public void setAltered() { - dataManager.set(ALTERED, true); - } - - public boolean getIsOpen() { - return dataManager.get(OPENED); - } - - public Boolean getUserSetState() { - byte state = dataManager.get(OPENED_USER); - return state == 1 ? null : state == 2; - } - - public void setIsOpen(boolean val) { - dataManager.set(OPENED, val); - } - - public void setUserSetState(Boolean val) { - dataManager.set(OPENED_USER, val == null ? (byte)1 : val == true ? (byte)2 : (byte)0); - } - - @Override - public void onUpdate() { - boolean open = getIsOpen(); - this.isJumping = open && isInWater(); - super.onUpdate(); - if (open && world.isClient) { - - for (int offX = -2; offX <= 1; ++offX) { - for (int offZ = -2; offZ <= 1; ++offZ) { - if (offX > -1 && offX < 1 && offZ == -1) { - offZ = 1; - } - - if (rand.nextInt(320) == 0) { - for (int offY = 0; offY <= 1; ++offY) { - world.spawnParticle(EnumParticleTypes.ENCHANTMENT_TABLE, - posX, posY, posZ, - offX/2F + rand.nextFloat(), - offY/2F - rand.nextFloat() + 0.5f, - offZ/2F + rand.nextFloat() - ); - } - } - } - } - } - - if (world.rand.nextInt(30) == 0) { - float celest = world.getCelestialAngle(1) * 4; - - boolean isDay = celest > 3 || celest < 1; - - Boolean userState = getUserSetState(); - - boolean canToggle = (isDay != open) && (userState == null || userState == isDay); - - if (canToggle) { - setUserSetState(null); - setIsOpen(isDay); - } - - if (userState != null && (isDay == open) && (userState == open)) { - setUserSetState(null); - } - } - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - if (!world.isClient) { - setDead(); - - SoundType sound = SoundType.WOOD; - - world.playSound(posX, posY, posZ, sound.getBreakSound(), SoundCategory.BLOCKS, sound.getVolume(), sound.getPitch(), true); - - if (world.getGameRules().getBoolean("doTileDrops")) { - entityDropItem(new ItemStack(UItems.spellbook), 0); - } - } - return false; - } - - @Override - public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) { - if (player.isSneaking()) { - boolean open = !getIsOpen(); - - setIsOpen(open); - setUserSetState(open); - - return EnumActionResult.SUCCESS; - } - - if (Predicates.MAGI.test(player)) { - - player.playSound(SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, 2, 1); - - player.openGui(Unicopia.MODID, 0, world, (int)posX, (int)posY, (int)posZ); - - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.PASS; - } - - @Override - public void readEntityFromNBT(NBTTagCompound compound) { - super.readEntityFromNBT(compound); - - setIsOpen(compound.getBoolean("open")); - setUserSetState(compound.hasKey("force_open") ? compound.getBoolean("force_open") : null); - } - - @Override - public void writeEntityToNBT(NBTTagCompound compound) { - super.writeEntityToNBT(compound); - compound.setBoolean("open", getIsOpen()); - - Boolean state = getUserSetState(); - - if (state != null) { - compound.setBoolean("force_open", state); - } - } - - @Override - public ItemStack getPickedResult(RayTraceResult target) { - return new ItemStack(UItems.spellbook); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityWildCloud.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityWildCloud.java deleted file mode 100644 index 17362895..00000000 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityWildCloud.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.minelittlepony.unicopia.entity; - -import java.util.Iterator; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.util.ClassInheritanceMultiMap; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome.SpawnListEntry; -import net.minecraft.world.chunk.Chunk; - -public class EntityWildCloud extends EntityCloud { - - public static final SpawnListEntry SPAWN_ENTRY_LAND = new SpawnListEntry(EntityWildCloud.class, 1, 1, 15); - public static final SpawnListEntry SPAWN_ENTRY_OCEAN = new SpawnListEntry(EntityWildCloud.class, 1, 1, 7); - - public EntityWildCloud(World world) { - super(world); - - preventEntitySpawning = true; - } - - @Override - public boolean isNotColliding() { - Box boundingbox = getEntityBoundingBox(); - - return checkNoEntityCollision(boundingbox, this) - && world.canBlockSeeSky(new BlockPos(this)) - && world.getCollisionBoxes(this, boundingbox).isEmpty() - && !world.containsAnyLiquid(boundingbox); - } - - /** - * Returns true if there are no solid, live entities in the specified Box, excluding the given entity - * - * @ref World.checkNoEntityCollision(Box area, Entity entity) - */ - public boolean checkNoEntityCollision(Box area, Entity entity) { - - for (Entity i : world.getEntitiesWithinAABBExcludingEntity(entity, area)) { - if (!i.isDead && (i.preventEntitySpawning || i instanceof EntityCloud) && (!entity.isRiding() || !entity.isRidingOrBeingRiddenBy(i))) { - return false; - } - } - return true; - } - - @Override - public boolean getCanSpawnHere() { - int count = 0; - - BlockPos pos = new BlockPos(this); - - Chunk chunk = world.getChunk(pos); - for (ClassInheritanceMultiMap i : chunk.getEntityLists()) { - Iterator iter = i.getByClass(EntityCloud.class).iterator(); - while (iter.hasNext()) { - iter.next(); - - if (count++ > 2) { - return false; - } - } - } - - return world.getBlockState(pos.down()).canEntitySpawn(this); - } - - @Override - public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, IEntityLivingData pack) { - pack = super.onInitialSpawn(difficulty, pack); - - if (!(pack instanceof PackData)) { - float minSpawnHeight = getMinimumFlyingHeight(); - - targetAltitude = getRandomFlyingHeight(); - - if (posY < minSpawnHeight) { - minSpawnHeight += world.rand.nextInt(Math.max(1, (int)getMaximumFlyingHeight() - (int)minSpawnHeight)); - - setLocationAndAngles(posX, minSpawnHeight - 1, posZ, rotationYaw, rotationPitch); - collideWithNearbyEntities(); - } - - if (world.isRainingAt(getPosition())) { - setIsRaining(true); - } - - if (world.isThundering()) { - setIsThundering(true); - } - - pack = new PackData(this); - } else { - PackData packData = (PackData)pack; - targetAltitude = packData.leader.targetAltitude; - - Vec3d position = packData.getUnOccupiedPosition(getCloudSize()); - - setIsRaining(packData.leader.getIsRaining()); - setIsThundering(packData.leader.getIsThundering()); - - setLocationAndAngles(position.x, position.y, position.z, packData.leader.rotationYaw, packData.leader.rotationPitch); - collideWithNearbyEntities(); - } - - return pack; - } - - static class PackData implements IEntityLivingData { - - EntityCloud leader; - - PackData(EntityCloud leader) { - this.leader = leader; - } - - Vec3d getUnOccupiedPosition(int size) { - return leader.getPositionVector(); - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java b/src/main/java/com/minelittlepony/unicopia/entity/RainbowEntity.java similarity index 68% rename from src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java rename to src/main/java/com/minelittlepony/unicopia/entity/RainbowEntity.java index c61567a6..937ab43d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/RainbowEntity.java @@ -1,26 +1,29 @@ package com.minelittlepony.unicopia.entity; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.UEntities; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.packet.EntitySpawnGlobalS2CPacket; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LightningEntity; -import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.SpawnType; import net.minecraft.entity.mob.MobEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.NetworkThreadUtils; import net.minecraft.network.Packet; import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.sound.SoundCategory; -import net.minecraft.util.ThreadExecutor; import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; +import net.minecraft.world.IWorld; import net.minecraft.world.World; +import net.minecraft.world.biome.Biome.SpawnEntry; -public class EntityRainbow extends Entity implements IInAnimate { +public class RainbowEntity extends Entity implements IInAnimate { - public static final SpawnListEntry SPAWN_ENTRY = new SpawnListEntry(EntityRainbow.Spawner.class, 1, 1, 1); + public static final SpawnEntry SPAWN_ENTRY = new SpawnEntry(UEntities.RAINBOW_SPAWNER, 1, 1, 1); private int ticksAlive; @@ -32,33 +35,23 @@ public class EntityRainbow extends Entity implements IInAnimate { public static final Box SPAWN_COLLISSION_RADIUS = new Box( -RAINBOW_MAX_SIZE, -RAINBOW_MAX_SIZE, -RAINBOW_MAX_SIZE, RAINBOW_MAX_SIZE, RAINBOW_MAX_SIZE, RAINBOW_MAX_SIZE - ).grow(RAINBOW_MAX_SIZE); + ).expand(RAINBOW_MAX_SIZE); + public RainbowEntity(EntityType type, World world) { + super(type, world); - public EntityRainbow(World world) { - this(world, 0, 0, 0); - } + float yaw = (int)MathHelper.nextDouble(random, 0, 360); - public EntityRainbow(World world, double x, double y, double z) { - super(world); + setPositionAndAngles(0, 0, 0, yaw, 0); - float yaw = (int)MathHelper.nextDouble((world == null ? rand : world.random), 0, 360); - - setLocationAndAngles(x, y, z, yaw, 0); - - radius = MathHelper.nextDouble(world == null ? rand : world.random, RAINBOW_MIN_SIZE, RAINBOW_MAX_SIZE); + radius = MathHelper.nextDouble(random, RAINBOW_MIN_SIZE, RAINBOW_MAX_SIZE); ticksAlive = 10000; - ignoreFrustumCheck = true; + ignoreCameraFrustum = true; - width = (float)radius; - height = width; - } - - @Override - public boolean shouldRenderInPass(int pass) { - return pass == 1; + //width = (float)radius; + //height = width; } @Override @@ -68,10 +61,11 @@ public class EntityRainbow extends Entity implements IInAnimate { @Override public void setPosition(double x, double y, double z) { - posX = x; - posY = y; - posZ = z; + this.x = x; + this.y = y; + this.z = z; + float width = getDimensions(getPose()).width; setBoundingBox(new Box( x - width, y - radius/2, z, x + width, y + radius/2, z @@ -84,7 +78,7 @@ public class EntityRainbow extends Entity implements IInAnimate { } @Override - public boolean isInRangeToRenderDist(double distance) { + public boolean shouldRenderAtDistance(double distance) { return true; } @@ -101,10 +95,10 @@ public class EntityRainbow extends Entity implements IInAnimate { } if (!removed) { - Box bounds = SPAWN_COLLISSION_RADIUS.offset(getPosition()); + Box bounds = SPAWN_COLLISSION_RADIUS.offset(getPos()); - world.getEntities(EntityRainbow.class, bounds).forEach(this::attackCompetitor); - world.getEntities(EntityRainbow.Spawner.class, bounds).forEach(this::attackCompetitor); + world.getEntities(RainbowEntity.class, bounds).forEach(this::attackCompetitor); + world.getEntities(RainbowEntity.Spawner.class, bounds).forEach(this::attackCompetitor); } } @@ -133,22 +127,23 @@ public class EntityRainbow extends Entity implements IInAnimate { public static class Spawner extends MobEntity { - public Spawner(World worldIn) { - super(worldIn); + public Spawner(EntityType type, World world) { + super(type, world); this.setInvisible(true); } @Override - public boolean getCanSpawnHere() { + public boolean canSpawn(IWorld world, SpawnType type) { + Box bounds = SPAWN_COLLISSION_RADIUS.offset(getPos()); - return super.getCanSpawnHere() - && world.getEntities(EntityRainbow.class, bounds).isEmpty() - && world.getEntities(EntityRainbow.Spawner.class, bounds).isEmpty(); + return super.canSpawn(world, type) + && world.getEntities(RainbowEntity.class, bounds).isEmpty() + && world.getEntities(RainbowEntity.Spawner.class, bounds).isEmpty(); } @Override - public int getMaxSpawnedInChunk() { + public int getLimitPerChunk() { return 1; } @@ -162,14 +157,14 @@ public class EntityRainbow extends Entity implements IInAnimate { } public void trySpawnRainbow() { - EntityRainbow rainbow = new EntityRainbow(world); + RainbowEntity rainbow = UEntities.RAINBOW.create(world); rainbow.setPosition(x, y, z); world.spawnEntity(rainbow); } } static class SpawnPacket extends EntitySpawnGlobalS2CPacket { - public SpawnPacket(EntityRainbow entity) { + public SpawnPacket(RainbowEntity entity) { super(entity); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java new file mode 100644 index 00000000..bc769b75 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java @@ -0,0 +1,200 @@ +package com.minelittlepony.unicopia.entity; + +import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.UItems; +import net.minecraft.container.Container; +import net.minecraft.container.NameableContainerProvider; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; + +public class SpellbookEntity extends MobEntity implements NameableContainerProvider, IMagicals { + + private static final TrackedData OPENED = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData ALTERED = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData OPENED_USER = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BYTE); + + public SpellbookEntity(EntityType type, World world) { + super(type, world); + setPersistent(); + + if (world.random.nextInt(3) == 0) { + setAltered(); + } + } + + @Override + protected void initDataTracker() { + super.initDataTracker(); + dataTracker.startTracking(OPENED, true); + dataTracker.startTracking(OPENED_USER, (byte)1); + dataTracker.startTracking(ALTERED, false); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean doesRenderOnFire() { + return false; + } + + public boolean getIsAltered() { + return dataTracker.get(ALTERED); + } + + public void setAltered() { + dataTracker.set(ALTERED, true); + } + + public boolean getIsOpen() { + return dataTracker.get(OPENED); + } + + public Boolean getUserSetState() { + byte state = dataTracker.get(OPENED_USER); + return state == 1 ? null : state == 2; + } + + public void setIsOpen(boolean val) { + dataTracker.set(OPENED, val); + } + + public void setUserSetState(Boolean val) { + dataTracker.set(OPENED_USER, val == null ? (byte)1 : val == true ? (byte)2 : (byte)0); + } + + @Override + public void tick() { + boolean open = getIsOpen(); + jumping = open && isInWater(); + super.tick(); + if (open && world.isClient) { + + for (int offX = -2; offX <= 1; ++offX) { + for (int offZ = -2; offZ <= 1; ++offZ) { + if (offX > -1 && offX < 1 && offZ == -1) { + offZ = 1; + } + + if (random.nextInt(320) == 0) { + for (int offY = 0; offY <= 1; ++offY) { + world.addParticle(ParticleTypes.ENCHANT, + x, y, z, + offX/2F + random.nextFloat(), + offY/2F - random.nextFloat() + 0.5f, + offZ/2F + random.nextFloat() + ); + } + } + } + } + } + + if (world.random.nextInt(30) == 0) { + float celest = world.getStarsBrightness(1) * 4; + + boolean isDay = celest > 3 || celest < 1; + + Boolean userState = getUserSetState(); + + boolean canToggle = (isDay != open) && (userState == null || userState == isDay); + + if (canToggle) { + setUserSetState(null); + setIsOpen(isDay); + } + + if (userState != null && (isDay == open) && (userState == open)) { + setUserSetState(null); + } + } + } + + @Override + public boolean damage(DamageSource source, float amount) { + if (!world.isClient) { + remove(); + + BlockSoundGroup sound = BlockSoundGroup.WOOD; + + world.playSound(x, y, z, sound.getBreakSound(), SoundCategory.BLOCKS, sound.getVolume(), sound.getPitch(), true); + + if (world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)) { + dropItem(UItems.spellbook, 1); + } + } + return false; + } + + @Override + public ActionResult interactAt(PlayerEntity player, Vec3d vec, Hand hand) { + if (player.isSneaking()) { + boolean open = !getIsOpen(); + + setIsOpen(open); + setUserSetState(open); + + return ActionResult.SUCCESS; + } + + if (EquinePredicates.MAGI.test(player)) { + + player.playSound(SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, 2, 1); + + player.openContainer(this); + + return ActionResult.SUCCESS; + } + + return ActionResult.PASS; + } + + @Override + public Container createMenu(int id, PlayerInventory inventory, PlayerEntity player) { + return null; + } + + @Override + public void readCustomDataFromTag(CompoundTag compound) { + super.readCustomDataFromTag(compound); + + setIsOpen(compound.getBoolean("open")); + setUserSetState(compound.containsKey("force_open") ? compound.getBoolean("force_open") : null); + } + + @Override + public void writeCustomDataToTag(CompoundTag compound) { + super.writeCustomDataToTag(compound); + compound.putBoolean("open", getIsOpen()); + + Boolean state = getUserSetState(); + + if (state != null) { + compound.putBoolean("force_open", state); + } + } + + // TODO: + /*@Override + public ItemStack getPickStack(HitResult target) { + return new ItemStack(UItems.spellbook); + }*/ +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/SpellcastEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/SpellcastEntity.java index 06747372..49f694e0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/SpellcastEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/SpellcastEntity.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.StringUtils; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.magic.Affinity; @@ -41,6 +41,7 @@ import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; +import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameRules; @@ -49,10 +50,6 @@ import net.minecraft.world.explosion.Explosion.DestructionType; public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICaster, IInAnimate { - public static EntityType TYPE = EntityType.Builder.create(SpellcastEntity::new, EntityCategory.MISC) - .setDimensions(0.6F, 0.25F) - .build("spell"); - private LivingEntity owner = null; public float hoverStart; @@ -136,20 +133,16 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast dataTracker.startTracking(AFFINITY, Affinity.NEUTRAL.ordinal()); } - @Override - public ItemStack getPickedResult(RayTraceResult target) { + // TODO: + /*@Override + public ItemStack getPickedStack(HitResult target) { return SpellRegistry.instance().enchantStack(new ItemStack(getItem()), getEffect().getName()); - } + }*/ protected Item getItem() { return getAffinity() == Affinity.BAD ? UItems.curse : UItems.spell; } - @Override - protected boolean canTriggerWalking() { - return false; - } - @Override public boolean isPushable() { return false; @@ -206,7 +199,7 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast if (!hasEffect()) { remove(); } else { - if (getEffect().getDead()) { + if (getEffect().isDead()) { remove(); onDeath(); } else { @@ -288,7 +281,7 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast @Override public ActionResult interactAt(PlayerEntity player, Vec3d vec, Hand hand) { - if (Predicates.MAGI.test(player)) { + if (EquinePredicates.MAGI.test(player)) { ItemStack currentItem = player.getStackInHand(Hand.MAIN_HAND); if (currentItem != null diff --git a/src/main/java/com/minelittlepony/unicopia/entity/WildCloudEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/WildCloudEntity.java new file mode 100644 index 00000000..882d4186 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/WildCloudEntity.java @@ -0,0 +1,139 @@ +package com.minelittlepony.unicopia.entity; + +import java.util.Iterator; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.UEntities; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.TypeFilterableList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IWorld; +import net.minecraft.world.LocalDifficulty; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome.SpawnEntry; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.WorldChunk; + +public class WildCloudEntity extends CloudEntity { + + public static final SpawnEntry SPAWN_ENTRY_LAND = new SpawnEntry(UEntities.WILD_CLOUD, 1, 1, 15); + public static final SpawnEntry SPAWN_ENTRY_OCEAN = new SpawnEntry(UEntities.WILD_CLOUD, 1, 1, 7); + + public WildCloudEntity(EntityType type, World world) { + super(type, world); + + preventEntitySpawning = true; + } + + @Override + public boolean isNotColliding() { + Box boundingbox = getBoundingBox(); + + return checkNoEntityCollision(boundingbox, this) + && world.isSkyVisible(getBlockPos()) + && world.doesNotCollide(this, boundingbox) + && !world.intersectsFluid(boundingbox); + } + + /** + * Returns true if there are no solid, live entities in the specified Box, excluding the given entity + * + * @ref World.checkNoEntityCollision(Box area, Entity entity) + */ + public boolean checkNoEntityCollision(Box area, Entity entity) { + + for (Entity i : world.getEntities(entity, area)) { + if (!i.removed && (i.preventEntitySpawning || i instanceof CloudEntity) && (!entity.hasVehicle() || !entity.isConnectedThroughVehicle(i))) { + return false; + } + } + return true; + } + + @Override + public boolean canSpawn(IWorld world, SpawnType type) { + if (type == SpawnType.NATURAL) { + int count = 0; + + ChunkPos cpos = new ChunkPos(getBlockPos()); + + WorldChunk chunk = world.getChunkManager().getWorldChunk(cpos.x, cpos.z, false); + for (TypeFilterableList i : chunk.getEntitySectionArray()) { + Iterator iter = i.getAllOfType(CloudEntity.class).iterator(); + while (iter.hasNext()) { + iter.next(); + + if (count++ > 2) { + return false; + } + } + } + } + + BlockPos pos = getBlockPos().down(); + return world.getBlockState(pos).allowsSpawning(world, pos, getType()); + } + + @Override + public EntityData initialize(IWorld world, LocalDifficulty difficulty, SpawnType type, @Nullable EntityData data, @Nullable CompoundTag tag) { + data = super.initialize(world, difficulty, type, data, tag); + + if (!(data instanceof PackData)) { + float minSpawnHeight = getMinimumFlyingHeight(); + + targetAltitude = getRandomFlyingHeight(); + + if (y < minSpawnHeight) { + minSpawnHeight += world.random.nextInt(Math.max(1, (int)getMaximumFlyingHeight() - (int)minSpawnHeight)); + + setPositionAndAngles(x, minSpawnHeight - 1, z, yaw, pitch); + collideWithNearbyEntities(); + } + + if (world.hasRain(getBlockPos())) { + setIsRaining(true); + } + + if (world.isThundering()) { + setIsThundering(true); + } + + data = new PackData(this); + } else { + PackData packData = (PackData)data; + targetAltitude = packData.leader.targetAltitude; + + Vec3d position = packData.getUnOccupiedPosition(getCloudSize()); + + setIsRaining(packData.leader.getIsRaining()); + setIsThundering(packData.leader.getIsThundering()); + + setPositionAndAngles(position.x, position.y, position.z, packData.leader.yaw, packData.leader.pitch); + checkBlockCollision(); + } + + return data; + } + + static class PackData implements EntityData { + + final CloudEntity leader; + + PackData(CloudEntity leader) { + this.leader = leader; + } + + Vec3d getUnOccupiedPosition(int size) { + return leader.getPos(); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/AbilityDelegate.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java rename to src/main/java/com/minelittlepony/unicopia/entity/capabilities/AbilityDelegate.java index d8e212f4..9282c769 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/AbilityDelegate.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.entity.player; +package com.minelittlepony.unicopia.entity.capabilities; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -7,7 +7,7 @@ import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.IAbilityReceiver; import com.minelittlepony.unicopia.ability.IData; import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.powers.PowersRegistry; +import com.minelittlepony.unicopia.ability.PowersRegistry; import com.minelittlepony.unicopia.entity.IUpdatable; import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.util.InbtSerialisable; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ai/FollowCasterGoal.java b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/FollowCasterGoal.java similarity index 98% rename from src/main/java/com/minelittlepony/unicopia/entity/ai/FollowCasterGoal.java rename to src/main/java/com/minelittlepony/unicopia/entity/capabilities/FollowCasterGoal.java index 7eeb0d47..36408df9 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ai/FollowCasterGoal.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/FollowCasterGoal.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.entity.ai; +package com.minelittlepony.unicopia.entity.capabilities; import java.util.EnumSet; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/GravityDelegate.java b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/GravityDelegate.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/entity/player/GravityDelegate.java rename to src/main/java/com/minelittlepony/unicopia/entity/capabilities/GravityDelegate.java index a400827b..d7cc873c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/GravityDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/GravityDelegate.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.entity.player; +package com.minelittlepony.unicopia.entity.capabilities; import java.util.Random; @@ -60,7 +60,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable if (player.hasEffect()) { IMagicEffect effect = player.getEffect(); - if (!effect.getDead() && effect instanceof IFlyingPredicate) { + if (!effect.isDead() && effect instanceof IFlyingPredicate) { return ((IFlyingPredicate)effect).checkCanFly(player); } } @@ -76,7 +76,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable public float getTargetEyeHeight(IPlayer player) { if (player.hasEffect()) { IMagicEffect effect = player.getEffect(); - if (!effect.getDead() && effect instanceof IHeightPredicate) { + if (!effect.isDead() && effect instanceof IHeightPredicate) { float val = ((IHeightPredicate)effect).getTargetEyeHeight(player); if (val > 0) { return val; @@ -95,7 +95,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable public float getTargetBodyHeight(IPlayer player) { if (player.hasEffect()) { IMagicEffect effect = player.getEffect(); - if (!effect.getDead() && effect instanceof IHeightPredicate) { + if (!effect.isDead() && effect instanceof IHeightPredicate) { float val = ((IHeightPredicate)effect).getTargetBodyHeight(player); if (val > 0) { return val; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/ICamera.java b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/ICamera.java similarity index 81% rename from src/main/java/com/minelittlepony/unicopia/entity/player/ICamera.java rename to src/main/java/com/minelittlepony/unicopia/entity/capabilities/ICamera.java index 5fc0f145..cb2ef4a5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/ICamera.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/ICamera.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.entity.player; +package com.minelittlepony.unicopia.entity.capabilities; public interface ICamera { float calculateRoll(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/IPlayer.java b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/IPlayer.java similarity index 96% rename from src/main/java/com/minelittlepony/unicopia/entity/player/IPlayer.java rename to src/main/java/com/minelittlepony/unicopia/entity/capabilities/IPlayer.java index 28e2a0f1..b7a8ec55 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/IPlayer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/capabilities/IPlayer.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.entity.player; +package com.minelittlepony.unicopia.entity.capabilities; import java.util.UUID; @@ -137,7 +137,7 @@ public interface IPlayer extends ICaster, IRaceContainer getBiomeType(Biome biome) { - return Lists.newArrayList(BiomeManager.BiomeType.values()).stream().filter(type -> - BiomeManager.getBiomes(type).stream().filter(entry -> - entry.biome.equals(biome) - ).findFirst() - .isPresent() - ).findFirst(); - } - - /** - * Adds a spawn entry for the specified entity if one does not already exist. - */ - public static void addSpawnEntry(Biome biome, EnumCreatureType list, Class type, Function func) { - List entries = biome.getSpawnableList(list); - - entries.stream().filter(p -> p.entityClass == type).findFirst().orElseGet(() -> { - entries.add(func.apply(biome)); - return null; - }); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java b/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java index 6c2c3441..2dcce13e 100644 --- a/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java +++ b/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java @@ -10,7 +10,7 @@ import com.minelittlepony.unicopia.enchanting.IPage; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; import com.minelittlepony.unicopia.enchanting.PageState; import com.minelittlepony.unicopia.enchanting.Pages; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; @@ -171,7 +171,7 @@ public class GuiSpellBook extends GuiContainer implements IPageUnlockListener { drawModalRectWithCustomSizedTexture(left, top, 0, 0, xSize, ySize, 512, 256); } else { if (playerExtension.getWorld().rand.nextInt(100) == 0) { - Unicopia.log.fatal("Missing texture " + texture); + Unicopia.LOGGER.fatal("Missing texture " + texture); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellBookContainer.java b/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellBookContainer.java index fcff5013..0568b9ad 100644 --- a/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellBookContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellBookContainer.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.inventory.gui; import javax.annotation.Nonnull; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; @@ -156,7 +156,7 @@ public class SpellBookContainer extends Container { @Override public boolean canUse(PlayerEntity player) { - return Predicates.MAGI.test(player); + return EquinePredicates.MAGI.test(player); } static class SpellbookSlot extends Slot { diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellbookResultSlot.java b/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellbookResultSlot.java index 11ae8318..8cbe0180 100644 --- a/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellbookResultSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/inventory/gui/SpellbookResultSlot.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.inventory.gui; import com.minelittlepony.unicopia.enchanting.IPageOwner; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; import com.minelittlepony.unicopia.enchanting.SpellCraftingEvent; -import com.minelittlepony.unicopia.item.ItemSpell; +import com.minelittlepony.unicopia.item.MagicGemItem; import com.minelittlepony.unicopia.magic.spells.SpellRegistry; import net.minecraft.entity.player.PlayerEntity; @@ -90,7 +90,7 @@ public class SpellbookResultSlot extends SpellBookContainer.SpellbookSlot { @Override public boolean canInsert(ItemStack stack) { - return (stack.getItem() instanceof ItemSpell || stack.getItem() instanceof MusicDiscItem) + return (stack.getItem() instanceof MagicGemItem || stack.getItem() instanceof MusicDiscItem) && !SpellRegistry.stackHasEnchantment(stack); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java index e4dedb8b..50f8382f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AppleItem.java @@ -6,8 +6,8 @@ import java.util.function.Supplier; import javax.annotation.Nullable; import com.minelittlepony.unicopia.UItems; -import com.minelittlepony.unicopia.edibles.IEdible; -import com.minelittlepony.unicopia.edibles.Toxicity; +import com.minelittlepony.unicopia.item.consumables.IEdible; +import com.minelittlepony.unicopia.item.consumables.Toxicity; import com.minelittlepony.util.collection.Pool; import com.minelittlepony.util.collection.Weighted; diff --git a/src/main/java/com/minelittlepony/unicopia/item/CloudPlacerItem.java b/src/main/java/com/minelittlepony/unicopia/item/CloudPlacerItem.java index ed0740c7..5aa5c829 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/CloudPlacerItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/CloudPlacerItem.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.item; import java.util.function.Function; -import com.minelittlepony.unicopia.entity.EntityCloud; +import com.minelittlepony.unicopia.entity.CloudEntity; import com.minelittlepony.unicopia.magic.items.IDispensable; import net.minecraft.block.DispenserBlock; @@ -23,9 +23,9 @@ import net.minecraft.world.World; public class CloudPlacerItem extends Item implements IDispensable { - private final Function cloudSupplier; + private final Function cloudSupplier; - public CloudPlacerItem(Function cloudSupplier) { + public CloudPlacerItem(Function cloudSupplier) { super(new Item.Settings() .group(ItemGroup.MATERIALS) .maxCount(16) @@ -36,7 +36,7 @@ public class CloudPlacerItem extends Item implements IDispensable { } public void placeCloud(World world, BlockPos pos) { - EntityCloud cloud = cloudSupplier.apply(world); + CloudEntity cloud = cloudSupplier.apply(world); cloud.setPositionAndAngles(pos, 0, 0); world.spawnEntity(cloud); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/CursedMagicGemItem.java b/src/main/java/com/minelittlepony/unicopia/item/CursedMagicGemItem.java new file mode 100644 index 00000000..f818326b --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/CursedMagicGemItem.java @@ -0,0 +1,54 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.magic.Affinity; +import com.minelittlepony.unicopia.magic.IDispenceable; +import com.minelittlepony.unicopia.magic.IMagicEffect; +import com.minelittlepony.unicopia.magic.spells.SpellCastResult; +import com.minelittlepony.util.MagicalDamageSource; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.explosion.Explosion.DestructionType; + +public class CursedMagicGemItem extends MagicGemItem { + + @Override + public SpellCastResult onDispenseSpell(BlockPointer source, ItemStack stack, IDispenceable effect) { + + BlockPos pos = source.getBlockPos(); + World world = source.getWorld(); + + SpellCastResult result = super.onDispenseSpell(source, stack, effect); + + if (result != SpellCastResult.NONE) { + if (world.random.nextInt(200) == 0) { + float strength = world.random.nextFloat() * 100; + + world.createExplosion(null, pos.getX(), pos.getY(), pos.getZ(), strength, DestructionType.DESTROY); + + return SpellCastResult.NONE; + } + } + + return result; + } + + @Override + public SpellCastResult onCastSpell(ItemUsageContext context, IMagicEffect effect) { + SpellCastResult result = super.onCastSpell(context, effect); + + if (result != SpellCastResult.NONE) { + context.getPlayer().damage(MagicalDamageSource.causePlayerDamage("corruption", context.getPlayer()), 1); + } + + return result; + } + + @Override + public Affinity getAffinity() { + return Affinity.BAD; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ExtendedShearsItem.java b/src/main/java/com/minelittlepony/unicopia/item/ExtendedShearsItem.java new file mode 100644 index 00000000..17c94e59 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ExtendedShearsItem.java @@ -0,0 +1,78 @@ +package com.minelittlepony.unicopia.item; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.magic.items.IDispensable; +import net.minecraft.block.BlockState; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.DispenserBehavior; +import net.minecraft.block.dispenser.ItemDispenserBehavior; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.Items; +import net.minecraft.item.ShearsItem; +import net.minecraft.util.ActionResult; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class ExtendedShearsItem extends ShearsItem { + + @Nullable + private static DispenserBehavior vanillaDispenserBehaviour; + private static final DispenserBehavior dispenserBehavior = new ItemDispenserBehavior() { + @Override + protected ItemStack dispenseSilently(BlockPointer source, ItemStack stack) { + + Direction facing = source.getBlockState().get(DispenserBlock.FACING); + BlockPos pos = source.getBlockPos().offset(facing); + World w = source.getWorld(); + + if (UItems.moss.tryConvert(w, w.getBlockState(pos), pos, null)) { + stack.damage(1, w.random, null); + + return stack; + } + + if (vanillaDispenserBehaviour != null) { + return vanillaDispenserBehaviour.dispense(source, stack); + } + + return stack; + } + }; + + public ExtendedShearsItem() { + super(new Item.Settings().maxDamage(238).group(ItemGroup.TOOLS)); + + vanillaDispenserBehaviour = IDispensable.getBehaviorForItem(new ItemStack(Items.SHEARS)); + DispenserBlock.registerBehavior(Items.SHEARS, dispenserBehavior); + DispenserBlock.registerBehavior(this, dispenserBehavior); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + BlockState state = context.getWorld().getBlockState(context.getBlockPos()); + + PlayerEntity player = context.getPlayer(); + + if (UItems.moss.tryConvert(context.getWorld(), state, context.getBlockPos(), context.getPlayer())) { + if (player != null) { + ItemStack stack = context.getStack(); + + if (player == null || !player.isCreative()) { + stack.damage(1, player, p -> p.sendToolBreakStatus(context.getHand())); + } + } + + return ActionResult.SUCCESS; + } + + return ActionResult.PASS; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java b/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java index a2b79b95..3f858c62 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java @@ -9,7 +9,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UClient; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.items.IDependable; import com.minelittlepony.unicopia.spell.SpellAffinity; import com.minelittlepony.unicopia.world.UWorld; @@ -28,7 +28,7 @@ import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.ActionResult; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumActionResult; @@ -135,10 +135,10 @@ public class ItemAlicornAmulet extends ItemArmor implements IDependable { public String getItemStackDisplayName(ItemStack stack) { if (!stack.hasTagCompound()) { - stack.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(new CompoundTag()); } - NBTTagCompound compound = stack.getTagCompound(); + CompoundTag compound = stack.getTagCompound(); int hideFlags = 0; diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java b/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java deleted file mode 100644 index 32e05f5d..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemCurse.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import com.minelittlepony.unicopia.spell.IDispenceable; -import com.minelittlepony.unicopia.spell.IMagicEffect; -import com.minelittlepony.unicopia.spell.SpellAffinity; -import com.minelittlepony.unicopia.spell.SpellCastResult; -import com.minelittlepony.util.MagicalDamageSource; - -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemCurse extends ItemSpell { - - public ItemCurse(String domain, String name) { - super(domain, name); - } - - @Override - public SpellCastResult onDispenseSpell(IBlockSource source, ItemStack stack, IDispenceable effect) { - - BlockPos pos = source.getBlockPos(); - World world = source.getWorld(); - - SpellCastResult result = super.onDispenseSpell(source, stack, effect); - - if (result != SpellCastResult.NONE) { - if (world.rand.nextInt(200) == 0) { - float strength = world.rand.nextFloat() * 100; - - world.createExplosion(null, pos.getX(), pos.getY(), pos.getZ(), strength, true); - - return SpellCastResult.NONE; - } - } - - return result; - } - - @Override - public SpellCastResult onCastSpell(PlayerEntity player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, Direction side, float hitX, float hitY, float hitZ) { - SpellCastResult result = super.onCastSpell(player, world, pos, stack, effect, side, hitX, hitY, hitZ); - - if (result != SpellCastResult.NONE) { - player.attackEntityFrom(MagicalDamageSource.causePlayerDamage("corruption", player), 1); - } - - return result; - } - - @Override - public SpellAffinity getAffinity() { - return SpellAffinity.BAD; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java b/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java deleted file mode 100644 index 561e259c..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import net.minecraft.block.Block; - -public class ItemFruitLeaves extends UItemDecoration { - - public ItemFruitLeaves(Block block) { - super(block); - } - - @Override - public int getMetadata(int damage) { - return damage | 4; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemMagicStaff.java b/src/main/java/com/minelittlepony/unicopia/item/ItemMagicStaff.java index e28b62c4..d90c8861 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemMagicStaff.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemMagicStaff.java @@ -5,9 +5,9 @@ import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.projectile.ITossableItem; import com.minelittlepony.unicopia.spell.CasterUtils; import com.minelittlepony.unicopia.spell.IAligned; @@ -53,7 +53,7 @@ public class ItemMagicStaff extends ItemStaff implements IAligned, ITossableItem @Override public TypedActionResult onItemRightClick(World world, PlayerEntity player, EnumHand hand) { - if (Predicates.MAGI.test(player) && hand == EnumHand.MAIN_HAND) { + if (EquinePredicates.MAGI.test(player) && hand == EnumHand.MAIN_HAND) { ItemStack itemstack = player.getStackInHand(hand); player.setActiveHand(hand); @@ -66,7 +66,7 @@ public class ItemMagicStaff extends ItemStaff implements IAligned, ITossableItem @Override public void onPlayerStoppedUsing(ItemStack itemstack, World world, LivingEntity entity, int timeLeft) { - if (Predicates.MAGI.test(entity) && entity instanceof PlayerEntity) { + if (EquinePredicates.MAGI.test(entity) && entity instanceof PlayerEntity) { int i = getMaxItemUseDuration(itemstack) - timeLeft; diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemMoss.java b/src/main/java/com/minelittlepony/unicopia/item/ItemMoss.java deleted file mode 100644 index 69278d90..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemMoss.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import javax.annotation.Nullable; - -import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.UClient; -import com.minelittlepony.unicopia.edibles.ItemEdible; -import com.minelittlepony.unicopia.edibles.Toxicity; -import com.minelittlepony.util.collection.ReversableStateMapList; -import com.mojang.authlib.GameProfile; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockDispenser; -import net.minecraft.block.BlockSilverfish; -import net.minecraft.block.BlockStoneBrick; -import net.minecraft.block.BlockWall; -import net.minecraft.block.state.BlockState; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.IBehaviorDispenseItem; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.IShearable; - -public class ItemMoss extends ItemEdible { - - public static final ReversableStateMapList affected = new ReversableStateMapList(); - - static { - affected.replaceBlock(Blocks.MOSSY_COBBLESTONE, Blocks.COBBLESTONE); - affected.replaceProperty(Blocks.COBBLESTONE_WALL, BlockWall.VARIANT, BlockWall.EnumType.MOSSY, BlockWall.EnumType.NORMAL); - affected.replaceProperty(Blocks.STONEBRICK, BlockStoneBrick.VARIANT, BlockStoneBrick.EnumType.MOSSY, BlockStoneBrick.EnumType.DEFAULT); - affected.replaceProperty(Blocks.MONSTER_EGG, BlockSilverfish.VARIANT, BlockSilverfish.EnumType.MOSSY_STONEBRICK, BlockSilverfish.EnumType.STONEBRICK); - } - - @Nullable - protected IBehaviorDispenseItem vanillaDispenserBehaviour; - private final IBehaviorDispenseItem dispenserBehavior = new BehaviorDefaultDispenseItem() { - @Override - protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { - - Direction facing = source.getBlockState().getValue(BlockDispenser.FACING); - BlockPos pos = source.getBlockPos().offset(facing); - World w = source.getWorld(); - - if (tryConvert(w, w.getBlockState(pos), pos, null)) { - stack.attemptDamageItem(1, w.rand, null); - - return stack; - } - - PlayerEntity player = null; - - for (LivingEntity e : w.getEntitiesWithinAABB(LivingEntity.class, Block.FULL_BLOCK_AABB.offset(pos), e -> - e instanceof IShearable && ((IShearable)e).isShearable(stack, w, pos) - )) { - if (player == null) { - player = UClient.instance().createPlayer(e, new GameProfile(null, "Notch")); - } - - if (stack.interactWithEntity(player, e, EnumHand.MAIN_HAND)) { - return stack; - } - } - - if (vanillaDispenserBehaviour != null) { - return vanillaDispenserBehaviour.dispense(source, stack); - } - - return stack; - } - }; - - public ItemMoss(String domain, String name) { - super(domain, name, 3, 0, false); - - IBehaviorDispenseItem previous = BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.containsKey(Items.SHEARS) ? BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.getObject(Items.SHEARS) : null; - - if (previous != null && previous != dispenserBehavior) { - vanillaDispenserBehaviour = previous; - } - - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(Items.SHEARS, dispenserBehavior); - } - - public boolean tryConvert(World world, BlockState state, BlockPos pos, @Nullable PlayerEntity player) { - BlockState converted = affected.getConverted(state); - - if (!state.equals(converted)) { - world.setBlockState(pos, converted, 3); - - world.playSound(null, pos, SoundEvents.ENTITY_SHEEP_SHEAR, SoundCategory.PLAYERS, 1, 1); - - int amount = 1; - - if (player != null && SpeciesList.instance().getPlayer(player).getSpecies().canUseEarth()) { - amount = world.rand.nextInt(4); - } - - Block.spawnAsEntity(world, pos, new ItemStack(this, amount)); - - return true; - } - - return false; - } - - @Override - public Toxicity getToxicityLevel(ItemStack stack) { - return Toxicity.MILD; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemOfHolding.java b/src/main/java/com/minelittlepony/unicopia/item/ItemOfHolding.java index 4e931d3a..143d903b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemOfHolding.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemOfHolding.java @@ -6,7 +6,7 @@ import java.util.Map; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.inventory.gui.ContainerOfHolding; import com.minelittlepony.unicopia.inventory.gui.InventoryOfHolding; @@ -72,7 +72,7 @@ public class ItemOfHolding extends Item implements IMagicalItem { @Override public TypedActionResult onItemRightClick(World world, PlayerEntity player, EnumHand hand) { - if (!Predicates.MAGI.test(player)) { + if (!EquinePredicates.MAGI.test(player)) { return super.onItemRightClick(world, player, hand); } @@ -99,7 +99,7 @@ public class ItemOfHolding extends Item implements IMagicalItem { Box box = new Box(pos.offset(hit.sideHit)).grow(0.5); - List itemsAround = world.getEntitiesInAABBexcluding(player, box, Predicates.ITEMS); + List itemsAround = world.getEntitiesInAABBexcluding(player, box, EquinePredicates.ITEMS); if (itemsAround.size() > 0) { InventoryOfHolding inventory = InventoryOfHolding.getInventoryFromStack(stack); diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemRottenTomato.java b/src/main/java/com/minelittlepony/unicopia/item/ItemRottenTomato.java deleted file mode 100644 index 42b40ac4..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemRottenTomato.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.projectile.ITossableItem; -import com.minelittlepony.unicopia.spell.ICaster; - -import net.minecraft.block.material.Material; -import net.minecraft.block.state.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.MobEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemRottenTomato extends ItemTomato implements ITossableItem { - - public ItemRottenTomato(String domain, String name, int heal, int sat) { - super(domain, name, heal, sat); - - setDispenseable(); - } - - @Override - public TypedActionResult onItemRightClick(World world, PlayerEntity player, EnumHand hand) { - ItemStack itemstack = player.getStackInHand(hand); - - if (canBeThrown(itemstack) && !player.canEat(false)) { - toss(world, itemstack, player); - - return new TypedActionResult(EnumActionResult.SUCCESS, itemstack); - } - - return super.onItemRightClick(world, player, hand); - } - - protected boolean isSickening(ItemStack stack, PlayerEntity player) { - return canBeThrown(stack) - && !SpeciesList.instance().getPlayer(player).getSpecies().canUseEarth(); - } - - @Override - protected void onFoodEaten(ItemStack stack, World worldIn, PlayerEntity player) { - if (isSickening(stack, player)) { - int duration = 7000; - - PotionEffect effect = player.getActivePotionEffect(MobEffects.NAUSEA); - - if (effect != null) { - duration += Math.max(0, effect.getDuration()); - } - - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, duration, 4)); - } - } - - @Override - public void onImpact(ICaster caster, BlockPos pos, BlockState state) { - if (caster.isLocal() && state.getMaterial() == Material.GLASS) { - caster.getWorld().destroyBlock(pos, true); - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java b/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java deleted file mode 100644 index eb42c146..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemSpell.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import java.util.List; - -import javax.annotation.Nullable; - -import com.minelittlepony.unicopia.Predicates; -import com.minelittlepony.unicopia.entity.SpellcastEntity; -import com.minelittlepony.unicopia.magic.items.ICastable; -import com.minelittlepony.unicopia.spell.IMagicEffect; -import com.minelittlepony.unicopia.spell.IUseAction; -import com.minelittlepony.unicopia.spell.SpellAffinity; -import com.minelittlepony.unicopia.spell.SpellCastResult; -import com.minelittlepony.unicopia.spell.IDispenceable; -import com.minelittlepony.unicopia.spell.SpellRegistry; -import com.minelittlepony.util.VecHelper; -import com.minelittlepony.util.lang.ClientLocale; - -import net.minecraft.block.BlockDispenser; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumHand; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; - -public class ItemSpell extends Item implements ICastable { - - protected String translationKey; - - public ItemSpell(String domain, String name) { - super(); - - setMaxDamage(0); - setTranslationKey(name); - setRegistryName(domain, name); - setMaxStackSize(16); - - setCreativeTab(CreativeTabs.BREWING); - - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(this, DISPENSER_BEHAVIOUR); - } - - public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isSelected) { - - } - - public Item setTranslationKey(String key) { - translationKey = key; - return super.setTranslationKey(key); - } - - @Override - public boolean hasEffect(ItemStack stack) { - return SpellRegistry.stackHasEnchantment(stack); - } - - @Override - public SpellCastResult onDispenseSpell(IBlockSource source, ItemStack stack, IDispenceable effect) { - Direction facing = source.getBlockState().getValue(BlockDispenser.FACING); - BlockPos pos = source.getBlockPos().offset(facing); - - return effect.onDispenced(pos, facing, source, getAffinity(stack)); - } - - @Override - public SpellCastResult onCastSpell(PlayerEntity player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, Direction side, float hitX, float hitY, float hitZ) { - if (effect instanceof IUseAction) { - return ((IUseAction)effect).onUse(stack, getAffinity(stack), player, world, pos, side, hitX, hitY, hitZ); - } - - return SpellCastResult.PLACE; - } - - @Override - public EnumActionResult onItemUse(PlayerEntity player, World world, BlockPos pos, EnumHand hand, Direction side, float hitX, float hitY, float hitZ) { - - if (hand != EnumHand.MAIN_HAND || !Predicates.MAGI.test(player)) { - return EnumActionResult.PASS; - } - - ItemStack stack = player.getStackInHand(hand); - - if (!SpellRegistry.stackHasEnchantment(stack)) { - return EnumActionResult.FAIL; - } - - IMagicEffect effect = SpellRegistry.getInstance().getSpellFrom(stack); - - if (effect == null) { - return EnumActionResult.FAIL; - } - - SpellCastResult result = onCastSpell(player, world, pos, stack, effect, side, hitX, hitY, hitZ); - - if (!world.isClient) { - pos = pos.offset(side); - - if (result == SpellCastResult.PLACE) { - castContainedSpell(world, pos, stack, effect).setOwner(player); - } - } - - if (result != SpellCastResult.NONE) { - if (!player.capabilities.isCreativeMode) { - stack.shrink(1); - } - - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.FAIL; - } - - @Override - public TypedActionResult onItemRightClick(World world, PlayerEntity player, EnumHand hand) { - - ItemStack stack = player.getStackInHand(hand); - - if (!Predicates.MAGI.test(player)) { - return new TypedActionResult(EnumActionResult.PASS, stack); - } - - if (!SpellRegistry.stackHasEnchantment(stack)) { - return new TypedActionResult(EnumActionResult.FAIL, stack); - } - - IUseAction effect = SpellRegistry.getInstance().getUseActionFrom(stack); - - if (effect != null) { - SpellCastResult result = effect.onUse(stack, getAffinity(stack), player, world, VecHelper.getLookedAtEntity(player, 5)); - - if (result != SpellCastResult.NONE) { - if (result == SpellCastResult.PLACE && !player.capabilities.isCreativeMode) { - stack.shrink(1); - } - - return new TypedActionResult(EnumActionResult.SUCCESS, stack); - } - } - - return new TypedActionResult(EnumActionResult.PASS, stack); - } - - @Override - public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { - if (SpellRegistry.stackHasEnchantment(stack)) { - SpellAffinity affinity = getAffinity(stack); - - tooltip.add(affinity.getColourCode() + ClientLocale.format(String.format("%s.%s.tagline", - affinity.getTranslationKey(), - SpellRegistry.getKeyFromStack(stack) - ))); - } - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(); - } - - @Override - public String getItemStackDisplayName(ItemStack stack) { - if (SpellRegistry.stackHasEnchantment(stack)) { - return ClientLocale.format(getTranslationKey(stack) + ".enchanted.name", ClientLocale.format(String.format("%s.%s.name", - getAffinity(stack).getTranslationKey(), - SpellRegistry.getKeyFromStack(stack) - ))); - } - - return super.getItemStackDisplayName(stack); - } - - @Override - public void getSubItems(CreativeTabs tab, NonNullList subItems) { - super.getSubItems(tab, subItems); - - if (isInCreativeTab(tab)) { - for (String name : SpellRegistry.getInstance().getAllNames(getAffinity())) { - subItems.add(SpellRegistry.getInstance().enchantStack(new ItemStack(this, 1), name)); - } - } - } - - @Override - public EnumRarity getRarity(ItemStack stack) { - if (SpellRegistry.stackHasEnchantment(stack)) { - return EnumRarity.UNCOMMON; - } - - return super.getRarity(stack); - } - - @Override - public boolean canFeed(SpellcastEntity entity, ItemStack stack) { - IMagicEffect effect = entity.getEffect(); - - return effect != null - && entity.getAffinity() == getAffinity() - && effect.getName().equals(SpellRegistry.getKeyFromStack(stack)); - } - - @Override - public SpellAffinity getAffinity() { - return SpellAffinity.GOOD; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemSpellbook.java b/src/main/java/com/minelittlepony/unicopia/item/ItemSpellbook.java deleted file mode 100644 index 927cd443..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemSpellbook.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import com.minelittlepony.unicopia.Predicates; -import com.minelittlepony.unicopia.entity.EntitySpellbook; - -import net.minecraft.block.BlockDispenser; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.IBehaviorDispenseItem; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemBook; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumHand; -import net.minecraft.world.World; - -public class ItemSpellbook extends ItemBook { - private static final IBehaviorDispenseItem dispenserBehavior = new BehaviorDefaultDispenseItem() { - @Override - protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { - Direction facing = source.getBlockState().getValue(BlockDispenser.FACING); - BlockPos pos = source.getBlockPos().offset(facing); - int yaw = 0; - - - //0deg == SOUTH - //90deg == WEST - //180deg == NORTH - //270deg == EAST - - /*switch (facing) { - case NORTH: yaw -= 90; break; - case SOUTH: yaw += 90; break; - case EAST: yaw += 180; break; - default: - }*/ - - yaw = facing.getOpposite().getHorizontalIndex() * 90; - placeBook(source.getWorld(), pos.getX(), pos.getY(), pos.getZ(), yaw); - stack.shrink(1); - return stack; - } - }; - - public ItemSpellbook(String domain, String name) { - super(); - setTranslationKey(name); - setRegistryName(domain, name); - - setMaxDamage(0); - maxStackSize = 1; - setCreativeTab(CreativeTabs.BREWING); - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(this, dispenserBehavior); - } - - public EnumActionResult onItemUse(PlayerEntity player, World world, BlockPos pos, EnumHand hand, Direction side, float hitX, float hitY, float hitZ) { - - if (!world.isClient && Predicates.MAGI.test(player)) { - pos = pos.offset(side); - - double diffX = player.posX - (pos.getX() + 0.5); - double diffZ = player.posZ - (pos.getZ() + 0.5); - float yaw = (float)Math.toDegrees(Math.atan2(diffZ, diffX) + Math.PI); - - placeBook(world, pos.getX(), pos.getY(), pos.getZ(), yaw); - - if (!player.capabilities.isCreativeMode) { - player.getStackInHand(hand).shrink(1); - } - - return EnumActionResult.SUCCESS; - } - return EnumActionResult.PASS; - } - - private static void placeBook(World world, int x, int y, int z, float yaw) { - EntitySpellbook book = new EntitySpellbook(world); - - book.setPositionAndRotation(x + 0.5, y, z + 0.5, yaw, 0); - book.renderYawOffset = 0; - book.prevRotationYaw = yaw; - - world.spawnEntity(book); - } -} - - - - - - - - - - - - - - - diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java b/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java index 65334d96..2a5d176b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.util.lang.ClientLocale; import net.minecraft.block.Block; @@ -66,7 +66,7 @@ public class ItemStaff extends ItemSword { public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { super.hitEntity(stack, target, attacker); - if (Predicates.MAGI.test(attacker)) { + if (EquinePredicates.MAGI.test(attacker)) { return castContainedEffect(stack, target, attacker); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemTomato.java b/src/main/java/com/minelittlepony/unicopia/item/ItemTomato.java deleted file mode 100644 index a3e7ec67..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemTomato.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import com.minelittlepony.unicopia.UItems; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.MobEffects; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; - -public class ItemTomato extends ItemFood { - - public ItemTomato(String domain, String name, int heal, int sat) { - super(heal, sat, false); - - setTranslationKey(name); - setRegistryName(domain, name); - } - - - @Override - public void getSubItems(CreativeTabs tab, NonNullList items) { - if (this == UItems.tomato && isInCreativeTab(tab)) { - items.add(new ItemStack(this)); - items.add(new ItemStack(UItems.rotten_tomato)); - items.add(new ItemStack(UItems.cloudsdale_tomato)); - items.add(new ItemStack(UItems.rotten_cloudsdale_tomato)); - } - } - - @Override - protected void onFoodEaten(ItemStack stack, World worldIn, PlayerEntity player) { - - PotionEffect effect = player.getActivePotionEffect(MobEffects.NAUSEA); - - if (effect != null) { - player.removePotionEffect(MobEffects.NAUSEA); - } - } - -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemTomatoSeeds.java b/src/main/java/com/minelittlepony/unicopia/item/ItemTomatoSeeds.java deleted file mode 100644 index fe6cf370..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemTomatoSeeds.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.minelittlepony.unicopia.item; - -import com.minelittlepony.unicopia.UBlocks; -import com.minelittlepony.unicopia.block.StickBlock; - -import net.minecraft.block.Block; -import net.minecraft.block.state.BlockState; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemTomatoSeeds extends Item { - - public ItemTomatoSeeds(String domain, String name) { - setTranslationKey(name); - setRegistryName(domain, name); - setCreativeTab(CreativeTabs.MATERIALS); - } - - @Override - public EnumActionResult onItemUse(PlayerEntity player, World world, BlockPos pos, EnumHand hand, Direction facing, float hitX, float hitY, float hitZ) { - - BlockState state = world.getBlockState(pos); - - Block block = state.getBlock(); - - if (block instanceof StickBlock) { - if (UBlocks.tomato_plant.plant(world, pos, state)) { - if (!player.capabilities.isCreativeMode) { - player.getStackInHand(hand).shrink(1); - } - - return EnumActionResult.SUCCESS; - } - } - - return EnumActionResult.PASS; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemZapApple.java b/src/main/java/com/minelittlepony/unicopia/item/ItemZapApple.java index f4e4267c..607a1b0a 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemZapApple.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemZapApple.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.item; -import com.minelittlepony.unicopia.edibles.Toxicity; +import com.minelittlepony.unicopia.item.consumables.Toxicity; import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.VecHelper; diff --git a/src/main/java/com/minelittlepony/unicopia/item/MagicGemItem.java b/src/main/java/com/minelittlepony/unicopia/item/MagicGemItem.java new file mode 100644 index 00000000..4f060c2d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/MagicGemItem.java @@ -0,0 +1,202 @@ +package com.minelittlepony.unicopia.item; + +import java.util.List; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.entity.SpellcastEntity; +import com.minelittlepony.unicopia.magic.Affinity; +import com.minelittlepony.unicopia.magic.IDispenceable; +import com.minelittlepony.unicopia.magic.IMagicEffect; +import com.minelittlepony.unicopia.magic.IUseable; +import com.minelittlepony.unicopia.magic.items.ICastable; +import com.minelittlepony.unicopia.magic.spells.SpellCastResult; +import com.minelittlepony.unicopia.magic.spells.SpellRegistry; +import com.minelittlepony.util.VecHelper; + +import net.minecraft.block.DispenserBlock; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.ActionResult; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Hand; +import net.minecraft.util.Rarity; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; + +public class MagicGemItem extends Item implements ICastable { + + public MagicGemItem() { + super(new Settings() + .maxCount(16) + .group(ItemGroup.BREWING)); + + setDispenseable(); + } + + @Override + public boolean hasEnchantmentGlint(ItemStack stack) { + return super.hasEnchantmentGlint(stack) || SpellRegistry.stackHasEnchantment(stack); + } + + @Override + public SpellCastResult onDispenseSpell(BlockPointer source, ItemStack stack, IDispenceable effect) { + Direction facing = source.getBlockState().get(DispenserBlock.FACING); + BlockPos pos = source.getBlockPos().offset(facing); + + return effect.onDispenced(pos, facing, source, getAffinity(stack)); + } + + @Override + public SpellCastResult onCastSpell(ItemUsageContext context, IMagicEffect effect) { + if (effect instanceof IUseable) { + return ((IUseable)effect).onUse(context, getAffinity(context.getStack())); + } + + return SpellCastResult.PLACE; + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + + BlockPos pos = context.getBlockPos(); + Hand hand = context.getHand(); + PlayerEntity player = context.getPlayer(); + + if (hand != Hand.MAIN_HAND || !EquinePredicates.MAGI.test(player)) { + return ActionResult.PASS; + } + + ItemStack stack = player.getStackInHand(hand); + + if (!SpellRegistry.stackHasEnchantment(stack)) { + return ActionResult.FAIL; + } + + IMagicEffect effect = SpellRegistry.instance().getSpellFrom(stack); + + if (effect == null) { + return ActionResult.FAIL; + } + + SpellCastResult result = onCastSpell(context, effect); + + if (!context.getWorld().isClient) { + pos = pos.offset(context.getSide()); + + if (result == SpellCastResult.PLACE) { + castContainedSpell(context.getWorld(), pos, stack, effect).setOwner(player); + } + } + + if (result != SpellCastResult.NONE) { + if (!player.isCreative()) { + stack.decrement(1); + } + + return ActionResult.SUCCESS; + } + + return ActionResult.FAIL; + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + + ItemStack stack = player.getStackInHand(hand); + + if (!EquinePredicates.MAGI.test(player)) { + return new TypedActionResult<>(ActionResult.PASS, stack); + } + + if (!SpellRegistry.stackHasEnchantment(stack)) { + return new TypedActionResult<>(ActionResult.FAIL, stack); + } + + IUseable effect = SpellRegistry.instance().getUseActionFrom(stack); + + if (effect != null) { + SpellCastResult result = effect.onUse(stack, getAffinity(stack), player, world, VecHelper.getLookedAtEntity(player, 5)); + + if (result != SpellCastResult.NONE) { + if (result == SpellCastResult.PLACE && !player.isCreative()) { + stack.decrement(1); + } + + return new TypedActionResult<>(ActionResult.SUCCESS, stack); + } + } + + return new TypedActionResult<>(ActionResult.PASS, stack); + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable World worldIn, List tooltip, TooltipContext context) { + if (SpellRegistry.stackHasEnchantment(stack)) { + Affinity affinity = getAffinity(stack); + + Text text = new TranslatableText(String.format("%s.%s.tagline", + affinity.getTranslationKey(), + SpellRegistry.getKeyFromStack(stack) + )); + text.getStyle().setColor(affinity.getColourCode()); + + tooltip.add(text); + } + } + + @Override + public Text getName(ItemStack stack) { + if (SpellRegistry.stackHasEnchantment(stack)) { + return new TranslatableText(getTranslationKey(stack) + ".enchanted.name", + new TranslatableText(String.format("%s.%s.name", getAffinity(stack).getTranslationKey(), SpellRegistry.getKeyFromStack(stack) + ))); + } + + return super.getName(stack); + } + + @Override + public void appendStacks(ItemGroup tab, DefaultedList subItems) { + super.appendStacks(tab, subItems); + + if (isIn(tab)) { + SpellRegistry.instance().getAllNames(getAffinity()).forEach(name -> { + subItems.add(SpellRegistry.instance().enchantStack(new ItemStack(this), name)); + }); + } + } + + @Override + public Rarity getRarity(ItemStack stack) { + if (SpellRegistry.stackHasEnchantment(stack)) { + return Rarity.UNCOMMON; + } + + return super.getRarity(stack); + } + + @Override + public boolean canFeed(SpellcastEntity entity, ItemStack stack) { + IMagicEffect effect = entity.getEffect(); + + return effect != null + && entity.getAffinity() == getAffinity() + && effect.getName().equals(SpellRegistry.getKeyFromStack(stack)); + } + + @Override + public Affinity getAffinity() { + return Affinity.GOOD; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/MossItem.java b/src/main/java/com/minelittlepony/unicopia/item/MossItem.java new file mode 100644 index 00000000..26d02a67 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/MossItem.java @@ -0,0 +1,67 @@ +package com.minelittlepony.unicopia.item; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.SpeciesList; +import com.minelittlepony.unicopia.item.consumables.ItemEdible; +import com.minelittlepony.unicopia.item.consumables.Toxicity; +import com.minelittlepony.util.collection.ReversableStateMapList; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class MossItem extends ItemEdible { + + public static final ReversableStateMapList AFFECTED = new ReversableStateMapList(); + + static { + // TODO: move to resourcepack + AFFECTED.replaceBlock(Blocks.MOSSY_COBBLESTONE, Blocks.COBBLESTONE); + AFFECTED.replaceBlock(Blocks.MOSSY_COBBLESTONE_SLAB, Blocks.COBBLESTONE_SLAB); + AFFECTED.replaceBlock(Blocks.MOSSY_COBBLESTONE_STAIRS, Blocks.COBBLESTONE_STAIRS); + AFFECTED.replaceBlock(Blocks.MOSSY_COBBLESTONE_WALL, Blocks.COBBLESTONE_WALL); + AFFECTED.replaceBlock(Blocks.MOSSY_STONE_BRICK_SLAB, Blocks.STONE_BRICK_SLAB); + AFFECTED.replaceBlock(Blocks.MOSSY_STONE_BRICK_STAIRS, Blocks.STONE_BRICK_STAIRS); + AFFECTED.replaceBlock(Blocks.MOSSY_STONE_BRICK_WALL, Blocks.MOSSY_STONE_BRICK_WALL); + AFFECTED.replaceBlock(Blocks.MOSSY_STONE_BRICKS, Blocks.STONE_BRICKS); + AFFECTED.replaceBlock(Blocks.INFESTED_MOSSY_STONE_BRICKS, Blocks.INFESTED_STONE_BRICKS); + } + + public MossItem(Item.Settings settings) { + super(settings); + } + + public boolean tryConvert(World world, BlockState state, BlockPos pos, @Nullable PlayerEntity player) { + BlockState converted = AFFECTED.getConverted(state); + + if (!state.equals(converted)) { + world.setBlockState(pos, converted, 3); + + world.playSound(null, pos, SoundEvents.ENTITY_SHEEP_SHEAR, SoundCategory.PLAYERS, 1, 1); + + int amount = 1; + + if (player != null && SpeciesList.instance().getPlayer(player).getSpecies().canUseEarth()) { + amount = world.random.nextInt(4); + } + + Block.dropStack(world, pos, new ItemStack(this, amount)); + + return true; + } + + return false; + } + + @Override + public Toxicity getToxicityLevel(ItemStack stack) { + return Toxicity.MILD; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemRottenApple.java b/src/main/java/com/minelittlepony/unicopia/item/RottenAppleItem.java similarity index 52% rename from src/main/java/com/minelittlepony/unicopia/item/ItemRottenApple.java rename to src/main/java/com/minelittlepony/unicopia/item/RottenAppleItem.java index cc89ff6e..6205bcde 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemRottenApple.java +++ b/src/main/java/com/minelittlepony/unicopia/item/RottenAppleItem.java @@ -1,18 +1,14 @@ package com.minelittlepony.unicopia.item; +import net.fabricmc.fabric.api.registry.FuelRegistry; import net.minecraft.entity.ItemEntity; import net.minecraft.item.FoodComponent; -import net.minecraft.item.ItemStack; -public class ItemRottenApple extends AppleItem { +public class RottenAppleItem extends AppleItem { - public ItemRottenApple(FoodComponent components) { + public RottenAppleItem(FoodComponent components) { super(components); - } - - @Override - public int getItemBurnTime(ItemStack stack) { - return 150; + FuelRegistry.INSTANCE.add(this, 150); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/RottenTomatoItem.java b/src/main/java/com/minelittlepony/unicopia/item/RottenTomatoItem.java new file mode 100644 index 00000000..89ec0fef --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/RottenTomatoItem.java @@ -0,0 +1,70 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.SpeciesList; +import com.minelittlepony.unicopia.magic.ICaster; +import com.minelittlepony.unicopia.projectile.ITossableItem; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Material; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class RottenTomatoItem extends TomatoItem implements ITossableItem { + + public RottenTomatoItem(FoodComponent components) { + super(components); + + setDispenseable(); + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack itemstack = player.getStackInHand(hand); + + if (canBeThrown(itemstack) && !player.canConsume(false)) { + toss(world, itemstack, player); + + return new TypedActionResult<>(ActionResult.SUCCESS, itemstack); + } + + return super.use(world, player, hand); + } + + protected boolean isSickening(ItemStack stack, PlayerEntity player) { + return canBeThrown(stack) + && !SpeciesList.instance().getPlayer(player).getSpecies().canUseEarth(); + } + + @Override + public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { + if (entity instanceof PlayerEntity && isSickening(stack, (PlayerEntity)entity)) { + int duration = 7000; + + StatusEffectInstance effect = entity.getStatusEffect(StatusEffects.NAUSEA); + + if (effect != null) { + duration += Math.max(0, effect.getDuration()); + } + + entity.addPotionEffect(new StatusEffectInstance(StatusEffects.NAUSEA, duration, 4)); + + } + return entity.eatFood(world, stack); + } + + @Override + public void onImpact(ICaster caster, BlockPos pos, BlockState state) { + if (caster.isLocal() && state.getMaterial() == Material.GLASS) { + caster.getWorld().breakBlock(pos, true); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java b/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java new file mode 100644 index 00000000..e7994dd1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/SpellbookItem.java @@ -0,0 +1,106 @@ +package com.minelittlepony.unicopia.item; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.UEntities; +import com.minelittlepony.unicopia.entity.SpellbookEntity; +import com.minelittlepony.unicopia.magic.items.IDispensable; + +import net.minecraft.block.DispenserBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BookItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class SpellbookItem extends BookItem implements IDispensable { + + public SpellbookItem() { + super(new Item.Settings() + .maxCount(1) + .group(ItemGroup.BREWING)); + + setDispenseable(); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + + @Nullable + PlayerEntity player = context.getPlayer(); + + if (!context.getWorld().isClient && EquinePredicates.MAGI.test(player)) { + BlockPos pos = context.getBlockPos().offset(context.getSide()); + + double diffX = player.x - (pos.getX() + 0.5); + double diffZ = player.z - (pos.getZ() + 0.5); + float yaw = (float)Math.toDegrees(Math.atan2(diffZ, diffX) + Math.PI); + + placeBook(context.getWorld(), pos.getX(), pos.getY(), pos.getZ(), yaw); + + if (!player.abilities.creativeMode) { + player.getStackInHand(context.getHand()).decrement(1); + } + + return ActionResult.SUCCESS; + } + return ActionResult.PASS; + } + + private static void placeBook(World world, int x, int y, int z, float yaw) { + SpellbookEntity book = UEntities.SPELLBOOK.create(world); + + book.setPositionAndAngles(x + 0.5, y, z + 0.5, yaw, 0); + //book.renderYawOffset = 0; + book.prevYaw = yaw; + + world.spawnEntity(book); + } + + @Override + public TypedActionResult dispenseStack(BlockPointer source, ItemStack stack) { + Direction facing = source.getBlockState().get(DispenserBlock.FACING); + BlockPos pos = source.getBlockPos().offset(facing); + + //0deg == SOUTH + //90deg == WEST + //180deg == NORTH + //270deg == EAST + + /*switch (facing) { + case NORTH: yaw -= 90; break; + case SOUTH: yaw += 90; break; + case EAST: yaw += 180; break; + default: + }*/ + + int yaw = facing.getOpposite().getHorizontal() * 90; + placeBook(source.getWorld(), pos.getX(), pos.getY(), pos.getZ(), yaw); + stack.decrement(1); + + return new TypedActionResult<>(ActionResult.SUCCESS, stack); + } +} + + + + + + + + + + + + + + + diff --git a/src/main/java/com/minelittlepony/unicopia/item/override/ItemStick.java b/src/main/java/com/minelittlepony/unicopia/item/StickItem.java similarity index 89% rename from src/main/java/com/minelittlepony/unicopia/item/override/ItemStick.java rename to src/main/java/com/minelittlepony/unicopia/item/StickItem.java index c6bf8eed..6888f657 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/override/ItemStick.java +++ b/src/main/java/com/minelittlepony/unicopia/item/StickItem.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.item.override; +package com.minelittlepony.unicopia.item; import javax.annotation.Nullable; @@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.UBlocks; import net.minecraft.advancement.criterion.Criterions; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.server.network.ServerPlayerEntity; @@ -17,9 +18,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; -public class ItemStick extends Item { - public ItemStick(Settings settings) { - super(settings); +public class StickItem extends Item { + public StickItem() { + super(new Item.Settings().group(ItemGroup.MATERIALS)); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/TomatoItem.java b/src/main/java/com/minelittlepony/unicopia/item/TomatoItem.java new file mode 100644 index 00000000..1844c83c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/TomatoItem.java @@ -0,0 +1,23 @@ +package com.minelittlepony.unicopia.item; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class TomatoItem extends Item { + + public TomatoItem(FoodComponent components) { + super(new Settings().food(components)); + } + + @Override + public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { + stack = super.finishUsing(stack, world, entity); + entity.removePotionEffect(StatusEffects.NAUSEA); + return stack; + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/TomatoSeedsItem.java b/src/main/java/com/minelittlepony/unicopia/item/TomatoSeedsItem.java new file mode 100644 index 00000000..4843b11e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/TomatoSeedsItem.java @@ -0,0 +1,41 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.UBlocks; +import com.minelittlepony.unicopia.block.StickBlock; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.util.ActionResult; + +public class TomatoSeedsItem extends Item { + + public TomatoSeedsItem() { + super(new Settings().group(ItemGroup.MATERIALS)); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + + BlockState state = context.getWorld().getBlockState(context.getBlockPos()); + + Block block = state.getBlock(); + + if (block instanceof StickBlock) { + if (UBlocks.tomato_plant.plant(context.getWorld(), context.getBlockPos(), state)) { + PlayerEntity player = context.getPlayer(); + + if (player == null || !player.isCreative()) { + context.getStack().decrement(1); + } + + return ActionResult.SUCCESS; + } + } + + return ActionResult.PASS; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/BushToxicityDeterminent.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/BushToxicityDeterminent.java similarity index 69% rename from src/main/java/com/minelittlepony/unicopia/edibles/BushToxicityDeterminent.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/BushToxicityDeterminent.java index fdeb9cbe..217b9e6c 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/BushToxicityDeterminent.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/BushToxicityDeterminent.java @@ -1,10 +1,10 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; import net.minecraft.block.BlockDoublePlant; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.MobEffects; +import net.minecraft.init.StatusEffects; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.StatusEffectInstance; import static net.minecraft.block.BlockDoublePlant.EnumPlantType.*; @@ -33,15 +33,15 @@ public class BushToxicityDeterminent implements IEdible { if ((type == ROSE || type == FERN) && player.world.rand.nextInt(30) == 0) { - player.addPotionEffect(new PotionEffect(MobEffects.INSTANT_DAMAGE, 1, 1, false, false)); + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.INSTANT_DAMAGE, 1, 1, false, false)); } if (type == GRASS) { - player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 30, 1, false, false)); + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.NAUSEA, 30, 1, false, false)); } if (type == FERN) { - player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 30, 1, false, false)); + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.STRENGTH, 30, 1, false, false)); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/CookedToxicityDeterminent.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/CookedToxicityDeterminent.java similarity index 85% rename from src/main/java/com/minelittlepony/unicopia/edibles/CookedToxicityDeterminent.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/CookedToxicityDeterminent.java index 8c9c0e17..77d5e064 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/CookedToxicityDeterminent.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/CookedToxicityDeterminent.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/FlowerToxicityDeterminent.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/FlowerToxicityDeterminent.java similarity index 78% rename from src/main/java/com/minelittlepony/unicopia/edibles/FlowerToxicityDeterminent.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/FlowerToxicityDeterminent.java index 9046fb5a..4819f288 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/FlowerToxicityDeterminent.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/FlowerToxicityDeterminent.java @@ -1,10 +1,10 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; import net.minecraft.block.BlockFlower; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.MobEffects; +import net.minecraft.init.StatusEffects; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.StatusEffectInstance; import static net.minecraft.block.BlockFlower.EnumFlowerType.*; @@ -42,11 +42,11 @@ public class FlowerToxicityDeterminent implements IEdible { BlockFlower.EnumFlowerType type = getType(stack); if (type == HOUSTONIA && player.world.rand.nextInt(30) == 0) { - player.addPotionEffect(new PotionEffect(MobEffects.GLOWING, 10, 1, false, false)); + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.GLOWING, 10, 1, false, false)); } if (type == OXEYE_DAISY) { - player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, 30, 1, false, false)); + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.BLINDNESS, 30, 1, false, false)); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/IEdible.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/IEdible.java similarity index 86% rename from src/main/java/com/minelittlepony/unicopia/edibles/IEdible.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/IEdible.java index d67adb3e..f1bad69f 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/IEdible.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/IEdible.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; import javax.annotation.Nonnull; diff --git a/src/main/java/com/minelittlepony/unicopia/item/consumables/ItemEdible.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/ItemEdible.java new file mode 100644 index 00000000..74c354ed --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/ItemEdible.java @@ -0,0 +1,121 @@ +package com.minelittlepony.unicopia.item.consumables; + +import java.util.List; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.SpeciesList; +import com.minelittlepony.unicopia.UEffects; + +import net.minecraft.advancement.criterion.Criterions; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.Potions; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.UseAction; +import net.minecraft.world.World; + +public abstract class ItemEdible extends Item implements IEdible { + + private UseAction useAction = UseAction.EAT; + + public ItemEdible(Item.Settings settings) { + super(settings); + } + + public Item setUseAction(UseAction action) { + useAction = action; + + return this; + } + + public UseAction getItemUseAction(ItemStack stack) { + return useAction; + } + + protected void onFoodEaten(ItemStack stack, World worldIn, PlayerEntity player) { + Race race = SpeciesList.instance().getPlayer(player).getSpecies(); + Toxicity toxicity = (race.isDefault() || race == Race.CHANGELING) ? Toxicity.LETHAL : getToxicityLevel(stack); + + addSecondaryEffects(player, toxicity, stack); + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + tooltip.add(getToxicityLevel(stack).getTooltip()); + } + + @Override + public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { + PlayerEntity player = entity instanceof PlayerEntity ? (PlayerEntity)entity : null; + + if (player != null) { + player.getHungerManager().eat(this, stack); + + world.playSound(null, player.x, player.y, player.z, SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); + + onFoodEaten(stack, world, player); + + // replaced "this" with "stack.getItem()" + player.addStat(StatList.getObjectUseStats(stack.getItem())); + + if (player instanceof ServerPlayerEntity) { + Criterions.CONSUME_ITEM.handle((ServerPlayerEntity)player, stack); + } + } + + if (player == null || !player.abilities.creativeMode) { + stack.decrement(1); + } + + ItemStack container = getContainerItem(stack); + + if (!container.isEmpty() && player != null && !player.abilities.creativeMode) { + if (stack.isEmpty()) { + return getContainerItem(stack); + } + + player.inventory.addItemStackToInventory(getContainerItem(stack)); + } + + return stack; + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + Race race = SpeciesList.instance().getPlayer(player).getSpecies(); + + if (race.isDefault() || race == Race.CHANGELING) { + return new TypedActionResult<>(ActionResult.FAIL, player.getStackInHand(hand)); + } + + return super.use(world, player, hand); + } + + @Override + public void addSecondaryEffects(PlayerEntity player, Toxicity toxicity, ItemStack stack) { + + if (toxicity.toxicWhenRaw()) { + player.addStatusEffectInstance(toxicity.getPoisonEffect()); + } + + if (toxicity.isLethal()) { + player.addStatusEffectInstance(new StatusEffectInstance(UEffects.FOOD_POISONING, 300, 7, false, false)); + } else if (toxicity.toxicWhenCooked()) { + player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.NAUSEA, 3, 1, false, false)); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/consumables/MultiItemEdible.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/MultiItemEdible.java new file mode 100644 index 00000000..ae84292b --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/MultiItemEdible.java @@ -0,0 +1,28 @@ +package com.minelittlepony.unicopia.item.consumables; + +import javax.annotation.Nonnull; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; + +public class MultiItemEdible extends ItemEdible { + + private final IEdible toxicityDeterminant; + + public MultiItemEdible(Item.Settings settings, @Nonnull IEdible mapper) { + super(settings); + + toxicityDeterminant = mapper; + } + + @Override + public void addSecondaryEffects(PlayerEntity player, Toxicity toxicity, ItemStack stack) { + super.addSecondaryEffects(player, toxicity, stack); + + toxicityDeterminant.addSecondaryEffects(player, toxicity, stack); + } + + @Override + public Toxicity getToxicityLevel(ItemStack stack) { + return toxicityDeterminant.getToxicityLevel(stack); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/Toxicity.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/Toxicity.java similarity index 82% rename from src/main/java/com/minelittlepony/unicopia/edibles/Toxicity.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/Toxicity.java index 3a670c76..f0e065f1 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/Toxicity.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/Toxicity.java @@ -1,5 +1,7 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; @@ -37,8 +39,8 @@ public enum Toxicity { return this == LETHAL; } - public PotionEffect getPoisonEffect() { - return new PotionEffect(isMild() ? MobEffects.NAUSEA : MobEffects.POISON, duration, level); + public StatusEffectInstance getPoisonEffect() { + return new StatusEffectInstance(isMild() ? StatusEffects.NAUSEA : StatusEffects.POISON, duration, level); } public String getTranslationKey() { diff --git a/src/main/java/com/minelittlepony/unicopia/edibles/UItemFoodDelegate.java b/src/main/java/com/minelittlepony/unicopia/item/consumables/UItemFoodDelegate.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/edibles/UItemFoodDelegate.java rename to src/main/java/com/minelittlepony/unicopia/item/consumables/UItemFoodDelegate.java index 1ae56e0d..9392f9d4 100644 --- a/src/main/java/com/minelittlepony/unicopia/edibles/UItemFoodDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/item/consumables/UItemFoodDelegate.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.edibles; +package com.minelittlepony.unicopia.item.consumables; import java.util.List; diff --git a/src/main/java/com/minelittlepony/unicopia/item/override/ItemShear.java b/src/main/java/com/minelittlepony/unicopia/item/override/ItemShear.java deleted file mode 100644 index 7b8fa0ed..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/override/ItemShear.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.minelittlepony.unicopia.item.override; - -import com.minelittlepony.unicopia.UItems; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ShearsItem; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemShear extends ShearsItem { - @Override - public EnumActionResult onItemUse(PlayerEntity player, World world, BlockPos pos, EnumHand hand, Direction facing, float hitX, float hitY, float hitZ) { - BlockState state = world.getBlockState(pos); - - if (UItems.moss.tryConvert(world, state, pos, player)) { - ItemStack stack = player.getStackInHand(hand); - - if (!player.isCreative()) { - stack.damageItem(1, player); - } - - return EnumActionResult.SUCCESS; - } - - return EnumActionResult.PASS; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/magic/CasterUtils.java b/src/main/java/com/minelittlepony/unicopia/magic/CasterUtils.java index 9da4a357..a30d4caf 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/CasterUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/CasterUtils.java @@ -6,7 +6,7 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import com.google.common.collect.Streams; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.entity.IMagicals; @@ -60,7 +60,7 @@ public class CasterUtils { } static Stream> findAllSpellsInRange(ICaster source, Box bb) { - return source.getWorld().getEntities(source.getEntity(), bb, e -> !e.removed && (e instanceof ICaster || Predicates.MAGI.test(e))).stream() + return source.getWorld().getEntities(source.getEntity(), bb, e -> !e.removed && (e instanceof ICaster || EquinePredicates.MAGI.test(e))).stream() .map(CasterUtils::toCaster) .filter(o -> o.isPresent() && o.get() != source) .map(Optional::get); @@ -70,7 +70,7 @@ public class CasterUtils { return toCaster(entity) .filter(ICaster::hasEffect) .map(caster -> caster.getEffect(type, false)) - .filter(e -> !e.getDead()); + .filter(e -> !e.isDead()); } /** diff --git a/src/main/java/com/minelittlepony/unicopia/magic/ICaster.java b/src/main/java/com/minelittlepony/unicopia/magic/ICaster.java index 84eefe9c..ed5f8b47 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/ICaster.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/ICaster.java @@ -54,7 +54,7 @@ public interface ICaster extends IOwned, ILevelled, I default Optional getEffect(Class type) { IMagicEffect effect = getEffect(); - if (effect == null || effect.getDead() || !type.isAssignableFrom(effect.getClass())) { + if (effect == null || effect.isDead() || !type.isAssignableFrom(effect.getClass())) { return Optional.empty(); } @@ -117,7 +117,7 @@ public interface ICaster extends IOwned, ILevelled, I default void spawnParticles(ParticleEffect particleId, int count) { // TODO: - // ParticleTypeRegistry.getTnstance().getSpawner().spawnParticles(particleId, getEntity(), count); + // ParticleTypeRegistry.getInstance().getSpawner().spawnParticles(particleId, getEntity(), count); } default void spawnParticles(IShape area, int count, Consumer particleSpawner) { @@ -134,6 +134,7 @@ public interface ICaster extends IOwned, ILevelled, I return getOwner().getHealth() > 0; } + @Deprecated default Stream> findAllSpells() { return CasterUtils.findAllSpells(this); } diff --git a/src/main/java/com/minelittlepony/unicopia/magic/IHeldEffect.java b/src/main/java/com/minelittlepony/unicopia/magic/IHeldEffect.java index 83d32728..2d4d3f59 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/IHeldEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/IHeldEffect.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.magic; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; /** * Represents a passive spell that does something when held in the player's hand. diff --git a/src/main/java/com/minelittlepony/unicopia/magic/IMagicEffect.java b/src/main/java/com/minelittlepony/unicopia/magic/IMagicEffect.java index de6debff..69bbd126 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/IMagicEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/IMagicEffect.java @@ -26,7 +26,7 @@ public interface IMagicEffect extends InbtSerialisable, IAffine { /** * Returns true if this spell is dead, and must be cleaned up. */ - boolean getDead(); + boolean isDead(); /** * Returns true if this effect has changes that need to be sent to the client. diff --git a/src/main/java/com/minelittlepony/unicopia/magic/ITossedEffect.java b/src/main/java/com/minelittlepony/unicopia/magic/ITossedEffect.java index 2305fa35..4ac89b4d 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/ITossedEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/ITossedEffect.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.magic; import javax.annotation.Nullable; import com.minelittlepony.unicopia.UItems; -import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity; +import com.minelittlepony.unicopia.entity.AdvancedProjectileEntity; import com.minelittlepony.unicopia.magic.spells.SpellRegistry; import com.minelittlepony.unicopia.projectile.IAdvancedProjectile; import com.minelittlepony.unicopia.projectile.ITossable; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/IUseable.java b/src/main/java/com/minelittlepony/unicopia/magic/IUseable.java index 423f60bd..14b727c7 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/IUseable.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/IUseable.java @@ -7,8 +7,7 @@ import com.minelittlepony.unicopia.magic.spells.SpellCastResult; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.item.ItemUsageContext; import net.minecraft.world.World; /** @@ -32,7 +31,7 @@ public interface IUseable { * * @return ActionResult for the type of action to perform */ - SpellCastResult onUse(ItemStack stack, Affinity affinity, PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ); + SpellCastResult onUse(ItemUsageContext context, Affinity affinity); /** * Triggered when the player right clicks diff --git a/src/main/java/com/minelittlepony/unicopia/magic/items/ICastable.java b/src/main/java/com/minelittlepony/unicopia/magic/items/ICastable.java index ef96c9e9..b8025d55 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/items/ICastable.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/items/ICastable.java @@ -6,17 +6,18 @@ import com.minelittlepony.unicopia.magic.IMagicEffect; import com.minelittlepony.unicopia.magic.spells.SpellCastResult; import com.minelittlepony.unicopia.magic.spells.SpellRegistry; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; import net.minecraft.util.ActionResult; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public interface ICastable extends IMagicalItem, IDispensable { @Override - default TypedActionResult dispenseStack(IBlockSource source, ItemStack stack) { + default TypedActionResult dispenseStack(BlockPointer source, ItemStack stack) { IDispenceable effect = SpellRegistry.instance().getDispenseActionFrom(stack); if (effect == null) { @@ -32,15 +33,15 @@ public interface ICastable extends IMagicalItem, IDispensable { if (dispenceResult == SpellCastResult.PLACE) { castContainedSpell(source.getWorld(), source.getBlockPos(), stack, effect); - stack.shrink(1); + stack.decrement(1); } - return new ActionResult(ActionResult.SUCCESS, stack); + return new TypedActionResult<>(ActionResult.SUCCESS, stack); } - SpellCastResult onDispenseSpell(BlockState source, ItemStack stack, IDispenceable effect); + SpellCastResult onDispenseSpell(BlockPointer source, ItemStack stack, IDispenceable effect); - SpellCastResult onCastSpell(PlayerEntity player, World world, BlockPos pos, ItemStack stack, IMagicEffect effect, Direction side, float hitX, float hitY, float hitZ); + SpellCastResult onCastSpell(ItemUsageContext context, IMagicEffect effect); boolean canFeed(SpellcastEntity spell, ItemStack stack); @@ -48,10 +49,10 @@ public interface ICastable extends IMagicalItem, IDispensable { * Called to cast a spell. The result is an entity spawned with the spell attached. */ default SpellcastEntity castContainedSpell(World world, BlockPos pos, ItemStack stack, IMagicEffect effect) { - SpellcastEntity spell = new SpellcastEntity(world); + SpellcastEntity spell = new SpellcastEntity(null, world); spell.setAffinity(getAffinity(stack)); - spell.setLocationAndAngles(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0); + spell.setPositionAndAngles(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0); spell.setEffect(effect); world.spawnEntity(spell); diff --git a/src/main/java/com/minelittlepony/unicopia/magic/items/IDependable.java b/src/main/java/com/minelittlepony/unicopia/magic/items/IDependable.java index 0a78e184..77b3c82f 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/items/IDependable.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/items/IDependable.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.magic.items; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; public interface IDependable extends IMagicalItem { void onRemoved(IPlayer player, float needfulness); diff --git a/src/main/java/com/minelittlepony/unicopia/magic/items/IDispensable.java b/src/main/java/com/minelittlepony/unicopia/magic/items/IDispensable.java index fdf5f27f..33e833f5 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/items/IDispensable.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/items/IDispensable.java @@ -1,6 +1,9 @@ package com.minelittlepony.unicopia.magic.items; +import net.minecraft.block.Block; import net.minecraft.block.DispenserBlock; +import net.minecraft.block.Material; +import net.minecraft.block.dispenser.DispenserBehavior; import net.minecraft.block.dispenser.ItemDispenserBehavior; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -19,7 +22,7 @@ public interface IDispensable { TypedActionResult result = dispenseStack(source, stack); if (result.getResult() != ActionResult.SUCCESS) { - return super.dispense(source, stack); + return super.dispenseSilently(source, stack); } return result.getValue(); @@ -33,4 +36,20 @@ public interface IDispensable { * Called to dispense this stack. */ TypedActionResult dispenseStack(BlockPointer source, ItemStack stack); + + static DispenserBehavior getBehaviorForItem(ItemStack stack) { + return DispenserAccess.INSTANCE.getBehaviorForItem(stack); + } } + +class DispenserAccess extends DispenserBlock { + static final DispenserAccess INSTANCE = new DispenserAccess(); + private DispenserAccess() { + super(Block.Settings.of(Material.BUBBLE_COLUMN)); + } + + @Override + public DispenserBehavior getBehaviorForItem(ItemStack stack) { + return super.getBehaviorForItem(stack); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractAttachableSpell.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractAttachableSpell.java index 4f840da9..76121c25 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractAttachableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractAttachableSpell.java @@ -68,7 +68,7 @@ public abstract class AbstractAttachableSpell extends AbstractSpell { getTarget(source); } - return !getDead(); + return !isDead(); } protected void searchForTarget(ICaster source) { diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractSpell.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractSpell.java index ac70272d..ff2ee327 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/AbstractSpell.java @@ -21,7 +21,7 @@ public abstract class AbstractSpell implements IMagicEffect { } @Override - public boolean getDead() { + public boolean isDead() { return isDead; } diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/GenericSpell.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/GenericSpell.java index b51c6f7b..94c59e28 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/GenericSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/GenericSpell.java @@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.magic.spells; import java.util.function.Supplier; -import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IMagicEffect; @@ -42,7 +41,8 @@ public class GenericSpell extends AbstractSpell { @Override public void render(ICaster source) { - source.spawnParticles(UParticles.UNICORN_MAGIC, 1, getTint()); + // TODO: + // source.spawnParticles(UParticles.UNICORN_MAGIC, 1, getTint()); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellAwkward.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellAwkward.java index 900bf464..732a18f1 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellAwkward.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellAwkward.java @@ -18,12 +18,12 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsageContext; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.particle.ParticleTypes; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import net.minecraft.world.World; @@ -85,7 +85,7 @@ public class SpellAwkward extends AbstractSpell implements ITossedEffect, IUseab } @Override - public SpellCastResult onUse(ItemStack stack, Affinity affinity, PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ) { + public SpellCastResult onUse(ItemUsageContext context, Affinity affinity) { return SpellCastResult.PLACE; } diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellChangelingTrap.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellChangelingTrap.java index 99f4fd7d..e7c19003 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellChangelingTrap.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellChangelingTrap.java @@ -123,7 +123,7 @@ public class SpellChangelingTrap extends AbstractSpell implements ITossedEffect, StatusEffectInstance SLIME_REGEN = new StatusEffectInstance(StatusEffects.REGENERATION, 0); - entity.addPotionEffect(SLIME_REGEN); + entity.addStatusEffectInstance(SLIME_REGEN); if (caster.isLocal()) { if (struggleCounter <= 0) { diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellCharge.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellCharge.java index 253b88c3..8825f54a 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellCharge.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellCharge.java @@ -1,6 +1,5 @@ package com.minelittlepony.unicopia.magic.spells; -import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.entity.SpellcastEntity; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; @@ -41,16 +40,17 @@ public class SpellCharge extends AbstractAttachableSpell { @Override public void render(ICaster source) { - if (source.getWorld().rand.nextInt(4 + source.getCurrentLevel() * 4) == 0) { + if (source.getWorld().random.nextInt(4 + source.getCurrentLevel() * 4) == 0) { SpellcastEntity target = getTarget(source); if (target != null) { - Vec3d start = source.getEntity().getPositionVector(); + Vec3d start = source.getEntity().getPos(); - IShape line = new Line(start, target.getPositionVector()); + IShape line = new Line(start, target.getPos()); source.spawnParticles(line, (int)line.getVolumeOfSpawnableSpace(), pos -> { - ParticleTypeRegistry.getTnstance().spawnParticle(UParticles.UNICORN_MAGIC, false, pos.add(start), 0, 0, 0, getTint()); + // TODO: + // ParticleTypeRegistry.getTnstance().spawnParticle(UParticles.UNICORN_MAGIC, false, pos.add(start), 0, 0, 0, getTint()); }); } @@ -70,6 +70,6 @@ public class SpellCharge extends AbstractAttachableSpell { } } - return !getDead(); + return !isDead(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDarkness.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDarkness.java index 9d7c47be..aa355cf6 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDarkness.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDarkness.java @@ -97,7 +97,7 @@ public class SpellDarkness extends AbstractAttachableSpell { } - return !getDead(); + return !isDead(); } private void applyBlocks(ICaster source, int radius) { @@ -225,7 +225,7 @@ public class SpellDarkness extends AbstractAttachableSpell { return; } - float size = source.getWorld().rand.nextFloat() * maxSize; + float size = source.getWorld().random.nextFloat() * maxSize; float particleSpeed = hasTarget() ? 0.3F : 0.5F; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDisguise.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDisguise.java index 4aef3a90..73041487 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDisguise.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDisguise.java @@ -12,7 +12,7 @@ import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.ability.IFlyingPredicate; import com.minelittlepony.unicopia.ability.IHeightPredicate; import com.minelittlepony.unicopia.entity.IOwned; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.CasterUtils; import com.minelittlepony.unicopia.magic.IAttachedEffect; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDrake.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDrake.java index a3d9c6cb..597cfde2 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDrake.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellDrake.java @@ -3,14 +3,12 @@ package com.minelittlepony.unicopia.magic.spells; import javax.annotation.Nullable; import com.minelittlepony.unicopia.entity.SpellcastEntity; -import com.minelittlepony.unicopia.entity.ai.FollowCasterGoal; +import com.minelittlepony.unicopia.entity.capabilities.FollowCasterGoal; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IMagicEffect; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.pathfinding.PathNavigateGround; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.Box; public class SpellDrake extends AbstractSpell { @@ -49,8 +47,9 @@ public class SpellDrake extends AbstractSpell { return true; } - public boolean getDead() { - return super.getDead(); + @Override + public boolean isDead() { + return super.isDead(); } @Override @@ -67,7 +66,7 @@ public class SpellDrake extends AbstractSpell { living.tasks.addTask(1, new EntityAISwimming(living)); living.tasks.addTask(2, new FollowCasterGoal<>(caster, 1, 4, 70)); - living.setPosition(living.posX, living.posY, living.posZ); + living.setPosition(living.x, living.y, living.z); } } @@ -76,7 +75,7 @@ public class SpellDrake extends AbstractSpell { if (piggyBackSpell == null) { Box bb = EFFECT_BOUNDS.offset(source.getOriginVector()); - source.getWorld().getEntitiesInAABBexcluding(source.getEntity(), bb, e -> e instanceof SpellcastEntity).stream() + source.getWorld().getEntities(source.getEntity(), bb, e -> e instanceof SpellcastEntity).stream() .map(i -> (SpellcastEntity)i) .filter(i -> i.hasEffect() && !(i.getEffect() instanceof SpellDrake)) .findFirst().ifPresent(i -> { @@ -102,23 +101,23 @@ public class SpellDrake extends AbstractSpell { } @Override - public void writeToNBT(NBTTagCompound compound) { + public void toNBT(CompoundTag compound) { super.toNBT(compound); if (piggyBackSpell != null) { - compound.setTag("effect", SpellRegistry.instance().serializeEffectToNBT(piggyBackSpell)); + compound.put("effect", SpellRegistry.instance().serializeEffectToNBT(piggyBackSpell)); } } @Override - public void readFromNBT(NBTTagCompound compound) { + public void fromNBT(CompoundTag compound) { super.fromNBT(compound); - if (compound.hasKey("effect")) { + if (compound.containsKey("effect")) { if (piggyBackSpell != null) { - piggyBackSpell.fromNBT(compound.getCompoundTag("effect")); + piggyBackSpell.fromNBT(compound.getCompound("effect")); } else { - piggyBackSpell = SpellRegistry.instance().createEffectFromNBT(compound.getCompoundTag("effect")); + piggyBackSpell = SpellRegistry.instance().createEffectFromNBT(compound.getCompound("effect")); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFire.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFire.java index b89d209b..5be268e5 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFire.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFire.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.magic.spells; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.entity.IMagicals; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; @@ -206,7 +206,7 @@ public class SpellFire extends AbstractSpell.RangedAreaSpell implements IUseable protected boolean applyEntitySingle(Entity owner, World world, Entity e) { if ((!e.equals(owner) || - (owner instanceof PlayerEntity && !Predicates.MAGI.test(owner))) && !(e instanceof EntityItem) + (owner instanceof PlayerEntity && !EquinePredicates.MAGI.test(owner))) && !(e instanceof EntityItem) && !(e instanceof IMagicals)) { e.setFire(60); e.attackEntityFrom(getDamageCause(e, (LivingEntity)owner), 0.1f); diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFlame.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFlame.java index 0f67f125..a0ed4d5b 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFlame.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellFlame.java @@ -1,6 +1,6 @@ package com.minelittlepony.unicopia.magic.spells; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IHeldEffect; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellLight.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellLight.java index 22d1c131..78584cd7 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellLight.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellLight.java @@ -1,11 +1,11 @@ package com.minelittlepony.unicopia.magic.spells; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IHeldEffect; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; @@ -67,7 +67,7 @@ public class SpellLight extends GenericSpell implements IHeldEffect { } @Override - public void writeToNBT(NBTTagCompound compound) { + public void writeToNBT(CompoundTag compound) { super.toNBT(compound); if (compound.hasKey("lastX")) { @@ -78,7 +78,7 @@ public class SpellLight extends GenericSpell implements IHeldEffect { } @Override - public void readFromNBT(NBTTagCompound compound) { + public void readFromNBT(CompoundTag compound) { super.fromNBT(compound); if (lastPos != null) { diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellPortal.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellPortal.java index 9ad67ecb..5f60af2c 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellPortal.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellPortal.java @@ -7,10 +7,9 @@ import java.util.UUID; import javax.annotation.Nullable; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.entity.SpellcastEntity; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.entity.IMagicals; -import com.minelittlepony.unicopia.entity.player.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.IMagicEffect; @@ -19,18 +18,18 @@ import com.minelittlepony.util.InbtSerialisable; import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.Sphere; -import net.fabricmc.fabric.api.particles.ParticleTypeRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseable { @@ -105,11 +104,11 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab } @Override - public SpellCastResult onUse(ItemStack stack, Affinity affinity, PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ) { - position = pos.offset(side); - axis = Direction.getDirectionFromEntityLiving(position, player).getAxis(); + public SpellCastResult onUse(ItemUsageContext context, Affinity affinity) { + position = context.getBlockPos().offset(context.getSide()); + axis = context.getPlayerFacing().getAxis(); - IPlayer prop = SpeciesList.instance().getPlayer(player); + IPlayer prop = SpeciesList.instance().getPlayer(context.getPlayer()); SpellPortal other = prop.getEffect(SpellPortal.class, true); if (other != null) { @@ -151,7 +150,7 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab public boolean update(ICaster source) { if (!source.getWorld().isClient) { getDestinationPortal().ifPresent(dest -> - source.getWorld().getEntitiesWithinAABB(Entity.class, getTeleportBounds().offset(source.getOrigin())).stream() + source.getWorld().getEntities(Entity.class, getTeleportBounds().offset(source.getOrigin())).stream() .filter(this::canTeleport) .forEach(i -> teleportEntity(source, dest, i))); } @@ -161,9 +160,10 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab @Override public void render(ICaster source) { - source.spawnParticles(getPortalZone(), 10, pos -> { + // TODO: + /*source.spawnParticles(getPortalZone(), 10, pos -> { ParticleTypeRegistry.getTnstance().spawnParticle(UParticles.UNICORN_MAGIC, false, pos, 0, 0, 0, getTint()); - }); + });*/ } public IShape getPortalZone() { @@ -184,7 +184,7 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab } protected boolean canTeleport(Entity i) { - return !(i instanceof IMagicals) && i.timeUntilPortal == 0; + return !(i instanceof IMagicals) && i.portalCooldown == 0; } protected void teleportEntity(ICaster source, SpellPortal dest, Entity i) { @@ -196,40 +196,40 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab Direction offset = i.getHorizontalFacing(); - double destX = dest.position.getX() + (i.posX - source.getOrigin().getX()); - double destY = dest.position.getY() + (i.posY - source.getOrigin().getY()); - double destZ = dest.position.getZ() + (i.posZ - source.getOrigin().getZ()); + double destX = dest.position.getX() + (i.x - source.getOrigin().getX()); + double destY = dest.position.getY() + (i.y - source.getOrigin().getY()); + double destZ = dest.position.getZ() + (i.z - source.getOrigin().getZ()); if (axis != Direction.Axis.Y) { - destX += offset.getXOffset(); + destX += offset.getOffsetX(); destY++; - destZ += offset.getZOffset(); + destZ += offset.getOffsetZ(); } - i.timeUntilPortal = i.getPortalCooldown(); + i.portalCooldown = i.getDefaultPortalCooldown(); - i.getEntityWorld().playSound(null, i.getPosition(), SoundEvents.BLOCK_END_PORTAL_FRAME_FILL, SoundCategory.PLAYERS, 1, 1); + i.getEntityWorld().playSound(null, i.getBlockPos(), SoundEvents.BLOCK_END_PORTAL_FRAME_FILL, SoundCategory.PLAYERS, 1, 1); if (dest.axis != axis) { if (xi != dest.axis) { - i.setPositionAndRotation(i.posX, i.posY, i.posZ, i.rotationYaw + 90, i.rotationPitch); + i.setPositionAndAngles(i.x, i.y, i.z, i.yaw + 90, i.pitch); } } - i.setPositionAndUpdate(destX, destY, destZ); - i.getEntityWorld().playSound(null, i.getPosition(), SoundEvents.BLOCK_END_PORTAL_FRAME_FILL, SoundCategory.PLAYERS, 1, 1); + i.setPosition(destX, destY, destZ); + i.getEntityWorld().playSound(null, i.getBlockPos(), SoundEvents.BLOCK_END_PORTAL_FRAME_FILL, SoundCategory.PLAYERS, 1, 1); } /** * Converts a possibly dead portal effect into a live one by forcing the owner entity to load. */ protected SpellPortal getActualInstance() { - if (world instanceof WorldServer) { - Entity i = ((WorldServer)world).getEntityFromUuid(casterId); + if (world instanceof ServerWorld) { + Entity i = ((ServerWorld)world).getEntity(casterId); if (i == null) { world.getChunk(position); - i = ((WorldServer)world).getEntityFromUuid(casterId); + i = ((ServerWorld)world).getEntity(casterId); } if (i instanceof SpellcastEntity) { @@ -249,18 +249,18 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab */ public Optional getDestinationPortal() { - if (getDead()) { + if (isDead()) { return Optional.empty(); } Entity i = null; if (destinationId != null) { - i = ((WorldServer)world).getEntityFromUuid(destinationId); + i = ((ServerWorld)world).getEntity(destinationId); if (i == null && destinationPos != null) { world.getChunk(destinationPos); - i = ((WorldServer)world).getEntityFromUuid(destinationId); + i = ((ServerWorld)world).getEntity(destinationId); if (i == null) { setDead(); @@ -278,7 +278,7 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab } } - if (sibling != null && sibling.getDead()) { + if (sibling != null && sibling.isDead()) { setDead(); } @@ -290,42 +290,42 @@ public class SpellPortal extends AbstractSpell.RangedAreaSpell implements IUseab } @Override - public void writeToNBT(NBTTagCompound compound) { + public void toNBT(CompoundTag compound) { super.toNBT(compound); if (destinationPos != null) { - compound.setTag("destination", InbtSerialisable.writeBlockPos(destinationPos)); + compound.put("destination", InbtSerialisable.writeBlockPos(destinationPos)); } if (casterId != null) { - compound.setUniqueId("casterId", casterId); + compound.putUuid("casterId", casterId); } if (destinationId != null) { - compound.setUniqueId("destinationId", destinationId); + compound.putUuid("destinationId", destinationId); } - compound.setString("axis", axis.getName2()); + compound.putString("axis", axis.getName()); } @Override - public void readFromNBT(NBTTagCompound compound) { + public void fromNBT(CompoundTag compound) { super.fromNBT(compound); - if (compound.hasKey("destination")) { - destinationPos = InbtSerialisable.readBlockPos(compound.getCompoundTag("destination")); + if (compound.containsKey("destination")) { + destinationPos = InbtSerialisable.readBlockPos(compound.getCompound("destination")); } - if (compound.hasUniqueId("casterId")) { - casterId = compound.getUniqueId("casterId"); + if (compound.containsKey("casterId")) { + casterId = compound.getUuid("casterId"); } - if (compound.hasUniqueId("destinationId")) { - destinationId = compound.getUniqueId("destinationId"); + if (compound.containsKey("destinationId")) { + destinationId = compound.getUuid("destinationId"); } - if (compound.hasKey("axis")) { - axis = Direction.Axis.byName(compound.getString("axis").toLowerCase(Locale.ROOT)); + if (compound.containsKey("axis")) { + axis = Direction.Axis.fromName(compound.getString("axis").toLowerCase(Locale.ROOT)); if (axis == null) { axis = Direction.Axis.Y; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellScorch.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellScorch.java index 416d44d9..886b3511 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellScorch.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellScorch.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.magic.spells; import javax.annotation.Nullable; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity; +import com.minelittlepony.unicopia.entity.AdvancedProjectileEntity; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.ITossedEffect; diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellShield.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellShield.java index ecd30c3a..52b0d2b5 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellShield.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellShield.java @@ -3,10 +3,10 @@ package com.minelittlepony.unicopia.magic.spells; import java.util.List; import java.util.stream.Collectors; -import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UParticles; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.IAttachedEffect; import com.minelittlepony.unicopia.magic.ICaster; @@ -14,11 +14,10 @@ import com.minelittlepony.unicopia.particles.ParticleConnection; import com.minelittlepony.unicopia.projectile.ProjectileUtil; import com.minelittlepony.util.shape.Sphere; -import net.fabricmc.fabric.api.particles.ParticleTypeRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.SoundEvents; +import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.Vec3d; public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttachedEffect { @@ -62,7 +61,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac public boolean updateOnPerson(ICaster source) { int costMultiplier = applyEntities(source); if (costMultiplier > 0) { - if (source.getOwner().ticksExisted % 20 == 0) { + if (source.getOwner().age % 20 == 0) { double cost = 4 + (source.getCurrentLevel() * 2); cost *= costMultiplier / 5F; @@ -74,7 +73,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac } } - return !getDead(); + return !isDead(); } public double getDrawDropOffRange(ICaster source) { @@ -92,7 +91,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac Entity owner = source.getOwner(); - boolean ownerIsValid = source.getAffinity() != Affinity.BAD && Predicates.MAGI.test(owner); + boolean ownerIsValid = source.getAffinity() != Affinity.BAD && EquinePredicates.MAGI.test(owner); Vec3d origin = source.getOriginVector(); @@ -102,7 +101,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac targets.forEach(i -> { try { - double dist = i.getPositionVector().distanceTo(origin); + double dist = i.getPos().distanceTo(origin); applyRadialEffect(source, i, dist, radius); } catch (Throwable e) { @@ -120,7 +119,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac if (!ProjectileUtil.isProjectileThrownBy(target, source.getOwner())) { if (distance < 1) { target.playSound(SoundEvents.ENTITY_ZOMBIE_VILLAGER_CURE, 0.1F, 1); - target.setDead(); + target.remove(); } else { ricochet(target, pos); } @@ -142,7 +141,7 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac * Applies a force to the given entity based on distance from the source. */ protected void applyForce(Vec3d pos, Entity target, double force, double distance) { - pos = target.getPositionVector().subtract(pos).normalize().scale(force); + pos = target.getPos().subtract(pos).normalize().multiply(force); target.addVelocity( pos.x, @@ -174,8 +173,8 @@ public class SpellShield extends AbstractSpell.RangedAreaSpell implements IAttac * Reverses a projectiles direction to deflect it off the shield's surface. */ protected void ricochet(Entity projectile, Vec3d pos) { - Vec3d position = projectile.getPositionVector(); - Vec3d motion = new Vec3d(projectile.motionX, projectile.motionY, projectile.motionZ); + Vec3d position = projectile.getPos(); + Vec3d motion = projectile.getVelocity(); Vec3d normal = position.subtract(pos).normalize(); Vec3d approach = motion.subtract(normal); diff --git a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellSiphon.java b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellSiphon.java index 5d0d1e55..67635cff 100644 --- a/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellSiphon.java +++ b/src/main/java/com/minelittlepony/unicopia/magic/spells/SpellSiphon.java @@ -5,16 +5,16 @@ import java.util.stream.Collectors; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.shape.Sphere; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumParticleTypes; +import net.minecraft.particle.ParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -47,7 +47,7 @@ public class SpellSiphon extends AbstractSpell.RangedAreaSpell { if (source.getAffinity() == Affinity.BAD) { if (owner != null) { float healthGain = 0; - float maxHealthGain = owner.getMaxHealth() - owner.getHealth(); + float maxHealthGain = owner.getHealthMaximum() - owner.getHealth(); if (maxHealthGain > 0) { float attackAmount = Math.max(maxHealthGain / target.size(), 0.5F); @@ -69,7 +69,7 @@ public class SpellSiphon extends AbstractSpell.RangedAreaSpell { } } - e.attackEntityFrom(damage, dealt); + e.damage(damage, dealt); healthGain += dealt; } @@ -81,13 +81,13 @@ public class SpellSiphon extends AbstractSpell.RangedAreaSpell { } else { target.forEach(e -> { - float maxHealthGain = e.getMaxHealth() - e.getHealth(); + float maxHealthGain = e.getHealthMaximum() - e.getHealth(); if (maxHealthGain <= 0) { - if (source.getWorld().rand.nextInt(30) == 0) { + if (source.getWorld().random.nextInt(30) == 0) { setDead(); } else { - e.attackEntityFrom(damage, e.getHealth() / 4); + e.damage(damage, e.getHealth() / 4); } } else { e.heal((float)Math.min(0.5F * (1 + source.getCurrentLevel()), maxHealthGain * 0.6)); @@ -114,14 +114,14 @@ public class SpellSiphon extends AbstractSpell.RangedAreaSpell { int direction = source.getAffinity() == Affinity.GOOD ? 1 : -1; source.spawnParticles(new Sphere(true, radius, 1, 0, 1), 1, pos -> { - if (!source.getWorld().isAirBlock(new BlockPos(pos).down())) { + if (!source.getWorld().isAir(new BlockPos(pos).down())) { double dist = pos.distanceTo(origin); - Vec3d velocity = pos.subtract(origin).normalize().scale(direction * dist); + Vec3d velocity = pos.subtract(origin).normalize().multiply(direction * dist); - source.getWorld().spawnParticle( - direction == 1 ? EnumParticleTypes.HEART : EnumParticleTypes.VILLAGER_ANGRY, + source.getWorld().addParticle( + direction == 1 ? ParticleTypes.HEART : ParticleTypes.ANGRY_VILLAGER, pos.x, pos.y, pos.z, velocity.x, velocity.y, velocity.z); } }); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java index 5a53bba6..b94e88f1 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemEntity.java @@ -7,7 +7,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.entity.IEntity; -import com.minelittlepony.unicopia.entity.item.ItemEntityCapabilities; +import com.minelittlepony.unicopia.entity.capabilities.ItemEntityCapabilities; + import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java index 9d147d96..96ad81e4 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.entity.IEntity; -import com.minelittlepony.unicopia.entity.living.LivingEntityCapabilities; +import com.minelittlepony.unicopia.entity.capabilities.LivingEntityCapabilities; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java index 145f1e6b..4e343de6 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java @@ -9,8 +9,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.entity.IEntity; -import com.minelittlepony.unicopia.entity.player.IPlayer; -import com.minelittlepony.unicopia.entity.player.PlayerCapabilities; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.PlayerCapabilities; import com.mojang.datafixers.util.Either; import net.minecraft.entity.ItemEntity; diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java index f34f0c6b..a27791ac 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java @@ -8,8 +8,8 @@ import com.google.gson.annotations.Expose; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.ability.IData; import com.minelittlepony.unicopia.ability.IPower; -import com.minelittlepony.unicopia.ability.powers.PowersRegistry; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.ability.PowersRegistry; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java index a0a7688e..c4acd8e2 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java @@ -15,11 +15,11 @@ import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; @IMessage.Id(1) public class MsgPlayerCapabilities implements IMessage, IMessageHandler { @@ -43,7 +43,7 @@ public class MsgPlayerCapabilities implements IMessage, IMessageHandler 0) { try (ByteArrayInputStream input = new ByteArrayInputStream(compoundTag)) { - NBTTagCompound nbt = CompressedStreamTools.read(new DataInputStream(input)); + CompoundTag nbt = CompressedStreamTools.read(new DataInputStream(input)); player.fromNBT(nbt); } catch (IOException e) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgRequestCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgRequestCapabilities.java index 7981ce0d..ac59ee15 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgRequestCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgRequestCapabilities.java @@ -9,7 +9,7 @@ import com.minelittlepony.jumpingcastle.api.IMessageHandler; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.entity.player.IPlayer; +import com.minelittlepony.unicopia.entity.capabilities.IPlayer; import net.minecraft.entity.player.PlayerEntity; @@ -28,7 +28,7 @@ public class MsgRequestCapabilities implements IMessage, IMessageHandler task; while ((task = tickTasks.poll()) != null) { Consumer i = task; - Exceptions.logged(() -> i.accept(world), Unicopia.log); + Exceptions.logged(() -> i.accept(world), Unicopia.LOGGER); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/world/structure/AbstractFeature.java b/src/main/java/com/minelittlepony/unicopia/world/structure/AbstractFeature.java index 4186c9ad..be9442b6 100644 --- a/src/main/java/com/minelittlepony/unicopia/world/structure/AbstractFeature.java +++ b/src/main/java/com/minelittlepony/unicopia/world/structure/AbstractFeature.java @@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.world.structure; import java.util.Random; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.MutableBlockPos; @@ -43,7 +43,7 @@ public abstract class AbstractFeature extends StructureComponent { } @Override - protected void writeStructureToNBT(NBTTagCompound tagCompound) { + protected void writeStructureToNBT(CompoundTag tagCompound) { tagCompound.setInteger("Width", width); tagCompound.setInteger("Height", height); tagCompound.setInteger("Depth", depth); @@ -51,7 +51,7 @@ public abstract class AbstractFeature extends StructureComponent { } @Override - protected void readStructureFromNBT(NBTTagCompound tagCompound, TemplateManager templater) { + protected void readStructureFromNBT(CompoundTag tagCompound, TemplateManager templater) { width = tagCompound.getInteger("Width"); height = tagCompound.getInteger("Height"); depth = tagCompound.getInteger("Depth"); diff --git a/src/main/java/com/minelittlepony/util/MagicalDamageSource.java b/src/main/java/com/minelittlepony/util/MagicalDamageSource.java index 549eb820..7267df39 100644 --- a/src/main/java/com/minelittlepony/util/MagicalDamageSource.java +++ b/src/main/java/com/minelittlepony/util/MagicalDamageSource.java @@ -16,9 +16,8 @@ import net.minecraft.util.Language; public class MagicalDamageSource extends EntityDamageSource { - public static DamageSource mundane(String type) { - return new DamageSource(type) {}; - } + public static final DamageSource FOOD_POISONING = new MundaneDamageSource("food_poisoning").setBypassesArmor(); + public static final DamageSource ACID = new MundaneDamageSource("acid"); public static DamageSource create(String type) { return new MagicalDamageSource(type); @@ -65,4 +64,16 @@ public class MagicalDamageSource extends EntityDamageSource { return new TranslatableText(basic, target.getDisplayName(), source.getDisplayName()); } + + private static class MundaneDamageSource extends DamageSource { + + public MundaneDamageSource(String key) { + super(key); + } + + @Override + public DamageSource setBypassesArmor() { + return super.setBypassesArmor(); + } + } } diff --git a/src/main/java/com/minelittlepony/util/collection/ListHelper.java b/src/main/java/com/minelittlepony/util/collection/ListHelper.java new file mode 100644 index 00000000..d8bc8acb --- /dev/null +++ b/src/main/java/com/minelittlepony/util/collection/ListHelper.java @@ -0,0 +1,13 @@ +package com.minelittlepony.util.collection; + +import java.util.List; + +import net.minecraft.world.biome.Biome.SpawnEntry; + +public final class ListHelper { + public static void addifAbsent(List entries, SpawnEntry entry) { + if (!entries.contains(entry)) { + entries.add(entry); + } + } +}