Fishing.kt

Branches > main > bedd093 > files / src / main / kotlin / net / bowmap / handlers / Fishing.kt

package net.bowmap.handlers

import net.bowmap.stormbow.handler
import net.bowmap.stormbow.fact.*
import net.bowmap.stormbow.effect.*

import net.bowmap.server.loot.*
import org.bukkit.Material.*
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerFishEvent
import org.bukkit.event.player.PlayerFishEvent.State
import org.bukkit.util.Vector

import net.bowmap.server.loot.tables.fishingLootTable
import net.bowmap.server.item.toItemStacks

private fun calculateFishVelocity(e: PlayerCaughtFish): Vector {
  val eye = e.player.eyeLocation
  val distance = eye.distance(e.hook.location)

  return eye.subtract(e.hook.location)
            .toVector()
            .normalize()
            .multiply(0.2 + distance * 0.1)
}

object Fishing {
  fun register() {
    handler<PlayerStartedFishing> {
      effects(SetFishTime(ticks = 20))
    }

    handler<PlayerCaughtFish> {
      val loot = fishingLootTable.getLoot()

      for (stack in toItemStacks(loot)) {
        val item = hook.world.dropItem(hook.location, stack)
        item.setVelocity(calculateFishVelocity(this))
      }
      effects()
    }
  }
}