sky tools, part 1
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/handheld",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_axe"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_chest"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_helmet"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/handheld",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_hoe"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_pants"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/handheld",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_pickaxe"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_shoes"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/handheld",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_shovel"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "item/handheld",
|
||||
"textures": {
|
||||
"layer0": "naturesaura:item/sky_sword"
|
||||
}
|
||||
}
|
|
@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.api.render.ITrinketItem;
|
|||
import de.ellpeck.naturesaura.items.tools.ItemArmor;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import de.ellpeck.naturesaura.reg.ModArmorMaterial;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -74,7 +75,7 @@ public class ItemShockwaveCreator extends ItemImpl implements ITrinketItem {
|
|||
source = DamageSource.causePlayerDamage((PlayerEntity) living);
|
||||
else
|
||||
source = DamageSource.MAGIC;
|
||||
boolean infusedSet = ItemArmor.isFullSetEquipped(living, 0);
|
||||
boolean infusedSet = ItemArmor.isFullSetEquipped(living, ModArmorMaterial.INFUSED);
|
||||
|
||||
int range = 5;
|
||||
List<LivingEntity> mobs = worldIn.getEntitiesWithinAABB(LivingEntity.class, new AxisAlignedBB(
|
||||
|
|
|
@ -49,4 +49,13 @@ public final class ModItems {
|
|||
public static Item TAINTED_GOLD;
|
||||
public static Item LOOT_FINDER;
|
||||
public static Item LIGHT_STAFF;
|
||||
public static Item SKY_PICKAXE;
|
||||
public static Item SKY_AXE;
|
||||
public static Item SKY_SHOVEL;
|
||||
public static Item SKY_HOE;
|
||||
public static Item SKY_SWORD;
|
||||
public static Item SKY_HELMET;
|
||||
public static Item SKY_CHEST;
|
||||
public static Item SKY_PANTS;
|
||||
public static Item SKY_SHOES;
|
||||
}
|
||||
|
|
|
@ -2,31 +2,34 @@ package de.ellpeck.naturesaura.items.tools;
|
|||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.items.ModItems;
|
||||
import de.ellpeck.naturesaura.reg.IModItem;
|
||||
import de.ellpeck.naturesaura.reg.ModArmorMaterial;
|
||||
import de.ellpeck.naturesaura.reg.ModRegistry;
|
||||
import net.minecraft.entity.Entity;
|
||||
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.ArmorItem;
|
||||
import net.minecraft.item.IArmorMaterial;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.potion.EffectInstance;
|
||||
import net.minecraft.potion.Effects;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.event.entity.living.LivingAttackEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class ItemArmor extends ArmorItem implements IModItem {
|
||||
|
||||
private static List<Item[]> sets;
|
||||
private static final AttributeModifier SKY_MOVEMENT_MODIFIER = new AttributeModifier(UUID.fromString("c1f96acc-e117-4dc1-a351-e196a4de6071"), NaturesAura.MOD_ID + ":sky_movement_speed", 0.15F, AttributeModifier.Operation.MULTIPLY_TOTAL);
|
||||
private static final Map<IArmorMaterial, Item[]> SETS = new HashMap<>();
|
||||
private final String baseName;
|
||||
|
||||
public ItemArmor(String baseName, IArmorMaterial materialIn, EquipmentSlotType equipmentSlotIn) {
|
||||
|
@ -36,13 +39,11 @@ public class ItemArmor extends ArmorItem implements IModItem {
|
|||
ModRegistry.add(this);
|
||||
}
|
||||
|
||||
public static boolean isFullSetEquipped(LivingEntity entity, int setIndex) {
|
||||
if (sets == null) {
|
||||
sets = new ArrayList<>();
|
||||
sets.add(new Item[]{ModItems.INFUSED_IRON_SHOES, ModItems.INFUSED_IRON_PANTS, ModItems.INFUSED_IRON_CHEST, ModItems.INFUSED_IRON_HELMET});
|
||||
}
|
||||
|
||||
Item[] set = sets.get(setIndex);
|
||||
public static boolean isFullSetEquipped(LivingEntity entity, IArmorMaterial material) {
|
||||
Item[] set = SETS.computeIfAbsent(material, m -> ForgeRegistries.ITEMS.getValues().stream()
|
||||
.filter(i -> i instanceof ItemArmor && ((ItemArmor) i).getArmorMaterial() == material)
|
||||
.sorted(Comparator.comparingInt(i -> ((ItemArmor) i).getEquipmentSlot().ordinal()))
|
||||
.toArray(Item[]::new));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
EquipmentSlotType slot = EquipmentSlotType.values()[i + 2];
|
||||
ItemStack stack = entity.getItemStackFromSlot(slot);
|
||||
|
@ -69,12 +70,33 @@ public class ItemArmor extends ArmorItem implements IModItem {
|
|||
public void onAttack(LivingAttackEvent event) {
|
||||
LivingEntity entity = event.getEntityLiving();
|
||||
if (!entity.world.isRemote) {
|
||||
if (!isFullSetEquipped(entity, 0))
|
||||
if (!isFullSetEquipped(entity, ModArmorMaterial.INFUSED))
|
||||
return;
|
||||
Entity source = event.getSource().getTrueSource();
|
||||
if (source instanceof LivingEntity)
|
||||
((LivingEntity) source).addPotionEffect(new EffectInstance(Effects.WITHER, 40));
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void update(TickEvent.PlayerTickEvent event) {
|
||||
PlayerEntity player = event.player;
|
||||
IAttributeInstance speed = player.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED);
|
||||
String key = NaturesAura.MOD_ID + ":sky_equipped";
|
||||
CompoundNBT nbt = player.getPersistentData();
|
||||
boolean equipped = isFullSetEquipped(player, ModArmorMaterial.SKY);
|
||||
if (equipped && !nbt.getBoolean(key)) {
|
||||
// we just equipped it
|
||||
nbt.putBoolean(key, true);
|
||||
player.stepHeight = 1.1F;
|
||||
if (!speed.hasModifier(SKY_MOVEMENT_MODIFIER))
|
||||
speed.applyModifier(SKY_MOVEMENT_MODIFIER);
|
||||
} else if (!equipped && nbt.getBoolean(key)) {
|
||||
// we just unequipped it
|
||||
nbt.putBoolean(key, false);
|
||||
player.stepHeight = 0.6F;
|
||||
speed.removeModifier(SKY_MOVEMENT_MODIFIER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,9 +43,7 @@ public class ItemAxe extends AxeItem implements IModItem, ICustomItemModel {
|
|||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
|
||||
if (this == ModItems.INFUSED_IRON_AXE)
|
||||
return Helper.makeRechargeProvider(stack, true);
|
||||
else return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -7,12 +7,22 @@ import de.ellpeck.naturesaura.items.ModItems;
|
|||
import de.ellpeck.naturesaura.reg.ICustomItemModel;
|
||||
import de.ellpeck.naturesaura.reg.IModItem;
|
||||
import de.ellpeck.naturesaura.reg.ModRegistry;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.BushBlock;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvents;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.IPlantable;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -30,9 +40,10 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
|
|||
|
||||
@Override
|
||||
public ActionResultType onItemUse(ItemUseContext context) {
|
||||
if (this == ModItems.INFUSED_IRON_HOE) {
|
||||
World world = context.getWorld();
|
||||
ActionResultType result = super.onItemUse(context);
|
||||
if (!world.isRemote && result == ActionResultType.SUCCESS && this == ModItems.INFUSED_IRON_HOE) {
|
||||
if (!world.isRemote && result == ActionResultType.SUCCESS) {
|
||||
ItemStack seed = ItemStack.EMPTY;
|
||||
Random random = world.getRandom();
|
||||
BlockPos pos = context.getPos();
|
||||
|
@ -55,6 +66,43 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
|
|||
}
|
||||
}
|
||||
return result;
|
||||
} else if (this == ModItems.SKY_HOE) {
|
||||
boolean success = false;
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
for (int z = -1; z <= 1; z++) {
|
||||
BlockPos offset = context.getPos().add(x, 0, z);
|
||||
BlockRayTraceResult newResult = new BlockRayTraceResult(context.getHitVec(), context.getFace(), offset, context.isInside());
|
||||
ItemUseContext newContext = new ItemUseContext(context.getPlayer(), context.getHand(), newResult);
|
||||
success |= super.onItemUse(newContext) == ActionResultType.SUCCESS;
|
||||
}
|
||||
}
|
||||
return success ? ActionResultType.SUCCESS : ActionResultType.FAIL;
|
||||
}
|
||||
return super.onItemUse(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockStartBreak(ItemStack stack, BlockPos pos, PlayerEntity player) {
|
||||
if (stack.getItem() == ModItems.SKY_HOE) {
|
||||
if (!(player.world.getBlockState(pos).getBlock() instanceof BushBlock))
|
||||
return false;
|
||||
if (!player.world.isRemote) {
|
||||
int range = 3;
|
||||
for (int x = -range; x <= range; x++) {
|
||||
for (int y = -range; y <= range; y++) {
|
||||
for (int z = -range; z <= range; z++) {
|
||||
if (x == 0 && y == 0 && z == 0)
|
||||
continue;
|
||||
BlockPos offset = pos.add(x, y, z);
|
||||
BlockState otherState = player.world.getBlockState(offset);
|
||||
if (otherState.getBlock() instanceof BushBlock)
|
||||
player.world.destroyBlock(offset, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -65,9 +113,7 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
|
|||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
|
||||
if (this == ModItems.INFUSED_IRON_HOE)
|
||||
return Helper.makeRechargeProvider(stack, true);
|
||||
else return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -68,9 +68,7 @@ public class ItemPickaxe extends PickaxeItem implements IModItem, ICustomItemMod
|
|||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
|
||||
if (this == ModItems.INFUSED_IRON_PICKAXE)
|
||||
return Helper.makeRechargeProvider(stack, true);
|
||||
else return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -86,9 +86,7 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
|
|||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
|
||||
if (this == ModItems.INFUSED_IRON_SHOVEL)
|
||||
return Helper.makeRechargeProvider(stack, true);
|
||||
else return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -34,17 +34,18 @@ public class ItemSword extends SwordItem implements IModItem, ICustomItemModel {
|
|||
|
||||
@Override
|
||||
public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) {
|
||||
if (this == ModItems.INFUSED_IRON_SWORD)
|
||||
if (this == ModItems.INFUSED_IRON_SWORD) {
|
||||
target.addPotionEffect(new EffectInstance(Effects.SLOWNESS, 60, 2));
|
||||
} else if (this == ModItems.SKY_SWORD) {
|
||||
target.addPotionEffect(new EffectInstance(Effects.LEVITATION, 60, 2));
|
||||
}
|
||||
return super.hitEntity(stack, target, attacker);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
|
||||
if (this == ModItems.INFUSED_IRON_SWORD)
|
||||
return Helper.makeRechargeProvider(stack, true);
|
||||
else return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -15,7 +15,8 @@ import java.util.function.Supplier;
|
|||
|
||||
public enum ModArmorMaterial implements IArmorMaterial {
|
||||
|
||||
INFUSED(NaturesAura.MOD_ID + ":infused_iron", 19, new int[]{2, 5, 6, 2}, 16, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0F, () -> Ingredient.fromItems(ModItems.INFUSED_IRON));
|
||||
INFUSED(NaturesAura.MOD_ID + ":infused_iron", 19, new int[]{2, 5, 6, 2}, 16, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0, () -> Ingredient.fromItems(ModItems.INFUSED_IRON)),
|
||||
SKY(NaturesAura.MOD_ID + ":sky", 33, new int[]{3, 6, 8, 3}, 12, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 2, () -> Ingredient.fromItems(ModItems.SKY_INGOT));
|
||||
|
||||
private static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11};
|
||||
private final String name;
|
||||
|
|
|
@ -8,7 +8,8 @@ import net.minecraft.util.LazyValue;
|
|||
import java.util.function.Supplier;
|
||||
|
||||
public enum ModItemTier implements IItemTier {
|
||||
INFUSED(2, 250, 6.0F, 2.0F, 14, () -> Ingredient.fromItems(ModItems.INFUSED_IRON));
|
||||
INFUSED(2, 250, 6, 2, 16, () -> Ingredient.fromItems(ModItems.INFUSED_IRON)),
|
||||
SKY(3, 1500, 8, 3, 12, () -> Ingredient.fromItems(ModItems.SKY_INGOT));
|
||||
|
||||
private final int harvestLevel;
|
||||
private final int maxUses;
|
||||
|
|
|
@ -205,7 +205,16 @@ public final class ModRegistry {
|
|||
new ItemDeathRing(),
|
||||
new ItemImpl("tainted_gold"),
|
||||
new ItemLootFinder(),
|
||||
new ItemLightStaff()
|
||||
new ItemLightStaff(),
|
||||
new ItemPickaxe("sky_pickaxe", ModItemTier.SKY, 1, -2.8F),
|
||||
new ItemAxe("sky_axe", ModItemTier.SKY, 5.0F, -3.0F),
|
||||
new ItemShovel("sky_shovel", ModItemTier.SKY, 1.5F, -3.0F),
|
||||
new ItemHoe("sky_hoe", ModItemTier.SKY, -1.0F),
|
||||
new ItemSword("sky_sword", ModItemTier.SKY, 3, -2.4F),
|
||||
new ItemArmor("sky_helmet", ModArmorMaterial.SKY, EquipmentSlotType.HEAD),
|
||||
new ItemArmor("sky_chest", ModArmorMaterial.SKY, EquipmentSlotType.CHEST),
|
||||
new ItemArmor("sky_pants", ModArmorMaterial.SKY, EquipmentSlotType.LEGS),
|
||||
new ItemArmor("sky_shoes", ModArmorMaterial.SKY, EquipmentSlotType.FEET)
|
||||
);
|
||||
Helper.populateObjectHolders(ModItems.class, event.getRegistry());
|
||||
}
|
||||
|
|
BIN
src/main/resources/assets/naturesaura/textures/item/sky_axe.png
Normal file
After Width: | Height: | Size: 521 B |
After Width: | Height: | Size: 592 B |
After Width: | Height: | Size: 251 B |
BIN
src/main/resources/assets/naturesaura/textures/item/sky_hoe.png
Normal file
After Width: | Height: | Size: 509 B |
After Width: | Height: | Size: 422 B |
After Width: | Height: | Size: 553 B |
After Width: | Height: | Size: 414 B |
After Width: | Height: | Size: 448 B |
After Width: | Height: | Size: 573 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 838 B |