# Detect an entity in a zone with Kore

> Detect when a player enters a specific area in Minecraft using a Kore Kotlin library. Learn how to create a datapack that triggers an event when a player enters a defined zone.

Published 2024-05-19, updated 2026-06-23. Canonical: https://ayfri.com/articles/kore-zone-detection/

Welcome to this tutorial on creating a Minecraft datapack that detects when a player enters a specific area using the Kore Kotlin library.
Follow these steps to get started:

## Prerequisites

Before we begin, ensure you have the following:

- Minecraft 1.21.11 installed
- Basic understanding of Minecraft commands
- Kotlin and Kore setup (refer to the [Kore Template](https://github.com/Kore-Minecraft/Kore-Template) for setup instructions)

Check [Kore Introduction](https://ayfri.com/articles/kore-introduction/) for more information on how to set up Kore in your Kotlin project.

## Step 1: Creating the Datapack

First, let's create the basic structure of our datapack.

```kotlin
fun main() {
	val datapack = dataPack("player_detection") {
		pack {
			description = textComponent("Player Detection Datapack", Color.GOLD)
		}
	}

	datapack.generateZip()
}
```

This code initializes a new datapack named "player_detection" with a description.

## Step 2: Defining the Detection Zone

We'll define the coordinates for the detection zone and create a predicate to check if a player is within this range.
Using a predicate will allow us to easily check if a player is within the specified area.

```kotlin
import io.github.ayfri.kore.DataPack
import io.github.ayfri.kore.arguments.numbers.ranges.rangeOrInt
import io.github.ayfri.kore.features.predicates.conditions.locationCheck
import io.github.ayfri.kore.features.predicates.predicate
import io.github.ayfri.kore.features.predicates.sub.position

// Define the zone where the player can be detected.
val ZONE_X = -20..20
val ZONE_Y = 40..80
val ZONE_Z = -20..20

fun DataPack.rangePredicate() = predicate("in_range") {
	locationCheck {
		position {
			x = rangeOrInt(ZONE_X)
			y = rangeOrInt(ZONE_Y)
			z = rangeOrInt(ZONE_Z)
		}
	}
}
```

In this code, we define a detection zone with the specified X, Y, and Z ranges. We then create a `rangePredicate` to check if a player is
within these coordinates.

## Step 3: Creating the Player Detected Function

Now, let's create the function that will be executed when a player is detected in the specified area.

```kotlin
import io.github.ayfri.kore.arguments.chatcomponents.textComponent
import io.github.ayfri.kore.arguments.colors.Color
import io.github.ayfri.kore.arguments.types.literals.allPlayers
import io.github.ayfri.kore.commands.tellraw
import io.github.ayfri.kore.DataPack
import io.github.ayfri.kore.functions.function

fun DataPack.playerDetected() = function("player_detected") {
	tellraw(allPlayers(), textComponent("A player has been detected in the area!", Color.RED))
}
```

This function sends a message to all players informing them that a player has been detected in the area.

## Step 4: Combining the Functions

We need to integrate the detection function and the player detected function into the main code.

```kotlin
import io.github.ayfri.kore.DataPack
import io.github.ayfri.kore.arguments.chatcomponents.textComponent
import io.github.ayfri.kore.arguments.colors.Color
import io.github.ayfri.kore.arguments.numbers.ranges.rangeOrInt
import io.github.ayfri.kore.arguments.types.literals.allPlayers
import io.github.ayfri.kore.commands.execute.execute
import io.github.ayfri.kore.commands.function
import io.github.ayfri.kore.commands.tellraw
import io.github.ayfri.kore.dataPack
import io.github.ayfri.kore.features.predicates.conditions.locationCheck
import io.github.ayfri.kore.features.predicates.predicate
import io.github.ayfri.kore.features.predicates.sub.position
import io.github.ayfri.kore.functions.function
import io.github.ayfri.kore.functions.tick

// Define the zone where the player can be detected.
val ZONE_X = -20..20
val ZONE_Y = 40..80
val ZONE_Z = -20..20

fun DataPack.rangePredicate() = predicate("in_range") {
	locationCheck {
		position {
			x = rangeOrInt(ZONE_X)
			y = rangeOrInt(ZONE_Y)
			z = rangeOrInt(ZONE_Z)
		}
	}
}

fun DataPack.playerDetected() = function("player_detected") {
	tellraw(allPlayers(), textComponent("A player has been detected in the area!", Color.RED))
}


fun main() {
	val datapack = dataPack("player_detection") {
		tick {
			execute {
				ifCondition(rangePredicate()) // Check if a player is in the detection zone using our predicate.
				run {
					function(playerDetected()) // Execute the player_detected function if a player is detected.
				}
			}
		}
	}

	datapack.generateZip()
}
```

In this final code, we define the detection zone, create the detection function, and integrate the `player_detected` function, which sends a
notification to all players.

## Customizing the Detection Area

You can customize the detection area by changing the ranges for `ZONE_X`, `ZONE_Y`, and `ZONE_Z` in the `rangePredicate`. Additionally, you
can add more conditions or actions based on your requirements.

## Going Beyond the Tutorial

To extend this tutorial, you can:

- Add more complex conditions for detection.
- Trigger different functions based on the player's actions.
- Use scoreboards to keep track of player activities.
- Dynamically generate the detection zone based on player interactions, storages and macros.

By leveraging the power of Kore and Kotlin, you can create sophisticated and maintainable Minecraft datapacks with ease. Happy coding!
