diff --git a/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java b/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java index 6bc23ec7..2320336b 100644 --- a/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java +++ b/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java @@ -9,6 +9,7 @@ import electroblob.wizardry.data.WizardData; import electroblob.wizardry.item.ISpellCastingItem; import electroblob.wizardry.item.ItemArtefact; import electroblob.wizardry.item.ItemSpectralBow; +import electroblob.wizardry.item.ItemWand; import electroblob.wizardry.potion.PotionSlowTime; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardryItems; @@ -173,6 +174,14 @@ public final class WizardryClientEventHandler { event.getMovementInput().jump = false; event.getMovementInput().sneak = false; } + + if(ItemArtefact.isArtefactActive(event.getEntityPlayer(), WizardryItems.charm_move_speed) + && event.getEntityPlayer().isHandActive() + && event.getEntityPlayer().getActiveItemStack().getItem() instanceof ItemWand){ + // Normally speed is set to 20% when using items, this makes it 80% + event.getMovementInput().moveStrafe *= 4; + event.getMovementInput().moveForward *= 4; + } } @SubscribeEvent diff --git a/src/main/java/electroblob/wizardry/client/model/WizardryModels.java b/src/main/java/electroblob/wizardry/client/model/WizardryModels.java index 84a3aa9f..f89c73d5 100644 --- a/src/main/java/electroblob/wizardry/client/model/WizardryModels.java +++ b/src/main/java/electroblob/wizardry/client/model/WizardryModels.java @@ -279,6 +279,7 @@ public final class WizardryModels { registerItemModel(WizardryItems.charm_haggler); registerItemModel(WizardryItems.charm_experience_tome); + registerItemModel(WizardryItems.charm_move_speed); registerItemModel(WizardryItems.charm_auto_smelt); registerItemModel(WizardryItems.charm_lava_walking); registerItemModel(WizardryItems.charm_storm); @@ -291,6 +292,7 @@ public final class WizardryModels { registerItemModel(WizardryItems.charm_stop_time); registerItemModel(WizardryItems.charm_light); registerItemModel(WizardryItems.charm_transportation); + registerItemModel(WizardryItems.charm_black_hole); registerItemModel(WizardryItems.charm_feeding); } diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityBlackHole.java b/src/main/java/electroblob/wizardry/entity/construct/EntityBlackHole.java index 378c9066..8f7075f0 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityBlackHole.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityBlackHole.java @@ -1,19 +1,25 @@ package electroblob.wizardry.entity.construct; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.entity.EntityLevitatingBlock; import electroblob.wizardry.item.ItemArtefact; import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.MagicDamage.DamageType; import electroblob.wizardry.util.WizardryUtilities; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.SPacketEntityVelocity; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -82,10 +88,42 @@ public class EntityBlackHole extends EntityMagicConstruct { if(!this.world.isRemote){ - List targets = WizardryUtilities.getEntitiesWithinRadius(6.0d, this.posX, this.posY, - this.posZ, this.world); + double radius = 6; // TODO: Support for spell properties and modifiers - for(EntityLivingBase target : targets){ + boolean suckInBlocks = getCaster() instanceof EntityPlayer && WizardryUtilities.canDamageBlocks(getCaster(), world) + && ItemArtefact.isArtefactActive((EntityPlayer)getCaster(), WizardryItems.charm_black_hole); + + if(suckInBlocks){ + + List sphere = WizardryUtilities.getBlockSphere(new BlockPos(this), radius); + + for(BlockPos pos : sphere){ + + if(rand.nextInt(Math.max(1, (int)this.getDistanceSq(pos) * 3)) == 0){ + + if(!WizardryUtilities.isBlockUnbreakable(world, pos) && !world.isAirBlock(pos) + && world.isBlockNormalCube(pos, false)){ + // Checks that the block above is not solid, since this causes the falling block to vanish. +// && !world.isBlockNormalCube(pos.up(), false)){ + + EntityFallingBlock fallingBlock = new EntityLevitatingBlock(world, pos.getX() + 0.5, + pos.getY() + 0.5, pos.getZ() + 0.5, world.getBlockState(pos)); +// fallingBlock.noClip = true; + fallingBlock.fallTime = 1; // Prevent it from trying to delete the block itself + world.spawnEntity(fallingBlock); + world.setBlockToAir(pos); + } + } + } + + } + + List targets = WizardryUtilities.getEntitiesWithinRadius(radius, this.posX, this.posY, + this.posZ, this.world, Entity.class); + + targets.removeIf(t -> !(t instanceof EntityLivingBase || (suckInBlocks && t instanceof EntityFallingBlock))); + + for(Entity target : targets){ if(this.isValidTarget(target)){ @@ -94,6 +132,7 @@ public class EntityBlackHole extends EntityMagicConstruct { || ItemArtefact.isArtefactActive((EntityPlayer)target, WizardryItems.amulet_anchoring)))){ WizardryUtilities.undoGravity(target); + if(target instanceof EntityLevitatingBlock) ((EntityLevitatingBlock)target).suspend(); // Sucks the target in if(this.posX > target.posX && target.motionX < 1){ @@ -121,13 +160,22 @@ public class EntityBlackHole extends EntityMagicConstruct { } if(this.getDistance(target) <= 2){ - // Damages the target if it is close enough - if(this.getCaster() != null){ - target.attackEntityFrom( - MagicDamage.causeIndirectMagicDamage(this, getCaster(), DamageType.MAGIC), - 2 * damageMultiplier); + // Damages the target if it is close enough, or destroys it if it's a block + if(target instanceof EntityFallingBlock){ + target.playSound(WizardrySounds.ENTITY_BLACK_HOLE_BREAK_BLOCK, 0.5f, + (rand.nextFloat() - rand.nextFloat()) * 0.2f + 1); + IBlockState state = ((EntityFallingBlock)target).getBlock(); + if(state != null) world.playEvent(2001, new BlockPos(target), Block.getStateId(state)); + target.setDead(); + }else{ - target.attackEntityFrom(DamageSource.MAGIC, 2 * damageMultiplier); + if(this.getCaster() != null){ + target.attackEntityFrom( + MagicDamage.causeIndirectMagicDamage(this, getCaster(), DamageType.MAGIC), + 2 * damageMultiplier); + }else{ + target.attackEntityFrom(DamageSource.MAGIC, 2 * damageMultiplier); + } } } } diff --git a/src/main/java/electroblob/wizardry/registry/WizardryItems.java b/src/main/java/electroblob/wizardry/registry/WizardryItems.java index b33d4577..9754c6df 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryItems.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryItems.java @@ -262,6 +262,7 @@ public final class WizardryItems { public static final Item charm_haggler = placeholder(); public static final Item charm_experience_tome = placeholder(); + public static final Item charm_move_speed = placeholder(); public static final Item charm_auto_smelt = placeholder(); public static final Item charm_lava_walking = placeholder(); public static final Item charm_storm = placeholder(); @@ -274,6 +275,7 @@ public final class WizardryItems { public static final Item charm_stop_time = placeholder(); public static final Item charm_light = placeholder(); public static final Item charm_transportation = placeholder(); + public static final Item charm_black_hole = placeholder(); public static final Item charm_feeding = placeholder(); private static final Map, Item> WAND_MAP = new HashMap<>(); @@ -612,6 +614,7 @@ public final class WizardryItems { registerItem(registry, "charm_haggler", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_experience_tome", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); + registerItem(registry, "charm_move_speed", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_auto_smelt", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_lava_walking", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_storm", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); @@ -624,6 +627,7 @@ public final class WizardryItems { registerItem(registry, "charm_stop_time", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_light", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_transportation", new ItemArtefact(EnumRarity.RARE, ItemArtefact.Type.CHARM)); + registerItem(registry, "charm_black_hole", new ItemArtefact(EnumRarity.EPIC, ItemArtefact.Type.CHARM)); registerItem(registry, "charm_feeding", new ItemArtefact(EnumRarity.UNCOMMON, ItemArtefact.Type.CHARM)); } diff --git a/src/main/java/electroblob/wizardry/registry/WizardrySounds.java b/src/main/java/electroblob/wizardry/registry/WizardrySounds.java index adf6eba4..240343dd 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardrySounds.java +++ b/src/main/java/electroblob/wizardry/registry/WizardrySounds.java @@ -41,6 +41,7 @@ public final class WizardrySounds { public static final SoundEvent ENTITY_BLACK_HOLE_AMBIENT = createSound("entity.black_hole.ambient"); public static final SoundEvent ENTITY_BLACK_HOLE_VANISH = createSound("entity.black_hole.vanish"); + public static final SoundEvent ENTITY_BLACK_HOLE_BREAK_BLOCK = createSound("entity.black_hole.break_block"); public static final SoundEvent ENTITY_BUBBLE_POP = createSound("entity.bubble.pop"); public static final SoundEvent ENTITY_BLIZZARD_AMBIENT = createSound("entity.blizzard.ambient"); public static final SoundEvent ENTITY_DECAY_AMBIENT = createSound("entity.decay.ambient"); @@ -176,6 +177,7 @@ public final class WizardrySounds { event.getRegistry().register(ENTITY_BLACK_HOLE_AMBIENT); event.getRegistry().register(ENTITY_BLACK_HOLE_VANISH); + event.getRegistry().register(ENTITY_BLACK_HOLE_BREAK_BLOCK); event.getRegistry().register(ENTITY_BUBBLE_POP); event.getRegistry().register(ENTITY_BLIZZARD_AMBIENT); event.getRegistry().register(ENTITY_DECAY_AMBIENT); diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index d8982789..27b89588 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -362,6 +362,8 @@ item.ebwizardry\:charm_haggler.name=Haggler's Sign item.ebwizardry\:charm_haggler.desc=Wizards are guaranteed to offer a new trade every time you trade with them item.ebwizardry\:charm_experience_tome.name=Tome of the Diligent item.ebwizardry\:charm_experience_tome.desc=Increases the rate at which wands gain progression by 50%% +item.ebwizardry\:charm_move_speed.name=Icarus Medallion +item.ebwizardry\:charm_move_speed.desc=Move at near-full speed when casting spells item.ebwizardry\:charm_auto_smelt.name=Metallurgist's Mark item.ebwizardry\:charm_auto_smelt.desc=Pocket furnace triggers automatically when bound to a wand on your hotbar item.ebwizardry\:charm_lava_walking.name=Nether Ice Core @@ -386,6 +388,8 @@ item.ebwizardry\:charm_light.name=Elevinia's Everburning Lantern item.ebwizardry\:charm_light.desc=Conjured light sources last forever and may be dispelled by right-clicking with a wand item.ebwizardry\:charm_transportation.name=Ancient Compass item.ebwizardry\:charm_transportation.desc=Up to four stone circles may be remembered and selected from when using transportation +item.ebwizardry\:charm_black_hole.name=Void Opal +item.ebwizardry\:charm_black_hole.desc=Black hole sucks in and destroys blocks item.ebwizardry\:charm_feeding.name=Bottomless Provisions item.ebwizardry\:charm_feeding.desc=Replenish hunger and satiety trigger automatically when bound to a wand on your hotbar diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index 5c21e185..c50099d1 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -362,6 +362,8 @@ item.ebwizardry\:charm_haggler.name=Haggler's Sign item.ebwizardry\:charm_haggler.desc=Wizards are guaranteed to offer a new trade every time you trade with them item.ebwizardry\:charm_experience_tome.name=Tome of the Diligent item.ebwizardry\:charm_experience_tome.desc=Increases the rate at which wands gain progression by 50%% +item.ebwizardry\:charm_move_speed.name=Icarus Medallion +item.ebwizardry\:charm_move_speed.desc=Move at near-full speed when casting spells item.ebwizardry\:charm_auto_smelt.name=Metallurgist's Mark item.ebwizardry\:charm_auto_smelt.desc=Pocket furnace triggers automatically when bound to a wand on your hotbar item.ebwizardry\:charm_lava_walking.name=Nether Ice Core @@ -386,6 +388,8 @@ item.ebwizardry\:charm_light.name=Elevinia's Everburning Lantern item.ebwizardry\:charm_light.desc=Conjured light sources last forever and may be dispelled by right-clicking with a wand item.ebwizardry\:charm_transportation.name=Ancient Compass item.ebwizardry\:charm_transportation.desc=Up to four stone circles may be remembered and selected from when using transportation +item.ebwizardry\:charm_black_hole.name=Void Opal +item.ebwizardry\:charm_black_hole.desc=Black hole sucks in and destroys blocks item.ebwizardry\:charm_feeding.name=Bottomless Provisions item.ebwizardry\:charm_feeding.desc=Replenish hunger and satiety trigger automatically when bound to a wand on your hotbar diff --git a/src/main/resources/assets/ebwizardry/models/item/charm_black_hole.json b/src/main/resources/assets/ebwizardry/models/item/charm_black_hole.json new file mode 100644 index 00000000..f416b151 --- /dev/null +++ b/src/main/resources/assets/ebwizardry/models/item/charm_black_hole.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "ebwizardry:items/charm_black_hole" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/models/item/charm_move_speed.json b/src/main/resources/assets/ebwizardry/models/item/charm_move_speed.json new file mode 100644 index 00000000..71f461b1 --- /dev/null +++ b/src/main/resources/assets/ebwizardry/models/item/charm_move_speed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "ebwizardry:items/charm_move_speed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/sounds.json b/src/main/resources/assets/ebwizardry/sounds.json index 16307596..e03d769d 100644 --- a/src/main/resources/assets/ebwizardry/sounds.json +++ b/src/main/resources/assets/ebwizardry/sounds.json @@ -15,6 +15,7 @@ "entity.black_hole.ambient": {"category": "spells", "sounds": ["portal/portal"]}, "entity.black_hole.vanish": {"category": "spells", "sounds": ["portal/trigger"]}, + "entity.black_hole.break_block": {"category": "spells", "sounds": ["mob/zombie/woodbreak"]}, "entity.bubble.pop": {"category": "spells", "sounds": ["random/pop"]}, "entity.blizzard.ambient": {"category": "spells", "sounds": ["ebwizardry:wind"]}, "entity.decay.ambient": {"category": "spells", "sounds": ["liquid/lava"]}, diff --git a/src/main/resources/assets/ebwizardry/textures/items/charm_black_hole.png b/src/main/resources/assets/ebwizardry/textures/items/charm_black_hole.png new file mode 100644 index 00000000..ee7193cc Binary files /dev/null and b/src/main/resources/assets/ebwizardry/textures/items/charm_black_hole.png differ diff --git a/src/main/resources/assets/ebwizardry/textures/items/charm_move_speed.png b/src/main/resources/assets/ebwizardry/textures/items/charm_move_speed.png new file mode 100644 index 00000000..2c746930 Binary files /dev/null and b/src/main/resources/assets/ebwizardry/textures/items/charm_move_speed.png differ