Back to Guides
Plugins

Build a “/home” plugin step‑by‑step (Paper)

HostChicken Editorial Team
September 7, 2025
2 min read
paperplugin developmenthomes

Build a “/home” plugin step‑by‑step (Paper)

Let’s extend your first plugin into something useful: a simple homes system. Players can set a home and teleport back anytime with `/sethome` and `/home`. We’ll store data in a YAML file to keep it easy.

Project outline

  • Commands: `/sethome`, `/home`
  • Storage: `plugins/Homes/homes.yml`
  • Permissions: `homes.sethome`, `homes.home` (optional)

plugin.yml

```yaml

name: Homes

version: 1.0.0

main: com.example.homes.HomesPlugin

api-version: 1.20

commands:

sethome:

description: Set your home

home:

description: Teleport to your home

permissions:

homes.sethome:

default: true

homes.home:

default: true

```

Main plugin class

```java

package com.example.homes;

import org.bukkit.Bukkit;

import org.bukkit.Location;

import org.bukkit.World;

import org.bukkit.command.Command;

import org.bukkit.command.CommandSender;

import org.bukkit.entity.Player;

import org.bukkit.plugin.java.JavaPlugin;

import org.bukkit.configuration.file.FileConfiguration;

import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;

import java.io.IOException;

import java.util.UUID;

public class HomesPlugin extends JavaPlugin {

private File homesFile;

private FileConfiguration homes;

@Override

public void onEnable() {

homesFile = new File(getDataFolder(), "homes.yml");

if (!homesFile.getParentFile().exists()) {

homesFile.getParentFile().mkdirs();

}

if (!homesFile.exists()) {

try { homesFile.createNewFile(); } catch (IOException ignored) {}

}

homes = YamlConfiguration.loadConfiguration(homesFile);

getLogger().info("Homes enabled");

}

@Override

public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

if (!(sender instanceof Player player)) {

sender.sendMessage("Players only.");

return true;

}

if (command.getName().equalsIgnoreCase("sethome")) {

if (!player.hasPermission("homes.sethome")) {

player.sendMessage("You don’t have permission.");

return true;

}

setHome(player.getUniqueId(), player.getLocation());

player.sendMessage("Home set!");

return true;

}

if (command.getName().equalsIgnoreCase("home")) {

if (!player.hasPermission("homes.home")) {

player.sendMessage("You don’t have permission.");

return true;

}

Location home = getHome(player.getUniqueId());

if (home == null) {

player.sendMessage("You don’t have a home yet. Use /sethome.");

return true;

}

player.teleport(home);

player.sendMessage("Teleported home!");

return true;

}

return false;

}

private void setHome(UUID uuid, Location loc) {

String path = uuid.toString();

homes.set(path + ".world", loc.getWorld().getName());

homes.set(path + ".x", loc.getX());

homes.set(path + ".y", loc.getY());

homes.set(path + ".z", loc.getZ());

homes.set(path + ".yaw", loc.getYaw());

homes.set(path + ".pitch", loc.getPitch());

try { homes.save(homesFile); } catch (IOException ignored) {}

}

private Location getHome(UUID uuid) {

String base = uuid.toString();

if (!homes.contains(base)) return null;

World world = Bukkit.getWorld(homes.getString(base + ".world"));

if (world == null) return null;

double x = homes.getDouble(base + ".x");

double y = homes.getDouble(base + ".y");

double z = homes.getDouble(base + ".z");

float yaw = (float) homes.getDouble(base + ".yaw");

float pitch = (float) homes.getDouble(base + ".pitch");

return new Location(world, x, y, z, yaw, pitch);

}

}

```

Build and install

Build your jar and place it in `plugins/`. Start the server and test with a friend.

Enhancements

  • Add multiple homes per player (`/sethome `)
  • Add cooldowns and costs
  • Integrate with LuckPerms for per‑group limits

You now have a practical plugin players will use every day—and a foundation to grow from.

About HostChicken Editorial Team

HostChicken Editorial Team contributes to the HostChicken guides, helping gamers master their servers.

Related Guides

25 article ideas for your Minecraft hosting app
2 min read
Minecraft Hosting
Auto-hibernation and scheduling: save resources with smart start/stop
3 min read
Minecraft Hosting
Backups and world management: save, restore, and clone safely
3 min read

Enjoyed This Guide?

Subscribe to get more Minecraft server tips and tutorials delivered to your inbox.