Add combat tracker API (#11853)

This commit is contained in:
Illia Bondar
2025-04-30 20:24:33 +03:00
committed by GitHub
parent 646b80ca53
commit e663f99982
12 changed files with 546 additions and 0 deletions

View File

@@ -1,10 +1,21 @@
package io.papermc.paper;
import io.papermc.paper.world.damagesource.CombatEntry;
import io.papermc.paper.world.damagesource.FallLocationType;
import io.papermc.paper.world.damagesource.PaperCombatEntryWrapper;
import io.papermc.paper.world.damagesource.PaperCombatTrackerWrapper;
import net.minecraft.Optionull;
import net.minecraft.world.damagesource.FallLocation;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.block.CraftBiome;
import org.bukkit.craftbukkit.damage.CraftDamageEffect;
import org.bukkit.craftbukkit.damage.CraftDamageSource;
import org.bukkit.craftbukkit.entity.CraftLivingEntity;
import org.bukkit.damage.DamageEffect;
import org.bukkit.damage.DamageSource;
import org.bukkit.entity.LivingEntity;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@NullMarked
public class PaperServerInternalAPIBridge implements InternalAPIBridge {
@@ -22,4 +33,42 @@ public class PaperServerInternalAPIBridge implements InternalAPIBridge {
}
return Holder.LEGACY_CUSTOM;
}
@Override
public CombatEntry createCombatEntry(final LivingEntity entity, final DamageSource damageSource, final float damage) {
final net.minecraft.world.entity.LivingEntity mob = ((CraftLivingEntity) entity).getHandle();
final FallLocation fallLocation = FallLocation.getCurrentFallLocation(mob);
return createCombatEntry(
((CraftDamageSource) damageSource).getHandle(),
damage,
fallLocation,
(float) mob.fallDistance
);
}
@Override
public CombatEntry createCombatEntry(
final DamageSource damageSource,
final float damage,
@Nullable final FallLocationType fallLocationType,
final float fallDistance
) {
return createCombatEntry(
((CraftDamageSource) damageSource).getHandle(),
damage,
Optionull.map(fallLocationType, PaperCombatTrackerWrapper::paperToMinecraft),
fallDistance
);
}
private CombatEntry createCombatEntry(
final net.minecraft.world.damagesource.DamageSource damageSource,
final float damage,
final net.minecraft.world.damagesource.@Nullable FallLocation fallLocation,
final float fallDistance
) {
return new PaperCombatEntryWrapper(new net.minecraft.world.damagesource.CombatEntry(
damageSource, damage, fallLocation, fallDistance
));
}
}