use of net.minecraft.world.entity.LivingEntity in project SpongeCommon by SpongePowered.
the class EntityPerformingDropsTransaction method captureState.
@Override
protected void captureState() {
super.captureState();
final Entity entity = this.destroyingEntity;
this.worldSupplier = VolumeStreamUtils.createWeaklyReferencedSupplier((ServerLevel) entity.level, "ServerLevel");
final CompoundTag tag = new CompoundTag();
entity.saveWithoutId(tag);
this.entityTag = tag;
@Nullable final DamageSource lastAttacker;
if (entity instanceof LivingEntity) {
final CombatEntry entry = ((CombatTrackerAccessor) ((LivingEntity) entity).getCombatTracker()).invoker$getMostSignificantFall();
if (entry != null) {
lastAttacker = ((CombatEntryAccessor) entry).accessor$source();
} else {
lastAttacker = null;
}
} else {
lastAttacker = null;
}
final WeakReference<@Nullable DamageSource> ref = new WeakReference<>(lastAttacker);
this.lastAttacker = () -> {
@Nullable final DamageSource damageSource = ref.get();
// Yes, I know, we're effectively
if (damageSource == null) {
return Optional.empty();
}
return Optional.of(damageSource);
};
}
use of net.minecraft.world.entity.LivingEntity in project SpongeCommon by SpongePowered.
the class DamageEventUtil method createEnchantmentModifiers.
public static Optional<List<DamageFunction>> createEnchantmentModifiers(final LivingEntity living, final DamageSource damageSource) {
if (damageSource.isBypassMagic()) {
return Optional.empty();
}
final Iterable<net.minecraft.world.item.ItemStack> inventory = living.getArmorSlots();
final int damageProtection = EnchantmentHelper.getDamageProtection(inventory, damageSource);
if (damageProtection <= 0) {
return Optional.empty();
}
final List<DamageFunction> modifiers = new ArrayList<>();
final DoubleUnaryOperator enchantmentFunction = incomingDamage -> -(incomingDamage - CombatRules.getDamageAfterMagicAbsorb((float) incomingDamage, damageProtection));
try (final CauseStackManager.StackFrame frame = ((Server) living.getServer()).causeStackManager().pushCauseFrame()) {
frame.pushCause(living);
final DamageModifier enchantmentModifier = DamageModifier.builder().cause(frame.currentCause()).type(DamageModifierTypes.ARMOR_ENCHANTMENT).build();
modifiers.add(new DamageFunction(enchantmentModifier, enchantmentFunction));
}
return Optional.of(modifiers);
}
use of net.minecraft.world.entity.LivingEntity in project SpongeCommon by SpongePowered.
the class DamageEventUtil method createAbsorptionModifier.
public static Optional<DamageFunction> createAbsorptionModifier(final LivingEntity living) {
final float absorptionAmount = living.getAbsorptionAmount();
if (absorptionAmount > 0) {
final DoubleUnaryOperator function = damage -> -(Math.max(damage - Math.max(damage - absorptionAmount, 0.0F), 0.0F));
final DamageModifier modifier = DamageModifier.builder().cause(Cause.of(EventContext.empty(), living)).type(DamageModifierTypes.ABSORPTION).build();
return Optional.of(new DamageFunction(modifier, function));
}
return Optional.empty();
}
use of net.minecraft.world.entity.LivingEntity in project SpongeCommon by SpongePowered.
the class ServerPlayerMixin method die.
/**
* @author blood - May 12th, 2016
* @author gabizou - June 3rd, 2016
* @author gabizou - February 22nd, 2020 - Minecraft 1.14.3
* @reason SpongeForge requires an overwrite so we do it here instead. This handles player death events.
*/
@Overwrite
public void die(final DamageSource cause) {
// Sponge start - Call Destruct Death Event
final DestructEntityEvent.Death event = SpongeCommonEventFactory.callDestructEntityEventDeath((net.minecraft.server.level.ServerPlayer) (Object) this, cause, Audiences.server());
if (event.isCancelled()) {
return;
}
// Sponge end
final boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES) && !event.isMessageCancelled();
if (flag) {
final net.minecraft.network.chat.Component itextcomponent = this.shadow$getCombatTracker().getDeathMessage();
this.connection.send(new ClientboundPlayerCombatPacket(this.shadow$getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED, itextcomponent), (p_212356_2_) -> {
if (!p_212356_2_.isSuccess()) {
final int i = 256;
final String s = itextcomponent.getString(256);
final net.minecraft.network.chat.Component itextcomponent1 = new TranslatableComponent("death.attack.message_too_long", (new TextComponent(s)).withStyle(ChatFormatting.YELLOW));
final net.minecraft.network.chat.Component itextcomponent2 = new TranslatableComponent("death.attack.even_more_magic", this.shadow$getDisplayName()).withStyle((p_212357_1_) -> p_212357_1_.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, itextcomponent1)));
this.connection.send(new ClientboundPlayerCombatPacket(this.shadow$getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED, itextcomponent2));
}
});
final Team team = this.shadow$getTeam();
if (team != null && team.getDeathMessageVisibility() != Team.Visibility.ALWAYS) {
if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) {
this.server.getPlayerList().broadcastToTeam((net.minecraft.server.level.ServerPlayer) (Object) this, itextcomponent);
} else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OWN_TEAM) {
this.server.getPlayerList().broadcastToAllExceptTeam((net.minecraft.server.level.ServerPlayer) (Object) this, itextcomponent);
}
} else {
final Component message = event.message();
// Sponge start - use the event audience
if (message != Component.empty()) {
event.audience().ifPresent(eventChannel -> eventChannel.sendMessage(Identity.nil(), message));
}
// Sponge end
// this.server.getPlayerList().sendMessage(itextcomponent);
}
} else {
this.connection.send(new ClientboundPlayerCombatPacket(this.shadow$getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED));
}
this.shadow$removeEntitiesOnShoulder();
if (this.level.getGameRules().getBoolean(GameRules.RULE_FORGIVE_DEAD_PLAYERS)) {
this.shadow$tellNeutralMobsThatIDied();
}
// Sponge Start - update the keep inventory flag for dropping inventory
// during the death update ticks
this.impl$keepInventory = event.keepInventory();
if (!this.shadow$isSpectator()) {
this.shadow$dropAllDeathLoot(cause);
}
// Sponge End
this.shadow$getScoreboard().forAllObjectives(ObjectiveCriteria.DEATH_COUNT, this.shadow$getScoreboardName(), Score::increment);
final LivingEntity livingentity = this.shadow$getKillCredit();
if (livingentity != null) {
this.shadow$awardStat(Stats.ENTITY_KILLED_BY.get(livingentity.getType()));
livingentity.awardKillScore((net.minecraft.server.level.ServerPlayer) (Object) this, this.deathScore, cause);
this.shadow$createWitherRose(livingentity);
}
this.level.broadcastEntityEvent((net.minecraft.server.level.ServerPlayer) (Object) this, (byte) 3);
this.shadow$awardStat(Stats.DEATHS);
this.shadow$resetStat(Stats.CUSTOM.get(Stats.TIME_SINCE_DEATH));
this.shadow$resetStat(Stats.CUSTOM.get(Stats.TIME_SINCE_REST));
this.shadow$clearFire();
this.shadow$setSharedFlag(0, false);
this.shadow$getCombatTracker().recheckStatus();
}
use of net.minecraft.world.entity.LivingEntity in project SpongeCommon by SpongePowered.
the class AttackEntityPacketState method getSpawnTypeForTransaction.
@Override
public Supplier<SpawnType> getSpawnTypeForTransaction(final BasicPacketContext context, final net.minecraft.world.entity.Entity entityToSpawn) {
final ServerboundInteractPacket useEntityPacket = context.getPacket();
final ServerPlayer player = context.getPacketPlayer();
final net.minecraft.world.entity.@Nullable Entity entity = useEntityPacket.getTarget(player.level);
if (entity != null && (entity.removed || entity instanceof LivingEntity && ((LivingEntity) entity).isDeadOrDying())) {
return entityToSpawn instanceof ExperienceOrb ? SpawnTypes.EXPERIENCE : SpawnTypes.DROPPED_ITEM;
}
if (entityToSpawn instanceof ItemEntity) {
return SpawnTypes.DROPPED_ITEM;
}
return super.getSpawnTypeForTransaction(context, entityToSpawn);
}
Aggregations