diff --git a/psd/ender_vision.psd b/psd/ender_vision.psd new file mode 100644 index 00000000..df47502a Binary files /dev/null and b/psd/ender_vision.psd differ diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 3fce8d36..77898b32 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -5,6 +5,8 @@ import net.fabricmc.api.ModInitializer; import net.minecraft.util.Identifier; import ru.betterend.config.MainConfig; +import ru.betterend.effects.EndEnchantments; +import ru.betterend.effects.EndPotions; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.registry.BiomeRegistry; import ru.betterend.registry.BlockEntityRegistry; @@ -38,6 +40,8 @@ public class BetterEnd implements ModInitializer { BetterEndBiomeSource.register(); ItemTagRegistry.register(); BlockTagRegistry.register(); + EndEnchantments.register(); + EndPotions.register(); CraftingRecipes.register(); StructureRegistry.register(); } diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/effects/EndEnchantments.java new file mode 100644 index 00000000..f59e545d --- /dev/null +++ b/src/main/java/ru/betterend/effects/EndEnchantments.java @@ -0,0 +1,16 @@ +package ru.betterend.effects; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.effects.enchantment.EndVeilEnchantment; + +public class EndEnchantments { + public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); + + public static Enchantment registerEnchantment(String name, Enchantment enchantment) { + return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); + } + + public static void register() {} +} diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java new file mode 100644 index 00000000..a37a3cc4 --- /dev/null +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -0,0 +1,29 @@ +package ru.betterend.effects; + +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.item.Items; +import net.minecraft.potion.Potion; +import net.minecraft.potion.Potions; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.mixin.common.BrewingAccessor; +import ru.betterend.registry.ItemRegistry; + +public class EndPotions { + public final static Potion END_VEIL = registerPotion("end_veil", EndStatusEffects.END_VEIL, 3600); + public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600); + + public static Potion registerPotion(String name, StatusEffect effect, int duration) { + return registerPotion(name, new Potion(name, new StatusEffectInstance[]{ new StatusEffectInstance(effect, duration) })); + } + + public static Potion registerPotion(String name, Potion potion) { + return Registry.register(Registry.POTION, BetterEnd.makeID(name), potion); + } + + public static void register() { + BrewingAccessor.callRegisterPotionRecipe(Potions.AWKWARD, ItemRegistry.ENDER_DUST, END_VEIL); + BrewingAccessor.callRegisterPotionRecipe(END_VEIL, Items.REDSTONE, LONG_END_VEIL); + } +} diff --git a/src/main/java/ru/betterend/effects/EndStatusEffects.java b/src/main/java/ru/betterend/effects/EndStatusEffects.java new file mode 100644 index 00000000..db3e701d --- /dev/null +++ b/src/main/java/ru/betterend/effects/EndStatusEffects.java @@ -0,0 +1,15 @@ +package ru.betterend.effects; + +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.effects.status.EndVeilEffect; + +public class EndStatusEffects { + + public final static StatusEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); + + public static StatusEffect registerEffect(String name, E effect) { + return Registry.register(Registry.STATUS_EFFECT, BetterEnd.makeID(name), effect); + } +} diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java new file mode 100644 index 00000000..ecda6750 --- /dev/null +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -0,0 +1,17 @@ +package ru.betterend.effects.enchantment; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentTarget; +import net.minecraft.entity.EquipmentSlot; + +public class EndVeilEnchantment extends Enchantment { + + public EndVeilEnchantment() { + super(Enchantment.Rarity.VERY_RARE, EnchantmentTarget.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); + } + + @Override + public boolean isAvailableForRandomSelection() { + return false; + } +} diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java new file mode 100644 index 00000000..b4e1489d --- /dev/null +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -0,0 +1,16 @@ +package ru.betterend.effects.status; + +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectType; + +public class EndVeilEffect extends StatusEffect { + + public EndVeilEffect() { + super(StatusEffectType.BENEFICIAL, 0x0D554A); + } + + @Override + public boolean canApplyUpdateEffect(int duration, int amplifier) { + return false; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java new file mode 100644 index 00000000..751ee040 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/BrewingAccessor.java @@ -0,0 +1,16 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.item.Item; +import net.minecraft.potion.Potion; +import net.minecraft.recipe.BrewingRecipeRegistry; + +@Mixin(BrewingRecipeRegistry.class) +public interface BrewingAccessor { + @Invoker + static void callRegisterPotionRecipe(Potion input, Item item, Potion output) { + throw new AssertionError("@Invoker dummy body called"); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java new file mode 100644 index 00000000..266d6ed6 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.mob.EndermanEntity; +import net.minecraft.entity.player.PlayerEntity; + +import ru.betterend.effects.EndEnchantments; +import ru.betterend.effects.EndStatusEffects; + +@Mixin(EndermanEntity.class) +public abstract class EndermanEntityMixin { + + @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) + private void isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { + if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || + EnchantmentHelper.getEquipmentLevel(EndEnchantments.END_VEIL, player) > 0) { + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 984118a7..293a7c7d 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -50,6 +50,17 @@ "item.betterend.diamond_hammer": "Diamond Smith Hammer", "item.betterend.netherite_hammer": "Netherite Smith Hammer", + "effect.betterend.end_veil": "End Veil", + "enchantment.betterend.end_veil": "End Veil", + "item.minecraft.potion.effect.end_veil": "Potion of End Veil", + "item.minecraft.potion.effect.long_end_veil": "Long potion of End Veil", + "item.minecraft.splash_potion.effect.end_veil": "Splash potion of End Veil", + "item.minecraft.splash_potion.effect.long_end_veil": "Splash potion of End Veil", + "item.minecraft.lingering_potion.effect.end_veil": "Lingering potion of End Veil", + "item.minecraft.lingering_potion.effect.long_end_veil": "Lingering potion of End Veil", + "item.minecraft.tipped_arrow.effect.end_veil": "Arrow of End Veil", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Arrow of End Veil", + "block.betterend.mossy_glowshroom_sapling": "Mossy Glowshroom Sapling", "block.betterend.mossy_glowshroom_cap": "Mossy Glowshroom Cap", "block.betterend.mossy_glowshroom_fur": "Mossy Glowshroom Fur", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 5a463407..32224bf3 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -50,6 +50,17 @@ "item.betterend.diamond_hammer": "Алмазный Кузнечный Молот", "item.betterend.netherite_hammer": "Кузнечный Молот из Незерита", + "effect.betterend.end_veil": "Вуаль Края", + "enchantment.betterend.end_veil": "Вуаль Края", + "item.minecraft.potion.effect.end_veil": "Зелье Вуали Края", + "item.minecraft.potion.effect.long_end_veil": "Долгое зелье Вуали Края", + "item.minecraft.splash_potion.effect.end_veil": "Взрывное зелье Вуали Края", + "item.minecraft.splash_potion.effect.long_end_veil": "Взрывное зелье Вуали Края", + "item.minecraft.lingering_potion.effect.end_veil": "Оседающее зелье Вуали Края", + "item.minecraft.lingering_potion.effect.long_end_veil": "Оседающее зелье Вуали Края", + "item.minecraft.tipped_arrow.effect.end_veil": "Стрела Вуали Края", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Стрела Вуали Края", + "block.betterend.mossy_glowshroom_sapling": "Саженец мшистого светогриба", "block.betterend.mossy_glowshroom_cap": "Шляпка мшистого светогриба", "block.betterend.mossy_glowshroom_fur": "Волоски мшистого светогриба", diff --git a/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png b/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png new file mode 100644 index 00000000..c3c79c99 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/mob_effect/end_veil.png differ diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index e9029b91..a208d020 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,19 +4,21 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_8", "mixins": [ - "DimensionTypeMixin", - "RecipeManagerMixin", "ServerPlayNetworkHandlerMixin", - "TagGroupLoaderMixin", "CraftingScreenHandlerMixin", + "DefaultBiomeCreatorMixin", "GenerationSettingsMixin", "AnvilScreenHandlerMixin", + "TagGroupLoaderMixin", + "EndermanEntityMixin", + "LocateCommandMixin", + "DimensionTypeMixin", + "RecipeManagerMixin", "AbstractBlockMixin", "LivingEntityMixin", - "BiomeMixin", "SlimeEntityMixin", - "LocateCommandMixin", - "DefaultBiomeCreatorMixin" + "BrewingAccessor", + "BiomeMixin" ], "injectors": { "defaultRequire": 1