-
Notifications
You must be signed in to change notification settings - Fork 28
Developer API
Boss contains easy-to-understand developer API that allows you to find and track Bosses, add or remove Bosses, or edit custom skills
Simply check if the entity has a "Boss_V4" scoreboard tag (or check for metadata of the same tag name if you are on a legacy Minecraft version).
Since Boss 4, we no longer host the plugin publicly. Just use the downloaded JAR as a systemPath dependency.
If you are a developer, please fill the upgrade form selecting "I made a contribution" and a link to your BuiltByBit profile here: https://mineacademy.org/boss/#upgrade and we'll add you.
<dependency>
<groupId>org.mineacademy</groupId>
<artifactId>Boss</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>C:/path/to/your/server/plugins/Boss.jar</systemPath>
</dependency>
Where should you start? Use BossAPI to access main API calls and BossSkillRegistry to add custom skills.
Creating new skills is a simple process that takes two steps. Firstly, you need to create the skill itself. Then, you need to register it within the plugin. They will appear in the Boss' menu automatically.
When your plugin enables, register the skill inside of the Boss plugin:
BossSkill.registerSkill("YourSkillUniqueName", YourSkillClass.class);
Please take a look at the example skill to understand how a Skill should be made. We use open-source library Foundation available in our main repository.
package org.mineacademy.boss.skill;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.mineacademy.fo.collection.SerializedMap;
import org.mineacademy.fo.conversation.SimpleDecimalPrompt;
import org.mineacademy.fo.menu.Menu;
import org.mineacademy.fo.menu.button.Button;
import org.mineacademy.fo.menu.button.StartPosition;
import org.mineacademy.fo.menu.button.annotation.Position;
import org.mineacademy.fo.menu.model.ItemCreator;
import org.mineacademy.fo.model.HookManager;
import org.mineacademy.fo.model.RangedSimpleTime;
import org.mineacademy.fo.remain.CompMaterial;
import org.mineacademy.fo.remain.CompSound;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class SkillEnderman extends BossSkill {
/**
* How many blocks away from the Boss to look for?
*/
private int radius;
@Override
public RangedSimpleTime getDefaultDelay() {
return RangedSimpleTime.parse("45 seconds - 2 minutes");
}
@Override
public boolean execute(LivingEntity entity) {
final List<Player> found = new ArrayList<>();
for (final Entity nearby : entity.getNearbyEntities(this.radius, this.radius - 1, this.radius))
if (nearby instanceof Player && !HookManager.isNPC(nearby))
found.add((Player) nearby);
if (!found.isEmpty()) {
Collections.shuffle(found);
final Player target = found.get(0);
if (this.getBoss().canTarget(target)) {
entity.teleport(target.getLocation());
CompSound.ENDERMAN_TELEPORT.play(target);
this.sendSkillMessage(target, entity);
return true;
}
}
return false;
}
@Override
public String[] getDefaultMessage() {
return new String[] {
"I was lonely far from you so I wanted to say hey",
"Say hey! {boss} has &cteleported itself to you &7!",
"I thought we were friends, so here I come!"
};
}
@Override
public ItemStack getIcon() {
return ItemCreator.of(
CompMaterial.ENDER_PEARL,
"Enderman",
"",
"Boss will teleport itself",
"to a random player.")
.make();
}
@Override
public void readSettings(SerializedMap map) {
this.radius = map.getInteger("Radius", 5);
}
@Override
public SerializedMap writeSettings() {
final SerializedMap map = new SerializedMap();
map.put("Radius", this.radius);
return map;
}
@Override
public Menu getMenu(Menu parent) {
return new SkillSettingsMenu(parent);
}
/* ------------------------------------------------------------------------------- */
/* Classes */
/* ------------------------------------------------------------------------------- */
private class SkillSettingsMenu extends Menu {
@Position(start = StartPosition.CENTER)
private final Button radiusButton;
SkillSettingsMenu(Menu parent) {
super(parent);
this.setSize(9 * 3);
this.setTitle("Enderman Skill Settings");
this.radiusButton = Button.makeSimple(ItemCreator.of(
CompMaterial.ENDER_PEARL,
"Radius",
"",
"Current: &f" + SkillEnderman.this.radius,
"",
"How many blocks around",
"should Boss look for players",
"to teleport itself to?"),
player -> {
new SimpleDecimalPrompt("Enter how many blocks around the Boss will look for players. Current: '" + SkillEnderman.this.radius + "'.") {
@Override
protected boolean isInputValid(ConversationContext context, String input) {
try {
final int newRadius = Integer.parseInt(input);
if (newRadius > 0 && newRadius <= 50) {
SkillEnderman.this.radius = newRadius;
SkillEnderman.this.save();
return true;
}
} catch (final Throwable t) {
// see getFailedValiationText
}
return false;
}
@Override
protected String getFailedValidationText(ConversationContext context, String invalidInput) {
return "Invalid radius, enter a whole number between 1-50";
}
}.show(player);
});
}
@Override
public Menu newInstance() {
return new SkillSettingsMenu(this.getParent());
}
}
}
© MineAcademy | Code Unique Minecraft Plugins & Servers In 20 Days
Home
About
Basics
About Bosses
Troubleshooting
Miscellaneous