Aller au contenu principal

Creating Neurons

Neurons are the core components of Synapse that process and resolve placeholders. This guide covers everything you need to know about creating custom neurons and registering different types of placeholders.


Understanding Neurons

A Neuron is a platform-specific placeholder processor that:

  • Handles placeholder resolution for a specific namespace
  • Manages placeholder registration and lifecycle
  • Provides context-aware placeholder processing
  • Supports both synchronous and asynchronous operations

Namespace Management

Namespaces help organize placeholders and avoid naming conflicts. When creating a neuron, you can define one or more namespaces that it will handle.

Single Namespace

public class SimpleNeuron extends BukkitNeuron {
public SimpleNeuron(Plugin plugin) {
super(plugin, Namespace.of("simple"));
// Accessible as: ${simple.placeholder}
}
}

Multiple Namespaces

public class MultiNeuron extends BukkitNeuron {
public MultiNeuron(Plugin plugin) {
super(plugin, Namespace.of("multi", "m", "multiple"));
// Accessible as: ${multi.placeholder}, ${m.placeholder}, or ${multiple.placeholder}
}
}

Creating Your First Neuron

public class MyCustomNeuron extends BukkitNeuron {

public MyCustomNeuron(Plugin plugin) {
super(plugin, Namespace.of("custom"));
registerPlaceholders();
}

private void registerPlaceholders() {
// Register your placeholders here
register("hello", "Hello World!");
register("server_name", () -> getPlugin().getServer().getName());
}
}

Registering Your Neuron

After creating your neuron, register it with Synapse:

@Override
public void onEnable() {
new MyCustomNeuron(this).register();
}

PlaceholderAPI Integration (Bukkit Only)

For Bukkit, you can easily integrate with PlaceholderAPI:

public class PAPICompatibleNeuron extends BukkitNeuron {

public PAPICompatibleNeuron(Plugin plugin) {
super(plugin, Namespace.of("myplugin"));
registerPlaceholders();

// Enable PAPI integration
hookToPAPI();
}

private void registerPlaceholders() {
register("player_balance", context -> {
Player player = context.user().requirePlayer();
return String.valueOf(getBalance(player));
});
}
}