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,28 @@
package ctn.stonecraft.common.entity.projectile;

import ctn.stonecraft.common.entity.projectile.stone_nugget.AbsStoneNuggetProjectile;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;

/**
* 弹射物工厂接口
* 用于创建不同类型的弹射物
*/
@FunctionalInterface
public interface ProjectileFactory {
/**
* 创建弹射物
*
* @param level 世界
* @param shooter 发射者
* @param weapon 武器
* @param ammo 弹药
* @return 弹射物实例
*/
@NotNull AbsStoneNuggetProjectile create(@NotNull Level level,
@NotNull LivingEntity shooter,
@NotNull ItemStack weapon,
@NotNull ItemStack ammo);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package ctn.stonecraft.common.entity.projectile;

import ctn.stonecraft.common.entity.projectile.stone_nugget.flint.FlintProjectile;
import ctn.stonecraft.common.entity.projectile.stone_nugget.StoneNuggetProjectileBuilder;
import ctn.stonecraft.common.item.stone_nugget.AbsStoneNuggetItem;
import ctn.stonecraft.init.ScEntityTypes;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;

import java.util.HashMap;
import java.util.Map;

import static ctn.stonecraft.common.entity.projectile.stone_nugget.flint.FlintProjectile.FLINT_BASE_NUGGET_PROPS;
import static ctn.stonecraft.init.ScItems.STONE_NUGGET;

/**
* 弹射物工厂注册表
* 管理所有弹药类型对应的弹射物创建逻辑
*/
public class ProjectileFactoryRegistry {
private static final Map<Item, ProjectileFactory> FACTORIES = new HashMap<>();
private static ProjectileFactory DEFAULT_FACTORY;

/**
* 注册弹药对应的弹射物工厂
*/
public static void register(Item ammo, ProjectileFactory factory) {
FACTORIES.put(ammo, factory);
}

public static void setDefaultFactory(ProjectileFactory factory){
DEFAULT_FACTORY = factory;
}

/**
* 根据 Item 获取弹射物工厂
*/
public static ProjectileFactory getFacory(Item item){

// 1. 如果是 AbsStoneNuggetItem,使用其自带的工厂
if (item instanceof AbsStoneNuggetItem nuggetItem) {
return (level, shooter, weapon, ammoStack) -> {
return nuggetItem.getProjectile(level, shooter, weapon);
};
}

// 2. 查找注册的工厂
ProjectileFactory factory = FACTORIES.get(item);
if (factory != null) {
return factory;
}
// 3. 返回默认工厂
return DEFAULT_FACTORY != null ? DEFAULT_FACTORY : createDefaultFactory();
}

/**
* 创建默认工厂
*/
private static ProjectileFactory createDefaultFactory() {
return (level, shooter, weapon, ammo) -> {
AbsStoneNuggetItem item = STONE_NUGGET.get();
return item.getProjectile(level, shooter, weapon);
};
}

/**
* 初始化注册所有工厂
*/
public static void init() {
// 默认弹药工厂
setDefaultFactory((level, shooter, weapon, ammo) -> {
AbsStoneNuggetItem item = STONE_NUGGET.get();
return item.getProjectile(level, shooter, weapon);
});

// 燧石弹射物工厂
register(Items.FLINT, (level, shooter, weapon, ammo) ->
new FlintProjectile(
new StoneNuggetProjectileBuilder(FLINT_BASE_NUGGET_PROPS), // ← 使用专用构建器
ScEntityTypes.FLINT_PROJECTILE.get(),
shooter,
level,
weapon
)
);
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -86,30 +86,31 @@ public abstract class AbsStoneNuggetProjectile extends ThrowableItemProjectile {
@Nullable
private ItemStack weapon;
private AbsStoneNuggetItem projectileItem;
protected boolean SkipAllowed = true; //是否允许打水漂
// endregion

// region 构造方法
public AbsStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder,
EntityType<AbsStoneNuggetProjectile> entityType, Position pos, Level level, @Nullable ItemStack weapon) {
EntityType<? extends AbsStoneNuggetProjectile> entityType, Position pos, Level level, @Nullable ItemStack weapon) {
this(stoneNuggetProjectileBuilder, entityType, pos.x(), pos.y(), pos.z(), level, weapon);
}

public AbsStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder,
EntityType<AbsStoneNuggetProjectile> entityType, double x, double y, double z, Level level, @Nullable ItemStack weapon) {
EntityType<? extends AbsStoneNuggetProjectile> entityType, double x, double y, double z, Level level, @Nullable ItemStack weapon) {
super(entityType, x, y, z, level);
this.weapon = weapon;
init(stoneNuggetProjectileBuilder, weapon);
}

public AbsStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder,
EntityType<AbsStoneNuggetProjectile> entityType, Level level, @Nullable ItemStack weapon) {
EntityType<? extends AbsStoneNuggetProjectile> entityType, Level level, @Nullable ItemStack weapon) {
super(entityType, level);
this.weapon = weapon;
init(stoneNuggetProjectileBuilder, weapon);
}

public AbsStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder,
EntityType<AbsStoneNuggetProjectile> entityType, LivingEntity shooter, Level level, @Nullable ItemStack weapon) {
EntityType<? extends AbsStoneNuggetProjectile> entityType, LivingEntity shooter, Level level, @Nullable ItemStack weapon) {
super(entityType, shooter, level);
this.weapon = weapon;
init(stoneNuggetProjectileBuilder, weapon);
Expand All @@ -133,10 +134,10 @@ private void init(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, @Nu
maxBounceAngle = stoneNuggetProjectileBuilder.maxBounceAngle;
minBounceAngle = stoneNuggetProjectileBuilder.minBounceAngle;
minBounceSpeed = stoneNuggetProjectileBuilder.minBounceSpeed;
projectileItem = stoneNuggetProjectileBuilder.projectileItem.get();
basicDamage = projectileItem.getDamage();
basicGravity = projectileItem.getGravity();
basicWeight = projectileItem.getWeight();
projectileItem = (stoneNuggetProjectileBuilder.projectileItem == null) ? null : stoneNuggetProjectileBuilder.projectileItem.get();
basicDamage = stoneNuggetProjectileBuilder.baseNuggetProps.damage;
basicGravity = stoneNuggetProjectileBuilder.baseNuggetProps.gravity;
basicWeight = stoneNuggetProjectileBuilder.baseNuggetProps.weight;
}
if (weapon != null && (weapon.getItem() instanceof Slingshot slingshot)) {
damageBonus = slingshot.getDamageBonus();
Expand Down Expand Up @@ -219,9 +220,9 @@ public void readAdditionalSaveData(@NotNull CompoundTag compound) {
} else {
projectileItem = ScItems.STONE_NUGGET.get();
}
basicDamage = getProjectileItem().getDamage();
basicGravity = getProjectileItem().getGravity();
basicWeight = getProjectileItem().getWeight();
basicDamage = getProjectileItem().Damage();
basicGravity = getProjectileItem().Gravity();
basicWeight = getProjectileItem().Weight();
}
// endregion

Expand All @@ -237,7 +238,9 @@ public void tick() {
Level level = this.level();

// 进行打水漂逻辑
handleSkipLogic(level);
if(SkipAllowed){
handleSkipLogic(level);
}

checkEntityCollisions();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,35 @@
import net.minecraft.world.level.Level;

public class BasicStoneNuggetProjectile extends AbsStoneNuggetProjectile {
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<AbsStoneNuggetProjectile> entityType, Position pos, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, pos, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<AbsStoneNuggetProjectile> entityType, double x, double y, double z, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, x, y, z, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<AbsStoneNuggetProjectile> entityType, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<AbsStoneNuggetProjectile> entityType, LivingEntity shooter, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, shooter, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, Position pos, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), pos, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, double x, double y, double z, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), x, y, z, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, LivingEntity shooter, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), shooter, level, weapon);
}
public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<? extends AbsStoneNuggetProjectile> entityType, Position pos, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, pos, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<? extends AbsStoneNuggetProjectile> entityType, double x, double y, double z, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, x, y, z, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<? extends AbsStoneNuggetProjectile> entityType, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, EntityType<? extends AbsStoneNuggetProjectile> entityType, LivingEntity shooter, Level level, ItemStack weapon) {
super(stoneNuggetProjectileBuilder, entityType, shooter, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, Position pos, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), pos, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, double x, double y, double z, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), x, y, z, level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), level, weapon);
}

public BasicStoneNuggetProjectile(StoneNuggetProjectileBuilder stoneNuggetProjectileBuilder, LivingEntity shooter, Level level, ItemStack weapon) {
this(stoneNuggetProjectileBuilder, ScEntityTypes.STONE_NUGGET.get(), shooter, level, weapon);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ctn.stonecraft.common.entity.projectile.stone_nugget;

import ctn.stonecraft.common.item.stone_nugget.AbsStoneNuggetItem;
import ctn.stonecraft.common.item.stone_nugget.BaseNuggetProps;

import java.util.function.Supplier;

Expand All @@ -15,48 +16,61 @@ public final class StoneNuggetProjectileBuilder {
float maxBounceAngle = 20.0f;
float minBounceAngle = 0.0f;
float minBounceSpeed = 0.001f;
final Supplier<AbsStoneNuggetItem> projectileItem;

final Supplier<AbsStoneNuggetItem> projectileItem;
final BaseNuggetProps baseNuggetProps;

public StoneNuggetProjectileBuilder(Supplier<AbsStoneNuggetItem> projectileItem) {
this.projectileItem = projectileItem;
var item = projectileItem.get();
this.baseNuggetProps = new BaseNuggetProps(item.Damage(), item.Weight(), item.Gravity());
}

public StoneNuggetProjectileBuilder(AbsStoneNuggetItem absStoneNuggetItem) {
projectileItem = () -> absStoneNuggetItem;
var item = projectileItem.get();
this.baseNuggetProps = new BaseNuggetProps(item.Damage(), item.Weight(), item.Gravity());
}


/**
* 根据投掷物属性创建通用构建器-用于兼容原版物品
*/
public StoneNuggetProjectileBuilder (BaseNuggetProps baseNuggetProps) {
projectileItem = null;
this.baseNuggetProps = baseNuggetProps;
}

public StoneNuggetProjectileBuilder verticalVelocityLowAngleFactor(double factor) {
this.verticalVelocityLowAngleFactor = factor;
return this;
}

public StoneNuggetProjectileBuilder verticalVelocityHighAngleFactor(double factor) {
this.verticalVelocityHighAngleFactor = factor;
return this;
}

public StoneNuggetProjectileBuilder lowAngleThreshold(double threshold) {
this.lowAngleThreshold = threshold;
return this;
}

public StoneNuggetProjectileBuilder highAngleThreshold(double threshold) {
this.highAngleThreshold = threshold;
return this;
}

public StoneNuggetProjectileBuilder maxBounceAngle(float angle) {
this.maxBounceAngle = angle;
return this;
}

public StoneNuggetProjectileBuilder minBounceAngle(float angle) {
this.minBounceAngle = angle;
return this;
}

public StoneNuggetProjectileBuilder minBounceSpeed(float speed) {
this.minBounceSpeed = speed;
return this;
}
}
}
Loading