Fishing.kt

Branches > main > 545457c > files / src / main / kotlin / net / bowmap / events / Fishing.kt

package net.bowmap.events

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.paper.*

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

  val distance = eye.distance(hook.location)

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

private val fishingLootTable = WeightedLoot(
  Category(
    "trash",
    100,
    MaterialLoot(ROTTEN_FLESH), MaterialLoot(ROTTEN_FLESH), MaterialLoot(STRING), MaterialLoot(BONE), MaterialLoot(SPIDER_EYE), MaterialLoot(GUNPOWDER)
  ),

  Category(
    "rareTrash",
    15,
    MaterialLoot(TRIPWIRE_HOOK), MaterialLoot(STICK), MaterialLoot(REDSTONE), MaterialLoot(GLOWSTONE_DUST), MaterialLoot(FEATHER),
    MaterialLoot(CLAY_BALL, 4),
    MaterialLoot(HONEYCOMB, 3),
    MaterialLoot(LEATHER, 2)
  ),

  Category(
    "fish",
    20,
    MaterialLoot(COD), MaterialLoot(SALMON)
  ),

  Category(
    "exoticFish",
    6,
    MaterialLoot(PUFFERFISH), MaterialLoot(TROPICAL_FISH)
  ),

  Category(
    "decoration",
    2,
    MaterialLoot(SKELETON_SKULL), MaterialLoot(PAINTING), MaterialLoot(OAK_SIGN), MaterialLoot(BELL), MaterialLoot(DECORATED_POT),
    LootList(MaterialLoot(WHITE_BANNER), MaterialLoot(BLACK_BANNER), MaterialLoot(GRAY_BANNER), MaterialLoot(GREEN_BANNER), MaterialLoot(BLUE_BANNER))
  ),

  Category(
    "treasure",
    6,
    MaterialLoot(GLOW_INK_SAC),
    MaterialLoot(IRON_NUGGET, 6),
    MaterialLoot(GOLD_NUGGET, 5),
    MaterialLoot(PRISMARINE_SHARD, 3),
    MaterialLoot(PRISMARINE_CRYSTALS, 3)
  ),

  Category(
    "extremeTreasure",
    2,
    MaterialLoot(IRON_INGOT), MaterialLoot(GOLD_INGOT), MaterialLoot(COPPER_INGOT), MaterialLoot(NAME_TAG), MaterialLoot(TNT), MaterialLoot(GLASS_BOTTLE), MaterialLoot(IRON_SHOVEL)
  ),

  Category(
    "books",
    3,
    MaterialLoot(ENCHANTED_BOOK), MaterialLoot(BOOK)
  )
)

private fun setWaitTime(e: PlayerFishEvent) {
  e.hook.setWaitTime(20)
}


class Fishing : Listener {
  @EventHandler
  fun onFish(e: PlayerFishEvent) {
    when (e.state) {
      State.FISHING -> {
        setWaitTime(e)
      }

      State.CAUGHT_FISH -> {
        val hook = e.hook
        val loot = fishingLootTable.getLoot()

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

        e.caught?.remove()
        e.expToDrop = 1
      }
      else -> {}
    }
  }
}