Fishing.kt
Branches > main > bda016e > files / src / main / kotlin / net / bowmap / events / Fishing.kt
package net.bowmap.events
import net.bowmap.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 -> {}
}
}
}