Skip to content

Instantly share code, notes, and snippets.

@ShiftSad
Created June 27, 2024 03:01
Show Gist options
  • Save ShiftSad/b1db62ca32131dfaf6fe338e36c3fa3e to your computer and use it in GitHub Desktop.
Save ShiftSad/b1db62ca32131dfaf6fe338e36c3fa3e to your computer and use it in GitHub Desktop.
Here yah go
package codes.shiftmc.minigame.npc
import net.minestom.server.coordinate.Pos
import net.minestom.server.entity.*
import net.minestom.server.entity.Player.Hand
import net.minestom.server.entity.ai.target.ClosestEntityTarget
import net.minestom.server.entity.metadata.PlayerMeta
import net.minestom.server.event.entity.EntityAttackEvent
import net.minestom.server.event.player.PlayerEntityInteractEvent
import net.minestom.server.instance.Instance
import net.minestom.server.network.packet.server.play.PlayerInfoUpdatePacket
class NPC(
val name: String,
val skin: PlayerSkin,
instance: Instance,
spawn: Pos,
enableCape: Boolean = true,
val onClick: (Player) -> Unit
) : EntityCreature(
EntityType.PLAYER
) {
init {
instance.eventNode().addListener(EntityAttackEvent::class.java) { handle(it) }
instance.eventNode().addListener(PlayerEntityInteractEvent::class.java) { handle(it) }
val meta = getEntityMeta() as PlayerMeta
meta.setNotifyAboutChanges(false)
meta.isCapeEnabled = enableCape
meta.isJacketEnabled = false
meta.isLeftSleeveEnabled = true
meta.isRightSleeveEnabled = true
meta.isLeftLegEnabled = true
meta.isRightLegEnabled = true
meta.isHatEnabled = true
meta.setNotifyAboutChanges(true)
addAIGroup(
listOf(LookAtPlayerGoal(this)),
listOf(ClosestEntityTarget(this, 15.0) { it is Player })
)
setInstance(instance, spawn)
}
override fun updateNewViewer(player: Player) {
val properties = listOf(
PlayerInfoUpdatePacket.Property("textures", skin.textures(), skin.signature())
)
player.sendPacket(PlayerInfoUpdatePacket(PlayerInfoUpdatePacket.Action.ADD_PLAYER,
PlayerInfoUpdatePacket.Entry(
uuid, name, properties, false, 0, GameMode.SURVIVAL, null, null
)
))
super.updateNewViewer(player)
}
private fun handle(event: EntityAttackEvent) {
if (event.target != this) return
if (event.entity !is Player) return
onClick(event.entity as Player)
}
private fun handle(event: PlayerEntityInteractEvent) {
if (event.target != this) return
if (event.hand != Hand.MAIN) return
onClick(event.player)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment