/* * This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT). * * Copyright (c) JCThePants (www.jcwhatever.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.jcwhatever.nucleus.internal.managed.titles; import com.jcwhatever.nucleus.managed.titles.ITitle; import com.jcwhatever.nucleus.utils.PreCon; import com.jcwhatever.nucleus.utils.Utils; import com.jcwhatever.nucleus.utils.nms.INmsTitleHandler; import com.jcwhatever.nucleus.utils.nms.NmsUtils; import com.jcwhatever.nucleus.utils.text.SimpleJSONBuilder; import com.jcwhatever.nucleus.utils.text.TextComponents; import org.bukkit.entity.Player; import javax.annotation.Nullable; import java.util.Collection; /** * NucleusFramework's implementation of {@link ITitle} */ class Title implements ITitle { private final CharSequence _title; private final CharSequence _subTitle; private final int _fadeInTime; private final int _stayTime; private final int _fadeOutTime; private TextComponents _titleComponents; private TextComponents _subTitleComponents; /** * Constructor. * * <p>Uses default times.</p> * * @param title The title text. * @param subTitle The sub title text. */ Title(CharSequence title, @Nullable CharSequence subTitle) { this(title, subTitle, -1, -1, -1); } /** * Constructor. * * @param title The title text components. * @param subTitle The sub title text components. * @param fadeInTime The time spent fading in. * @param stayTime The time spent being displayed. * @param fadeOutTime The time spent fading out. */ Title(CharSequence title, @Nullable CharSequence subTitle, int fadeInTime, int stayTime, int fadeOutTime) { PreCon.notNull(title); _title = title; _subTitle = subTitle; _fadeInTime = fadeInTime; _stayTime = stayTime; _fadeOutTime = fadeOutTime; } /** * Get the time spent fading in. * * @return -1 if the default is used. */ @Override public int getFadeInTime() { return getTime(_fadeInTime); } /** * Get the time spent being displayed. * * @return -1 if the default is used. */ @Override public int getStayTime() { return getTime(_stayTime); } /** * Get the time spent fading out. * * @return -1 if the default is used. */ @Override public int getFadeOutTime() { return getTime(_fadeOutTime); } /** * Get the title components. */ @Override public String getTitle() { return _title.toString(); } /** * Get the sub-title components. */ @Override @Nullable public String getSubTitle() { return _subTitle != null ? _subTitle.toString() : null; } /** * Show the title to the specified player. * * @param player The player to show the title to. */ @Override public void showTo(Player player) { PreCon.notNull(player); INmsTitleHandler titleHandler = NmsUtils.getTitleHandler(); if (titleHandler != null) { titleHandler.send(player, _title, _subTitle, _fadeInTime, _stayTime, _fadeOutTime); return; } // use commands as a fallback if there is no NMS title handler String titleCommand = getCommand(player, TitleCommandType.TITLE); String subTitleCommand = null; String timesCommand = null; if (_subTitleComponents != null) { subTitleCommand = getCommand(player, TitleCommandType.SUBTITLE); } // if one time is -1 then all times are -1 if (getTime(_fadeInTime) != -1) { timesCommand = getCommand(player, TitleCommandType.TIMES); } if (timesCommand != null) { Utils.executeAsConsole(timesCommand); } if (subTitleCommand != null) { Utils.executeAsConsole(subTitleCommand); } Utils.executeAsConsole(titleCommand); } @Override public void showTo(Collection<? extends Player> players) { PreCon.notNull(players); INmsTitleHandler titleHandler = NmsUtils.getTitleHandler(); if (titleHandler != null) { for (Player player : players) { titleHandler.send(player, _title, _subTitle, _fadeInTime, _stayTime, _fadeOutTime); } return; } // fallback if no title handler for current NMS version. for (Player player : players) { showTo(player); } } public TextComponents getTitleComponents() { if (_titleComponents == null) { _titleComponents = new TextComponents(_title); } return _titleComponents; } @Nullable public TextComponents getSubTitleComponents() { if (_subTitle != null && _subTitleComponents == null) { _subTitleComponents = new TextComponents(_subTitle); } return _subTitleComponents; } private String getCommand(Player p, TitleCommandType type) { StringBuilder buffer = new StringBuilder(100); buffer.append("title "); buffer.append(p.getName()); buffer.append(' '); buffer.append(type.name()); buffer.append(' '); switch (type) { case TITLE: SimpleJSONBuilder.text(buffer, getTitleComponents()); break; case SUBTITLE: //noinspection ConstantConditions SimpleJSONBuilder.text(buffer, getSubTitleComponents()); break; case TIMES: buffer.append(_fadeInTime); buffer.append(' '); buffer.append(_stayTime); buffer.append(' '); buffer.append(_fadeOutTime); break; case CLEAR: break; case RESET: break; default: throw new AssertionError(); } return buffer.toString(); } private int getTime(int time) { if (_fadeInTime < 0 || _stayTime < 0 || _fadeOutTime < 0) return -1; return time; } protected enum TitleCommandType { TITLE, SUBTITLE, TIMES, CLEAR, RESET } }