package com.dsh105.holoapi.example;
import com.dsh105.holoapi.api.Hologram;
import com.dsh105.holoapi.api.HologramFactory;
import com.dsh105.holoapi.api.events.HoloTouchActionLoadEvent;
import com.dsh105.holoapi.api.events.HoloTouchEvent;
import com.dsh105.holoapi.api.touch.TouchAction;
import com.dsh105.holoapi.protocol.Action;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.LinkedHashMap;
/**
* Example:
* - Creating and managing touchscreen enabled holograms through the TouchScreen API
* - On startup, two holograms are created
* - The first has two touch actions added - one persistent saved under "travel"
* - The second is touch enabled and handled using the HoloTouchEvent
* <p/>
* What you will achieve by following this:
* - Creating touchable holograms using the TouchScreen API
* - Add touch actions in two different ways
* - Add both persistent and temporary touch actions to a hologram
* - Loading persistent data for hologram touch actions and re-applying to a hologram
* - Enabling touchscreen functionality on a hologram without adding any touch actions
* - Using various events to manipulate touchscreen enabled holograms
*/
public class ExampleMain extends JavaPlugin implements Listener {
private Hologram touchEventHologram;
@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(this, this);
// Just creating a hologram here. If you don't know how to do this yet, see the other examples
// NOTE: This hologram will be created on startup every time.
Hologram hologram = new HologramFactory(this).withLocation(new Location(Bukkit.getWorld("world"), 0, 50, 0)).withText("Click to travel to spawn!").build();
// This is where we get to the fun stuff
// This method allows us to add actions that are performed when this hologram is touched (clicked)
hologram.addTouchAction(new TravelTouchAction(new Location(Bukkit.getWorld("world"), 10, 50, 10)));
// Another example of how to implement a touch action
// This one won't be persistent
hologram.addTouchAction(new TouchAction() {
@Override
public void onTouch(Player who, Action action) {
who.sendMessage("Congrats! You touched a hologram");
}
@Override
public String getSaveKey() {
// We don't want this action saved, so return null here
return null;
}
@Override
public LinkedHashMap<String, Object> getDataToSave() {
// Seeing as the save key is null, this method won't ever be called for this touch action
return null;
}
});
// Creating and storing another hologram. This will be used later on
touchEventHologram = new HologramFactory(this).withLocation(new Location(Bukkit.getWorld("world"), 0, 50, 0)).withText("Want some XP?").build();
// Seeing as we aren't specifically adding any touch actions, this hologram won't be touch enabled yet
// Consequently, we have to make sure it's enabled
touchEventHologram.setTouchEnabled(true); // That wasn't too hard was it? :D
// Once a hologram is touch enabled, HoloAPI won't remove that functionality unless specifically told to using that method
// As you can see, the possibilities of touchscreens are limitless using HoloAPI
// And it's fairly easy too :)
}
// This event handles data loading
// For the hologram above, this won't matter much because it's created on startup anyway
// For other holograms utilising the custom touch action, this becomes extremely useful for keeping touch actions saved between restarts
@EventHandler
public void onDataLoad(HoloTouchActionLoadEvent event) {
// Check if this is the touch action we wanted
if (event.getSaveKey().equals("travel")) {
// Retrieve all the data from the event
// It would be best to check if the data actually exists first
// For the purpose of this tutorial, I won't do that here
int x = (Integer) event.getConfigMap().get("x");
int y = (Integer) event.getConfigMap().get("y");
int z = (Integer) event.getConfigMap().get("z");
World world = Bukkit.getWorld((String) event.getConfigMap().get("world"));
// Put the touch action back into the hologram that was loaded
event.getHologram().addTouchAction(new TravelTouchAction(new Location(world, x, y, z)));
}
}
// In this event, we are going to handle the touch actions slightly differently
// Instead of app
@EventHandler
public void onTouch(HoloTouchEvent event) {
// First check if it's the hologram we want
if (event.getHologram().equals(this.touchEventHologram)) {
// Give them XP for touching it and send them a message
event.getPlayer().giveExpLevels(5);
event.getPlayer().sendMessage("You just gained 5 XP levels by touching that hologram. Well done!");
}
}
/**
* Our extension of the TouchAction
* This will be persistent, using the event above
*/
public class TravelTouchAction implements TouchAction {
Location to;
public TravelTouchAction(Location to) {
this.to = to;
}
@Override
public void onTouch(Player who, Action action) {
// No matter who clicks it, teleport them to the location we stored above
who.teleport(to);
}
@Override
public String getSaveKey() {
// What do we want to save it as?
// Might be a good idea to use something more unique than this, especially if other plugins on your server are utilising this API
// If two actions have the same save key, data will be overwritten
return "travel";
}
@Override
public LinkedHashMap<String, Object> getDataToSave() {
// By putting all these values into the map and sending it back to HoloAPI, we can make sure that all the data we need to load it back in is there
// See the load event above for how to load everything back into holograms
LinkedHashMap<String, Object> data = new LinkedHashMap<String, Object>();
data.put("x", to.getX());
data.put("y", to.getY());
data.put("z", to.getZ());
data.put("world", to.getWorld());
return data;
}
}
}