--- a/net/minecraft/world/entity/projectile/ThrownTrident.java
+++ b/net/minecraft/world/entity/projectile/ThrownTrident.java
@@ -28,21 +_,24 @@
     private static final EntityDataAccessor<Boolean> ID_FOIL = SynchedEntityData.defineId(ThrownTrident.class, EntityDataSerializers.BOOLEAN);
     private static final float WATER_INERTIA = 0.99F;
     private static final boolean DEFAULT_DEALT_DAMAGE = false;
-    private boolean dealtDamage = false;
+    public boolean dealtDamage = false;
     public int clientSideReturnTridentTickCount;
 
     public ThrownTrident(EntityType<? extends ThrownTrident> entityType, Level level) {
         super(entityType, level);
+        this.setBaseDamage(net.minecraft.world.item.TridentItem.BASE_DAMAGE); // Paper - Allow trident custom damage
     }
 
     public ThrownTrident(Level level, LivingEntity shooter, ItemStack pickupItemStack) {
         super(EntityType.TRIDENT, shooter, level, pickupItemStack, null);
+        this.setBaseDamage(net.minecraft.world.item.TridentItem.BASE_DAMAGE); // Paper - Allow trident custom damage
         this.entityData.set(ID_LOYALTY, this.getLoyaltyFromItem(pickupItemStack));
         this.entityData.set(ID_FOIL, pickupItemStack.hasFoil());
     }
 
     public ThrownTrident(Level level, double x, double y, double z, ItemStack pickupItemStack) {
         super(EntityType.TRIDENT, x, y, z, level, pickupItemStack, pickupItemStack);
+        this.setBaseDamage(net.minecraft.world.item.TridentItem.BASE_DAMAGE); // Paper - Allow trident custom damage
         this.entityData.set(ID_LOYALTY, this.getLoyaltyFromItem(pickupItemStack));
         this.entityData.set(ID_FOIL, pickupItemStack.hasFoil());
     }
@@ -68,10 +_,10 @@
                     this.spawnAtLocation(serverLevel, this.getPickupItem(), 0.1F);
                 }
 
-                this.discard();
+                this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DROP); // CraftBukkit - add Bukkit remove cause
             } else {
                 if (!(owner instanceof Player) && this.position().distanceTo(owner.getEyePosition()) < owner.getBbWidth() + 1.0) {
-                    this.discard();
+                    this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
                     return;
                 }
 
@@ -100,6 +_,20 @@
         return this.entityData.get(ID_FOIL);
     }
 
+    // Paper start
+    public void setFoil(boolean foil) {
+        this.entityData.set(ThrownTrident.ID_FOIL, foil);
+    }
+
+    public int getLoyalty() {
+        return this.entityData.get(ThrownTrident.ID_LOYALTY);
+    }
+
+    public void setLoyalty(byte loyalty) {
+        this.entityData.set(ThrownTrident.ID_LOYALTY, loyalty);
+    }
+    // Paper end
+
     @Nullable
     @Override
     protected EntityHitResult findHitEntity(Vec3 startVec, Vec3 endVec) {
@@ -109,7 +_,7 @@
     @Override
     protected void onHitEntity(EntityHitResult result) {
         Entity entity = result.getEntity();
-        float f = 8.0F;
+        float f = (float) this.baseDamage; // Paper - Allow trident custom damage
         Entity owner = this.getOwner();
         DamageSource damageSource = this.damageSources().trident(this, (Entity)(owner == null ? this : owner));
         if (this.level() instanceof ServerLevel serverLevel) {
