diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java index 04767c0bd..87371c3d8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/DefaultVehicleData.java @@ -22,6 +22,14 @@ public class DefaultVehicleData { @SerializedName("RepairAmount") public float repairAmount = VehicleConfig.REPAIR_AMOUNT.get().floatValue(); + @ServerOnly + @SerializedName("RepairMaterial") + public String repairMaterial = "minecraft:iron_ingot"; + + @ServerOnly + @SerializedName("RepairMaterialHealAmount") + public float repairMaterialHealAmount = 50; + @SerializedName("MaxEnergy") public int maxEnergy = 100000; diff --git a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java index 975a39633..c76dede9a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java +++ b/src/main/java/com/atsuishio/superbwarfare/data/vehicle/VehicleData.java @@ -6,8 +6,12 @@ import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; public class VehicleData { @@ -46,6 +50,41 @@ public class VehicleData { return data.repairAmount; } + public String repairMaterial() { + return data.repairMaterial; + } + + public float repairMaterialHealAmount() { + return data.repairMaterialHealAmount; + } + + public boolean canRepairManually() { + var material = repairMaterial(); + if (material == null) return false; + + if (material.startsWith("#")) { + material = material.substring(1); + } + return ResourceLocation.tryParse(material) != null; + } + + public boolean isRepairMaterial(ItemStack stack) { + var material = repairMaterial(); + var useTag = false; + + if (material.startsWith("#")) { + material = material.substring(1); + useTag = true; + } + + var location = ResourceLocation.parse(material); + if (!useTag) { + return stack.getItem() == BuiltInRegistries.ITEM.get(location); + } else { + return stack.is(ItemTags.create(location)); + } + } + public int maxEnergy() { return data.maxEnergy; } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index 7258498a4..66fafaa8c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -50,7 +50,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.vehicle.DismountHelper; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.material.Fluid; @@ -334,6 +333,7 @@ public abstract class VehicleEntity extends Entity { @Override public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { if (player.getVehicle() == this) return InteractionResult.PASS; + var data = data(); ItemStack stack = player.getMainHandItem(); if (player.isShiftKeyDown() && stack.is(ModItems.CROWBAR.get()) && this.getPassengers().isEmpty()) { @@ -344,8 +344,11 @@ public abstract class VehicleEntity extends Entity { this.remove(RemovalReason.DISCARDED); this.discard(); return InteractionResult.SUCCESS; - } else if (this.getHealth() < this.getMaxHealth() && stack.is(Items.IRON_INGOT)) { - this.heal(Math.min(50, this.getMaxHealth())); + } else if (this.getHealth() < this.getMaxHealth() + && data.canRepairManually() + && data.isRepairMaterial(stack) + ) { + this.heal(Math.min(data.repairMaterialHealAmount(), this.getMaxHealth())); stack.shrink(1); if (!this.level().isClientSide) { this.level().playSound(null, this, SoundEvents.IRON_GOLEM_REPAIR, this.getSoundSource(), 0.5f, 1);