package jk_5.nailed.server.worlditems;
import gnu.trove.map.hash.TObjectIntHashMap;
import jk_5.eventbus.EventHandler;
import jk_5.nailed.api.chat.ChatColor;
import jk_5.nailed.api.chat.ComponentBuilder;
import jk_5.nailed.api.chat.TextComponent;
import jk_5.nailed.api.event.player.PlayerJoinMapEvent;
import jk_5.nailed.api.event.player.PlayerLeaveMapEvent;
import jk_5.nailed.api.event.player.PlayerRightClickItemEvent;
import jk_5.nailed.api.event.player.PlayerThrowItemEvent;
import jk_5.nailed.api.item.ItemStack;
import jk_5.nailed.api.item.Material;
import jk_5.nailed.api.mappack.metadata.TutorialStage;
import jk_5.nailed.api.player.Player;
import jk_5.nailed.api.util.Location;
import jk_5.nailed.api.util.TeleportOptions;
import jk_5.nailed.server.teleport.Teleporter;
public class WorldItemEventHandler {
private static final WorldItemEventHandler INSTANCE = new WorldItemEventHandler();
//TODO:
// Unmount before teleporting
private TObjectIntHashMap<Player> tutorialStage = new TObjectIntHashMap<Player>();
@EventHandler
public void onPlayerJoinMap(PlayerJoinMapEvent event){
tutorialStage.remove(event.getPlayer());
if(event.getMap().mappack().getMetadata().tutorial() != null){
//event.getPlayer.setInventorySlot(0, getStartTutorialItem) //TODO
tutorialStage.put(event.getPlayer(), -1);
}
}
@EventHandler
public void onPlayerLeaveMap(PlayerLeaveMapEvent event){
int i = 0;
/*event.getPlayer.iterateInventory { s =>
if(s != null && s.getTag("WorldItemType").isDefined) event.getPlayer.setInventorySlot(i, null)
i += 1
}*/ //TODO
tutorialStage.remove(event.getPlayer());
event.getPlayer().setAllowedToFly(false); //TODO don't set this to false if the player is creative or was allowed to fly
}
@EventHandler
public void onPlayerRightClickItem(PlayerRightClickItemEvent event){
ItemStack stack = event.getStack();
if(stack != null && stack.getTag("WorldItemType") != null){
String type = stack.getTag("WorldItemType");
if(type.equals("Tutorial")){
event.getPlayer().sendMessage(new ComponentBuilder("Starting tutorial").color(ChatColor.GREEN).create());
removeWorldItemFromPlayer(event.getPlayer(), "Tutorial");
//event.getPlayer.setInventorySlot(0, getNextStageItem) //TODO
//event.getPlayer.setInventorySlot(8, getEndTutorialItem) //TODO
nextStage(event.getPlayer());
event.getPlayer().setAllowedToFly(true);
doStageAction(event.getPlayer());
event.getPlayer().setAllowedToFly(true);
}else if(type.equals("Tutorial:NextStage")){
nextStage(event.getPlayer());
doStageAction(event.getPlayer());
}else if(type.equals("Tutorial:End")){
endTutorial(event.getPlayer());
}
}
}
private int nextStage(Player player){
int current = tutorialStage.get(player);
if(current == tutorialStage.getNoEntryValue()){
current = -1;
}
int next = current + 1;
tutorialStage.put(player, next);
return next;
}
private void endTutorial(Player player){
player.sendMessage(new TextComponent(""));
player.sendMessage(new ComponentBuilder("Finished the tutorial").color(ChatColor.GREEN).create());
Location.Builder loc = Location.builder().copy(player.getWorld().getConfig().spawnPoint());
loc.setWorld(player.getWorld());
Teleporter.teleportPlayer(player, new TeleportOptions(loc.build()));
removeWorldItemFromPlayer(player, "Tutorial:NextStage");
removeWorldItemFromPlayer(player, "Tutorial:End");
tutorialStage.remove(player);
//player.setInventorySlot(0, getStartTutorialItem) //TODO
player.setAllowedToFly(false);
}
private void doStageAction(Player player){
int nextStage = tutorialStage.get(player);
if(nextStage == tutorialStage.getNoEntryValue()){
nextStage = -1;
}
TutorialStage[] stages = player.getMap().mappack().getMetadata().tutorial().stages();
if(nextStage >= stages.length){
endTutorial(player);
}else{
TutorialStage stage = stages[nextStage];
Location.Builder loc = Location.builder().copy(stage.teleport());
loc.setWorld(player.getWorld());
player.setAllowedToFly(true);
Teleporter.teleportPlayer(player, new TeleportOptions(loc.build()));
player.sendMessage(new TextComponent(""));
player.sendMessage(new ComponentBuilder("-- " + stage.title()).color(ChatColor.DARK_AQUA).create());
for(String line : stage.messages()){
player.sendMessage(new ComponentBuilder(line).color(ChatColor.GRAY).create());
}
}
}
private void removeWorldItemFromPlayer(Player player, String type){
int i = 0;
/*player.iterateInventory { s =>
if(s != null && s.getTag("WorldItemType").isDefined && s.getTag("WorldItemType").get == typ) player.setInventorySlot(i, null)
i += 1
}*/ //TODO
}
public ItemStack getStartTutorialItem(){
ItemStack is = new ItemStack(Material.EMERALD);
is.setDisplayName(ChatColor.RESET.toString() + ChatColor.GOLD.toString() + "Tutorial");
is.addLore(ChatColor.RESET.toString() + ChatColor.GRAY.toString() + "Right click to start a tutorial");
is.setTag("WorldItemType", "Tutorial");
return is;
}
public ItemStack getNextStageItem(){
ItemStack is = new ItemStack(Material.EMERALD);
is.setDisplayName(ChatColor.RESET.toString() + ChatColor.GOLD.toString() + "Tutorial - Next Stage");
is.addLore(ChatColor.RESET.toString() + ChatColor.GRAY.toString() + "Right click to go to the next tutorial stage");
is.setTag("WorldItemType", "Tutorial:NextStage");
return is;
}
public ItemStack getEndTutorialItem(){
ItemStack is = new ItemStack(Material.WOOL, 1, (short) 14);
is.setDisplayName(ChatColor.RESET.toString() + ChatColor.RED.toString() + "Stop Tutorial");
is.addLore(ChatColor.RESET.toString() + ChatColor.GRAY.toString() + "Right click to stop the tutorial");
is.setTag("WorldItemType", "Tutorial:End");
return is;
}
@EventHandler
public void onPlayerThrowItem(PlayerThrowItemEvent event){
ItemStack stack = event.getStack();
if(stack != null && stack.getTag("WorldItemType") != null){
event.setCanceled(true);
}
}
public static WorldItemEventHandler instance(){
return INSTANCE;
}
}