Porting to Fabric/Yarn/1.14 part 3

This commit is contained in:
Sollace 2020-01-17 14:27:26 +01:00
parent 897287600b
commit 9a42c8ebd5
171 changed files with 2700 additions and 2662 deletions

View file

@ -1,6 +1,6 @@
package com.minelittlepony.unicopia; 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.Entity;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
@ -26,15 +26,15 @@ public enum CloudType {
return true; return true;
} }
return Predicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)e) return EquinePredicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)e)
|| (Predicates.MAGI.test(e) && EntityCloud.getFeatherEnchantStrength((PlayerEntity)e) > 0); || (EquinePredicates.MAGI.test(e) && CloudEntity.getFeatherEnchantStrength((PlayerEntity)e) > 0);
} }
if (e instanceof ItemEntity) { 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()); return canInteract(e.getVehicle());
} }

View file

@ -15,16 +15,16 @@ import com.google.gson.annotations.Expose;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter; 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() private static final Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() .excludeFieldsWithoutExposeAnnotation()
.setPrettyPrinting() .setPrettyPrinting()
.create(); .create();
public static UConfig instance() { public static Config instance() {
return instance; return instance;
} }
@ -34,14 +34,14 @@ public class UConfig {
try { try {
if (file.exists()) { if (file.exists()) {
try(JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file)));) { 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) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (instance == null) { 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)))) { try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file)))) {
writer.setIndent(" "); writer.setIndent(" ");
gson.toJson(this, UConfig.class, writer); gson.toJson(this, Config.class, writer);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View file

@ -6,7 +6,7 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
public final class Predicates { public final class EquinePredicates {
public static final Predicate<PlayerEntity> INTERACT_WITH_CLOUDS = player -> { public static final Predicate<PlayerEntity> INTERACT_WITH_CLOUDS = player -> {
return player != null && SpeciesList.instance().getPlayer(player).getSpecies().canInteractWithClouds(); return player != null && SpeciesList.instance().getPlayer(player).getSpecies().canInteractWithClouds();
}; };

View file

@ -1,21 +1,20 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import net.minecraft.client.MinecraftClient;
public final class MineLP { public final class MineLP {
private static boolean checkComplete; private static boolean checkComplete;
private static boolean modIsActive; private static boolean modIsActive;
// TODO:
/** /**
* Returns true if mine little pony is present. That's all we need. * Returns true if mine little pony is present. That's all we need.
*/ */
static boolean modIsActive() { static boolean modIsActive() {
if (!checkComplete) { if (!checkComplete) {
try { try {
MineLittlePony.getInstance(); // MineLittlePony.instance();
// always true, but this will throw if we don't have what we need. // 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) { } catch (Exception e) {
modIsActive = false; modIsActive = false;
} }
@ -29,7 +28,7 @@ public final class MineLP {
return Race.HUMAN; return Race.HUMAN;
} }
switch (IPony.forPlayer(MinecraftClient.getInstance().player).getRace(false)) { /*switch (IPony.forPlayer(MinecraftClient.getInstance().player).getRace(false)) {
case ALICORN: case ALICORN:
return Race.ALICORN; return Race.ALICORN;
case CHANGELING: case CHANGELING:
@ -49,6 +48,7 @@ public final class MineLP {
default: default:
return Race.EARTH; return Race.EARTH;
} }*/
return Race.EARTH;
} }
} }

View file

@ -5,10 +5,11 @@ import java.util.UUID;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.UConfig; import com.minelittlepony.unicopia.Config;
import com.minelittlepony.unicopia.ducks.IRaceContainerHolder; import com.minelittlepony.unicopia.ducks.IRaceContainerHolder;
import com.minelittlepony.unicopia.entity.IEntity; 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.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -21,17 +22,17 @@ public class SpeciesList {
} }
public boolean whiteListRace(Race race) { 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; return result;
} }
public boolean unwhiteListRace(Race race) { 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; return result;
} }
@ -41,7 +42,7 @@ public class SpeciesList {
return false; 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) { public Race validate(Race race, PlayerEntity sender) {

View file

@ -91,7 +91,7 @@ public class UBlocks {
public static final Block apple_leaves = register(new FruitLeavesBlock() public static final Block apple_leaves = register(new FruitLeavesBlock()
.growthChance(1200) .growthChance(1200)
.tint(0xFFEE81) .tint(0xFFEE81)
.fruit(ItemApple::getRandomItemStack) .fruit(AppleItem::getRandomItemStack)
.compost(w -> new ItemStack(UItems.rotten_apple)), "apple_leaves"); .compost(w -> new ItemStack(UItems.rotten_apple)), "apple_leaves");

View file

@ -5,8 +5,9 @@ import java.util.UUID;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.client.UnicopiaClient;
import com.minelittlepony.unicopia.entity.EntityFakeServerPlayer; 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 com.mojang.authlib.GameProfile;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.util.MagicalDamageSource;
import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffect;
@ -10,22 +11,20 @@ import net.minecraft.potion.Potion;
public class UEffects { 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) public static final StatusEffect FOOD_POISONING = new UPotion(Unicopia.MODID, "food_poisoning", true, 3484199)
.setIconIndex(3, 1) .setIconIndex(3, 1)
.setSilent() .setSilent()
.setEffectiveness(0.25) .setEffectiveness(0.25)
.setApplicator((p, e, i) -> { .setApplicator((p, e, i) -> {
StatusEffectInstance nausea = e.getActivePotionEffect(StatusEffects.NAUSEA); StatusEffectInstance nausea = e.getStatusEffect(StatusEffects.NAUSEA);
if (nausea == null) { 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()); nausea = new StatusEffectInstance(StatusEffects.NAUSEA, foodEffect.getDuration(), foodEffect.getAmplifier(), foodEffect.getIsAmbient(), foodEffect.doesShowParticles());
e.addPotionEffect(nausea); e.addPotionEffect(nausea);
} }
e.attackEntityFrom(food_poisoning, i); e.damage(MagicalDamageSource.FOOD_POISONING, i);
}); });
} }

View file

@ -1,87 +1,70 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.ButterflyEntity;
import com.minelittlepony.unicopia.client.render.entity.ButterflyEntityRenderer; import com.minelittlepony.unicopia.entity.CloudEntity;
import com.minelittlepony.unicopia.client.render.entity.RenderCloud; import com.minelittlepony.unicopia.entity.AdvancedProjectileEntity;
import com.minelittlepony.unicopia.client.render.entity.RenderCuccoon; import com.minelittlepony.unicopia.entity.ConstructionCloudEntity;
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.EntityCuccoon; import com.minelittlepony.unicopia.entity.EntityCuccoon;
import com.minelittlepony.unicopia.entity.EntityRacingCloud; 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.EntitySpear;
import com.minelittlepony.unicopia.entity.SpellcastEntity; import com.minelittlepony.unicopia.entity.SpellcastEntity;
import com.minelittlepony.unicopia.entity.EntitySpellbook; import com.minelittlepony.util.collection.ListHelper;
import com.minelittlepony.unicopia.entity.EntityWildCloud; import com.minelittlepony.unicopia.entity.SpellbookEntity;
import com.minelittlepony.unicopia.entity.item.AdvancedProjectileEntity; import com.minelittlepony.unicopia.entity.WildCloudEntity;
import com.minelittlepony.unicopia.forgebullshit.BiomeBS;
import com.minelittlepony.unicopia.forgebullshit.EntityType;
import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.Entity;
import net.minecraft.world.biome.Biome; import net.minecraft.entity.EntityCategory;
import net.minecraft.world.biome.BiomeEnd; import net.minecraft.entity.EntityType;
import net.minecraft.world.biome.BiomeForest; import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.BiomeHell; import net.minecraft.world.biome.EndBiome;
import net.minecraft.world.biome.BiomeHills; import net.minecraft.world.biome.ForestBiome;
import net.minecraft.world.biome.BiomePlains; import net.minecraft.world.biome.MountainsBiome;
import net.minecraft.world.biome.BiomeRiver; import net.minecraft.world.biome.NetherBiome;
import net.minecraftforge.common.BiomeManager; import net.minecraft.world.biome.OceanBiome;
import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraft.world.biome.PlainsBiome;
import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraft.world.biome.RiverBiome;
import net.minecraftforge.registries.IForgeRegistry;
public class UEntities { public class UEntities {
public static final EntityType<SpellbookEntity> SPELLBOOK = register("spellbook", EntityType.Builder.create(SpellbookEntity::new, EntityCategory.MISC).setDimensions(0.6f, 0.6f));
public static final EntityType<SpellcastEntity> MAGIC_SPELL = register("magic_spell", EntityType.Builder.create(SpellcastEntity::new, EntityCategory.MISC).setDimensions(0.6F, 0.25F));
public static final EntityType<CloudEntity> CLOUD = register("cloud", EntityType.Builder.create(CloudEntity::new, EntityCategory.CREATURE));
public static final EntityType<WildCloudEntity> WILD_CLOUD = register("wild_cloud", EntityType.Builder.create(WildCloudEntity::new, EntityCategory.CREATURE));
public static final EntityType<EntityRacingCloud> RACING_CLOUD = register("racing_cloud", EntityType.Builder.create(EntityRacingCloud::new, EntityCategory.CREATURE));
public static final EntityType<ConstructionCloudEntity> CONSTRUCTION_CLOUD = register("construction_cloud", EntityType.Builder.create(ConstructionCloudEntity::new, EntityCategory.CREATURE));
static void init(IForgeRegistry<EntityEntry> registry) { public static final EntityType<RainbowEntity> RAINBOW = register("rainbow", EntityType.Builder.create(RainbowEntity::new, EntityCategory.AMBIENT));
EntityType builder = EntityType.builder(Unicopia.MODID); public static final EntityType<RainbowEntity.Spawner> RAINBOW_SPAWNER = register("rainbow_spawner", EntityType.Builder.create(RainbowEntity.Spawner::new, EntityCategory.MISC));
registry.registerAll(
builder.creature(EntityCloud.class, "cloud").withEgg(0x4169e1, 0x7fff00), public static final EntityType<EntityCuccoon> CUCCOON = register("cuccoon", EntityType.Builder.create(EntityCuccoon::new, EntityCategory.MISC).setDimensions(0.6f, 0.6f));
builder.creature(EntityWildCloud.class, "wild_cloud"),
builder.creature(EntityRacingCloud.class, "racing_cloud"), public static final EntityType<ButterflyEntity> BUTTERFLY = register("butterfly", EntityType.Builder.create(ButterflyEntity::new, EntityCategory.AMBIENT));
builder.creature(EntityConstructionCloud.class, "construction_cloud"),
builder.creature(SpellcastEntity.class, "magic_spell"), public static final EntityType<AdvancedProjectileEntity> THROWN_ITEM = register("thrown_item", EntityType.Builder.create(AdvancedProjectileEntity::new, EntityCategory.MISC));
builder.creature(EntitySpellbook.class, "spellbook"), public static final EntityType<EntitySpear> THROWN_SPEAR = register("thrown_spear", EntityType.Builder.create(EntitySpear::new, EntityCategory.MISC));
builder.creature(EntityRainbow.Spawner.class, "rainbow_spawner"),
builder.creature(EntityCuccoon.class, "cuccoon"), //builder.creature(CloudEntity.class, "cloud").withEgg(0x4169e1, 0x7fff00),
builder.creature(EntityButterfly.class, "butterfly").withEgg(0x222200, 0xaaeeff), //builder.creature(ButterflyEntity.class, "butterfly").withEgg(0x222200, 0xaaeeff),
builder.projectile(EntityRainbow.class, "rainbow", 500, 5), // builder.projectile(AdvancedProjectileEntity.class, "thrown_item", 100, 10),
builder.projectile(AdvancedProjectileEntity.class, "thrown_item", 100, 10), // builder.projectile(EntitySpear.class, "spear", 100, 10)
builder.projectile(EntitySpear.class, "spear", 100, 10)
); private static <T extends Entity> EntityType<T> register(String name, EntityType.Builder<T> builder) {
return Registry.register(Registry.ENTITY_TYPE, name, builder.build(name));
} }
public static void preInit() { static void bootstrap() {
RenderingRegistry.registerEntityRenderingHandler(EntityCloud.class, RenderCloud::new); Registry.BIOME.forEach(biome -> {
RenderingRegistry.registerEntityRenderingHandler(SpellcastEntity.class, RenderGem::new); if (!(biome instanceof NetherBiome || biome instanceof EndBiome)) {
RenderingRegistry.registerEntityRenderingHandler(AdvancedProjectileEntity.class, RenderProjectile::new); ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.AMBIENT), biome instanceof OceanBiome ? WildCloudEntity.SPAWN_ENTRY_OCEAN : WildCloudEntity.SPAWN_ENTRY_LAND);
RenderingRegistry.registerEntityRenderingHandler(EntitySpellbook.class, RenderSpellbook::new); ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.CREATURE), RainbowEntity.SPAWN_ENTRY);
RenderingRegistry.registerEntityRenderingHandler(EntityRainbow.class, RenderRainbow::new);
RenderingRegistry.registerEntityRenderingHandler(EntityButterfly.class, ButterflyEntityRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(EntityCuccoon.class, RenderCuccoon::new);
RenderingRegistry.registerEntityRenderingHandler(EntitySpear.class, RenderSpear::new);
} }
public static void registerSpawnEntries(Biome biome) { if (biome instanceof PlainsBiome
if (!(biome instanceof BiomeHell || biome instanceof BiomeEnd)) { || biome instanceof RiverBiome
|| biome instanceof MountainsBiome
BiomeBS.addSpawnEntry(biome, EnumCreatureType.AMBIENT, EntityWildCloud.class, b -> || biome instanceof ForestBiome) {
BiomeManager.oceanBiomes.contains(b) ? EntityWildCloud.SPAWN_ENTRY_OCEAN : EntityWildCloud.SPAWN_ENTRY_LAND ListHelper.addifAbsent(biome.getEntitySpawnList(EntityCategory.AMBIENT), ButterflyEntity.SPAWN_ENTRY);
);
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);
} }
});
} }
} }

View file

@ -5,24 +5,29 @@ import com.minelittlepony.unicopia.item.ItemAppleMultiType;
import com.minelittlepony.unicopia.item.ItemCereal; import com.minelittlepony.unicopia.item.ItemCereal;
import com.minelittlepony.unicopia.item.AppleItem; import com.minelittlepony.unicopia.item.AppleItem;
import com.minelittlepony.unicopia.item.CloudPlacerItem; import com.minelittlepony.unicopia.item.CloudPlacerItem;
import com.minelittlepony.unicopia.item.ItemCurse; import com.minelittlepony.unicopia.item.ExtendedShearsItem;
import com.minelittlepony.unicopia.item.ItemFruitLeaves; import com.minelittlepony.unicopia.item.CursedMagicGemItem;
import com.minelittlepony.unicopia.item.ItemMagicStaff; 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.ItemOfHolding;
import com.minelittlepony.unicopia.item.ItemRottenApple; import com.minelittlepony.unicopia.item.RottenAppleItem;
import com.minelittlepony.unicopia.item.ItemRottenTomato; import com.minelittlepony.unicopia.item.RottenTomatoItem;
import com.minelittlepony.unicopia.item.ItemSpear; import com.minelittlepony.unicopia.item.ItemSpear;
import com.minelittlepony.unicopia.item.ItemSpell; import com.minelittlepony.unicopia.item.MagicGemItem;
import com.minelittlepony.unicopia.item.ItemSpellbook; import com.minelittlepony.unicopia.item.SpellbookItem;
import com.minelittlepony.unicopia.item.ItemStaff; import com.minelittlepony.unicopia.item.ItemStaff;
import com.minelittlepony.unicopia.item.ItemTomato; import com.minelittlepony.unicopia.item.TomatoItem;
import com.minelittlepony.unicopia.item.ItemTomatoSeeds; import com.minelittlepony.unicopia.item.TomatoSeedsItem;
import com.minelittlepony.unicopia.item.ItemZapApple; import com.minelittlepony.unicopia.item.ItemZapApple;
import com.minelittlepony.unicopia.item.PredicatedBlockItem; import com.minelittlepony.unicopia.item.PredicatedBlockItem;
import com.minelittlepony.unicopia.item.StickItem;
import com.minelittlepony.unicopia.item.URecord; import com.minelittlepony.unicopia.item.URecord;
import com.minelittlepony.unicopia.item.override.ItemShear; import com.minelittlepony.unicopia.item.consumables.BushToxicityDeterminent;
import com.minelittlepony.unicopia.item.override.ItemStick; 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 com.minelittlepony.unicopia.magic.spells.SpellRegistry;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -38,49 +43,43 @@ import net.minecraft.item.Items;
import net.minecraft.item.TallBlockItem; import net.minecraft.item.TallBlockItem;
import net.minecraft.item.Item.Settings; import net.minecraft.item.Item.Settings;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.UseAction;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import static com.minelittlepony.unicopia.Predicates.*; import static com.minelittlepony.unicopia.EquinePredicates.*;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.UClient;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.edibles.BushToxicityDeterminent; import com.minelittlepony.unicopia.entity.ConstructionCloudEntity;
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.EntityRacingCloud; 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.BuildInTexturesBakery;
import com.minelittlepony.unicopia.forgebullshit.OreReplacer; import com.minelittlepony.unicopia.forgebullshit.OreReplacer;
import com.minelittlepony.unicopia.forgebullshit.UnFuckedItemSnow; import com.minelittlepony.unicopia.forgebullshit.UnFuckedItemSnow;
public class UItems { public class UItems {
private static final ItemStick stick = register(new ItemStick(new Item.Settings()), "minecraft", "stick"); private static final StickItem stick = register(new StickItem(), "minecraft", "stick");
private static final ItemShear shears = register(new ItemShear(), "minecraft", "shears"); 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 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 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 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 AppleItem sour_apple = register(new AppleItem(FoodComponents.APPLE), "apple_sour");
public static final ItemAppleMultiType zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple") public static final ItemAppleMultiType zap_apple = new ItemZapApple(Unicopia.MODID, "zap_apple").setSubTypes("zap_apple", "red", "green", "sweet", "sour", "zap");
.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 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 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 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 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 construction_cloud_spawner = register(new CloudPlacerItem(ConstructionCloudEntity::new), "construction_cloud_spawner");
public static final CloudPlacerItem wild_cloud_spawner = register(new CloudPlacerItem(EntityWildCloud::new), "wild_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 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"); 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 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_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_popular = register(new URecord(USounds.RECORD_POPULAR), "popular");
public static final Item record_funk = register(new URecord(USounds.RECORD_FUNK), "funk"); 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 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 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 MagicGemItem spell = register(new MagicGemItem(), "gem");
public static final ItemSpell curse = new ItemCurse(Unicopia.MODID, "corrupted_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 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 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_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 staff_remembrance = new ItemMagicStaff(Unicopia.MODID, "staff_remembrance", new SpellScorch());
public static final Item spear = new ItemSpear(Unicopia.MODID, "spear"); 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) public static final Item alfalfa_seeds = new ItemSeedFood(1, 4, UBlocks.alfalfa, Blocks.FARMLAND)
.setTranslationKey("alfalfa_seeds") .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 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 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 TomatoItem tomato = new TomatoItem(Unicopia.MODID, "tomato", 4, 34);
public static final ItemRottenTomato rotten_tomato = new ItemRottenTomato(Unicopia.MODID, "rotten_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 TomatoItem cloudsdale_tomato = new TomatoItem(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 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_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 -> public static final Item double_plant = new UItemFoodDelegate(Blocks.DOUBLE_PLANT, stack ->
BlockDoublePlant.EnumPlantType.byMetadata(stack.getMetadata()).getTranslationKey() 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 wheat_worms = new MultiItemEdible(Unicopia.MODID, "wheat_worms", 1, 0, stack -> Toxicity.SEVERE);
public static final Item mug = new Item() public static final Item mug = register(new Item(new Item.Settings().group(ItemGroup.MATERIALS)), "mug");
.setTranslationKey("mug")
.setRegistryName(Unicopia.MODID, "mug")
.setCreativeTab(CreativeTabs.MATERIALS)
.setFull3D();
public static final Item apple_cider = new MultiItemEdible(Unicopia.MODID, "apple_cider", 4, 2, stack -> Toxicity.MILD) 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) .setContainerItem(mug)
.setFull3D(); .setFull3D();
public static final Item juice = new MultiItemEdible(Unicopia.MODID, "juice", 2, 2, stack -> Toxicity.SAFE) 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); .setContainerItem(Items.GLASS_BOTTLE);
public static final Item burned_juice = new MultiItemEdible(Unicopia.MODID, "burned_juice", 3, 1, stack -> Toxicity.FAIR) 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); .setContainerItem(Items.GLASS_BOTTLE);
@ -227,12 +222,12 @@ public class UItems {
BuildInTexturesBakery.getBuiltInTextures().add(new Identifier(Unicopia.MODID, "items/empty_slot_gem")); 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.instance().addSmeltingRecipe(new ItemStack(zap_apple), new ItemStack(cooked_zap_apple), 0.1F);
FurnaceRecipes.getInstance().addSmeltingRecipe(new ItemStack(juice), new ItemStack(burned_juice), 0); FurnaceRecipes.instance().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(cuccoon), new ItemStack(chitin_shell), 0.3F);
} }
public static void fixRecipes() { static void fixRecipes() {
new OreReplacer() new OreReplacer()
.registerAll(stack -> stack.getItem().getRegistryName().equals(red_apple.getRegistryName())) .registerAll(stack -> stack.getItem().getRegistryName().equals(red_apple.getRegistryName()))
.done(); .done();
@ -254,4 +249,6 @@ public class UItems {
return 0xffffff; return 0xffffff;
}, spell, curse); }, spell, curse);
} }
static void bootstrap() {}
} }

View file

@ -8,8 +8,6 @@ import com.minelittlepony.unicopia.client.particle.ParticleUnicornMagic;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; 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.particle.DefaultParticleType;
import net.minecraft.util.Identifier; 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 SPHERE = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "sphere"));
public static final DefaultParticleType DISK = ParticleTypeRegistry.getTnstance().register(new Identifier("unicopia", "disk")); 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);
}
} }

View file

@ -54,17 +54,17 @@ public class UPotion extends StatusEffect {
} }
@Override @Override
public boolean shouldRender(PotionEffect effect) { public boolean shouldRender(StatusEffectInstance effect) {
return !isSilent; return !isSilent;
} }
@Override @Override
public boolean shouldRenderInvText(PotionEffect effect) { public boolean shouldRenderInvText(StatusEffectInstance effect) {
return !isSilent; return !isSilent;
} }
@Override @Override
public boolean shouldRenderHUD(PotionEffect effect) { public boolean shouldRenderHUD(StatusEffectInstance effect) {
return !isSilent; return !isSilent;
} }

View file

@ -1,5 +1,7 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import net.fabricmc.api.ModInitializer;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
@ -10,28 +12,26 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.minelittlepony.unicopia.ability.powers.PowersRegistry; import com.minelittlepony.unicopia.ability.PowersRegistry;
import com.minelittlepony.unicopia.advancements.UAdvancements;
import com.minelittlepony.unicopia.command.Commands; import com.minelittlepony.unicopia.command.Commands;
import com.minelittlepony.unicopia.enchanting.AffineIngredients;
import com.minelittlepony.unicopia.enchanting.Pages; import com.minelittlepony.unicopia.enchanting.Pages;
import com.minelittlepony.unicopia.enchanting.SpecialRecipe; import com.minelittlepony.unicopia.enchanting.recipe.AffineIngredients;
import com.minelittlepony.unicopia.enchanting.SpellRecipe; 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.SpellBookContainer;
import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook; import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook;
import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.unicopia.network.MsgPlayerAbility;
import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; import com.minelittlepony.unicopia.network.MsgPlayerCapabilities;
import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
import com.minelittlepony.unicopia.util.crafting.CraftingManager; import com.minelittlepony.unicopia.util.crafting.CraftingManager;
import com.minelittlepony.unicopia.world.Hooks;
import com.minelittlepony.unicopia.world.UWorld; 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 MODID = "unicopia";
public static final String NAME = "@NAME@"; public static final String NAME = "@NAME@";
public static final String VERSION = "@VERSION@"; public static final String VERSION = "@VERSION@";
public static final Logger log = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
private static IChannel channel; private static IChannel channel;
@ -47,6 +47,7 @@ public class Unicopia implements IGuiHandler {
} }
}; };
@Deprecated
public static CraftingManager getCraftingManager() { public static CraftingManager getCraftingManager() {
return craftingManager; return craftingManager;
} }
@ -55,21 +56,10 @@ public class Unicopia implements IGuiHandler {
return channel; return channel;
} }
public void preInit(FMLPreInitializationEvent event) { @Override
UConfig.init(event.getModConfigurationDirectory()); public void onInitialize() {
UClient.instance().preInit(); Config.init(event.getModConfigurationDirectory());
UWorld.instance().init();
}
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, () -> {}) channel = JumpingCastle.subscribeTo(MODID, () -> {})
.listenFor(MsgRequestCapabilities.class) .listenFor(MsgRequestCapabilities.class)
.listenFor(MsgPlayerCapabilities.class) .listenFor(MsgPlayerCapabilities.class)
@ -79,37 +69,21 @@ public class Unicopia implements IGuiHandler {
UAdvancements.init(); UAdvancements.init();
FBS.init();
NetworkRegistry.INSTANCE.registerGuiHandler(this, this);
UClient.instance().init();
}
public void postInit(FMLPostInitializationEvent event) {
craftingManager.load(); craftingManager.load();
Pages.instance().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(); UClient.instance().postInit();
UItems.fixRecipes(); 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;
}
}
} }

View file

@ -1,6 +1,6 @@
package com.minelittlepony.unicopia.ability; 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. * Predicate for abilities to control whether a player can fly.

View file

@ -1,6 +1,6 @@
package com.minelittlepony.unicopia.ability; 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. * Predicate for abilities to control what the player's physical height is.

View file

@ -4,7 +4,7 @@ import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.client.input.IKeyBindingHandler; 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; import net.minecraft.world.World;

View file

@ -1,11 +1,9 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.Hit; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;
import net.minecraft.client.network.packet.EntityPassengersSetS2CPacket; import net.minecraft.client.network.packet.EntityPassengersSetS2CPacket;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import java.util.Optional; import java.util.Optional;
@ -6,9 +6,7 @@ import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.Numeric;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -8,9 +8,8 @@ import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.ability.Hit;
import com.minelittlepony.unicopia.entity.IInAnimate; 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.unicopia.magic.spells.SpellDisguise;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;

View file

@ -1,12 +1,10 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.Hit; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.unicopia.magic.spells.SpellChangelingTrap; import com.minelittlepony.unicopia.magic.spells.SpellChangelingTrap;
public class PowerEngulf implements IPower<Hit> { public class PowerEngulf implements IPower<Hit> {

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -8,9 +8,7 @@ import javax.annotation.Nullable;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.Hit; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;

View file

@ -1,12 +1,10 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.Location;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;

View file

@ -1,11 +1,9 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.ability.Hit; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.unicopia.magic.spells.SpellShield; import com.minelittlepony.unicopia.magic.spells.SpellShield;
public class PowerMagic implements IPower<Hit> { public class PowerMagic implements IPower<Hit> {

View file

@ -1,18 +1,14 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.Location;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.unicopia.item.AppleItem; import com.minelittlepony.unicopia.item.AppleItem;
import com.minelittlepony.unicopia.world.UWorld; import com.minelittlepony.unicopia.world.UWorld;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
@ -36,7 +32,6 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.BlockStateParticleEffect;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.state.property.Property;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -301,7 +296,7 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
int breaks = 0; int breaks = 0;
BlockState state; BlockState state;
while (variantAndBlockEquals(w.getBlockState(pos.up()), log)) { 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; break;
} }
@ -462,14 +457,16 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
} }
private Object getVariant(BlockState state) { private Object getVariant(BlockState state) {
if (state.getBlock() instanceof LeavesBlock) { // TODO:
/*if (state.getBlock() instanceof LeavesBlock) {
return ((LeavesBlock)state.getBlock()).getWoodType(state); return ((LeavesBlock)state.getBlock()).getWoodType(state);
} }
return state.getEntries().entrySet().stream() return state.getEntries().entrySet().stream()
.filter(i -> i.getKey().getName().contentEquals("variant")) .filter(i -> i.getKey().getName().contentEquals("variant"))
.map(i -> i.getValue()) .map(i -> i.getValue())
.findFirst().orElse(null); .findFirst().orElse(null);*/
return null;
} }
protected static class Data extends Location { protected static class Data extends Location {

View file

@ -1,11 +1,9 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import com.minelittlepony.unicopia.ability.Location;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.util.VecHelper; import com.minelittlepony.util.VecHelper;
import net.minecraft.block.Block; import net.minecraft.block.Block;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.ability.powers; package com.minelittlepony.unicopia.ability;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -7,16 +7,14 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.IData;
import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.client.input.Keyboard; import com.minelittlepony.unicopia.client.input.Keyboard;
public class PowersRegistry { public class PowersRegistry {
private static PowersRegistry instance = new PowersRegistry(); private static final PowersRegistry INSTANCE = new PowersRegistry();
public static PowersRegistry instance() { public static PowersRegistry instance() {
return instance; return INSTANCE;
} }
private final Map<Integer, List<IPower<? extends IData>>> keyToPowerMap = new HashMap<>(); private final Map<Integer, List<IPower<? extends IData>>> keyToPowerMap = new HashMap<>();

View file

@ -8,7 +8,7 @@ import javax.annotation.Nullable;
import com.minelittlepony.unicopia.CloudType; import com.minelittlepony.unicopia.CloudType;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UBlocks; 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.fabricmc.fabric.api.block.FabricBlockSettings;
import net.minecraft.block.Block; 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)); pos = pos.offset(Direction.random(rand), 1 + rand.nextInt(2));
state = world.getBlockState(pos); state = world.getBlockState(pos);
BlockState converted = ItemMoss.affected.getInverse().getConverted(state); BlockState converted = MossItem.AFFECTED.getInverse().getConverted(state);
if (!state.equals(converted)) { if (!state.equals(converted)) {
world.setBlockState(pos, converted); world.setBlockState(pos, converted);

View file

@ -4,7 +4,7 @@ import java.util.function.Supplier;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.EquinePredicates;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MapColor;
@ -32,7 +32,7 @@ public class BlockDiamondDoor extends UDoor {
@Override @Override
protected boolean canOpen(@Nullable PlayerEntity player) { protected boolean canOpen(@Nullable PlayerEntity player) {
return Predicates.MAGI.test(player); return EquinePredicates.MAGI.test(player);
} }
@Override @Override

View file

@ -5,7 +5,7 @@ import java.util.Random;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UBlocks;
import com.minelittlepony.unicopia.UMaterials; import com.minelittlepony.unicopia.UMaterials;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
@ -31,8 +31,6 @@ import net.minecraft.world.World;
public class BlockGrowingCuccoon extends Block { 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 IntProperty AGE = IntProperty.of("age", 0, 7);
public static final EnumProperty<Shape> SHAPE = EnumProperty.of("shape", Shape.class); public static final EnumProperty<Shape> SHAPE = EnumProperty.of("shape", Shape.class);
@ -207,11 +205,11 @@ public class BlockGrowingCuccoon extends Block {
@Override @Override
public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { 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; LivingEntity living = (LivingEntity)entity;
if (!Predicates.BUGGY.test(living) && living.getHealth() > 0) { if (!EquinePredicates.BUGGY.test(living) && living.getHealth() > 0) {
living.attackEntityFrom(DAMAGE_SOURCE, 1); living.damage(MagicalDamageSource.ACID, 1);
living.setInWeb(); living.setInWeb();
if (!world.isClient) { if (!world.isClient) {
@ -224,8 +222,8 @@ public class BlockGrowingCuccoon extends Block {
if (world.rand.nextInt(13000) == 0) { if (world.rand.nextInt(13000) == 0) {
PlayerEntity player = (PlayerEntity)living; PlayerEntity player = (PlayerEntity)living;
skull.setTagCompound(new NBTTagCompound()); skull.setTagCompound(new CompoundTag());
skull.getTagCompound().setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), player.getGameProfile())); skull.getTagCompound().setTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundTag(), player.getGameProfile()));
skull.setItemDamage(3); skull.setItemDamage(3);
} else { } else {
living.dropItem(Items.SKULL, 1); living.dropItem(Items.SKULL, 1);

View file

@ -5,7 +5,7 @@ import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UMaterials; 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.fabricmc.fabric.api.block.FabricBlockSettings;
import net.minecraft.block.Block; import net.minecraft.block.Block;

View file

@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.block;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UMaterials; 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.fabricmc.fabric.api.block.FabricBlockSettings;
import net.minecraft.block.Block; import net.minecraft.block.Block;

View file

@ -9,7 +9,7 @@ import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UBlocks;
import com.minelittlepony.unicopia.UMaterials; import com.minelittlepony.unicopia.UMaterials;
import com.minelittlepony.unicopia.USounds; 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.PosHelper;
import com.minelittlepony.util.shape.IShape; import com.minelittlepony.util.shape.IShape;
import com.minelittlepony.util.shape.Sphere; import com.minelittlepony.util.shape.Sphere;

View file

@ -1,7 +1,7 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block;
import com.minelittlepony.unicopia.CloudType; import com.minelittlepony.unicopia.CloudType;
import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.UClient;
import net.minecraft.block.BedBlock; import net.minecraft.block.BedBlock;
import net.minecraft.block.Block; 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; return type != CloudType.ENCHANTED;
} }

View file

@ -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.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 com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia.client;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -6,12 +6,20 @@ import java.util.UUID;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; 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.gui.SettingsScreen;
import com.minelittlepony.unicopia.client.input.Keyboard; import com.minelittlepony.unicopia.client.input.Keyboard;
import com.minelittlepony.unicopia.client.input.MouseControl; 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.client.input.InversionAwareKeyboardInput;
import com.minelittlepony.unicopia.entity.player.IPlayer;
import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
@ -34,7 +42,7 @@ public class UnicopiaClient extends UClient {
private static Race clientPlayerRace = getclientPlayerRace(); private static Race clientPlayerRace = getclientPlayerRace();
private static Race getclientPlayerRace() { private static Race getclientPlayerRace() {
if (!UConfig.instance().ignoresMineLittlePony() if (!Config.instance().ignoresMineLittlePony()
&& MinecraftClient.getInstance().player != null) { && MinecraftClient.getInstance().player != null) {
Race race = MineLP.getPlayerPonyRace(); Race race = MineLP.getPlayerPonyRace();
@ -44,7 +52,7 @@ public class UnicopiaClient extends UClient {
} }
return UConfig.instance().getPrefferedRace(); return Config.instance().getPrefferedRace();
} }
@Override @Override

View file

@ -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 com.minelittlepony.unicopia.magic.spells.SpellDisguise;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -49,7 +49,7 @@ public class DisguiseRenderer {
public boolean renderDisguiseToGui(IPlayer player) { public boolean renderDisguiseToGui(IPlayer player) {
SpellDisguise effect = player.getEffect(SpellDisguise.class, false); SpellDisguise effect = player.getEffect(SpellDisguise.class, false);
if (effect == null || effect.getDead()) { if (effect == null || effect.isDead()) {
return false; return false;
} }

View file

@ -1,6 +1,6 @@
package com.minelittlepony.unicopia.client.gui; 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 com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.DrawableHelper;

View file

@ -1,6 +1,6 @@
package com.minelittlepony.unicopia.client.gui; package com.minelittlepony.unicopia.client.gui;
import com.minelittlepony.unicopia.entity.player.IPlayer; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
public interface IHudElement { public interface IHudElement {

View file

@ -5,7 +5,7 @@ import java.util.List;
import org.lwjgl.opengl.GL11; 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 com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View file

@ -1,7 +1,7 @@
package com.minelittlepony.unicopia.client.input; package com.minelittlepony.unicopia.client.input;
import com.minelittlepony.unicopia.UClient; 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.MinecraftClient;
import net.minecraft.client.input.Input; import net.minecraft.client.input.Input;

View file

@ -5,8 +5,8 @@ import java.util.List;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.powers.PowersRegistry; import com.minelittlepony.unicopia.ability.PowersRegistry;
import com.minelittlepony.unicopia.entity.player.IPlayer; import com.minelittlepony.unicopia.entity.capabilities.IPlayer;
import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry;

View file

@ -7,6 +7,7 @@ import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleEffect;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@ -74,12 +75,12 @@ public class ParticleSphere extends Particle implements IAttachableParticle {
super.tick(); super.tick();
if (caster != null) { if (caster != null) {
if (!caster.hasEffect() || caster.getEffect().getDead() || caster.getEntity().removed) { if (!caster.hasEffect() || caster.getEffect().isDead() || caster.getEntity().removed) {
markDead(); markDead();
} else { } else {
Entity e = caster.getEntity(); Entity e = caster.getEntity();
if (!caster.getWorld().loadedEntityList.contains(caster.getEntity())) { if (caster.getWorld().getEntityById(e.getEntityId()) == null) {
markDead(); markDead();
} }

View file

@ -1,7 +1,7 @@
package com.minelittlepony.unicopia.client.render.entity; package com.minelittlepony.unicopia.client.render.entity;
import com.minelittlepony.unicopia.client.render.entity.model.ButterflyEntityModel; 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 com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.render.entity.EntityRenderDispatcher; 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.Identifier;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class ButterflyEntityRenderer extends LivingEntityRenderer<EntityButterfly, ButterflyEntityModel> { public class ButterflyEntityRenderer extends LivingEntityRenderer<ButterflyEntity, ButterflyEntityModel> {
public ButterflyEntityRenderer(EntityRenderDispatcher rm) { public ButterflyEntityRenderer(EntityRenderDispatcher rm) {
super(rm, new ButterflyEntityModel(), 0.25F); super(rm, new ButterflyEntityModel(), 0.25F);
} }
@Override @Override
protected Identifier getTexture(EntityButterfly entity) { protected Identifier getTexture(ButterflyEntity entity) {
return entity.getVariety().getSkin(); return entity.getVariety().getSkin();
} }
@Override @Override
protected void scale(EntityButterfly entity, float ticks) { protected void scale(ButterflyEntity entity, float ticks) {
GlStateManager.scalef(0.35F, 0.35F, 0.35F); GlStateManager.scalef(0.35F, 0.35F, 0.35F);
} }
@Override @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()) { if (!entity.isResting()) {
GlStateManager.translated(0, MathHelper.cos(age / 3F) / 10F, 0); GlStateManager.translated(0, MathHelper.cos(age / 3F) / 10F, 0);

View file

@ -1,26 +1,26 @@
package com.minelittlepony.unicopia.client.render.entity; package com.minelittlepony.unicopia.client.render.entity;
import net.minecraft.client.renderer.GlStateManager; import net.fabricmc.fabric.api.client.render.EntityRendererRegistry;
import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import com.minelittlepony.unicopia.client.render.entity.model.ModelCloud; 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; import com.minelittlepony.util.WorldHelper;
public class RenderCloud extends RenderLiving<EntityCloud> { public class RenderCloud extends LivingEntityRenderer<CloudEntity, ModelCloud> {
private static final Identifier cloud = new Identifier("unicopia", "textures/entity/clouds.png"); 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"); private static final Identifier rainCloud = new Identifier("unicopia", "textures/entity/clouds_storm.png");
public RenderCloud(RenderManager rendermanagerIn) { public RenderCloud(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) {
super(rendermanagerIn, new ModelCloud(), 1f); super(manager, new ModelCloud(), 1f);
} }
@Override @Override
public float prepareScale(EntityCloud entity, float par2) { public float prepareScale(CloudEntity entity, float par2) {
float scale = entity.getCloudSize(); float scale = entity.getCloudSize();
GL11.glScalef(scale, scale, scale); GL11.glScalef(scale, scale, scale);
@ -28,7 +28,7 @@ public class RenderCloud extends RenderLiving<EntityCloud> {
} }
@Override @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) { if (!entity.isDead) {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
@ -54,7 +54,7 @@ public class RenderCloud extends RenderLiving<EntityCloud> {
} }
@Override @Override
protected Identifier getEntityTexture(EntityCloud entity) { protected Identifier getEntityTexture(CloudEntity entity) {
if (entity.getIsRaining() && entity.getIsThundering()) { if (entity.getIsRaining() && entity.getIsThundering()) {
return rainCloud; return rainCloud;
} }
@ -62,12 +62,12 @@ public class RenderCloud extends RenderLiving<EntityCloud> {
} }
@Override @Override
protected int getColorMultiplier(EntityCloud par1LivingEntity, float yaw, float pitch) { protected int getColorMultiplier(CloudEntity par1LivingEntity, float yaw, float pitch) {
return 0; return 0;
} }
@Override @Override
protected float getDeathMaxRotation(EntityCloud par1LivingEntity) { protected float getDeathMaxRotation(CloudEntity par1LivingEntity) {
return 0; return 0;
} }
} }

View file

@ -36,7 +36,7 @@ public class RenderCuccoon extends RenderLivingBase<EntityCuccoon> {
if (entity.isBeingRidden()) { if (entity.isBeingRidden()) {
Entity rider = entity.getPassengers().get(0); 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.enableAlpha();
GlStateManager.enableBlend(); GlStateManager.enableBlend();

View file

@ -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<AdvancedProjectileEntity> {
public RenderProjectile(RenderManager renderManager) {
super(renderManager, Items.POTIONITEM, MinecraftClient.getInstance().getRenderItem());
}
@Override
public ItemStack getStackToRender(AdvancedProjectileEntity entity) {
return entity.getItem();
}
}

View file

@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.client.render.entity;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import com.minelittlepony.unicopia.entity.EntityRainbow; import com.minelittlepony.unicopia.entity.RainbowEntity;
import com.minelittlepony.util.WorldHelper; import com.minelittlepony.util.WorldHelper;
import net.minecraft.client.Minecraft; 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.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class RenderRainbow extends Render<EntityRainbow> { public class RenderRainbow extends Render<RainbowEntity> {
public RenderRainbow(RenderManager renderManager) { public RenderRainbow(RenderManager renderManager) {
super(renderManager); super(renderManager);
@ -22,9 +22,9 @@ public class RenderRainbow extends Render<EntityRainbow> {
private static final Identifier TEXTURE = new Identifier("unicopia", "textures/environment/rainbow.png"); 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) { public void doRender(RainbowEntity entity, double x, double y, double z, float entityYaw, float partialTicks) {
float distance = MinecraftClient.getInstance().getRenderViewEntity().getDistance(entity); float distance = MinecraftClient.instance().getRenderViewEntity().getDistance(entity);
float maxDistance = 16 * MinecraftClient.getInstance().gameSettings.renderDistanceChunks; float maxDistance = 16 * MinecraftClient.instance().gameSettings.renderDistanceChunks;
double r = entity.getRadius(); double r = entity.getRadius();
float light = WorldHelper.getDaylightBrightness(entity.getEntityWorld(), partialTicks); float light = WorldHelper.getDaylightBrightness(entity.getEntityWorld(), partialTicks);
@ -49,7 +49,7 @@ public class RenderRainbow extends Render<EntityRainbow> {
GlStateManager.color(1, 1, 1, opacity); GlStateManager.color(1, 1, 1, opacity);
Tessellator tessellator = Tessellator.getInstance(); Tessellator tessellator = Tessellator.instance();
BufferBuilder bufferbuilder = tessellator.getBuffer(); BufferBuilder bufferbuilder = tessellator.getBuffer();
bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
@ -67,7 +67,7 @@ public class RenderRainbow extends Render<EntityRainbow> {
} }
@Override @Override
protected Identifier getEntityTexture(EntityRainbow entity) { protected Identifier getEntityTexture(RainbowEntity entity) {
return TEXTURE; return TEXTURE;
} }

View file

@ -1,7 +1,7 @@
package com.minelittlepony.unicopia.client.render.entity; package com.minelittlepony.unicopia.client.render.entity;
import com.minelittlepony.unicopia.client.render.entity.model.ModelSpellbook; 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.GlStateManager;
import net.minecraft.client.renderer.entity.RenderLiving; 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.math.MathHelper;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class RenderSpellbook extends RenderLiving<EntitySpellbook> { public class RenderSpellbook extends RenderLiving<SpellbookEntity> {
private static final Identifier BLUE = new Identifier("unicopia", "textures/entity/enchanting_table_book_blue.png"); 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"); private static final Identifier NORMAL = new Identifier("unicopia", "textures/entity/enchanting_table_book.png");
@ -19,17 +19,17 @@ public class RenderSpellbook extends RenderLiving<EntitySpellbook> {
} }
@Override @Override
protected Identifier getEntityTexture(EntitySpellbook entity) { protected Identifier getEntityTexture(SpellbookEntity entity) {
return entity.getIsAltered() ? BLUE : NORMAL; return entity.getIsAltered() ? BLUE : NORMAL;
} }
@Override @Override
protected float getDeathMaxRotation(EntitySpellbook entity) { protected float getDeathMaxRotation(SpellbookEntity entity) {
return 0; return 0;
} }
@Override @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; float breath = MathHelper.sin(((float)entity.ticksExisted + stutter) / 20) * 0.01F + 0.1F;
@ -40,14 +40,14 @@ public class RenderSpellbook extends RenderLiving<EntitySpellbook> {
if (first_page_rot > 1) first_page_rot = 1; if (first_page_rot > 1) first_page_rot = 1;
if (second_page_rot > 1) second_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); GlStateManager.translate(0, 1.44f, 0);
} else { } else {
GlStateManager.translate(0, 1.2f + breath, 0); GlStateManager.translate(0, 1.2f + breath, 0);
} }
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
if (!((EntitySpellbook)entity).getIsOpen()) { if (!((SpellbookEntity)entity).getIsOpen()) {
first_page_rot = second_page_rot = open_angle = 0; first_page_rot = second_page_rot = open_angle = 0;
GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F); GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F); GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
@ -63,12 +63,12 @@ public class RenderSpellbook extends RenderLiving<EntitySpellbook> {
} }
@Override @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); GlStateManager.rotate(-interpolateRotation(entity.prevRotationYaw, entity.rotationYaw, partialTicks), 0, 1, 0);
} }
@Override @Override
protected boolean canRenderName(EntitySpellbook targetEntity) { protected boolean canRenderName(SpellbookEntity targetEntity) {
return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender() || targetEntity.hasCustomName() && targetEntity == renderManager.pointedEntity); return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender() || targetEntity.hasCustomName() && targetEntity == renderManager.pointedEntity);
} }
} }

View file

@ -3,16 +3,19 @@ package com.minelittlepony.unicopia.client.render.entity;
import com.minelittlepony.unicopia.client.render.entity.model.ModelGem; import com.minelittlepony.unicopia.client.render.entity.model.ModelGem;
import com.minelittlepony.unicopia.entity.SpellcastEntity; 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.EntityRenderDispatcher;
import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class RenderGem extends LivingEntityRenderer<SpellcastEntity, ModelGem> { public class SpellcastEntityRenderer extends LivingEntityRenderer<SpellcastEntity, ModelGem> {
private static final Identifier gem = new Identifier("unicopia", "textures/entity/gem.png"); private static final Identifier gem = new Identifier("unicopia", "textures/entity/gem.png");
public RenderGem(EntityRenderDispatcher rendermanagerIn) { public SpellcastEntityRenderer(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) {
super(rendermanagerIn, new ModelGem(), 0); super(manager, new ModelGem(), 0);
} }
@Override @Override
@ -21,7 +24,7 @@ public class RenderGem extends LivingEntityRenderer<SpellcastEntity, ModelGem> {
} }
@Override @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; return true;
} }
@ -33,6 +36,6 @@ public class RenderGem extends LivingEntityRenderer<SpellcastEntity, ModelGem> {
@Override @Override
protected boolean canRenderName(SpellcastEntity targetEntity) { protected boolean canRenderName(SpellcastEntity targetEntity) {
return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender() return super.canRenderName(targetEntity) && (targetEntity.getAlwaysRenderNameTagForRender()
|| targetEntity.hasCustomName() && targetEntity == renderManager.pointedEntity); || targetEntity.hasCustomName() && targetEntity == renderManager.targetedEntity);
} }
} }

View file

@ -1,13 +1,13 @@
package com.minelittlepony.unicopia.client.render.entity.model; 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 com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.model.Cuboid; import net.minecraft.client.model.Cuboid;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class ButterflyEntityModel extends EntityModel<EntityButterfly> { public class ButterflyEntityModel extends EntityModel<ButterflyEntity> {
private Cuboid body; private Cuboid body;
@ -55,7 +55,7 @@ public class ButterflyEntityModel extends EntityModel<EntityButterfly> {
} }
@Override @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); setAngles(entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale);
@ -67,7 +67,7 @@ public class ButterflyEntityModel extends EntityModel<EntityButterfly> {
} }
@Override @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; float flap = MathHelper.cos(ageInTicks) * (float)Math.PI / 4;

View file

@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.command;
import java.util.List; import java.util.List;
import com.minelittlepony.unicopia.SpeciesList; 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 com.minelittlepony.unicopia.magic.spells.SpellDisguise;
import net.minecraft.command.CommandException; import net.minecraft.command.CommandException;
@ -64,13 +64,13 @@ class CommandDisguise extends Command {
} }
protected Entity constructDisguiseEntity(World world, String[] args) throws CommandException { protected Entity constructDisguiseEntity(World world, String[] args) throws CommandException {
NBTTagCompound nbt = getEntityNBT(args); CompoundTag nbt = getEntityNBT(args);
nbt.setString("id", args[1]); nbt.setString("id", args[1]);
return AnvilChunkLoader.readWorldEntityPos(nbt, world, 0, 0, 0, false); 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) { if (args.length > 2) {
try { try {
return JsonToNBT.getTagFromJson(buildString(args, 2)); return JsonToNBT.getTagFromJson(buildString(args, 2));
@ -79,7 +79,7 @@ class CommandDisguise extends Command {
} }
} }
return new NBTTagCompound(); return new CompoundTag();
} }
@Override @Override

View file

@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.command;
import java.util.List; import java.util.List;
import com.minelittlepony.unicopia.SpeciesList; 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.CommandBase;
import net.minecraft.command.CommandException; import net.minecraft.command.CommandException;

View file

@ -1,7 +1,7 @@
package com.minelittlepony.unicopia.command; package com.minelittlepony.unicopia.command;
import com.minelittlepony.unicopia.SpeciesList; 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.CommandException;
import net.minecraft.command.CommandGameMode; import net.minecraft.command.CommandGameMode;

View file

@ -1,10 +1,7 @@
package com.minelittlepony.unicopia.command; package com.minelittlepony.unicopia.command;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
public class Commands { public class Commands {
public static void bootstrap() {
public static void init(FMLServerStartingEvent event) {
event.registerServerCommand(new CommandOverrideGameMode()); event.registerServerCommand(new CommandOverrideGameMode());
event.registerServerCommand(new CommandSpecies()); event.registerServerCommand(new CommandSpecies());
event.registerServerCommand(new CommandRacelist()); event.registerServerCommand(new CommandRacelist());

View file

@ -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<String> 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<ItemStack> onItemRightClick(World world, PlayerEntity player, EnumHand hand) {
Race race = SpeciesList.instance().getPlayer(player).getSpecies();
if (race.isDefault() || race == Race.CHANGELING) {
return new TypedActionResult<ItemStack>(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));
}
}
}

View file

@ -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;
}
}

View file

@ -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<IRecipe> implements IRecipe {
private final SpellIngredient spellitem;
private final NonNullList<SpellIngredient> ingredients;
static NonNullList<SpellIngredient> parseIngrediants(JsonObject json) {
NonNullList<SpellIngredient> 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<SpellIngredient> 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<SpellIngredient> 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<SpellIngredient> 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<SpellIngredient> getSpellIngredients() {
return ingredients;
}
@Override
public ItemStack getRecipeOutput() {
return spellitem.getStack();
}
@Override
public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) {
NonNullList<ItemStack> remainers = NonNullList.<ItemStack>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;
}
}

View file

@ -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<SpellIngredient> ingredients) {
super(input, ingredients);
this.output = output;
}
@Override
public ItemStack getRecipeOutput() {
return output.getStack();
}
}

View file

@ -5,7 +5,7 @@ import javax.annotation.Nullable;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.annotations.Expose; 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.SpellAffinity;
import com.minelittlepony.unicopia.spell.SpellRegistry; import com.minelittlepony.unicopia.spell.SpellRegistry;
@ -50,8 +50,8 @@ public class SpellCraftingEvent {
@Override @Override
public boolean matches(IPageOwner prop, Event event) { public boolean matches(IPageOwner prop, Event event) {
if (!event.stack.isEmpty() && event.stack.getItem() instanceof ItemSpell) { if (!event.stack.isEmpty() && event.stack.getItem() instanceof MagicGemItem) {
return ((ItemSpell)event.stack.getItem()).getAffinity() == affinity return ((MagicGemItem)event.stack.getItem()).getAffinity() == affinity
&& SpellRegistry.getKeyFromStack(event.stack).equals(spell); && SpellRegistry.getKeyFromStack(event.stack).equals(spell);
} }

View file

@ -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<ItemStack> getStacks();
class Compound implements SpellIngredient {
private final List<SpellIngredient> items;
Compound(List<SpellIngredient> items) {
this.items = items;
}
public Stream<ItemStack> getStacks() {
Stream<ItemStack> stacks = Lists.<ItemStack>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<SpellIngredient> 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<ItemStack> getStacks() {
if (ignoreMeta && !contained.isEmpty()) {
NonNullList<ItemStack> 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;
}
}
}

View file

@ -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<SpellIngredient> 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);
}
}

View file

@ -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<CraftingInventory> {
private final SpellIngredient spellitem;
private final DefaultedList<SpellIngredient> ingredients;
private final Identifier id;
public AbstractSpecialRecipe(Identifier id, SpellIngredient spellitem, DefaultedList<SpellIngredient> 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<SpellIngredient> 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<SpellIngredient> 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<SpellIngredient> getSpellIngredients() {
return ingredients;
}
@Override
public ItemStack getOutput() {
return spellitem.getStack();
}
}

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.enchanting; package com.minelittlepony.unicopia.enchanting.recipe;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;

View file

@ -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<CompoundSpellIngredient> SERIALIZER = new Serializer<CompoundSpellIngredient>() {
@Override
public CompoundSpellIngredient read(JsonElement json) {
JsonArray arr = json.getAsJsonArray();
if (arr.size() > 0) {
List<SpellIngredient> 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<SpellIngredient> items;
CompoundSpellIngredient(List<SpellIngredient> items) {
this.items = items;
}
@Override
public Stream<ItemStack> getStacks() {
Stream<ItemStack> stacks = Lists.<ItemStack>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;
}
}

View file

@ -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<SpellIngredient> SERIALIZER = new Serializer<SpellIngredient>() {
@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<ItemStack> getStacks() {
if (!contained.isEmpty()) {
DefaultedList<ItemStack> 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;
}
}

View file

@ -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<CraftingInventory> 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<SpellIngredient> 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;
}
}

View file

@ -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<SpellIngredient> SERIALIZER = new Serializer<SpellIngredient>() {
@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<SpellIngredient> multiple(JsonObject json) {
DefaultedList<SpellIngredient> 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<ItemStack> getStacks();
Serializer<?> getSerializer();
@SuppressWarnings("unchecked")
default void write(PacketByteBuf buff) {
((Serializer<SpellIngredient>)getSerializer()).write(buff, this);
}
interface Serializer<T> {
T read(JsonElement json);
T read(PacketByteBuf buff);
void write(PacketByteBuf buff, T ingredient);
}
}

View file

@ -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<SpellIngredient> 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<SpellRecipe> {
@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<SpellIngredient> 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<SpellIngredient> ingredients = recipe.getSpellIngredients();
buff.writeInt(ingredients.size());
ingredients.forEach(i -> i.write(buff));
}
}
}

View file

@ -1,8 +1,7 @@
package com.minelittlepony.unicopia.entity.item; package com.minelittlepony.unicopia.entity;
import java.util.UUID; import java.util.UUID;
import com.minelittlepony.unicopia.entity.IMagicals;
import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.Affinity;
import com.minelittlepony.unicopia.magic.ICaster; import com.minelittlepony.unicopia.magic.ICaster;
import com.minelittlepony.unicopia.magic.IMagicEffect; import com.minelittlepony.unicopia.magic.IMagicEffect;
@ -176,7 +175,7 @@ public class AdvancedProjectileEntity extends ThrownItemEntity implements IMagic
} }
if (hasEffect()) { if (hasEffect()) {
if (getEffect().getDead()) { if (getEffect().isDead()) {
remove(); remove();
} else { } else {
getEffect().update(this); getEffect().update(this);

View file

@ -28,21 +28,21 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.biome.Biome.SpawnEntry; import net.minecraft.world.biome.Biome.SpawnEntry;
public class EntityButterfly extends AmbientEntity { public class ButterflyEntity extends AmbientEntity {
public static final EntityType<EntityButterfly> TYPE = EntityType.Builder.create(EntityButterfly::new, EntityCategory.AMBIENT) public static final EntityType<ButterflyEntity> TYPE = EntityType.Builder.create(ButterflyEntity::new, EntityCategory.AMBIENT)
.setDimensions(0.1F, 0.1F) .setDimensions(0.1F, 0.1F)
.build("butterfly"); .build("butterfly");
public static final SpawnEntry SPAWN_ENTRY = new SpawnEntry(TYPE, 15, 9, 15); public static final SpawnEntry SPAWN_ENTRY = new SpawnEntry(TYPE, 15, 9, 15);
private static final TrackedData<Boolean> RESTING = DataTracker.registerData(EntityButterfly.class, TrackedDataHandlerRegistry.BOOLEAN); private static final TrackedData<Boolean> RESTING = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Integer> VARIANT = DataTracker.registerData(EntityButterfly.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> VARIANT = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.INTEGER);
private BlockPos hoveringPosition; private BlockPos hoveringPosition;
public EntityButterfly(EntityType<EntityButterfly> type, World world) { public ButterflyEntity(EntityType<ButterflyEntity> type, World world) {
super(type, world); super(type, world);
setVariaty(Variant.random(world.random)); setVariaty(Variant.random(world.random));
setResting(true); setResting(true);
@ -109,7 +109,7 @@ public class EntityButterfly extends AmbientEntity {
} }
protected boolean isAggressor(Entity e) { protected boolean isAggressor(Entity e) {
if (e instanceof EntityButterfly) { if (e instanceof ButterflyEntity) {
return false; return false;
} }

View file

@ -2,14 +2,18 @@ package com.minelittlepony.unicopia.entity;
import java.util.Map; 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.Race;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.UBlocks; import com.minelittlepony.unicopia.UBlocks;
import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.UItems;
import com.minelittlepony.unicopia.UParticles; 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.Blocks;
import net.minecraft.block.CropBlock; import net.minecraft.block.CropBlock;
import net.minecraft.block.FarmlandBlock; import net.minecraft.block.FarmlandBlock;
@ -18,9 +22,12 @@ import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments; import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityData;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LightningEntity; 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.damage.DamageSource;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData; 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.mob.FlyingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack; 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.particle.ParticleTypes;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap;
import net.minecraft.world.IWorld;
import net.minecraft.world.LocalDifficulty;
import net.minecraft.world.World; 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<Integer> RAINTIMER = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> RAINTIMER = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.INTEGER);
private static final TrackedData<Boolean> THUNDERING = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.BOOLEAN); private static final TrackedData<Boolean> THUNDERING = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Integer> SCALE = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> SCALE = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.INTEGER);
private static final TrackedData<Boolean> STATIONARY = DataTracker.registerData(EntityCloud.class, TrackedDataHandlerRegistry.BOOLEAN); private static final TrackedData<Boolean> STATIONARY = DataTracker.registerData(CloudEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
protected double targetAltitude; protected double targetAltitude;
@ -55,7 +74,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
private final double baseWidth = 3f; private final double baseWidth = 3f;
private final double baseHeight = 0.8f; private final double baseHeight = 0.8f;
public EntityCloud(EntityType<EntityCloud> type, World world) { public CloudEntity(EntityType<? extends CloudEntity> type, World world) {
super(type, world); super(type, world);
ignoreCameraFrustum = true; ignoreCameraFrustum = true;
targetAltitude = getRandomFlyingHeight(); targetAltitude = getRandomFlyingHeight();
@ -80,20 +99,11 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
return SoundEvents.BLOCK_WOOL_BREAK; return SoundEvents.BLOCK_WOOL_BREAK;
} }
@Override // TODO: loot table
/*@Override
protected Item getDropItem() { protected Item getDropItem() {
return UItems.cloud_matter; return UItems.cloud_matter;
} }*/
@Override
protected boolean canTriggerWalking() {
return false;
}
@Override
public boolean doesEntityNotTriggerPressurePlate() {
return true;
}
@Override @Override
public boolean doesRenderOnFire() { public boolean doesRenderOnFire() {
@ -126,28 +136,28 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
@Override @Override
public void onStruckByLightning(EntityLightningBolt lightningBolt) { public void onStruckByLightning(LightningEntity lightningBolt) {
} }
@Override @Override
public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, IEntityLivingData pack) { public EntityData initialize(IWorld world, LocalDifficulty difficulty, SpawnType type, @Nullable EntityData data, @Nullable CompoundTag tag) {
if (world.random.nextInt(20) == 0 && canRainHere()) { if (random.nextInt(20) == 0 && canRainHere()) {
setRaining(); setRaining();
if (world.random.nextInt(20) == 0) { if (random.nextInt(20) == 0) {
setIsThundering(true); setIsThundering(true);
} }
} }
setCloudSize(1 + random.nextInt(4)); setCloudSize(1 + random.nextInt(4));
return super.onInitialSpawn(difficulty, pack); return super.initialize(world, difficulty, type, data, tag);
} }
@Override @Override
protected void collideWithEntity(Entity other) { protected void collideWithEntity(Entity other) {
if (other instanceof EntityCloud || other instanceof PlayerEntity) { if (other instanceof CloudEntity || other instanceof PlayerEntity) {
if (other.posY > posY) { if (other.y > y) {
return; return;
} }
@ -158,16 +168,16 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
@Override @Override
public void applyEntityCollision(Entity other) { public void applyEntityCollision(Entity other) {
if (other instanceof PlayerEntity) { if (other instanceof PlayerEntity) {
if (Predicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)other)) { if (EquinePredicates.INTERACT_WITH_CLOUDS.test((PlayerEntity)other)) {
super.applyEntityCollision(other); super.applyEntityCollision(other);
} }
} else if (other instanceof EntityCloud) { } else if (other instanceof CloudEntity) {
super.applyEntityCollision(other); super.applyEntityCollision(other);
} }
} }
@Override @Override
public void onUpdate() { public void tick() {
Box boundingbox = getBoundingBox(); Box boundingbox = getBoundingBox();
if (getIsRaining()) { if (getIsRaining()) {
@ -175,11 +185,11 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
for (int i = 0; i < 30 * getCloudSize(); i++) { for (int i = 0; i < 30 * getCloudSize(); i++) {
double x = MathHelper.nextDouble(random, boundingbox.minX, boundingbox.maxX); double x = MathHelper.nextDouble(random, boundingbox.minX, boundingbox.maxX);
double y = getBoundingBox().minY + getHeight()/2; 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 Box rainedArea = boundingbox
@ -194,6 +204,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
} }
double width = getDimensions(getPose()).width;
BlockPos pos = getGroundPosition( BlockPos pos = getGroundPosition(
x + random.nextFloat() * width, x + random.nextFloat() * width,
z + 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()); world.setBlockState(pos, Blocks.AIR.getDefaultState());
} }
if (rand.nextInt(20) == 0) { if (random.nextInt(20) == 0) {
BlockPos below = pos.down(); BlockPos below = pos.down();
state = world.getBlockState(below); state = world.getBlockState(below);
if (state.getBlock() != null) { if (state.getBlock() != null) {
if (world.canBlockFreezeWater(below)) { Biome biome = world.getBiome(below);
if (biome.canSetIce(world, below)) {
world.setBlockState(below, Blocks.ICE.getDefaultState()); world.setBlockState(below, Blocks.ICE.getDefaultState());
} }
if (world.canSnowAt(pos, false)) { if (biome.canSetSnow(world, pos)) {
world.setBlockState(pos, Blocks.SNOW.getDefaultState()); world.setBlockState(pos, Blocks.SNOW.getDefaultState());
} }
if (state.getBlock() instanceof FarmlandBlock) { if (state.getBlock() instanceof FarmlandBlock) {
int moisture = state.getValue(FarmlandBlock.MOISTURE); int moisture = state.get(FarmlandBlock.MOISTURE);
if (moisture < 7) { if (moisture < 7) {
world.setBlockState(below, state.with(FarmlandBlock.MOISTURE, moisture + 1)); world.setBlockState(below, state.with(FarmlandBlock.MOISTURE, moisture + 1));
} }
} else if (state.getBlock() instanceof CropBlock) { } else if (state.getBlock() instanceof CropBlock) {
int age = state.getValue(CropBlock.AGE); int age = state.get(CropBlock.AGE);
if (age < 7) { if (age < 7) {
world.setBlockState(below, state.with(CropBlock.AGE, age + 1), 2); 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 (setRainTimer(getRainTimer() - 1) == 0) {
if (!getStationary()) { if (!getStationary()) {
pomf(); spawnHurtParticles();
if (getCloudSize() > 1) { if (getCloudSize() > 1) {
setIsRaining(false); setIsRaining(false);
@ -266,20 +279,20 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
} }
rotationPitch = 0; pitch = 0;
rotationYawHead = 0; headYaw = 0;
rotationYaw = 0; yaw = 0;
for (Entity i : world.getEntitiesInAABBexcluding(this, boundingbox for (Entity i : world.getEntities(this, boundingbox
.grow(1 / (1 + getCloudSize())), Predicates.ENTITY_INTERACT_WITH_CLOUDS)) { .expand(1 / (1 + getCloudSize())), EquinePredicates.ENTITY_INTERACT_WITH_CLOUDS)) {
if (i.posY > posY + 0.5) { if (i.y > y + 0.5) {
applyGravityCompensation(i); applyGravityCompensation(i);
} }
} }
if (isBurning() && !dead) { if (isOnFire() && !dead) {
for (int i = 0; i < 5; i++) { 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.minX, boundingbox.maxX),
MathHelper.nextDouble(random, boundingbox.minY, boundingbox.maxY), MathHelper.nextDouble(random, boundingbox.minY, boundingbox.maxY),
MathHelper.nextDouble(random, boundingbox.minZ, boundingbox.maxZ), 0, 0.25, 0); 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); setVelocity(0, 0, 0);
} }
super.onUpdate(); super.tick();
double motionFactor = (1 + getCloudSize() / 4); double motionFactor = (1 + getCloudSize() / 4);
motionX /= motionFactor; Vec3d vel = this.getVelocity();
motionZ /= motionFactor; this.setVelocity(vel.x / motionFactor, vel.y, vel.z / motionFactor);
hurtTime = 0; hurtTime = 0;
} }
@Override @Override
public double getMountedYOffset() { public double getMountedHeightOffset() {
return getEntityBoundingBox().maxY - getEntityBoundingBox().minY - 0.25; return getBoundingBox().maxY - getBoundingBox().minY - 0.25;
} }
@Override @Override
public void moveRelative(float strafe, float up, float forward, float friction) { public void travel(Vec3d motion) {
if (!getStationary()) { if (!getStationary()) {
super.moveRelative(strafe, up, forward, friction); super.travel(motion);
} }
} }
@Override @Override
public void onCollideWithPlayer(PlayerEntity player) { public void onPlayerCollision(PlayerEntity player) {
if (player.posY >= posY) { if (player.y >= y) {
if (applyGravityCompensation(player)) { if (applyGravityCompensation(player)) {
double difX = player.posX - player.lastTickPosX; double difX = player.x - player.prevX;
double difZ = player.posZ - player.lastTickPosZ; double difZ = player.z - player.prevZ;
double difY = player.posY - player.lastTickPosY; double difY = player.y - player.prevY;
player.distanceWalkedModified = (float)(player.distanceWalkedModified + MathHelper.sqrt(difX * difX + difZ * difZ) * 0.6); player.horizontalSpeed = (float)(player.horizontalSpeed + MathHelper.sqrt(difX * difX + difZ * difZ) * 0.6);
player.distanceWalkedOnStepModified = (float)(player.distanceWalkedOnStepModified + MathHelper.sqrt(difX * difX + difY * difY + 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()) { if (SpeciesList.instance().getPlayer(player).stepOnCloud()) {
SoundType soundtype = SoundType.CLOTH; BlockSoundGroup soundtype = BlockSoundGroup.WOOL;
player.playSound(soundtype.getStepSound(), soundtype.getVolume() * 0.15F, soundtype.getPitch()); player.playSound(soundtype.getStepSound(), soundtype.getVolume() * 0.15F, soundtype.getPitch());
} }
} }
} }
super.onCollideWithPlayer(player); super.onPlayerCollision(player);
} }
@Override @Override
@ -352,8 +366,9 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
distance = 0; distance = 0;
} }
getVelocity().y -= 0.002; Vec3d vel = getVelocity();
getVelocity().y += (Math.signum(distance) * 0.699999988079071D - getVelocity().y) * 0.10000000149011612D;
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() { protected float getMinimumFlyingHeight() {
float ground = world.getDimension().getAverageGroundLevel(); float ground = world.getBiome(getBlockPos()).getDepth();
float cloud = world.getDimension().getCloudHeight(); float cloud = world.getDimension().getCloudHeight();
float min = Math.min(ground, cloud); float min = Math.min(ground, cloud);
@ -384,12 +399,8 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
@Override @Override
public void handleStatus(byte type) { public void handleStatus(byte type) {
if (type == 2) { if (type == 2 && !isOnFire()) {
if (!isOnFire()) { spawnHurtParticles();
for (int i = 0; i < 50 * getCloudSize(); i++) {
ParticleTypeRegistry.getTnstance().getEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState());
}
}
} }
super.handleStatus(type); 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++) { 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); playHurtSound(DamageSource.GENERIC);
} }
@ -423,33 +433,31 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
Entity attacker = source.getAttacker(); Entity attacker = source.getAttacker();
if (attacker instanceof PlayerEntity) { 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); 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(); ItemStack stack = player.getMainHandStack();
boolean canFly = EnchantmentHelper.getEnchantments(stack).containsKey(Enchantments.FEATHER_FALLING) boolean canFly = EnchantmentHelper.getEnchantments(stack).containsKey(Enchantments.FEATHER_FALLING)
|| Predicates.INTERACT_WITH_CLOUDS.test(player); || EquinePredicates.INTERACT_WITH_CLOUDS.test(player);
boolean stat = getStationary(); boolean stat = getStationary();
if (stat || canFly) { if (stat || canFly) {
if (!isOnFire()) { if (!isOnFire()) {
for (int i = 0; i < 50 * getCloudSize(); i++) { spawnHurtParticles();
ParticleTypeRegistry.getTnstance().getEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState());
}
} }
if (stack != null && stack.getItem() instanceof ItemSword) { if (stack != null && stack.getItem() instanceof SwordItem) {
return super.attackEntityFrom(source, amount); return super.damage(source, amount);
} else if (stack != null && stack.getItem() instanceof ItemSpade) { } else if (stack != null && stack.getItem() instanceof ShovelItem) {
return super.attackEntityFrom(source, amount * 1.5f); return super.damage(source, amount * 1.5f);
} else if (canFly) { } else if (canFly) {
if (player.y < y || !world.isAirBlock(getPosition())) { if (player.y < y || !world.isAir(getBlockPos())) {
targetAltitude = y + 5; targetAltitude = y + 5;
} else if (player.y > y) { } else if (player.y > y) {
targetAltitude = y - 5; targetAltitude = y - 5;
@ -475,89 +483,95 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
clearItemFloatingState(); clearItemFloatingState();
} }
@FUF(reason = "There is no TickEvent.EntityTickEvent. Waiting on mixins...") //@FUF(reason = "There is no TickEvent.EntityTickEvent. Waiting on mixins...")
protected void clearItemFloatingState() { 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); i.setNoGravity(false);
} }
} }
private boolean entityIsFloatingItem(Entity e) { private boolean entityIsFloatingItem(Entity e) {
return e instanceof ItemEntity return e instanceof ItemEntity
&& Predicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e); && EquinePredicates.ITEM_INTERACT_WITH_CLOUDS.test((ItemEntity)e);
} }
@Override @Override
protected void dropFewItems(boolean hitByPlayer, int looting) { protected void dropEquipment(DamageSource source, int looting, boolean hitByPlayer) {
if (hitByPlayer) { if (hitByPlayer) {
Item item = getDropItem(); int amount = 13 + world.random.nextInt(3);
int amount = 13 + world.rand.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); dropItem(UItems.dew_drop, 3 + looting);
} }
} }
} }
@Override @Override
public EntityItem entityDropItem(ItemStack stack, float offsetY) { public ItemEntity dropItem(ItemConvertible stack, int amount) {
EntityItem item = super.entityDropItem(stack, offsetY); ItemEntity item = super.dropItem(stack, amount);
SpeciesList.instance().getEntity(item).setSpecies(Race.PEGASUS); SpeciesList.instance().getEntity(item).setSpecies(Race.PEGASUS);
item.setNoGravity(true); item.setNoGravity(true);
item.motionY = 0; item.setVelocity(0, 0, 0);
return item; return item;
} }
@Override @Override
public void readEntityFromNBT(NBTTagCompound tag) { public void readCustomDataFromTag(CompoundTag tag) {
super.readEntityFromNBT(tag); super.readCustomDataFromTag(tag);
setRainTimer(tag.getInteger("RainTimer")); setRainTimer(tag.getInt("RainTimer"));
setIsThundering(tag.getBoolean("IsThundering")); setIsThundering(tag.getBoolean("IsThundering"));
setCloudSize(tag.getByte("CloudSize")); setCloudSize(tag.getByte("CloudSize"));
setStationary(tag.getBoolean("IsStationary")); setStationary(tag.getBoolean("IsStationary"));
} }
@Override @Override
public void writeEntityToNBT(NBTTagCompound tag) { public void writeCustomDataToTag(CompoundTag tag) {
super.writeEntityToNBT(tag); super.writeCustomDataToTag(tag);
tag.setInteger("RainTimer", getRainTimer()); tag.putInt("RainTimer", getRainTimer());
tag.setBoolean("IsThundering", getIsThundering()); tag.putBoolean("IsThundering", getIsThundering());
tag.setByte("CloudSize", (byte)getCloudSize()); tag.putByte("CloudSize", (byte)getCloudSize());
tag.setBoolean("IsStationary", getStationary()); tag.putBoolean("IsStationary", getStationary());
} }
protected boolean applyGravityCompensation(Entity entity) { protected boolean applyGravityCompensation(Entity entity) {
int floatStrength = getFloatStrength(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; double boundModifier = entity.fallDistance > 80 ? 80 : MathHelper.floor(entity.fallDistance * 10) / 10;
entity.onGround = true; 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()) { 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) { if (!getStationary() && motionY > 0.4 && world.random.nextInt(900) == 0) {
spawnThunderbolt(getPosition()); spawnThunderbolt(getBlockPos());
} }
// @FUF(reason = "There is no TickEvents.EntityTickEvent. Waiting on mixins...") // @FUF(reason = "There is no TickEvents.EntityTickEvent. Waiting on mixins...")
if (getStationary() && entity instanceof EntityItem) { if (getStationary() && entity instanceof ItemEntity) {
entity.motionX /= 8; motionX /= 8;
entity.motionZ /= 8; motionZ /= 8;
entity.motionY /= 16; motionY /= 16;
entity.setNoGravity(true); entity.setNoGravity(true);
} }
entity.setVelocity(motionX, motionY, motionZ);
return true; return true;
} }
@ -566,13 +580,13 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
@Override @Override
public void move(MoverType type, double x, double y, double z) { public void move(MovementType type, Vec3d delta) {
setEntityBoundingBox(getEntityBoundingBox().offset(x, y, z)); setBoundingBox(getBoundingBox().offset(delta));
resetPositionToBB(); moveToBoundingBoxCenter();
} }
public int getFloatStrength(Entity entity) { public int getFloatStrength(Entity entity) {
if (Predicates.ENTITY_INTERACT_WITH_CLOUDS.test(entity)) { if (EquinePredicates.ENTITY_INTERACT_WITH_CLOUDS.test(entity)) {
return 3; return 3;
} }
@ -596,7 +610,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
private boolean canRainHere() { private boolean canRainHere() {
return world.getBiome(getBlockPos()).canRain(); return world.getBiome(getBlockPos()).getRainfall() > 0;
} }
private boolean canSnowHere(BlockPos pos) { private boolean canSnowHere(BlockPos pos) {
@ -608,16 +622,18 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
} }
public void spawnThunderbolt(BlockPos pos) { 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) { private BlockPos getGroundPosition(double x, double z) {
BlockPos pos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, new BlockPos(x, y, z)); BlockPos pos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, new BlockPos(x, y, z));
if (pos.getY() >= posY) { if (pos.getY() >= y) {
while (world.isValid(pos)) { while (World.isValid(pos)) {
pos = pos.down(); pos = pos.down();
if (world.getBlockState(pos).isSideSolid(world, pos, Direction.UP)) { if (world.getBlockState(pos).hasSolidTopSurface(world, pos, this)) {
return pos.up(); return pos.up();
} }
} }
@ -686,7 +702,7 @@ public class EntityCloud extends FlyingEntity implements ICloudEntity, IAnimals,
protected void setSize(float width, float height) { protected void setSize(float width, float height) {
if (width != this.width || height != this.height) { if (width != this.width || height != this.height) {
super.setSize(width, height); super.setSize(width, height);
setPosition(posX, posY, posZ); setPosition(x, y, z);
} }
} }

View file

@ -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<ConstructionCloudEntity> 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);
}
}
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -5,39 +5,43 @@ import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.google.common.collect.Lists; 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.Race;
import com.minelittlepony.unicopia.UParticles; import com.minelittlepony.unicopia.UParticles;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.IPower; import com.minelittlepony.unicopia.ability.IPower;
import com.minelittlepony.unicopia.particles.ParticleEmitter;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity; 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.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.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.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.datasync.TrackedData; import net.minecraft.particle.BlockStateParticleEffect;
import net.minecraft.network.datasync.TrackedDataHandlerRegistry; import net.minecraft.particle.ParticleTypes;
import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.sound.SoundEvent;
import net.minecraft.potion.PotionEffect; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.DamageSource; import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult; import net.minecraft.util.Arm;
import net.minecraft.util.EnumHand; import net.minecraft.util.Hand;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.GameRules;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.event.ForgeEventFactory;
public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate { public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate {
@ -47,12 +51,10 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
private boolean captiveLastSneakState; private boolean captiveLastSneakState;
public EntityCuccoon(World world) { public EntityCuccoon(EntityType<EntityCuccoon> type, World world) {
super(world); super(type, world);
setSize(0.6f, 0.6f); //width = 1.5F;
//height = 1.6F;
width = 1.5F;
height = 1.6F;
} }
@Override @Override
@ -62,11 +64,11 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
} }
public int getStruggleCount() { public int getStruggleCount() {
return getDataManager().get(STRUGGLE_COUNT) % 6; return getDataTracker().get(STRUGGLE_COUNT) % 6;
} }
public void setStruggleCount(int count) { public void setStruggleCount(int count) {
getDataManager().set(STRUGGLE_COUNT, count % 6); getDataTracker().set(STRUGGLE_COUNT, count % 6);
} }
@Override @Override
@ -81,50 +83,40 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
} }
@Override @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; amount = 0;
} }
return super.attackEntityFrom(source, amount); return super.damage(source, amount);
} }
@Override @Override
protected boolean canBeRidden(Entity entity) { protected boolean canAddPassenger(Entity entity) {
return super.canBeRidden(entity) return super.canAddPassenger(entity)
&& !entity.isSneaking() && !entity.isSneaking()
&& !isBeingRidden() && !hasPassengers()
&& entity instanceof LivingEntity && entity instanceof LivingEntity
&& !Predicates.BUGGY.test(entity); && !EquinePredicates.BUGGY.test(entity);
} }
@Override @Override
public boolean canRenderOnFire() { public boolean doesRenderOnFire() {
return false; return false;
} }
@Override @Override
protected boolean canTriggerWalking() { public double getMountedHeightOffset() {
return false;
}
@Override
public double getMountedYOffset() {
return 0; return 0;
} }
@Override @Override
public boolean canPassengerSteer() { public void tick() {
return false; super.tick();
}
@Override if (hasPassengers()) {
public void onUpdate() { Entity passenger = getPrimaryPassenger();
super.onUpdate();
if (isBeingRidden()) {
Entity passenger = getPassengers().get(0);
boolean sneaking = passenger.isSneaking(); boolean sneaking = passenger.isSneaking();
@ -137,76 +129,75 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
if (passenger instanceof LivingEntity) { if (passenger instanceof LivingEntity) {
LivingEntity living = (LivingEntity)passenger; LivingEntity living = (LivingEntity)passenger;
if (!living.isPotionActive(MobEffects.REGENERATION) && living.getHealth() < living.getMaxHealth()) { if (!living.hasStatusEffect(StatusEffects.REGENERATION) && living.getHealth() < living.getHealthMaximum()) {
living.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 20, 2)); living.addPotionEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 20, 2));
} }
if (!living.isPotionActive(MobEffects.SLOWNESS) && living.getHealth() < living.getMaxHealth()) { if (!living.hasStatusEffect(StatusEffects.SLOWNESS) && living.getHealth() < living.getHealthMaximum()) {
living.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 2000, 4)); living.addPotionEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 2000, 4));
} }
} }
} }
if (world.isClient) { if (world.isClient) {
double x = posX + width * world.rand.nextFloat() - width/2; double x = this.x + width * random.nextFloat() - width/2;
double y = posY + height * world.rand.nextFloat(); double y = this.y + height * random.nextFloat();
double z = posZ + width * world.rand.nextFloat() - width/2; 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 @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()) { if (hasPassengers()) {
Entity passenger = getPassengers().get(0); 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); DamageSource d = MagicalDamageSource.causePlayerDamage("feed", player);
IPower.spawnParticles(UParticles.CHANGELING_MAGIC, this, 7); IPower.spawnParticles(UParticles.CHANGELING_MAGIC, this, 7);
if (passenger instanceof LivingEntity) { if (passenger instanceof LivingEntity) {
if (player.isPotionActive(MobEffects.NAUSEA)) { if (player.hasStatusEffect(StatusEffects.NAUSEA)) {
((LivingEntity)passenger).addPotionEffect(player.removeActivePotionEffect(MobEffects.NAUSEA)); ((LivingEntity)passenger).addPotionEffect(player.removePotionEffect(StatusEffects.NAUSEA));
} else if (world.rand.nextInt(2300) == 0) { } else if (random.nextInt(2300) == 0) {
((LivingEntity)passenger).addPotionEffect(new PotionEffect(MobEffects.WITHER, 20, 1)); ((LivingEntity)passenger).addPotionEffect(new StatusEffectInstance(StatusEffects.WITHER, 20, 1));
} }
} }
if (passenger instanceof PlayerEntity) { if (passenger instanceof PlayerEntity) {
if (!player.isPotionActive(MobEffects.HEALTH_BOOST)) { if (!player.hasStatusEffect(StatusEffects.HEALTH_BOOST)) {
player.addPotionEffect(new PotionEffect(MobEffects.HEALTH_BOOST, 13000, 1)); player.addPotionEffect(new StatusEffectInstance(StatusEffects.HEALTH_BOOST, 13000, 1));
} }
} }
passenger.attackEntityFrom(d, 5); passenger.damage(d, 5);
if (player.canEat(false)) { if (player.canConsume(false)) {
player.getFoodStats().addStats(5, 0); player.getHungerManager().add(5, 0);
} else { } else {
player.heal(5); 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) { public float getBreatheAmount(float stutter) {
return MathHelper.sin((ticksExisted + stutter) / 40) / 2 return MathHelper.sin((age + stutter) / 40) / 2
+ hurtTime / 10F; + hurtTime / 10F;
} }
@Override @Override
public boolean attackable() { public boolean isAttackable() {
return false; return false;
} }
@ -214,23 +205,13 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
if (captive.isSneaking() != captiveLastSneakState) { if (captive.isSneaking() != captiveLastSneakState) {
setStruggleCount(getStruggleCount() + 1); setStruggleCount(getStruggleCount() + 1);
for (int k = 0; k < 20; k++) { spawnSlimeParticles();
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()));
}
captive.playSound(USounds.SLIME_RETRACT, 1, 1); captive.playSound(USounds.SLIME_RETRACT, 1, 1);
this.hurtTime += 15; this.hurtTime += 15;
if (getStruggleCount() == 0) { if (getStruggleCount() == 0) {
setDead(); remove();
return true; return true;
} }
@ -239,47 +220,53 @@ public class EntityCuccoon extends LivingEntity implements IMagicals, IInAnimate
return false; return false;
} }
private void spawnSlimeParticles() {
EntityDimensions dims = getDimensions(getPose());
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;
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 @Override
protected void onDeathUpdate() { protected void onDeathUpdate() {
if (++deathTime == 20) { if (++deathTime == 20) {
if (!world.isClient && (isPlayer() || recentlyHit > 0 && canDropLoot() && world.getGameRules().getBoolean("doMobLoot"))) { if (!world.isClient && lastAttackedTicks > 0 && canDropLootAndXp() && world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
int i = ForgeEventFactory.getExperienceDrop(this, attackingPlayer, getExperiencePoints(attackingPlayer)); int i = getCurrentExperience(attackingPlayer);
while (i > 0) { while (i > 0) {
int j = EntityXPOrb.getXPSplit(i); int j = ExperienceOrbEntity.roundToOrbSize(i);
i -= j; i -= j;
world.spawnEntity(new EntityXPOrb(world, posX, posY, posZ, j)); world.spawnEntity(new ExperienceOrbEntity(world, x, y, z, j));
} }
this.dismountRidingEntity(); removeAllPassengers();
} }
setDead(); remove();
spawnSlimeParticles();
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()));
}
} }
} }
@Override
@Nullable @Nullable
public Box getCollisionBox(Entity entity) { public Box getHardCollisionBox(Entity entity) {
return entity.canBeCollidedWith() ? entity.getEntityBoundingBox() : null; return entity.collides() ? entity.getBoundingBox() : null;
} }
@Nullable @Nullable
public Box getCollisionBoundingBox() { public Box getCollisionBoundingBox() {
return getEntityBoundingBox().shrink(0.2); return getBoundingBox().contract(0.2);
} }
@Override @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 @Override
public boolean canInteract(Race race) { public boolean canInteract(Race race) {
return race == Race.CHANGELING; return race == Race.CHANGELING;
} }
@Override @Override
public Iterable<ItemStack> getArmorInventoryList() { public Iterable<ItemStack> getArmorItems() {
return armour; return armour;
} }
@Override @Override
public ItemStack getItemStackFromSlot(EntityEquipmentSlot slotIn) { public ItemStack getEquippedStack(EquipmentSlot slot) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override @Override
public void setItemStackToSlot(EntityEquipmentSlot slotIn, ItemStack stack) { public void setEquippedStack(EquipmentSlot slot, ItemStack stack) {
} }
@Override @Override
public EnumHandSide getPrimaryHand() { public Arm getMainArm() {
return EnumHandSide.LEFT; return Arm.LEFT;
} }
} }

View file

@ -28,7 +28,7 @@ public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwn
@Nullable @Nullable
protected NetworkPlayerInfo getPlayerInfo() { protected NetworkPlayerInfo getPlayerInfo() {
if (playerInfo == null) { if (playerInfo == null) {
NetHandlerPlayClient connection = MinecraftClient.getInstance().getConnection(); NetHandlerPlayClient connection = MinecraftClient.instance().getConnection();
playerInfo = connection.getPlayerInfo(getGameProfile().getId()); playerInfo = connection.getPlayerInfo(getGameProfile().getId());

View file

@ -4,20 +4,19 @@ import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.EquinePredicates;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; 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.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
public class EntityRacingCloud extends EntityCloud { public class EntityRacingCloud extends CloudEntity {
public EntityRacingCloud(World world) { public EntityRacingCloud(EntityType<EntityRacingCloud> type, World world) {
super(world); super(type, world);
setCloudSize(1); setCloudSize(1);
} }
@ -41,7 +40,7 @@ public class EntityRacingCloud extends EntityCloud {
@Override @Override
public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) { public EnumActionResult applyPlayerInteraction(PlayerEntity player, Vec3d vec, EnumHand hand) {
if (!(isBeingRidden() || isRidingOrBeingRiddenBy(player)) && hand == EnumHand.MAIN_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()) { if (!getStationary()) {
player.startRiding(this); player.startRiding(this);
return EnumActionResult.SUCCESS; return EnumActionResult.SUCCESS;

View file

@ -5,6 +5,7 @@ import com.minelittlepony.util.MagicalDamageSource;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedData;
@ -24,8 +25,8 @@ public class EntitySpear extends ArrowEntity implements IAdvancedProjectile {
private static final TrackedData<Integer> KNOCKBACK = DataTracker.registerData(EntitySpear.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> KNOCKBACK = DataTracker.registerData(EntitySpear.class, TrackedDataHandlerRegistry.INTEGER);
public EntitySpear(World world) { public EntitySpear(EntityType<EntitySpear> type, World world) {
super(world); super(type, world);
} }
public EntitySpear(World world, double x, double y, double z) { public EntitySpear(World world, double x, double y, double z) {

View file

@ -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<Boolean> OPENED = DataTracker.registerData(EntitySpellbook.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Boolean> ALTERED = DataTracker.registerData(EntitySpellbook.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Byte> 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);
}
}

View file

@ -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<Entity> i : chunk.getEntityLists()) {
Iterator<EntityCloud> 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();
}
}
}

View file

@ -1,26 +1,29 @@
package com.minelittlepony.unicopia.entity; package com.minelittlepony.unicopia.entity;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UEntities;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.packet.EntitySpawnGlobalS2CPacket; import net.minecraft.client.network.packet.EntitySpawnGlobalS2CPacket;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SpawnType;
import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.mob.MobEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.NetworkThreadUtils; import net.minecraft.network.NetworkThreadUtils;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.util.ThreadExecutor;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.IWorld;
import net.minecraft.world.World; 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; private int ticksAlive;
@ -32,33 +35,23 @@ public class EntityRainbow extends Entity implements IInAnimate {
public static final Box SPAWN_COLLISSION_RADIUS = new Box( 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,
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<RainbowEntity> type, World world) {
super(type, world);
public EntityRainbow(World world) { float yaw = (int)MathHelper.nextDouble(random, 0, 360);
this(world, 0, 0, 0);
}
public EntityRainbow(World world, double x, double y, double z) { setPositionAndAngles(0, 0, 0, yaw, 0);
super(world);
float yaw = (int)MathHelper.nextDouble((world == null ? rand : world.random), 0, 360); radius = MathHelper.nextDouble(random, RAINBOW_MIN_SIZE, RAINBOW_MAX_SIZE);
setLocationAndAngles(x, y, z, yaw, 0);
radius = MathHelper.nextDouble(world == null ? rand : world.random, RAINBOW_MIN_SIZE, RAINBOW_MAX_SIZE);
ticksAlive = 10000; ticksAlive = 10000;
ignoreFrustumCheck = true; ignoreCameraFrustum = true;
width = (float)radius; //width = (float)radius;
height = width; //height = width;
}
@Override
public boolean shouldRenderInPass(int pass) {
return pass == 1;
} }
@Override @Override
@ -68,10 +61,11 @@ public class EntityRainbow extends Entity implements IInAnimate {
@Override @Override
public void setPosition(double x, double y, double z) { public void setPosition(double x, double y, double z) {
posX = x; this.x = x;
posY = y; this.y = y;
posZ = z; this.z = z;
float width = getDimensions(getPose()).width;
setBoundingBox(new Box( setBoundingBox(new Box(
x - width, y - radius/2, z, x - width, y - radius/2, z,
x + width, y + radius/2, z x + width, y + radius/2, z
@ -84,7 +78,7 @@ public class EntityRainbow extends Entity implements IInAnimate {
} }
@Override @Override
public boolean isInRangeToRenderDist(double distance) { public boolean shouldRenderAtDistance(double distance) {
return true; return true;
} }
@ -101,10 +95,10 @@ public class EntityRainbow extends Entity implements IInAnimate {
} }
if (!removed) { 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(RainbowEntity.class, bounds).forEach(this::attackCompetitor);
world.getEntities(EntityRainbow.Spawner.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 static class Spawner extends MobEntity {
public Spawner(World worldIn) { public Spawner(EntityType<Spawner> type, World world) {
super(worldIn); super(type, world);
this.setInvisible(true); this.setInvisible(true);
} }
@Override @Override
public boolean getCanSpawnHere() { public boolean canSpawn(IWorld world, SpawnType type) {
Box bounds = SPAWN_COLLISSION_RADIUS.offset(getPos()); Box bounds = SPAWN_COLLISSION_RADIUS.offset(getPos());
return super.getCanSpawnHere() return super.canSpawn(world, type)
&& world.getEntities(EntityRainbow.class, bounds).isEmpty() && world.getEntities(RainbowEntity.class, bounds).isEmpty()
&& world.getEntities(EntityRainbow.Spawner.class, bounds).isEmpty(); && world.getEntities(RainbowEntity.Spawner.class, bounds).isEmpty();
} }
@Override @Override
public int getMaxSpawnedInChunk() { public int getLimitPerChunk() {
return 1; return 1;
} }
@ -162,14 +157,14 @@ public class EntityRainbow extends Entity implements IInAnimate {
} }
public void trySpawnRainbow() { public void trySpawnRainbow() {
EntityRainbow rainbow = new EntityRainbow(world); RainbowEntity rainbow = UEntities.RAINBOW.create(world);
rainbow.setPosition(x, y, z); rainbow.setPosition(x, y, z);
world.spawnEntity(rainbow); world.spawnEntity(rainbow);
} }
} }
static class SpawnPacket extends EntitySpawnGlobalS2CPacket { static class SpawnPacket extends EntitySpawnGlobalS2CPacket {
public SpawnPacket(EntityRainbow entity) { public SpawnPacket(RainbowEntity entity) {
super(entity); super(entity);
} }

View file

@ -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<Boolean> OPENED = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Boolean> ALTERED = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Byte> OPENED_USER = DataTracker.registerData(SpellbookEntity.class, TrackedDataHandlerRegistry.BYTE);
public SpellbookEntity(EntityType<SpellbookEntity> 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);
}*/
}

View file

@ -7,7 +7,7 @@ import javax.annotation.Nullable;
import org.apache.commons.lang3.StringUtils; 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.Race;
import com.minelittlepony.unicopia.UItems; import com.minelittlepony.unicopia.UItems;
import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.Affinity;
@ -41,6 +41,7 @@ import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
@ -49,10 +50,6 @@ import net.minecraft.world.explosion.Explosion.DestructionType;
public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICaster<LivingEntity>, IInAnimate { public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICaster<LivingEntity>, IInAnimate {
public static EntityType<SpellcastEntity> TYPE = EntityType.Builder.create(SpellcastEntity::new, EntityCategory.MISC)
.setDimensions(0.6F, 0.25F)
.build("spell");
private LivingEntity owner = null; private LivingEntity owner = null;
public float hoverStart; public float hoverStart;
@ -136,20 +133,16 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast
dataTracker.startTracking(AFFINITY, Affinity.NEUTRAL.ordinal()); dataTracker.startTracking(AFFINITY, Affinity.NEUTRAL.ordinal());
} }
@Override // TODO:
public ItemStack getPickedResult(RayTraceResult target) { /*@Override
public ItemStack getPickedStack(HitResult target) {
return SpellRegistry.instance().enchantStack(new ItemStack(getItem()), getEffect().getName()); return SpellRegistry.instance().enchantStack(new ItemStack(getItem()), getEffect().getName());
} }*/
protected Item getItem() { protected Item getItem() {
return getAffinity() == Affinity.BAD ? UItems.curse : UItems.spell; return getAffinity() == Affinity.BAD ? UItems.curse : UItems.spell;
} }
@Override
protected boolean canTriggerWalking() {
return false;
}
@Override @Override
public boolean isPushable() { public boolean isPushable() {
return false; return false;
@ -206,7 +199,7 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast
if (!hasEffect()) { if (!hasEffect()) {
remove(); remove();
} else { } else {
if (getEffect().getDead()) { if (getEffect().isDead()) {
remove(); remove();
onDeath(); onDeath();
} else { } else {
@ -288,7 +281,7 @@ public class SpellcastEntity extends MobEntityWithAi implements IMagicals, ICast
@Override @Override
public ActionResult interactAt(PlayerEntity player, Vec3d vec, Hand hand) { 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); ItemStack currentItem = player.getStackInHand(Hand.MAIN_HAND);
if (currentItem != null if (currentItem != null

View file

@ -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<WildCloudEntity> 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<Entity> i : chunk.getEntitySectionArray()) {
Iterator<CloudEntity> 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();
}
}
}

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -7,7 +7,7 @@ import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.IAbilityReceiver; import com.minelittlepony.unicopia.ability.IAbilityReceiver;
import com.minelittlepony.unicopia.ability.IData; import com.minelittlepony.unicopia.ability.IData;
import com.minelittlepony.unicopia.ability.IPower; 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.entity.IUpdatable;
import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.unicopia.network.MsgPlayerAbility;
import com.minelittlepony.util.InbtSerialisable; import com.minelittlepony.util.InbtSerialisable;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.ai; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.EnumSet; import java.util.EnumSet;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.Random; import java.util.Random;
@ -60,7 +60,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable
if (player.hasEffect()) { if (player.hasEffect()) {
IMagicEffect effect = player.getEffect(); IMagicEffect effect = player.getEffect();
if (!effect.getDead() && effect instanceof IFlyingPredicate) { if (!effect.isDead() && effect instanceof IFlyingPredicate) {
return ((IFlyingPredicate)effect).checkCanFly(player); return ((IFlyingPredicate)effect).checkCanFly(player);
} }
} }
@ -76,7 +76,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable
public float getTargetEyeHeight(IPlayer player) { public float getTargetEyeHeight(IPlayer player) {
if (player.hasEffect()) { if (player.hasEffect()) {
IMagicEffect effect = player.getEffect(); IMagicEffect effect = player.getEffect();
if (!effect.getDead() && effect instanceof IHeightPredicate) { if (!effect.isDead() && effect instanceof IHeightPredicate) {
float val = ((IHeightPredicate)effect).getTargetEyeHeight(player); float val = ((IHeightPredicate)effect).getTargetEyeHeight(player);
if (val > 0) { if (val > 0) {
return val; return val;
@ -95,7 +95,7 @@ class GravityDelegate implements IUpdatable, IGravity, IFlight, InbtSerialisable
public float getTargetBodyHeight(IPlayer player) { public float getTargetBodyHeight(IPlayer player) {
if (player.hasEffect()) { if (player.hasEffect()) {
IMagicEffect effect = player.getEffect(); IMagicEffect effect = player.getEffect();
if (!effect.getDead() && effect instanceof IHeightPredicate) { if (!effect.isDead() && effect instanceof IHeightPredicate) {
float val = ((IHeightPredicate)effect).getTargetBodyHeight(player); float val = ((IHeightPredicate)effect).getTargetBodyHeight(player);
if (val > 0) { if (val > 0) {
return val; return val;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
public interface ICamera { public interface ICamera {
float calculateRoll(); float calculateRoll();

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.UUID; import java.util.UUID;
@ -137,7 +137,7 @@ public interface IPlayer extends ICaster<PlayerEntity>, IRaceContainer<PlayerEnt
static PlayerEntity fromServer(UUID playerId) { static PlayerEntity fromServer(UUID playerId) {
MinecraftServer server = FMLCommonHandler.getInstance().getMinecraftServerInstance(); MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
if (server == null) { if (server == null) {
return UClient.instance().getPlayerByUUID(playerId); return UClient.instance().getPlayerByUUID(playerId);

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.item; package com.minelittlepony.unicopia.entity.capabilities;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.entity.IOwned; import com.minelittlepony.unicopia.entity.IOwned;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.living; package com.minelittlepony.unicopia.entity.capabilities;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.entity.IRaceContainer; import com.minelittlepony.unicopia.entity.IRaceContainer;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.UUID; import java.util.UUID;

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
class PlayerCamera extends MotionCompositor implements ICamera { class PlayerCamera extends MotionCompositor implements ICamera {

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -306,7 +306,7 @@ public class PlayerCapabilities implements IPlayer {
public boolean onProjectileImpact(ProjectileEntity projectile) { public boolean onProjectileImpact(ProjectileEntity projectile) {
if (hasEffect()) { if (hasEffect()) {
IMagicEffect effect = getEffect(); IMagicEffect effect = getEffect();
if (effect instanceof SpellDisguise && !effect.getDead()) { if (effect instanceof SpellDisguise && !effect.isDead()) {
if (((SpellDisguise)effect).getDisguise() == projectile) { if (((SpellDisguise)effect).getDisguise() == projectile) {
return true; return true;
} }
@ -379,16 +379,16 @@ public class PlayerCapabilities implements IPlayer {
player.getHungerManager().add(-health/2, -saturation/2); player.getHungerManager().add(-health/2, -saturation/2);
player.addPotionEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 100, 3, true, true)); player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.NAUSEA, 100, 3, true, true));
} else { } else {
player.addPotionEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 3, true, true)); player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 3, true, true));
} }
if (player.world.getDifficulty() != Difficulty.PEACEFUL && player.world.random.nextInt(20) == 0) { if (player.world.getDifficulty() != Difficulty.PEACEFUL && player.world.random.nextInt(20) == 0) {
player.addPotionEffect(new StatusEffectInstance(UEffects.FOOD_POISONING, 3, 2, true, true)); player.addStatusEffectInstance(new StatusEffectInstance(UEffects.FOOD_POISONING, 3, 2, true, true));
} }
player.addPotionEffect(new StatusEffectInstance(StatusEffects.WEAKNESS, 2000, 2, true, true)); player.addStatusEffectInstance(new StatusEffectInstance(StatusEffects.WEAKNESS, 2000, 2, true, true));
} }
} }

View file

@ -1,4 +1,4 @@
package com.minelittlepony.unicopia.entity.player; package com.minelittlepony.unicopia.entity.capabilities;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;

View file

@ -1,40 +0,0 @@
package com.minelittlepony.unicopia.forgebullshit;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import com.google.common.collect.Lists;
import net.minecraft.world.biome.Biome;
/**
* Provides methods and apis that forge seems to be sorely lacking.
*/
@Deprecated
public class BiomeBS {
/**
* Gets the biome type associated with a given biome.
*/
public static Optional<BiomeType> 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<? extends LivingEntity> type, Function<Biome, SpawnListEntry> func) {
List<SpawnListEntry> entries = biome.getSpawnableList(list);
entries.stream().filter(p -> p.entityClass == type).findFirst().orElseGet(() -> {
entries.add(func.apply(biome));
return null;
});
}
}

View file

@ -10,7 +10,7 @@ import com.minelittlepony.unicopia.enchanting.IPage;
import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener;
import com.minelittlepony.unicopia.enchanting.PageState; import com.minelittlepony.unicopia.enchanting.PageState;
import com.minelittlepony.unicopia.enchanting.Pages; 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.Minecraft;
import net.minecraft.client.gui.GuiButton; 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); drawModalRectWithCustomSizedTexture(left, top, 0, 0, xSize, ySize, 512, 256);
} else { } else {
if (playerExtension.getWorld().rand.nextInt(100) == 0) { if (playerExtension.getWorld().rand.nextInt(100) == 0) {
Unicopia.log.fatal("Missing texture " + texture); Unicopia.LOGGER.fatal("Missing texture " + texture);
} }
} }
} }

View file

@ -2,7 +2,7 @@ package com.minelittlepony.unicopia.inventory.gui;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.SpeciesList; import com.minelittlepony.unicopia.SpeciesList;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener;
@ -156,7 +156,7 @@ public class SpellBookContainer extends Container {
@Override @Override
public boolean canUse(PlayerEntity player) { public boolean canUse(PlayerEntity player) {
return Predicates.MAGI.test(player); return EquinePredicates.MAGI.test(player);
} }
static class SpellbookSlot extends Slot { static class SpellbookSlot extends Slot {

View file

@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.inventory.gui;
import com.minelittlepony.unicopia.enchanting.IPageOwner; import com.minelittlepony.unicopia.enchanting.IPageOwner;
import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; import com.minelittlepony.unicopia.enchanting.IPageUnlockListener;
import com.minelittlepony.unicopia.enchanting.SpellCraftingEvent; 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 com.minelittlepony.unicopia.magic.spells.SpellRegistry;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -90,7 +90,7 @@ public class SpellbookResultSlot extends SpellBookContainer.SpellbookSlot {
@Override @Override
public boolean canInsert(ItemStack stack) { 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); && !SpellRegistry.stackHasEnchantment(stack);
} }

Some files were not shown because too many files have changed in this diff Show more