diff --git a/src/main/java/com/minelittlepony/unicopia/UTags.java b/src/main/java/com/minelittlepony/unicopia/UTags.java index d9eeb453..a115375d 100644 --- a/src/main/java/com/minelittlepony/unicopia/UTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UTags.java @@ -22,6 +22,8 @@ public interface UTags { TagKey POLEARMS = item("polearms"); TagKey APPLE_SEEDS = item("apple_seeds"); + TagKey GLASS_PANES = block("glass_panes"); + TagKey GLASS_BLOCKS = block("glass_blocks"); TagKey FRAGILE = block("fragile"); TagKey INTERESTING = block("interesting"); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java index eb19918f..c04e5059 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Owned; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; +import com.minelittlepony.unicopia.block.data.ModificationType; import com.minelittlepony.unicopia.entity.Physics; import com.minelittlepony.unicopia.entity.PonyContainer; import com.minelittlepony.unicopia.particle.ParticleSource; @@ -63,15 +64,24 @@ public interface Caster extends Owned, Levelled, Affi } default boolean canModifyAt(BlockPos pos) { + return canModifyAt(pos, ModificationType.EITHER); + } - if (!canCastAt(Vec3d.ofCenter(pos))) { - return false; + default boolean canModifyAt(BlockPos pos, ModificationType mod) { + + if (mod.checkPhysical()) { + if (getMaster() instanceof PlayerEntity player) { + if (!getReferenceWorld().canPlayerModifyAt(player, pos)) { + return false; + } + } else { + if (!getReferenceWorld().getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) { + return false; + } + } } - if (getMaster() instanceof PlayerEntity) { - return getReferenceWorld().canPlayerModifyAt((PlayerEntity)getMaster(), pos); - } - return getReferenceWorld().getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING); + return !mod.checkMagical() || canCastAt(Vec3d.ofCenter(pos)); } /** diff --git a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java index 45794fd4..9acf55c9 100644 --- a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java +++ b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java @@ -19,6 +19,7 @@ public interface UCriteria { CustomEventCriterion.Trigger THROW_MUFFIN = CUSTOM_EVENT.createTrigger("throw_muffin"); CustomEventCriterion.Trigger SEND_OATS = CUSTOM_EVENT.createTrigger("send_oats"); CustomEventCriterion.Trigger RECEIVE_OATS = CUSTOM_EVENT.createTrigger("receive_oats"); + CustomEventCriterion.Trigger BREAK_WINDOW = CUSTOM_EVENT.createTrigger("break_window"); private static > T register(T obj) { return MixinCriteria.register(obj); diff --git a/src/main/java/com/minelittlepony/unicopia/block/data/ModificationType.java b/src/main/java/com/minelittlepony/unicopia/block/data/ModificationType.java new file mode 100644 index 00000000..a19a962a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/data/ModificationType.java @@ -0,0 +1,15 @@ +package com.minelittlepony.unicopia.block.data; + +public enum ModificationType { + MAGICAL, + PHYSICAL, + EITHER; + + public boolean checkMagical() { + return this == MAGICAL || this == EITHER; + } + + public boolean checkPhysical() { + return this == PHYSICAL || this == EITHER; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 3408bb13..475b44de 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -1,12 +1,10 @@ package com.minelittlepony.unicopia.entity.player; -import com.minelittlepony.unicopia.FlightType; -import com.minelittlepony.unicopia.InteractionManager; -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.advancement.UCriteria; +import com.minelittlepony.unicopia.block.data.ModificationType; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; @@ -14,6 +12,7 @@ import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; import com.minelittlepony.unicopia.item.AmuletItem; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; +import com.minelittlepony.unicopia.particle.*; import com.minelittlepony.unicopia.projectile.ProjectileUtil; import com.minelittlepony.unicopia.util.*; @@ -589,17 +588,22 @@ public class PlayerPhysics extends EntityPhysics implements Tickab Vec3d orientation = entity.getRotationVec(1).multiply(speed); entity.addVelocity(orientation.x, orientation.y, orientation.z); - int damage = TraceHelper.findBlocks(entity, speed + 4, 1, state -> state.isOf(Blocks.GLASS_PANE)).stream() + int damage = TraceHelper.findBlocks(entity, speed + 4, 1, state -> state.isIn(UTags.GLASS_PANES)).stream() .flatMap(pos -> BlockPos.streamOutwards(pos, 2, 2, 2)) .filter(pos -> entity.world.getBlockState(pos).isOf(Blocks.GLASS_PANE)) .reduce(0, (u, pos) -> { - entity.world.breakBlock(pos, true); + if (pony.canModifyAt(pos, ModificationType.PHYSICAL)) { + entity.world.breakBlock(pos, true); + } else { + ParticleUtils.spawnParticles(new MagicParticleEffect(0x00AAFF), entity.world, Vec3d.ofCenter(pos), 15); + } return 1; }, Integer::sum); if (damage > 0) { pony.subtractEnergyCost(damage / 5F); entity.damage(DamageSource.FLY_INTO_WALL, Math.min(damage, entity.getHealth() - 1)); + UCriteria.BREAK_WINDOW.trigger(entity); } pony.updateVelocity(); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 1891b64a..aa660e29 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -597,6 +597,9 @@ "advancements.unicopia.molting_season_3.title": "Molting Season 3", "advancements.unicopia.molting_season_3.description": "Drop 15 feathers whilst flying", + "advancements.unicopia.rainbow_crash.title": "Dammit, Rainbow", + "advancements.unicopia.rainbow_crash.description": "Wage war on the evil glass window nation", + "unicopia.toast.discoveries.title": "New Discoveries!", "unicopia.toast.discoveries.description": "Check your spellbook" } diff --git a/src/main/resources/data/unicopia/advancements/unicopia/pegasus/rainbow_crash.json b/src/main/resources/data/unicopia/advancements/unicopia/pegasus/rainbow_crash.json new file mode 100644 index 00000000..2d46bd33 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/unicopia/pegasus/rainbow_crash.json @@ -0,0 +1,29 @@ +{ + "parent": "unicopia:unicopia/pegasus/sky_route", + "display": { + "icon": { + "item": "minecraft:glass_pane" + }, + "title": { + "translate": "advancements.unicopia.rainbow_crash.title" + }, + "description": { + "translate": "advancements.unicopia.rainbow_crash.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "break_window": { + "trigger": "unicopia:custom", + "conditions": { + "event": "break_window" + } + } + }, + "requirements": [ + [ "break_window" ] + ] +} diff --git a/src/main/resources/data/unicopia/advancements/unicopia/pegasus/sky_route.json b/src/main/resources/data/unicopia/advancements/unicopia/pegasus/sky_route.json index b87dd8dc..98b62c59 100644 --- a/src/main/resources/data/unicopia/advancements/unicopia/pegasus/sky_route.json +++ b/src/main/resources/data/unicopia/advancements/unicopia/pegasus/sky_route.json @@ -10,7 +10,7 @@ "description": { "translate": "advancements.unicopia.sky_route.description" }, - "frame": "task", + "frame": "challenge", "show_toast": true, "announce_to_chat": true, "hidden": false @@ -25,5 +25,8 @@ }, "requirements": [ [ "be_birb" ] - ] + ], + "rewards": { + "experience": 100 + } } diff --git a/src/main/resources/data/unicopia/tags/blocks/fragile.json b/src/main/resources/data/unicopia/tags/blocks/fragile.json index 1ee2823f..73e3b5f7 100644 --- a/src/main/resources/data/unicopia/tags/blocks/fragile.json +++ b/src/main/resources/data/unicopia/tags/blocks/fragile.json @@ -1,40 +1,8 @@ { "replace": false, "values": [ - "minecraft:glass", - "minecraft:glass_pane", - "minecraft:white_stained_glass", - "minecraft:orange_stained_glass", - "minecraft:magenta_stained_glass", - "minecraft:light_blue_stained_glass", - "minecraft:yellow_stained_glass", - "minecraft:lime_stained_glass", - "minecraft:pink_stained_glass", - "minecraft:gray_stained_glass", - "minecraft:light_gray_stained_glass", - "minecraft:cyan_stained_glass", - "minecraft:purple_stained_glass", - "minecraft:blue_stained_glass", - "minecraft:brown_stained_glass", - "minecraft:green_stained_glass", - "minecraft:red_stained_glass", - "minecraft:black_stained_glass", - "minecraft:white_stained_glass_pane", - "minecraft:orange_stained_glass_pane", - "minecraft:magenta_stained_glass_pane", - "minecraft:light_blue_stained_glass_pane", - "minecraft:yellow_stained_glass_pane", - "minecraft:lime_stained_glass_pane", - "minecraft:pink_stained_glass_pane", - "minecraft:gray_stained_glass_pane", - "minecraft:light_gray_stained_glass_pane", - "minecraft:cyan_stained_glass_pane", - "minecraft:purple_stained_glass_pane", - "minecraft:blue_stained_glass_pane", - "minecraft:brown_stained_glass_pane", - "minecraft:green_stained_glass_pane", - "minecraft:red_stained_glass_pane", - "minecraft:black_stained_glass_pane", + "#unicopia:glass_blocks", + "#unicopia:glass_panes", "minecraft:vine", "minecraft:lily_pad" ] diff --git a/src/main/resources/data/unicopia/tags/blocks/glass_blocks.json b/src/main/resources/data/unicopia/tags/blocks/glass_blocks.json new file mode 100644 index 00000000..c65024b7 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/blocks/glass_blocks.json @@ -0,0 +1,22 @@ +{ + "replace": false, + "values": [ + "minecraft:glass", + "minecraft:white_stained_glass", + "minecraft:orange_stained_glass", + "minecraft:magenta_stained_glass", + "minecraft:light_blue_stained_glass", + "minecraft:yellow_stained_glass", + "minecraft:lime_stained_glass", + "minecraft:pink_stained_glass", + "minecraft:gray_stained_glass", + "minecraft:light_gray_stained_glass", + "minecraft:cyan_stained_glass", + "minecraft:purple_stained_glass", + "minecraft:blue_stained_glass", + "minecraft:brown_stained_glass", + "minecraft:green_stained_glass", + "minecraft:red_stained_glass", + "minecraft:black_stained_glass" + ] +} diff --git a/src/main/resources/data/unicopia/tags/blocks/glass_panes.json b/src/main/resources/data/unicopia/tags/blocks/glass_panes.json new file mode 100644 index 00000000..ff9176f7 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/blocks/glass_panes.json @@ -0,0 +1,22 @@ +{ + "replace": false, + "values": [ + "minecraft:glass_pane", + "minecraft:white_stained_glass_pane", + "minecraft:orange_stained_glass_pane", + "minecraft:magenta_stained_glass_pane", + "minecraft:light_blue_stained_glass_pane", + "minecraft:yellow_stained_glass_pane", + "minecraft:lime_stained_glass_pane", + "minecraft:pink_stained_glass_pane", + "minecraft:gray_stained_glass_pane", + "minecraft:light_gray_stained_glass_pane", + "minecraft:cyan_stained_glass_pane", + "minecraft:purple_stained_glass_pane", + "minecraft:blue_stained_glass_pane", + "minecraft:brown_stained_glass_pane", + "minecraft:green_stained_glass_pane", + "minecraft:red_stained_glass_pane", + "minecraft:black_stained_glass_pane" + ] +}