Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.papermc.paper.datacomponent.item;

import io.papermc.paper.datacomponent.DataComponentBuilder;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Range;
import org.jspecify.annotations.NullMarked;

@NullMarked
@ApiStatus.Experimental
@ApiStatus.NonExtendable
public interface AttackRange {

/**
* Returns a new builder for creating an Attack Range.
*
* @return a builder instance
*/
@Contract(value = "-> new", pure = true)
static Builder attackRange() {
return ItemComponentTypesBridge.bridge().attackRange();
}

@Contract(pure = true)
@Range(from = 0, to = 64)
float minReach();

@Contract(pure = true)
@Range(from = 0, to = 64)
float maxReach();

@Contract(pure = true)
@Range(from = 0, to = 1)
float hitboxMargin();

@Contract(pure = true)
@Range(from = 0, to = 2)
float mobFactor();

/**
* Builder for {@link AttackRange}.
*/
@ApiStatus.Experimental
@ApiStatus.NonExtendable
interface Builder extends DataComponentBuilder<AttackRange> {

@Contract(value = "_ -> this", mutates = "this")
Builder minReach(@Range(from = 0, to = 64) float minReach);

@Contract(value = "_ -> this", mutates = "this")
Builder maxReach(@Range(from = 0, to = 64) float maxReach);

@Contract(value = "_ -> this", mutates = "this")
Builder hitboxMargin(@Range(from = 0, to = 1) float hitboxMargin);

@Contract(value = "_ -> this", mutates = "this")
Builder mobFactor(@Range(from = 0, to = 2) float mobFactor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ static ItemComponentTypesBridge bridge() {

PiercingWeapon.Builder piercingWeapon();

AttackRange.Builder attackRange();

SwingAnimation.Builder swingAnimation();

KineticWeapon.Condition kineticWeaponCondition(int maxDurationTicks, float minSpeed, float minRelativeSpeed);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,6 @@ static Condition condition(final @NonNegative int maxDurationTicks, final float
return ItemComponentTypesBridge.bridge().kineticWeaponCondition(maxDurationTicks, minSpeed, minRelativeSpeed);
}

@Contract(pure = true)
@Range(from = 0, to = 128) float minReach();

@Contract(pure = true)
@Range(from = 0, to = 128) float maxReach();

@Contract(pure = true)
@Range(from = 0, to = 1) float hitboxMargin();

@Contract(pure = true)
@NonNegative int contactCooldownTicks();

Expand Down Expand Up @@ -85,15 +76,6 @@ interface Condition {
@ApiStatus.NonExtendable
interface Builder extends DataComponentBuilder<KineticWeapon> {

@Contract(value = "_ -> this", mutates = "this")
Builder minReach(@Range(from = 0, to = 128) float minReach);

@Contract(value = "_ -> this", mutates = "this")
Builder maxReach(@Range(from = 0, to = 128) float maxReach);

@Contract(value = "_ -> this", mutates = "this")
Builder hitboxMargin(@Range(from = 0, to = 1) float hitboxMargin);

@Contract(value = "_ -> this", mutates = "this")
Builder contactCooldownTicks(@NonNegative int ticks);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@ static Builder piercingWeapon() {
return ItemComponentTypesBridge.bridge().piercingWeapon();
}

@Range(from = 0, to = 128) float minReach();

@Range(from = 0, to = 128) float maxReach();

@Range(from = 0, to = 1) float hitboxMargin();

boolean dealsKnockback();

boolean dismounts();
Expand All @@ -43,15 +37,6 @@ static Builder piercingWeapon() {
@ApiStatus.NonExtendable
interface Builder extends DataComponentBuilder<PiercingWeapon> {

@Contract(value = "_ -> this", mutates = "this")
Builder minReach(@Range(from = 0, to = 128) float minReach);

@Contract(value = "_ -> this", mutates = "this")
Builder maxReach(@Range(from = 0, to = 128) float maxReach);

@Contract(value = "_ -> this", mutates = "this")
Builder hitboxMargin(@Range(from = 0, to = 1) float hitboxMargin);

@Contract(value = "_ -> this", mutates = "this")
Builder dealsKnockback(boolean dealsKnockback);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.papermc.paper.datacomponent;

import io.papermc.paper.adventure.PaperAdventure;
import io.papermc.paper.datacomponent.item.PaperAttackRange;
import io.papermc.paper.datacomponent.item.PaperBannerPatternLayers;
import io.papermc.paper.datacomponent.item.PaperBlockItemDataProperties;
import io.papermc.paper.datacomponent.item.PaperBlocksAttacks;
Expand Down Expand Up @@ -180,6 +181,7 @@ public static void bootstrap() {
register(DataComponents.BLOCKS_ATTACKS, PaperBlocksAttacks::new);
register(DataComponents.PIERCING_WEAPON, PaperPiercingWeapon::new);
register(DataComponents.KINETIC_WEAPON, PaperKineticWeapon::new);
register(DataComponents.ATTACK_RANGE, PaperAttackRange::new);
register(DataComponents.SWING_ANIMATION, PaperSwingAnimation::new);
register(DataComponents.VILLAGER_VARIANT, CraftVillager.CraftType::minecraftHolderToBukkit, CraftVillager.CraftType::bukkitToMinecraftHolder);
register(DataComponents.WOLF_VARIANT, CraftWolf.CraftVariant::minecraftHolderToBukkit, CraftWolf.CraftVariant::bukkitToMinecraftHolder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,11 @@ public PiercingWeapon.Builder piercingWeapon() {
return new PaperPiercingWeapon.BuilderImpl();
}

@Override
public AttackRange.Builder attackRange() {
return new PaperAttackRange.BuilderImpl();
}

@Override
public SwingAnimation.Builder swingAnimation() {
return new PaperSwingAnimation.BuilderImpl();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package io.papermc.paper.datacomponent.item;

import com.google.common.base.Preconditions;
import org.bukkit.craftbukkit.util.Handleable;

public record PaperAttackRange(
net.minecraft.world.item.component.AttackRange impl
) implements AttackRange, Handleable<net.minecraft.world.item.component.AttackRange> {

@Override
public net.minecraft.world.item.component.AttackRange getHandle() {
return this.impl;
}

@Override
public float minReach() {
return this.impl.minRange();
}

@Override
public float maxReach() {
return this.impl.maxRange();
}

@Override
public float hitboxMargin() {
return this.impl.hitboxMargin();
}

@Override
public float mobFactor() {
return this.impl.mobFactor();
}

static final class BuilderImpl implements AttackRange.Builder {

private float minReach = net.minecraft.world.item.component.AttackRange.DEFAULT.minRange();
private float maxReach = net.minecraft.world.item.component.AttackRange.DEFAULT.maxRange();
private float hitboxMargin = net.minecraft.world.item.component.AttackRange.DEFAULT.hitboxMargin();
private float mobFactor = net.minecraft.world.item.component.AttackRange.DEFAULT.mobFactor();

@Override
public AttackRange.Builder minReach(final float minReach) {
Preconditions.checkArgument(minReach >= 0.0F && minReach <= 64.0F, "minReach must be in range [0,64] was %s", minReach);
this.minReach = minReach;
return this;
}

@Override
public AttackRange.Builder maxReach(final float maxReach) {
Preconditions.checkArgument(maxReach >= 0.0F && maxReach <= 64.0F, "maxReach must be in range [0,64] was %s", maxReach);
this.maxReach = maxReach;
return this;
}

@Override
public AttackRange.Builder hitboxMargin(final float hitboxMargin) {
Preconditions.checkArgument(hitboxMargin >= 0.0F && hitboxMargin <= 1.0F, "hitboxMargin must be in range [0,1] was %s", hitboxMargin);
this.hitboxMargin = hitboxMargin;
return this;
}

@Override
public AttackRange.Builder mobFactor(final float mobFactor) {
Preconditions.checkArgument(mobFactor >= 0.0F && mobFactor <= 2.0F, "mobFactor must be in range [0,2] was %s", mobFactor);
this.mobFactor = mobFactor;
return this;
}

@Override
public AttackRange build() {
return new PaperAttackRange(
new net.minecraft.world.item.component.AttackRange(
this.minReach,
this.maxReach,
this.hitboxMargin,
this.mobFactor
)
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,6 @@ public net.minecraft.world.item.component.KineticWeapon getHandle() {
return this.impl;
}

@Override
public float minReach() {
return this.impl.minReach();
}

@Override
public float maxReach() {
return this.impl.maxReach();
}

@Override
public float hitboxMargin() {
return this.impl.hitboxMargin();
}

@Override
public int contactCooldownTicks() {
return this.impl.contactCooldownTicks();
Expand Down Expand Up @@ -126,9 +111,6 @@ public float minRelativeSpeed() {

static final class BuilderImpl implements KineticWeapon.Builder {

private float minReach = 0.0F;
private float maxReach = 3.0F;
private float hitboxMargin = 0.3F;
private int contactCooldownTicks = 10;
private int delayTicks = 0;

Expand All @@ -142,27 +124,6 @@ static final class BuilderImpl implements KineticWeapon.Builder {
private float damageMultiplier = 1;
private float forwardMovement = 0.0F;

@Override
public KineticWeapon.Builder minReach(final float minReach) {
Preconditions.checkArgument(minReach >= 0.0F && minReach <= 128.0F, "minReach must be in range [0,128] was %s", minReach);
this.minReach = minReach;
return this;
}

@Override
public KineticWeapon.Builder maxReach(final float maxReach) {
Preconditions.checkArgument(maxReach >= 0.0F && maxReach <= 128.0F, "maxReach must be in range [0,128] was %s", maxReach);
this.maxReach = maxReach;
return this;
}

@Override
public KineticWeapon.Builder hitboxMargin(final float hitboxMargin) {
Preconditions.checkArgument(hitboxMargin >= 0.0F && hitboxMargin <= 1.0F, "hitboxMargin must be in range [0,1] was %s", hitboxMargin);
this.hitboxMargin = hitboxMargin;
return this;
}

@Override
public KineticWeapon.Builder contactCooldownTicks(final int ticks) {
Preconditions.checkArgument(ticks >= 0, "contactCooldownTicks must be non-negative");
Expand Down Expand Up @@ -223,9 +184,6 @@ public KineticWeapon.Builder hitSound(final @Nullable Key sound) {
public KineticWeapon build() {
return new PaperKineticWeapon(
new net.minecraft.world.item.component.KineticWeapon(
this.minReach,
this.maxReach,
this.hitboxMargin,
this.contactCooldownTicks,
this.delayTicks,
Optional.ofNullable(this.dismountConditions),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.papermc.paper.datacomponent.item;

import com.google.common.base.Preconditions;
import io.papermc.paper.adventure.PaperAdventure;
import java.util.Optional;
import net.kyori.adventure.key.Key;
Expand All @@ -18,21 +17,6 @@ public net.minecraft.world.item.component.PiercingWeapon getHandle() {
return this.impl;
}

@Override
public float minReach() {
return this.impl.minReach();
}

@Override
public float maxReach() {
return this.impl.maxReach();
}

@Override
public float hitboxMargin() {
return this.impl.hitboxMargin();
}

@Override
public boolean dealsKnockback() {
return this.impl.dealsKnockback();
Expand Down Expand Up @@ -63,37 +47,12 @@ public boolean dismounts() {

static final class BuilderImpl implements PiercingWeapon.Builder {

private float minReach = 0.0F;
private float maxReach = 3.0F;
private float hitboxMargin = 0.3F;

private boolean dealsKnockback = true;
private boolean dismounts = false;

private @Nullable Key sound = null;
private @Nullable Key hitSound = null;

@Override
public PiercingWeapon.Builder minReach(final float minReach) {
Preconditions.checkArgument(minReach >= 0.0F && minReach <= 128.0F, "minReach must be in range [0,128] was %s", minReach);
this.minReach = minReach;
return this;
}

@Override
public PiercingWeapon.Builder maxReach(final float maxReach) {
Preconditions.checkArgument(maxReach >= 0.0F && maxReach <= 128.0F, "maxReach must be in range [0,128] was %s", maxReach);
this.maxReach = maxReach;
return this;
}

@Override
public PiercingWeapon.Builder hitboxMargin(final float hitboxMargin) {
Preconditions.checkArgument(hitboxMargin >= 0.0F && hitboxMargin <= 1.0F, "hitboxMargin must be in range [0,1] was %s", hitboxMargin);
this.hitboxMargin = hitboxMargin;
return this;
}

@Override
public PiercingWeapon.Builder dealsKnockback(final boolean dealsKnockback) {
this.dealsKnockback = dealsKnockback;
Expand Down Expand Up @@ -122,9 +81,6 @@ public PiercingWeapon.Builder hitSound(final @Nullable Key sound) {
public PiercingWeapon build() {
return new PaperPiercingWeapon(
new net.minecraft.world.item.component.PiercingWeapon(
this.minReach,
this.maxReach,
this.hitboxMargin,
this.dealsKnockback,
this.dismounts,
Optional.ofNullable(this.sound).map(PaperAdventure::resolveSound),
Expand Down
Loading