Skip to content

Commit

Permalink
Generalize arrow launch into projectile launch
Browse files Browse the repository at this point in the history
Will help for launching fireworks eventually
  • Loading branch information
KnightMiner committed Dec 23, 2022
1 parent a6bedfb commit f93fa5d
Show file tree
Hide file tree
Showing 11 changed files with 99 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import slimeknights.mantle.client.TooltipKey;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.library.modifiers.hook.ArmorWalkModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.BowAmmoModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ConditionalStatModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ElytraFlightModifierHook;
Expand All @@ -15,6 +14,7 @@
import slimeknights.tconstruct.library.modifiers.hook.LootingModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.PlantHarvestModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileHitModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ShearsModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.interaction.BlockInteractionModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.interaction.EntityInteractionModifierHook;
Expand Down Expand Up @@ -75,8 +75,8 @@ private TinkerHooks() {}

/* Ranged */

/** Hook for firing arrows to modify the entity post firing */
public static final ModifierHook<ArrowLaunchModifierHook> ARROW_LAUNCH = register("arrow_launch", ArrowLaunchModifierHook.class, ArrowLaunchModifierHook.ALL_MERGER, ArrowLaunchModifierHook.EMPTY);
/** Hook for firing arrows or other projectiles to modify the entity post firing */
public static final ModifierHook<ProjectileLaunchModifierHook> PROJECTILE_LAUNCH = register("projectile_launch", ProjectileLaunchModifierHook.class, ProjectileLaunchModifierHook.ALL_MERGER, ProjectileLaunchModifierHook.EMPTY);
/** Hook called when an arrow hits an entity or block */
public static final ModifierHook<ProjectileHitModifierHook> PROJECTILE_HIT = register("projectile_hit", ProjectileHitModifierHook.class, ProjectileHitModifierHook.FIRST_MERGER, ProjectileHitModifierHook.EMPTY);
/** Hook called when a bow is looking for ammo. Does not support merging multiple hooks on one modifier */
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package slimeknights.tconstruct.library.modifiers.hook;

import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.nbt.NamespacedNBT;

import javax.annotation.Nullable;
import java.util.Collection;
import java.util.function.Function;

/**
* Hook for modifiers which wish to modify an arrow before its fired
*/
public interface ProjectileLaunchModifierHook {
/** Default instance */
ProjectileLaunchModifierHook EMPTY = (tool, modifier, shooter, projectile, arrow, persistentData) -> {};
/** Merger instance */
Function<Collection<ProjectileLaunchModifierHook>,ProjectileLaunchModifierHook> ALL_MERGER = AllMerger::new;

/**
* Hook to modify arrow properties after an arrow is fired. Called serverside only, so randomness is safe.
* @param tool Bow instance
* @param modifier Modifier being used
* @param shooter Entity firing the arrow
* @param projectile Projectile to modify
* @param arrow Arrow to modify as most modifiers wish to change that, will be null for non-arrow projectiles
* @param persistentData Persistent data instance stored on the arrow to write arbitrary data. Note the modifier list was already written
*/
void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData);

/** Logic to merge multiple hooks into one */
record AllMerger(Collection<ProjectileLaunchModifierHook> modules) implements ProjectileLaunchModifierHook {
@Override
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
for (ProjectileLaunchModifierHook module : modules) {
module.onProjectileLaunch(tool, modifier, shooter, projectile, arrow, persistentData);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ public void releaseUsing(ItemStack bow, Level level, LivingEntity living, int ti

// let modifiers such as fiery and punch set properties
for (ModifierEntry entry : modifiers.getModifiers()) {
entry.getHook(TinkerHooks.ARROW_LAUNCH).onArrowLaunch(tool, entry, living, arrowEntity, arrowData);
entry.getHook(TinkerHooks.PROJECTILE_LAUNCH).onProjectileLaunch(tool, entry, living, arrowEntity, arrowEntity, arrowData);
}

ToolDamageUtil.damageAnimated(tool, 1, player, player.getUsedItemHand());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,25 @@
import net.minecraft.util.Mth;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.phys.Vec3;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.context.ToolRebuildContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.nbt.NamespacedNBT;
import slimeknights.tconstruct.library.tools.stat.ModifierStatsBuilder;
import slimeknights.tconstruct.library.tools.stat.ToolStats;

public class CrystalboundModifier extends Modifier implements ArrowLaunchModifierHook {
import javax.annotation.Nullable;

public class CrystalboundModifier extends Modifier implements ProjectileLaunchModifierHook {
@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.PROJECTILE_LAUNCH);
}

@Override
Expand All @@ -28,13 +31,13 @@ public void addToolStats(ToolRebuildContext context, int level, ModifierStatsBui

@SuppressWarnings("SuspiciousNameCombination") // mojang uses the angle between X and Z, but parchment named atan2 as the angle between Y and X, makes IDEA mad as it things parameters should swap
@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
Vec3 direction = arrow.getDeltaMovement();
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
Vec3 direction = projectile.getDeltaMovement();
double oldAngle = Mth.atan2(direction.x, direction.z);
int possibleDirections = (int)Math.pow(2, 6 - modifier.getLevel());
double radianIncrements = 2 * Math.PI / possibleDirections;
double newAngle = Math.round(oldAngle / radianIncrements) * radianIncrements;
arrow.setDeltaMovement(direction.yRot((float)(newAngle - oldAngle)));
arrow.setYRot((float)(newAngle * 180f / Math.PI));
projectile.setDeltaMovement(direction.yRot((float)(newAngle - oldAngle)));
projectile.setYRot((float)(newAngle * 180f / Math.PI));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
import slimeknights.tconstruct.library.events.teleport.EnderportingTeleportEvent;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.PlantHarvestModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileHitModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.NoLevelsModifier;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.context.ToolAttackContext;
Expand All @@ -37,7 +37,7 @@
import javax.annotation.Nullable;
import java.util.Set;

public class EnderportingModifier extends NoLevelsModifier implements PlantHarvestModifierHook, ProjectileHitModifierHook, ArrowLaunchModifierHook {
public class EnderportingModifier extends NoLevelsModifier implements PlantHarvestModifierHook, ProjectileHitModifierHook, ProjectileLaunchModifierHook {
private static final Set<RelativeArgument> PACKET_FLAGS = ImmutableSet.of(RelativeArgument.X, RelativeArgument.Y, RelativeArgument.Z);

@Override
Expand Down Expand Up @@ -155,14 +155,14 @@ public boolean onProjectileHitBlock(ModifierNBT modifiers, NamespacedNBT persist
}

@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
// damage on shoot as we won't have tool context once the arrow lands
ToolDamageUtil.damageAnimated(tool, 10, shooter, shooter.getUsedItemHand());
}

@Override
protected void registerHooks(Builder hookBuilder) {
super.registerHooks(hookBuilder);
hookBuilder.addHook(this, TinkerHooks.PLANT_HARVEST, TinkerHooks.PROJECTILE_HIT, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.PLANT_HARVEST, TinkerHooks.PROJECTILE_HIT, TinkerHooks.PROJECTILE_LAUNCH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.item.TooltipFlag;
import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed;
import net.minecraftforge.registries.RegistryObject;
Expand All @@ -14,8 +15,8 @@
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ConditionalStatModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.context.ToolHarvestContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
Expand All @@ -28,12 +29,12 @@
import javax.annotation.Nullable;
import java.util.List;

public class MomentumModifier extends Modifier implements ArrowLaunchModifierHook, ConditionalStatModifierHook {
public class MomentumModifier extends Modifier implements ProjectileLaunchModifierHook, ConditionalStatModifierHook {
private static final Component SPEED = TConstruct.makeTranslation("modifier", "momentum.speed");

@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, TinkerHooks.CONDITIONAL_STAT, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.CONDITIONAL_STAT, TinkerHooks.PROJECTILE_LAUNCH);
}

@Override
Expand Down Expand Up @@ -69,8 +70,8 @@ public void afterBlockBreak(IToolStackView tool, int level, ToolHarvestContext c
}

@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
if (arrow.isCritArrow()) {
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
if (arrow == null || arrow.isCritArrow()) {
// 16 arrows gets you to max
int effectLevel = Math.min(15, TinkerModifiers.momentumRangedEffect.get().getLevel(shooter) + 1);
TinkerModifiers.momentumRangedEffect.get().apply(shooter, 5 * 20, effectLevel, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,22 @@

import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.IncrementalModifier;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.context.ToolAttackContext;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.nbt.NamespacedNBT;

public class FieryModifier extends IncrementalModifier implements ArrowLaunchModifierHook {
import javax.annotation.Nullable;

public class FieryModifier extends IncrementalModifier implements ProjectileLaunchModifierHook {
@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.PROJECTILE_LAUNCH);
}

@Override
Expand Down Expand Up @@ -46,7 +49,7 @@ public int afterEntityHit(IToolStackView tool, int level, ToolAttackContext cont
}

@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
arrow.setSecondsOnFire(Math.round(modifier.getEffectiveLevel(tool) * 20));
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
projectile.setSecondsOnFire(Math.round(modifier.getEffectiveLevel(tool) * 20));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileHitModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.impl.IncrementalModifier;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.context.ToolAttackContext;
Expand All @@ -30,12 +30,12 @@
import javax.annotation.Nullable;
import java.util.List;

public class PiercingModifier extends IncrementalModifier implements ProjectileHitModifierHook, ArrowLaunchModifierHook {
public class PiercingModifier extends IncrementalModifier implements ProjectileHitModifierHook, ProjectileLaunchModifierHook {
private static final ResourceLocation PIERCING_DEBUFF = TConstruct.getResource("piercing_debuff");

@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, TinkerHooks.PROJECTILE_HIT, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.PROJECTILE_HIT, TinkerHooks.PROJECTILE_LAUNCH);
}

@Override
Expand Down Expand Up @@ -73,7 +73,7 @@ public int afterEntityHit(IToolStackView tool, int level, ToolAttackContext cont
}

@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
// store the float level as we don't have access to the incremental level in the projectile hit hook
persistentData.putFloat(getId(), modifier.getEffectiveLevel(tool));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,27 @@

import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Projectile;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.ArrowLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.hook.ProjectileLaunchModifierHook;
import slimeknights.tconstruct.library.modifiers.util.ModifierHookMap.Builder;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.nbt.NamespacedNBT;

public class ImpalingModifier extends Modifier implements ArrowLaunchModifierHook {
import javax.annotation.Nullable;

public class ImpalingModifier extends Modifier implements ProjectileLaunchModifierHook {
@Override
protected void registerHooks(Builder hookBuilder) {
hookBuilder.addHook(this, TinkerHooks.ARROW_LAUNCH);
hookBuilder.addHook(this, TinkerHooks.PROJECTILE_LAUNCH);
}

@Override
public void onArrowLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, AbstractArrow arrow, NamespacedNBT persistentData) {
arrow.setPierceLevel((byte)modifier.getLevel());
public void onProjectileLaunch(IToolStackView tool, ModifierEntry modifier, LivingEntity shooter, Projectile projectile, @Nullable AbstractArrow arrow, NamespacedNBT persistentData) {
if (arrow != null) {
arrow.setPierceLevel((byte)modifier.getLevel());
}
}
}

0 comments on commit f93fa5d

Please sign in to comment.