From a130087d5dbe5f3daf89a0674bd81978497fc020 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 14 Feb 2021 17:53:44 +0200 Subject: [PATCH] Added jars, empty jars, lightning in a jar, and various storms in a jar --- .../unicopia/ability/magic/Thrown.java | 34 ++-- .../ability/magic/spell/FireSpell.java | 7 +- .../unicopia/entity/Equine.java | 11 +- .../minelittlepony/unicopia/item/JarItem.java | 148 ++++++++++++++++++ .../minelittlepony/unicopia/item/UItems.java | 6 + .../projectile/MagicProjectileEntity.java | 22 +-- .../projectile/ProjectileDelegate.java | 17 ++ .../resources/assets/unicopia/lang/en_us.json | 6 + .../unicopia/models/item/empty_jar.json | 6 + .../unicopia/models/item/lightning_jar.json | 6 + .../unicopia/models/item/rain_cloud_jar.json | 6 + .../unicopia/models/item/storm_cloud_jar.json | 6 + .../models/item/zap_apple_jam_jar.json | 6 + .../unicopia/textures/item/empty_jar.png | Bin 0 -> 3206 bytes .../unicopia/textures/item/lightning_jar.png | Bin 0 -> 3045 bytes .../unicopia/textures/item/rain_cloud_jar.png | Bin 0 -> 3150 bytes .../textures/item/storm_cloud_jar.png | Bin 0 -> 3210 bytes .../textures/item/zap_apple_jam_jar.png | Bin 0 -> 3180 bytes .../data/unicopia/recipes/empty_jar.json | 20 +++ 19 files changed, 270 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/JarItem.java create mode 100644 src/main/java/com/minelittlepony/unicopia/projectile/ProjectileDelegate.java create mode 100644 src/main/resources/assets/unicopia/models/item/empty_jar.json create mode 100644 src/main/resources/assets/unicopia/models/item/lightning_jar.json create mode 100644 src/main/resources/assets/unicopia/models/item/rain_cloud_jar.json create mode 100644 src/main/resources/assets/unicopia/models/item/storm_cloud_jar.json create mode 100644 src/main/resources/assets/unicopia/models/item/zap_apple_jam_jar.json create mode 100644 src/main/resources/assets/unicopia/textures/item/empty_jar.png create mode 100644 src/main/resources/assets/unicopia/textures/item/lightning_jar.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rain_cloud_jar.png create mode 100644 src/main/resources/assets/unicopia/textures/item/storm_cloud_jar.png create mode 100644 src/main/resources/assets/unicopia/textures/item/zap_apple_jam_jar.png create mode 100644 src/main/resources/data/unicopia/recipes/empty_jar.json diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java index 132d501b..2491a1dc 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java @@ -3,11 +3,13 @@ package com.minelittlepony.unicopia.ability.magic; import javax.annotation.Nullable; import com.minelittlepony.unicopia.Affinity; -import com.minelittlepony.unicopia.UEntities; import com.minelittlepony.unicopia.ability.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; +import com.minelittlepony.unicopia.projectile.ProjectileDelegate; + import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -15,23 +17,25 @@ import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; /** * Magic effects that can be thrown. */ -public interface Thrown extends Spell { +public interface Thrown extends Spell, ProjectileDelegate { - /** - * Called once the projectile lands either hitting the ground or an entity. - */ - default void onImpact(Caster caster, BlockPos pos, BlockState state) { - if (!caster.isClient()) { - update(caster); + @Override + default void onImpact(MagicProjectileEntity projectile, BlockPos pos, BlockState state) { + if (!projectile.isClient()) { + update(projectile); } } + @Override + default void onImpact(MagicProjectileEntity projectile, Entity entity) { + + } + /** * The amount of damage to be dealt when the projectile collides with an entity. */ @@ -64,24 +68,18 @@ public interface Thrown extends Spell { default MagicProjectileEntity toss(Caster caster) { World world = caster.getWorld(); - Entity entity = caster.getMaster(); + LivingEntity entity = caster.getMaster(); world.playSound(null, entity.getX(), entity.getY(), entity.getZ(), getThrowSound(caster), SoundCategory.NEUTRAL, 0.7F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); if (!caster.isClient()) { - Vec3d rot = entity.getRotationVec(1); - - MagicProjectileEntity projectile = new MagicProjectileEntity(UEntities.THROWN_ITEM, world, caster.getMaster(), entity.getRotationVec(1)); + MagicProjectileEntity projectile = new MagicProjectileEntity(world, entity); projectile.setItem(getCastAppearance(caster)); projectile.setThrowDamage(getThrowDamage(caster)); projectile.setSpell(this); projectile.setHydrophobic(); - projectile.updatePosition( - entity.getX() + rot.x * 4, - entity.getBodyY(0.5D) + 0.5, - projectile.getZ() + rot.z * 4 - ); + projectile.setProperties(entity, entity.pitch, entity.yaw, 0, 1.5F, 1); world.spawnEntity(projectile); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java index aa1d6632..df223abd 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java @@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Magical; import com.minelittlepony.unicopia.ability.magic.Thrown; import com.minelittlepony.unicopia.block.state.StateMaps; +import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; import com.minelittlepony.unicopia.util.MagicalDamageSource; import com.minelittlepony.unicopia.util.PosHelper; import com.minelittlepony.unicopia.util.VecHelper; @@ -55,9 +56,9 @@ public class FireSpell extends AbstractRangedAreaSpell implements Thrown { } @Override - public void onImpact(Caster caster, BlockPos pos, BlockState state) { - if (!caster.isClient()) { - caster.getWorld().createExplosion(caster.getMaster(), pos.getX(), pos.getY(), pos.getZ(), 2, DestructionType.DESTROY); + public void onImpact(MagicProjectileEntity projectile, BlockPos pos, BlockState state) { + if (!projectile.isClient()) { + projectile.getWorld().createExplosion(projectile.getMaster(), pos.getX(), pos.getY(), pos.getZ(), 2, DestructionType.DESTROY); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Equine.java b/src/main/java/com/minelittlepony/unicopia/entity/Equine.java index 14298366..11d865b8 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Equine.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Equine.java @@ -1,11 +1,14 @@ package com.minelittlepony.unicopia.entity; +import java.util.Optional; + import javax.annotation.Nullable; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.entity.Entity; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.util.Tickable; @@ -38,7 +41,6 @@ public interface Equine extends NbtSerialisable, Tickable { return false; } - /** * Event triggered when this entity is hit by a projectile. */ @@ -53,6 +55,13 @@ public interface Equine extends NbtSerialisable, Tickable { } + /** + * Called when an entity is harmed. + */ + default Optional onDamage(DamageSource source, float amount) { + return Optional.empty(); + } + @Nullable static > T of(Entity entity) { return PonyContainer.of(entity) diff --git a/src/main/java/com/minelittlepony/unicopia/item/JarItem.java b/src/main/java/com/minelittlepony/unicopia/item/JarItem.java new file mode 100644 index 00000000..2cbb8252 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/JarItem.java @@ -0,0 +1,148 @@ +package com.minelittlepony.unicopia.item; + +import com.minelittlepony.unicopia.entity.IItemEntity; +import com.minelittlepony.unicopia.entity.ItemImpl; +import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; +import com.minelittlepony.unicopia.projectile.ProjectileDelegate; +import com.minelittlepony.unicopia.util.WorldEvent; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.DispenserBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.LightningEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.level.ServerWorldProperties; + +public class JarItem extends Item implements ProjectileDelegate, ItemImpl.TickableItem { + + private final boolean rain; + private final boolean thunder; + private final boolean lightning; + + public JarItem(Settings settings, boolean rain, boolean thunder, boolean lightning) { + super(settings); + this.rain = rain; + this.thunder = thunder; + this.lightning = lightning; + + DispenserBlock.registerBehavior(this, ArmorItem.DISPENSER_BEHAVIOR); + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + ItemStack stack = player.getStackInHand(hand); + + world.playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, + 0.5F, + 0.4F / (RANDOM.nextFloat() * 0.4F + 0.8F)); + + if (!world.isClient) { + MagicProjectileEntity projectile = new MagicProjectileEntity(world, player); + projectile.setItem(stack); + projectile.setThrowDamage(0.5F); + projectile.setProperties(player, player.pitch, player.yaw, 0, 1.5F, 1); + + world.spawnEntity(projectile); + } + + player.incrementStat(Stats.USED.getOrCreateStat(this)); + + if (!player.abilities.creativeMode) { + stack.decrement(1); + } + + return TypedActionResult.success(stack, world.isClient()); + } + + + @Override + public ActionResult onGroundTick(IItemEntity item) { + ItemEntity entity = item.get().getMaster(); + + entity.setInvulnerable(true); + + if (!lightning + && !entity.world.isClient + && !entity.removed + && entity.getAge() > 100 + && entity.world.isThundering() + && entity.world.isSkyVisible(entity.getBlockPos()) + && entity.world.random.nextInt(130) == 0) { + LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.world); + lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ()); + + entity.remove(); + entity.world.spawnEntity(lightning); + + ItemEntity neu = EntityType.ITEM.create(entity.world); + neu.copyPositionAndRotation(entity); + neu.setStack(new ItemStack(this == UItems.RAIN_CLOUD_JAR ? UItems.STORM_CLOUD_JAR : UItems.LIGHTNING_JAR)); + neu.setInvulnerable(true); + + entity.world.spawnEntity(neu); + + ItemEntity copy = EntityType.ITEM.create(entity.world); + copy.copyPositionAndRotation(entity); + copy.setInvulnerable(true); + copy.setStack(entity.getStack()); + copy.getStack().decrement(1); + + entity.world.spawnEntity(copy); + } + return ActionResult.PASS; + } + + @Override + public void onImpact(MagicProjectileEntity projectile, BlockPos pos, BlockState state) { + onImpact(projectile); + } + + @Override + public void onImpact(MagicProjectileEntity projectile, Entity entity) { + onImpact(projectile); + } + + private void onImpact(MagicProjectileEntity projectile) { + + + if (!projectile.isClient()) { + ServerWorld world = (ServerWorld)projectile.world; + + if (rain || thunder) { + ServerWorldProperties props = ((ServerWorldProperties)world.getLevelProperties()); + + int time = Math.max(Math.max(props.getRainTime(), props.getThunderTime()), 40); + world.setWeather(0, time, rain, thunder); + } + + if (lightning) { + LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(world); + lightning.refreshPositionAfterTeleport(projectile.getX(), projectile.getY(), projectile.getZ()); + + world.spawnEntity(lightning); + } + } + + if (rain || thunder) { + projectile.world.syncWorldEvent(WorldEvent.PROJECTILE_HIT, projectile.getBlockPos(), thunder ? 0x888888 : 0xF8F8F8); + } + + WorldEvent.play(WorldEvent.DESTROY_BLOCK, projectile.world, projectile.getBlockPos(), Blocks.GLASS.getDefaultState()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 772d6258..4d69dfe7 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -47,6 +47,12 @@ public interface UItems { .equipmentSlot(FriendshipBraceletItem::getPreferredEquipmentSlot) )); + Item EMPTY_JAR = register("empty_jar", new JarItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(16).fireproof(), false, false, false)); + Item RAIN_CLOUD_JAR = register("rain_cloud_jar", new JarItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(1).fireproof(), true, false, false)); + Item STORM_CLOUD_JAR = register("storm_cloud_jar", new JarItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(1).fireproof(), true, true, false)); + Item LIGHTNING_JAR = register("lightning_jar", new JarItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(1).fireproof(), false, false, true)); + Item ZAP_APPLE_JAM_JAR = register("zap_apple_jam_jar", new JarItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(1).fireproof(), false, false, true)); + static T register(String name, T item) { ITEMS.add(item); if (item instanceof BlockItem) { diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java index 1b3211d2..e0af48aa 100644 --- a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java @@ -1,11 +1,11 @@ package com.minelittlepony.unicopia.projectile; import com.minelittlepony.unicopia.Affinity; +import com.minelittlepony.unicopia.UEntities; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Levelled; import com.minelittlepony.unicopia.ability.magic.Magical; import com.minelittlepony.unicopia.ability.magic.Spell; -import com.minelittlepony.unicopia.ability.magic.Thrown; import com.minelittlepony.unicopia.ability.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.entity.EntityPhysics; import com.minelittlepony.unicopia.entity.Physics; @@ -59,12 +59,8 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Magical, super(type, world); } - public MagicProjectileEntity(EntityType type, World world, LivingEntity thrower, Vec3d velocity) { - super(type, world); - refreshPositionAndAngles(thrower.getX(), thrower.getY(), thrower.getZ(), thrower.yaw, thrower.pitch); - refreshPosition(); - setVelocity(velocity); - setOwner(thrower); + public MagicProjectileEntity(World world, LivingEntity thrower) { + super(UEntities.THROWN_ITEM, thrower, world); } @Override @@ -249,10 +245,14 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Magical, if (hasSpell()) { Spell effect = getSpell(true); - if (effect instanceof Thrown) { - ((Thrown)effect).onImpact(this, hit.getBlockPos(), world.getBlockState(hit.getBlockPos())); + if (effect instanceof ProjectileDelegate) { + ((ProjectileDelegate)effect).onImpact(this, hit.getBlockPos(), world.getBlockState(hit.getBlockPos())); } } + + if (getItem().getItem() instanceof ProjectileDelegate) { + ((ProjectileDelegate)getItem().getItem()).onImpact(this, hit.getBlockPos(), world.getBlockState(hit.getBlockPos())); + } } @Override @@ -266,6 +266,10 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Magical, if (entity != null) { entity.damage(DamageSource.thrownProjectile(this, getOwner()), getThrowDamage()); } + + if (getItem().getItem() instanceof ProjectileDelegate) { + ((ProjectileDelegate)getItem().getItem()).onImpact(this, entity); + } } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/ProjectileDelegate.java b/src/main/java/com/minelittlepony/unicopia/projectile/ProjectileDelegate.java new file mode 100644 index 00000000..9c4c33d4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/projectile/ProjectileDelegate.java @@ -0,0 +1,17 @@ +package com.minelittlepony.unicopia.projectile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; + +public interface ProjectileDelegate { + /** + * Called once the projectile lands either hitting the ground or an entity. + */ + void onImpact(MagicProjectileEntity projectile, BlockPos pos, BlockState state); + + /** + * Called once the projectile lands either hitting the ground or an entity. + */ + void onImpact(MagicProjectileEntity projectile, Entity entity); +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 3cf64b0c..6ef61e6a 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -16,6 +16,12 @@ "item.unicopia.cooked_zap_apple": "Cooked Zap Apple", "item.unicopia.zap_apple": "Zap Apple", + "item.unicopia.empty_jar": "Glass Jar", + "item.unicopia.rain_cloud_jar": "Rain Cloud in a Jar", + "item.unicopia.storm_cloud_jar": "Storm Cloud in a Jar", + "item.unicopia.lightning_jar": "Lightning in a Jar", + "item.unicopia.zap_apple_jam_jar": "Zap Apple Jam", + "item.unicopia.music_disc_pet": "Music Disc", "item.unicopia.music_disc_pet.desc": "Danial Ingram - pet", "item.unicopia.music_disc_popular": "Music Disc", diff --git a/src/main/resources/assets/unicopia/models/item/empty_jar.json b/src/main/resources/assets/unicopia/models/item/empty_jar.json new file mode 100644 index 00000000..7df21561 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/empty_jar.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/empty_jar" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/lightning_jar.json b/src/main/resources/assets/unicopia/models/item/lightning_jar.json new file mode 100644 index 00000000..a9255315 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/lightning_jar.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/lightning_jar" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rain_cloud_jar.json b/src/main/resources/assets/unicopia/models/item/rain_cloud_jar.json new file mode 100644 index 00000000..46f325d2 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rain_cloud_jar.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rain_cloud_jar" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/storm_cloud_jar.json b/src/main/resources/assets/unicopia/models/item/storm_cloud_jar.json new file mode 100644 index 00000000..a1af2ea1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/storm_cloud_jar.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/storm_cloud_jar" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/zap_apple_jam_jar.json b/src/main/resources/assets/unicopia/models/item/zap_apple_jam_jar.json new file mode 100644 index 00000000..394030ba --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/zap_apple_jam_jar.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/zap_apple_jam_jar" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/empty_jar.png b/src/main/resources/assets/unicopia/textures/item/empty_jar.png new file mode 100644 index 0000000000000000000000000000000000000000..f8330704831e199efd2aed171076664e8e6987cc GIT binary patch literal 3206 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/lightning_jar.png b/src/main/resources/assets/unicopia/textures/item/lightning_jar.png new file mode 100644 index 0000000000000000000000000000000000000000..0fea7577505ad5cb443d88d85d16919200ac9528 GIT binary patch literal 3045 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/rain_cloud_jar.png b/src/main/resources/assets/unicopia/textures/item/rain_cloud_jar.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb51cca9ac38901f7368ae7c12b8f84491af686 GIT binary patch literal 3150 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/storm_cloud_jar.png b/src/main/resources/assets/unicopia/textures/item/storm_cloud_jar.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d58a51933f3a9c72e02e1fb2b2d66d021f0991 GIT binary patch literal 3210 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