1. Create custom mechanics with unique IDs
2. Set properties on mechanics
3. Register handlers for mechanic events
4. Check if items have specific mechanics
5. Respond to interactions with mechanics
## Configuration
The `config.yml` file includes a section for mechanic events:
```
set {_damage} to property "damage" of mechanic "toasty"
set {_enabled} to mechanic "toasty"'s property "enabled"
```
## Checking for Mechanics
You can check if an item has a specific mechanic using:
```
item has mechanic "mechanic_id"
```
or
```
item doesn't have mechanic "mechanic_id"
```
For example:
```
if player's tool has mechanic "toasty":
send "That item is toasty!" to player
```
## Responding to Mechanic Interactions
You can respond to interactions with mechanics using:
```
on interact with mechanic "mechanic_id":
# Event code here
```
For example:
```
on interact with mechanic "toasty":
if player's tool is a water bucket:
send "The water cooled down the toasty mechanic!" to player
cancel event
```
## Example Script
See the `example-mechanic.sk` file for a complete example of how to use the custom mechanics system.
## Programmatic Usage
You can also create and use custom mechanics programmatically. See the `ToastyItem.java` class in the `me.asleepp.skriptnexo.examples` package for an example.
## Using Custom Mechanics in Nexo Configs
When you create a custom mechanic using Skript, it is registered with Nexo's MechanicsManager, which means:
1. Your custom mechanics are available to Nexo and can be referenced in Nexo configurations by their ID.
2. Properties set on custom mechanics are stored in memory and can be accessed through Skript or Java code.
3. You can use your custom mechanics in Nexo's configuration files by referencing their ID.
For example, if you create a mechanic with ID "toasty", you can reference it in Nexo's configuration files like this:
```yaml
# Example of how to reference a custom mechanic in a Nexo config
items:
toasty_sword:
material: DIAMOND_SWORD
name: "&6Toasty Sword"
lore:
- "&eThis sword is extremely hot!"
mechanics:
- toasty # Reference to your custom mechanic
```
To apply a custom mechanic to an item or block programmatically, you need to use Nexo's API:
```java
// Example of applying a custom mechanic to an item programmatically
ItemStack item = new ItemStack(Material.DIAMOND_SWORD);
MechanicsManager.INSTANCE.applyMechanic(item, "toasty");
```
## Implementation Details
The custom mechanics system is implemented using the following classes:
- `SkriptMechanicFactory`: Creates custom mechanics
- `SkriptMechanic`: Represents a custom mechanic
- `MechanicHandler`: Handles mechanic events
- `SkriptMechanicInteractEvent`: Event for mechanic interactions
- `EvtMechanicInteractEvent`: Skript event for mechanic interactions
- `CondHasMechanic`: Condition for checking if an item has a mechanic
- `EffCreateCustomMechanic`: Effect for creating custom mechanics
- `EffSetMechanicProperty`: Effect for setting mechanic properties
- `ExprMechanicProperty`: Expression for getting mechanic properties
- `EffRegisterMechanicHandler`: Effect for registering mechanic handlers
# Example Skript script for creating and using custom mechanics in Skript-Nexo
# This script demonstrates how to create a custom "toasty" mechanic that sets players on fire when they interact with it
#
# Note: Once created, this mechanic can be used in Nexo configs by referencing its ID:
#
# Example in items.yml:
# items:
# toasty_sword:
# material: DIAMOND_SWORD
# name: "&6Toasty Sword"
# lore:
# - "&eThis sword is extremely hot!"
# mechanics:
# - toasty
# Create the custom mechanic when the server starts
on load:
# Create a new mechanic with the ID "toasty"
create nexo mechanic with id "toasty"
# Set properties for the mechanic
set property "damage" of mechanic "toasty" to 5
set property "enabled" of mechanic "toasty" to true
set property "duration" of mechanic "toasty" to 3 seconds
# Event to handle when a player interacts with an object that has the toasty mechanic
on interact with mechanic "toasty":
# This code will run when a player interacts with an object that has the "toasty" mechanic
send "§6You feel a warm sensation!" to player
# Get the damage and duration properties
set {_damage} to property "damage" of mechanic "toasty"
set {_duration} to property "duration" of mechanic "toasty"
# Apply effects based on the mechanic's properties
if player is sneaking:
# Reduced effect when sneaking
set {_damage} to {_damage} / 2
set {_duration} to {_duration} / 2
send "§e(Sneaking reduced the effect)" to player
# Apply heat effect (using potion effect instead of fire)
ignite player for {_duration}
# Apply damage
damage player by {_damage}
# You can add additional logic here if needed
if player's tool is a water bucket:
send "§bThe water cooled down the toasty mechanic!" to player
cancel event