package tc.oc.pgm.tracker.damage; import java.util.Optional; import javax.annotation.Nullable; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.Location; import tc.oc.commons.core.chat.Components; import tc.oc.commons.core.inspect.Inspectable; import tc.oc.pgm.match.ParticipantState; import static com.google.common.base.Preconditions.checkNotNull; public class ProjectileInfo extends Inspectable.Impl implements PhysicalInfo, DamageInfo, RangedInfo { @Inspect private final PhysicalInfo projectile; @Inspect private final @Nullable PhysicalInfo shooter; @Inspect private final Location origin; @Inspect private final @Nullable String customName; public ProjectileInfo(PhysicalInfo projectile, @Nullable PhysicalInfo shooter, Location origin, @Nullable String customName) { this.projectile = checkNotNull(projectile); this.shooter = shooter; this.origin = checkNotNull(origin); this.customName = customName; } @Override public Optional<PhysicalInfo> damager() { return Optional.of(projectile); } public PhysicalInfo getProjectile() { return projectile; } public @Nullable PhysicalInfo getShooter() { return shooter; } @Override public Location getOrigin() { return this.origin; } @Override public @Nullable ParticipantState getOwner() { return shooter == null ? null : shooter.getOwner(); } @Override public @Nullable ParticipantState getAttacker() { return getOwner(); } @Override public String getIdentifier() { return getProjectile().getIdentifier(); } @Override public BaseComponent getLocalizedName() { if(customName != null) { return Components.fromLegacyText(customName); } else if(getProjectile() instanceof PotionInfo) { // PotionInfo.getLocalizedName returns a potion name, // which doesn't work outside a potion death message. return new TranslatableComponent("item.potion.name"); } else { return getProjectile().getLocalizedName(); } } }