Package com.sijobe.spc.command

Source Code of com.sijobe.spc.command.Time

package com.sijobe.spc.command;

import com.sijobe.spc.util.FontColour;
import com.sijobe.spc.validation.Parameter;
import com.sijobe.spc.validation.ParameterString;
import com.sijobe.spc.validation.Parameters;
import com.sijobe.spc.wrapper.CommandException;
import com.sijobe.spc.wrapper.CommandSender;
import com.sijobe.spc.wrapper.World;

import java.util.List;

/**
* Provides methods of changing the current Minecraft time
*
* @author simo_415
*/
@Command (
   name = "time",
   description = "Set and get the time within minecraft",
   example = "set 06:00",
   videoURL = "http://www.youtube.com/watch?v=W7T1XcSgJZA",
   version = "1.0"
)
public class Time extends StandardCommand {

   /**
    * The offset of days from the standard time
    */
   private static final int OFFSET_DAY = 0;
   /**
    * The offset of hours from the standard time
    */
   private static final int OFFSET_HOUR = 6;
   /**
    * The offset of minutes from the standard time
    */
   private static final int OFFSET_MINUTE = 0;
   /**
    * The time format that the getCurrentTime() method uses
    */
   public static final String TIME_FORMAT = FontColour.AQUA + "HH:MM" +
                                            FontColour.WHITE + " on day " +
                                            FontColour.AQUA + "DD";
   /**
    * The time at which the command <code>/time day</code> sets the time to
    */
   public static final String TIME_DAY = "06:00";
   /**
    * The time at which the command <code>/time night</code> sets the time to
    */
   public static final String TIME_NIGHT = "20:00";

   private static final Parameters PARAMETERS = new Parameters (
      new Parameter[] {
         new ParameterString("[set [TIME]|day|night]", true, new String[] {"set","day","night"}),
         new ParameterString("", true)
      }
   );

   @Override
   public void execute(CommandSender sender, List<?> params) throws CommandException {
      World world = super.getSenderAsPlayer(sender).getWorld();
      if (params.size() == 0) { // Gets the current time
      } else if (((String)params.get(0)).equalsIgnoreCase("day")) {
         setCurrentTime(world,TIME_DAY);
      } else if (((String)params.get(0)).equalsIgnoreCase("night")) {
         setCurrentTime(world,TIME_NIGHT);
      } else if (((String)params.get(0)).equalsIgnoreCase("set")) {
         if (params.size() == 1) {
            throw new CommandException("Must specify what time to set it to.");
         }
         setCurrentTime(world,(String)params.get(1));
      } else {
         throw new CommandException(FontColour.RED + getUsage(sender));
      }
      outputCurrentTime(sender);
   }

   /**
    * Sends the current time to the output
    *
    * @param sender - The sender to send the output to
    */
   private void outputCurrentTime(CommandSender sender) {
      String time = getCurrentTime(super.getSenderAsPlayer(sender).getWorld());
      String message = "The current time is " + FontColour.AQUA + time;
      sender.sendMessageToPlayer(message);
   }

   /**
    * Gets a String representation of the current time
    *
    * @return The current time formatted as a String
    */
   public String getCurrentTime(World world) {
      long worldtime = world.getTime();
      int DD = ((int) ((worldtime / 1000) / 24)) + OFFSET_DAY;
      int HH = ((int) ((worldtime / 1000) + OFFSET_HOUR) % 24);
      int MM = ((int) ((((worldtime % 1000) / 1000.0) * 60) + OFFSET_MINUTE) % 60);
      return TIME_FORMAT.replaceAll("DD", DD + "").
                         replaceAll("HH", HH < 10 ? "0" + HH : HH + "").
                         replaceAll("MM", MM < 10 ? "0" + MM : MM + "");
   }

   /**
    * Sets the current time in Minecraft by parsing the specified date String
    *
    * @param time - The time to set the game to
    * @return True if the time was correctly set
    */
   public void setCurrentTime(World world, String time) throws CommandException {
      int hour = 0;
      int minute = 0;
      try {
         if (time.matches("[0-2][0-9]:[0-5][0-9]")) { // HH:MM
            String parts[] = time.split(":");
            hour = Integer.parseInt(parts[0]);
            if (hour > 23) {
               throw new CommandException("Hour out of range");
            }
            hour -= OFFSET_HOUR;
            minute = Integer.parseInt(parts[1]) - OFFSET_MINUTE;
         } else if (time.matches("[0-9]{0,19}")) {
            long ticks = Long.parseLong(time);
            world.setTime(ticks);
            return;
         } else {
            throw new CommandException("Unknown date format");
         }
         long newTime = ((world.getTime() / 1000) / 24); // Gets the current day
         newTime += 1; // Makes it the next day
         newTime *= 24000; // Converts it to days
         newTime += (hour % 24) * 1000; // Adds the hours on
         newTime += ((minute % 60) / 60.0) * 1000; // Adds the minutes on
         world.setTime(newTime);
      } catch (Exception e) {
         throw new CommandException("Could not parse date.");
      }
   }

   @Override
   public Parameters getParameters() {
      return PARAMETERS;
   }
}
TOP

Related Classes of com.sijobe.spc.command.Time

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.