Skip to content

Commit

Permalink
0.3.0 1.15.2
Browse files Browse the repository at this point in the history
+ new enchantment: Pheonix Dive
+ Dodge now gives 5 second of knockback immunity
+ code optimalization
  • Loading branch information
Majrusz committed Nov 6, 2020
1 parent 562188a commit a453d78
Show file tree
Hide file tree
Showing 17 changed files with 558 additions and 422 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.wonderfulenchantments;

import net.minecraft.enchantment.EnchantmentType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ShieldItem;

public class EnchantmentTypes {
public static final EnchantmentType SHIELD = EnchantmentType.create( "shield", ( Item item )->item instanceof ShieldItem );

public static void addTypeToItemGroup( EnchantmentType type, ItemGroup itemGroup ) {
EnchantmentType[] group = itemGroup.getRelevantEnchantmentTypes();
EnchantmentType[] temporary = new EnchantmentType[ group.length + 1 ];
System.arraycopy( group, 0, temporary, 0, group.length );
temporary[ group.length - 1 ] = type;
itemGroup.setRelevantEnchantmentTypes( temporary );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,26 @@
import com.wonderfulenchantments.enchantments.*;
import com.wonderfulenchantments.items.ShieldReplacementItem;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentType;
import net.minecraft.item.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.particles.BasicParticleType;
import net.minecraft.particles.ParticleType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class RegistryHandler {
public static final DeferredRegister< Enchantment > ENCHANTMENTS = new DeferredRegister<>( ForgeRegistries.ENCHANTMENTS, WonderfulEnchantments.MODID );
public static final DeferredRegister< Enchantment > ENCHANTMENTS = new DeferredRegister<>( ForgeRegistries.ENCHANTMENTS, WonderfulEnchantments.MOD_ID );
public static final DeferredRegister< ParticleType< ? > > PARTICLES = new DeferredRegister<>( ForgeRegistries.PARTICLE_TYPES, WonderfulEnchantments.MOD_ID );
public static final DeferredRegister< Item > ITEMS_TO_REPLACE = new DeferredRegister<>( ForgeRegistries.ITEMS, "minecraft" );
public static class EnchantmentTypes {
public static final EnchantmentType SHIELD = EnchantmentType.create( "shield", ( Item itemIn ) -> { return itemIn instanceof ShieldItem; } );

public static void addTypeToItemGroup( EnchantmentType type, ItemGroup itemGroup ) {
EnchantmentType[] group = itemGroup.getRelevantEnchantmentTypes();
EnchantmentType[] temporary = new EnchantmentType[ group.length+1 ];
System.arraycopy( group, 0, temporary, 0, group.length );
temporary[ group.length-1 ] = type;

itemGroup.setRelevantEnchantmentTypes( temporary );
}
}

public static void init() {
final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();

ENCHANTMENTS.register( modEventBus );
PARTICLES.register( modEventBus );
ITEMS_TO_REPLACE.register( modEventBus );

EnchantmentTypes.addTypeToItemGroup( EnchantmentTypes.SHIELD, ItemGroup.COMBAT );
Expand All @@ -42,9 +34,14 @@ public static void init() {
HUMAN_SLAYER = ENCHANTMENTS.register( "human_slayer", HumanSlayerEnchantment::new ),
DODGE = ENCHANTMENTS.register( "dodge", DodgeEnchantment::new ),
ENLIGHTENMENT = ENCHANTMENTS.register( "enlightenment", EnlightenmentEnchantment::new ),
VITALITY = ENCHANTMENTS.register( "vitality", VitalityEnchantment::new );
VITALITY = ENCHANTMENTS.register( "vitality", VitalityEnchantment::new ),
PHOENIX_DIVE = ENCHANTMENTS.register( "phoenix_dive", PhoenixDiveEnchantment::new );

// Particles
public static final RegistryObject< BasicParticleType >
PHOENIX_PARTICLE = PARTICLES.register( "phoenix_particle", () -> new BasicParticleType( true ) );

// Items to replace
public static final RegistryObject< Item >
SHIELD_REPLACEMENT = ITEMS_TO_REPLACE.register( "shield", ShieldReplacementItem::new );
SHIELD_REPLACEMENT = ITEMS_TO_REPLACE.register( "shield", ShieldReplacementItem::new );
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,23 @@

import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Random;

@Mod( "wonderful_enchantments" )
@Mod( WonderfulEnchantments.MOD_ID )
public class WonderfulEnchantments {
public WonderfulEnchantments() {
FMLJavaModLoadingContext.get().getModEventBus().addListener( this::setup );
FMLJavaModLoadingContext.get().getModEventBus().addListener( this::doClientStuff );

RegistryHandler.init();

MinecraftForge.EVENT_BUS.register( this );
}

private void setup( final FMLCommonSetupEvent event ) {

}

private void doClientStuff( final FMLClientSetupEvent event ) {

}

public static final String MODID = "wonderful_enchantments", VERSION = "0.2.0";
public static final String
MOD_ID = "wonderful_enchantments",
NAME = "Wonderful Enchantments",
VERSION = "0.3.0";
public static final Logger LOGGER = LogManager.getLogger();
public static final Random RANDOM = new Random();
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,78 +6,100 @@
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnchantmentType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.IAttributeInstance;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingDamageEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.HashMap;
import java.util.UUID;

@Mod.EventBusSubscriber
public class DodgeEnchantment extends Enchantment {
public DodgeEnchantment() {
super( Rarity.RARE, EnchantmentType.ARMOR_LEGS, new EquipmentSlotType[]{ EquipmentSlotType.LEGS } );
}

@Override
public int getMinEnchantability( int level ) {
return 14 * ( level );
}

@Override
public int getMaxEnchantability( int level ) {
return this.getMinEnchantability( level ) + 20;
}

@Override
public int getMaxLevel() {
return 2;
}

@Override
protected boolean canApplyTogether( Enchantment enchant ) {
return super.canApplyTogether( enchant );
}

@SubscribeEvent
public static void onEntityHurt( LivingDamageEvent event ) {
LivingEntity entity = event.getEntityLiving();
int enchantmentLevel = EnchantmentHelper.getMaxEnchantmentLevel( RegistryHandler.DODGE.get(), entity );

if( enchantmentLevel > 0 ) {
if( !( WonderfulEnchantments.RANDOM.nextDouble() < ( double )enchantmentLevel * 0.125D ) )
return;

for( double d = 0.0D; d < 3.0D; d++ ) {
((ServerWorld) entity.getEntityWorld()).spawnParticle(
ParticleTypes.SMOKE,
entity.getPosX(), entity.getPosYHeight( 0.25D*( d+1.0D ) ), entity.getPosZ(),
32,
0.125D, 0.0D, 0.125D,
0.075D
);
((ServerWorld) entity.getEntityWorld()).spawnParticle(
ParticleTypes.LARGE_SMOKE,
entity.getPosX(), entity.getPosYHeight( 0.25D*( d+1.0D ) ), entity.getPosZ(),
16,
0.125D, 0.0D, 0.125D,
0.025D
);
}

for( ItemStack armor : entity.getArmorInventoryList() ) {
int level = EnchantmentHelper.getEnchantmentLevel( RegistryHandler.DODGE.get(), armor );

if( level > 0 ) {
armor.damageItem( ( int )event.getAmount(), entity, ( e ) -> {
e.sendBreakAnimation( EquipmentSlotType.LEGS );
} );
break;
}
}

event.setCanceled( true );
}
}
protected static final UUID MODIFIER_UUID = UUID.fromString( "ad3e064e-e9f6-4747-a86b-46dc4e2a1444" );
protected static final String MODIFIER_NAME = "KnockBackImmunityTime";
protected static HashMap< String, Integer > modifiers = new HashMap<>();

public DodgeEnchantment() {
super( Rarity.RARE, EnchantmentType.ARMOR_LEGS, new EquipmentSlotType[]{ EquipmentSlotType.LEGS } );
}

@Override
public int getMaxLevel() {
return 2;
}

@Override
public int getMinEnchantability( int level ) {
return 14 * ( level );
}

@Override
public int getMaxEnchantability( int level ) {
return this.getMinEnchantability( level ) + 20;
}

@SubscribeEvent
public static void onEntityHurt( LivingDamageEvent event ) {
LivingEntity entity = event.getEntityLiving();
ItemStack pants = entity.getItemStackFromSlot( EquipmentSlotType.LEGS );
int enchantmentLevel = EnchantmentHelper.getEnchantmentLevel( RegistryHandler.DODGE.get(), pants );

if( enchantmentLevel > 0 ) {
if( !( WonderfulEnchantments.RANDOM.nextDouble() < ( double )enchantmentLevel * 0.125D ) )
return;

for( double d = 0.0D; d < 3.0D; d++ ) {
( ( ServerWorld )entity.getEntityWorld() ).spawnParticle( ParticleTypes.SMOKE, entity.getPosX(), entity.getPosYHeight( 0.25D * ( d + 1.0D ) ), entity.getPosZ(), 32, 0.125D, 0.0D, 0.125D, 0.075D );
( ( ServerWorld )entity.getEntityWorld() ).spawnParticle( ParticleTypes.LARGE_SMOKE, entity.getPosX(), entity.getPosYHeight( 0.25D * ( d + 1.0D ) ), entity.getPosZ(), 16, 0.125D, 0.0D, 0.125D, 0.025D );
}

pants.damageItem( ( int )event.getAmount(), entity, ( e )->e.sendBreakAnimation( EquipmentSlotType.LEGS ) );
if( entity instanceof PlayerEntity )
setImmunity( ( PlayerEntity )( entity ), 100 );

event.setCanceled( true );
}
}

private static void setImmunity( PlayerEntity player, int ticks ) {
String nickname = player.getDisplayName().getString();

if( !modifiers.containsKey( nickname ) )
modifiers.put( nickname, 0 );

modifiers.replace( nickname, ticks );

applyImmunity( player );
}

private static void applyImmunity( PlayerEntity player ) {
String nickname = player.getDisplayName().getString();

IAttributeInstance resistance = player.getAttribute( SharedMonsterAttributes.KNOCKBACK_RESISTANCE );
resistance.removeModifier( MODIFIER_UUID );
AttributeModifier modifier = new AttributeModifier( MODIFIER_UUID, MODIFIER_NAME, ( modifiers.get( nickname ) > 0 ) ? 1.0D : 0.0D, AttributeModifier.Operation.ADDITION );
resistance.applyModifier( modifier );
}

@SubscribeEvent
public static void checkPlayersKnockBackImmunity( TickEvent.PlayerTickEvent event ) {
PlayerEntity player = event.player;
String nickname = player.getDisplayName().getString();

if( !modifiers.containsKey( nickname ) )
modifiers.put( nickname, 0 );

applyImmunity( player );

modifiers.replace( nickname, Math.max( modifiers.get( nickname ) - 1, 0 ) );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.wonderfulenchantments.RegistryHandler;
import com.wonderfulenchantments.WonderfulEnchantments;
import net.minecraft.enchantment.*;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnchantmentType;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraftforge.event.entity.player.PlayerXpEvent;
Expand All @@ -11,42 +13,37 @@

@Mod.EventBusSubscriber
public class EnlightenmentEnchantment extends Enchantment {
public EnlightenmentEnchantment() {
super( Rarity.RARE, EnchantmentType.ARMOR, new EquipmentSlotType[]{ EquipmentSlotType.HEAD, EquipmentSlotType.CHEST, EquipmentSlotType.LEGS, EquipmentSlotType.FEET } );
}

@Override
public int getMinEnchantability( int enchantmentLevel ) {
return 6 + enchantmentLevel * 12;
}

@Override
public int getMaxEnchantability( int enchantmentLevel ) {
return this.getMinEnchantability( enchantmentLevel ) + 20;
}

@Override
public int getMaxLevel() {
return 2;
}

@Override
public boolean canApply( ItemStack stack ) {
return super.canApply( stack );
}

@SubscribeEvent
public static void onXPPickUp( PlayerXpEvent.PickupXp event ) {
int levelSum = 0;
for( ItemStack armor : event.getPlayer().getArmorInventoryList() )
levelSum += EnchantmentHelper.getEnchantmentLevel( RegistryHandler.ENLIGHTENMENT.get(), armor );

if( levelSum > 0 ) {
double bonusRatio = 0.25D * (double) levelSum;
double randomBonus = bonusRatio * WonderfulEnchantments.RANDOM.nextDouble();
int bonusExp = (int) (Math.round(randomBonus * (double) event.getOrb().getXpValue()));

event.getPlayer().giveExperiencePoints(bonusExp);
}
}
public EnlightenmentEnchantment() {
super( Rarity.RARE, EnchantmentType.ARMOR, new EquipmentSlotType[]{ EquipmentSlotType.HEAD, EquipmentSlotType.CHEST, EquipmentSlotType.LEGS, EquipmentSlotType.FEET } );
}

@Override
public int getMaxLevel() {
return 2;
}

@Override
public int getMinEnchantability( int enchantmentLevel ) {
return 6 + enchantmentLevel * 12;
}

@Override
public int getMaxEnchantability( int enchantmentLevel ) {
return this.getMinEnchantability( enchantmentLevel ) + 20;
}

@SubscribeEvent
public static void onXPPickUp( PlayerXpEvent.PickupXp event ) {
int levelSum = 0;
for( ItemStack armor : event.getPlayer().getArmorInventoryList() )
levelSum += EnchantmentHelper.getEnchantmentLevel( RegistryHandler.ENLIGHTENMENT.get(), armor );

if( levelSum > 0 ) {
double bonusRatio = 0.25D * ( double )levelSum;
double randomBonus = bonusRatio * WonderfulEnchantments.RANDOM.nextDouble();
int bonusExp = ( int )( Math.round( randomBonus * ( double )event.getOrb().getXpValue() ) );

event.getPlayer().giveExperiencePoints( bonusExp );
}
}
}
Loading

0 comments on commit a453d78

Please sign in to comment.