添加重型弹药的村民交易,撞击伤害产生的经验和掉落物(待优化)直接添加到玩家

This commit is contained in:
Atsuihsio 2024-12-19 13:52:04 +08:00
parent f68ae8ba7b
commit ee36a54567
3 changed files with 44 additions and 25 deletions

View file

@ -348,8 +348,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
collideBlock(); collideBlock();
gunnerAngle(); gunnerAngle();
gunnerFire(); gunnerFire();
pickUpItem();
// attractEntity();
this.refreshDimensions(); this.refreshDimensions();
} }
@ -593,26 +592,22 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
} }
} }
// public boolean hasEnoughSpaceFor(Entity pEntity) {
// return pEntity.getBbWidth() < this.getBbWidth(); public void pickUpItem() {
// } // List<Entity> list = this.level().getEntities(this, this.getBoundingBox().inflate(0.2F, 0.1, 0.2F));
//
// public void attractEntity() {
// List<Entity> list = this.level().getEntities(this, this.getBoundingBox().inflate(0.2F, -0.01F, 0.2F), EntitySelector.pushableBy(this));
// if (!list.isEmpty()) { // if (!list.isEmpty()) {
// boolean flag = !this.level().isClientSide && !(this.getControllingPassenger() instanceof Player);
// //
// for (Entity entity : list) { // for (Entity entity : list) {
// if (!entity.hasPassenger(this)) { // if (!this.level().isClientSide && entity instanceof ItemEntity itemEntity) {
// if (flag && this.getPassengers().size() < this.getMaxPassengers() && !entity.isPassenger() && this.hasEnoughSpaceFor(entity) && entity instanceof LivingEntity && !(entity instanceof WaterAnimal) && !(entity instanceof Player)) { // ItemStack itemStack = itemEntity.getItem();
// entity.startRiding(this); // boolean flag = !this.level().isClientSide;
// } else { //
// this.push(entity); // this.getItemStacks().add(itemStack);
// } // itemEntity.discard();
// } // }
// } // }
// } // }
// } }
public static double calculateAngle(Vec3 move, Vec3 view) { public static double calculateAngle(Vec3 move, Vec3 view) {
move = move.multiply(1, 0, 1).normalize(); move = move.multiply(1, 0, 1).normalize();

View file

@ -710,9 +710,10 @@ public class LivingEventHandler {
Entity sourceEntity = source.getEntity(); Entity sourceEntity = source.getEntity();
if (!(sourceEntity instanceof Player player)) return; if (!(sourceEntity instanceof Player player)) return;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
if (PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0) { //TODO 将撞击致死产生掉落物添加到载具储存空间而不是直接加到玩家身上
if (sourceEntity.getVehicle() instanceof IVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) {
var drops = event.getDrops(); var drops = event.getDrops();
drops.forEach(itemEntity -> { drops.forEach(itemEntity -> {
ItemStack item = itemEntity.getItem(); ItemStack item = itemEntity.getItem();
@ -720,7 +721,17 @@ public class LivingEventHandler {
player.drop(item, false); player.drop(item, false);
} }
}); });
event.setCanceled(true);
}
if (stack.is(ModTags.Items.GUN) && PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack) > 0) {
var drops = event.getDrops();
drops.forEach(itemEntity -> {
ItemStack item = itemEntity.getItem();
if (!player.addItem(item)) {
player.drop(item, false);
}
});
event.setCanceled(true); event.setCanceled(true);
} }
} }
@ -729,15 +740,22 @@ public class LivingEventHandler {
public static void onLivingExperienceDrop(LivingExperienceDropEvent event) { public static void onLivingExperienceDrop(LivingExperienceDropEvent event) {
Player player = event.getAttackingPlayer(); Player player = event.getAttackingPlayer();
if (player == null) return; if (player == null) return;
ItemStack stack = player.getMainHandItem(); DamageSource source = event.getAttackingPlayer().getLastDamageSource();
if (!stack.is(ModTags.Items.GUN)) return; if (source == null) return;
int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack);
if (level > 0) {
player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level)));
if (player.getVehicle() instanceof IVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) {
player.giveExperiencePoints(event.getDroppedExperience());
event.setCanceled(true); event.setCanceled(true);
} }
ItemStack stack = player.getMainHandItem();
if (stack.is(ModTags.Items.GUN)) {
int level = PerkHelper.getItemPerkLevel(ModPerks.POWERFUL_ATTRACTION.get(), stack);
if (level > 0) {
player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level)));
event.setCanceled(true);
}
}
} }
public static void handlePlayerBeamReset(Player player) { public static void handlePlayerBeamReset(Player player) {

View file

@ -1,8 +1,8 @@
package com.atsuishio.superbwarfare.init; package com.atsuishio.superbwarfare.init;
import com.atsuishio.superbwarfare.ModUtils;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import com.atsuishio.superbwarfare.ModUtils;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.ai.village.poi.PoiType;
@ -56,6 +56,8 @@ public class ModVillagers {
new ItemStack(ModItems.SNIPER_AMMO.get(), 2), 16, 1, 0.05f)); new ItemStack(ModItems.SNIPER_AMMO.get(), 2), 16, 1, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1), trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1),
new ItemStack(ModItems.SHOTGUN_AMMO.get(), 2), 16, 1, 0.05f)); new ItemStack(ModItems.SHOTGUN_AMMO.get(), 2), 16, 1, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(Items.EMERALD, 1),
new ItemStack(ModItems.HEAVY_AMMO.get(), 2), 16, 1, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HANDGUN_AMMO.get(), 8), trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HANDGUN_AMMO.get(), 8),
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f));
@ -65,6 +67,8 @@ public class ModVillagers {
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.SHOTGUN_AMMO.get(), 4), trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.SHOTGUN_AMMO.get(), 4),
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f)); new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f));
trades.get(1).add(new BasicItemListing(new ItemStack(ModItems.HEAVY_AMMO.get(), 4),
new ItemStack(Items.EMERALD, 1), 32, 2, 0.05f));
// 等级 2 交易 // 等级 2 交易
trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10), trades.get(2).add(new BasicItemListing(new ItemStack(Items.EMERALD, 10),
@ -204,6 +208,8 @@ public class ModVillagers {
new ItemStack(ModItems.DEVOTION_BLUEPRINT.get()), 10, 30, 0.05f)); new ItemStack(ModItems.DEVOTION_BLUEPRINT.get()), 10, 30, 0.05f));
trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 64), trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 64),
new ItemStack(ModItems.QBZ_95_BLUEPRINT.get()), 10, 30, 0.05f)); new ItemStack(ModItems.QBZ_95_BLUEPRINT.get()), 10, 30, 0.05f));
trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 64),
new ItemStack(ModItems.AK_12_BLUEPRINT.get()), 10, 30, 0.05f));
trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 16), trades.get(5).add(new BasicItemListing(new ItemStack(Items.EMERALD, 16),
new ItemStack(ModItems.HE_5_INCHES.get(), 1), 8, 10, 0.05f)); new ItemStack(ModItems.HE_5_INCHES.get(), 1), 8, 10, 0.05f));