概要
- 矢じゃないものを弓に装填するシチュエーションが好きなのでトライデントを発射できる弓を作ってみたくなった。
- 実装はだいぶ適当にやってます。
- まず弓を自作する必要があるのですが、そこは割愛します。
- https://youtu.be/x8w4OiebWCM?si=lIMI31PztxD3fp37
- ↑待ちきれない人はこれを見てくれ。
コード
弓の内部実装にreleaseUsingメソッドがあるのでそれをオーバーライドして、Arrowを出してそうなところをひたすら書き換えて行きます。
package com.example.examplemod.bow;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.stats.Stats;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.ThrownTrident;
import net.minecraft.world.item.*;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.Level;
public class MyBow extends BowItem {
public MyBow(){
super(new Item.Properties().tab(CreativeModeTab.TAB_COMBAT).stacksTo(1).durability(600));
}
@Override
public void releaseUsing(ItemStack pStack, Level pLevel, LivingEntity pEntityLiving, int pTimeLeft) {
if (pEntityLiving instanceof Player) {
Player player = (Player)pEntityLiving;
ItemStack itemstack = player.getProjectile(pStack);
int i = this.getUseDuration(pStack) - pTimeLeft;
i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(pStack, pLevel, player, i, !itemstack.isEmpty());
if (i < 0) return;
if (!itemstack.isEmpty()) {
if (itemstack.isEmpty()) {
itemstack = new ItemStack(Items.TRIDENT);
}
float f = getPowerForTime(i);
if (!((double)f < 0.1D)) {
boolean flag1 = player.getAbilities().instabuild || (itemstack.getItem() instanceof TridentItem);
if (!pLevel.isClientSide) {
ThrownTrident thrownTrident=new ThrownTrident(pLevel,player,itemstack);
thrownTrident.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, f * 3.0F, 1.0F);
if (f == 1.0F) {
thrownTrident.setCritArrow(true);
}
int j = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.POWER_ARROWS, pStack);
if (j > 0) {
thrownTrident.setBaseDamage(thrownTrident.getBaseDamage() + (double)j * 0.5D + 0.5D);
}
int k = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.PUNCH_ARROWS, pStack);
if (k > 0) {
thrownTrident.setKnockback(k);
}
if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FLAMING_ARROWS, pStack) > 0) {
thrownTrident.setSecondsOnFire(100);
}
pStack.hurtAndBreak(1, player, (p_40665_) -> {
p_40665_.broadcastBreakEvent(player.getUsedItemHand());
});
if (flag1 || player.getAbilities().instabuild && (itemstack.is(Items.SPECTRAL_ARROW) || itemstack.is(Items.TIPPED_ARROW))) {
thrownTrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY;
}
pLevel.addFreshEntity(thrownTrident);
}
pLevel.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F / (pLevel.getRandom().nextFloat() * 0.4F + 1.2F) + f * 0.5F);
if (!flag1 && !player.getAbilities().instabuild) {
itemstack.shrink(1);
if (itemstack.isEmpty()) {
player.getInventory().removeItem(itemstack);
}
}
player.awardStat(Stats.ITEM_USED.get(this));
}
}
}
}
}



