mirror of
https://e.coding.net/circlecloud/BossShop-re.git
synced 2025-11-24 21:26:18 +00:00
352 lines
11 KiB
Java
352 lines
11 KiB
Java
package cc.util.bossshop;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Map.Entry;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.entity.Player;
|
|
import org.json.simple.JSONArray;
|
|
import org.json.simple.JSONObject;
|
|
|
|
public class JsonExtra{
|
|
|
|
public enum HoverAction{
|
|
show_text,show_item,show_achievement
|
|
}
|
|
|
|
public enum ClickAction{
|
|
run_command,suggest_command,open_url
|
|
}
|
|
|
|
public enum Color{
|
|
black('0'),
|
|
dark_aqua('3'),
|
|
dark_blue('1'),
|
|
dark_gray('8'),
|
|
dark_green('2'),
|
|
dark_purple('5'),
|
|
dark_red('4'),
|
|
aqua('b'),
|
|
blue('9'),
|
|
gold('6'),
|
|
gray('7'),
|
|
green('a'),
|
|
light_purple('d'),
|
|
red('c'),
|
|
white('f'),
|
|
yellow('e');
|
|
|
|
public static final char COLOR_CHAR='§';
|
|
private final char code;
|
|
private final String toString;
|
|
|
|
private Color(char pChar){
|
|
this.code=pChar;
|
|
this.toString=new String(new char[]{'§',code});
|
|
}
|
|
|
|
@Override
|
|
public String toString(){
|
|
return this.toString;
|
|
}
|
|
|
|
public static boolean isColor(char c){
|
|
return Color.getColor(c)!=null;
|
|
}
|
|
|
|
public static Color getColor(char c){
|
|
c=(char)((c&0xDF)+32);
|
|
for(Color sColor : Color.values())
|
|
if(sColor.code==c) return sColor;
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
public enum Style{
|
|
magic('k',null),
|
|
bold('l',"bold"),
|
|
strikethrough('m',"obfuscated"),
|
|
underline('n',"underlined"),
|
|
italic('o',"italic"),
|
|
reset('r',null);
|
|
|
|
public static final char FORMAT_CHAR='§';
|
|
private final char code;
|
|
private final String mLabel;
|
|
private final String toString;
|
|
|
|
private Style(char pChar,String pLabel){
|
|
this.code=pChar;
|
|
this.mLabel=pLabel;
|
|
this.toString=new String(new char[]{'§',code});
|
|
}
|
|
|
|
@Override
|
|
public String toString(){
|
|
return this.toString;
|
|
}
|
|
|
|
public static boolean isStyle(char c){
|
|
return Style.getStyle(c)!=null;
|
|
}
|
|
|
|
public static Style getStyle(char c){
|
|
c=(char)((c&0xDF)+32);
|
|
for(Style sStyle : Style.values())
|
|
if(sStyle.code==c) return sStyle;
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 如果为null代表这个是不是Json使用的节点
|
|
*/
|
|
public String getJsonLabel(){
|
|
return this.mLabel;
|
|
}
|
|
|
|
}
|
|
|
|
private String mText="";
|
|
private Color mTextColor=null;
|
|
private JSONObject mHoverEvent=null;
|
|
private JSONObject mClickEvent=null;
|
|
private boolean mInherit=true;
|
|
private static Pattern COLOR_FORMAT=Pattern.compile("§([0123456789AaBbCcDdEeFfKkLlMmNnOoRr])");
|
|
private ArrayList<JsonExtra> mExtras=new ArrayList<>();
|
|
/**未设置的值的格式默认继承,true或false代表是否启用,不允许put null*/
|
|
private HashMap<Style,Boolean> mStyles=new HashMap<>();
|
|
|
|
public JsonExtra(){
|
|
this.mText="";
|
|
}
|
|
|
|
public JsonExtra(String pText){
|
|
this.setText(pText);
|
|
}
|
|
|
|
public JsonExtra(String pText,Color pTextColor){
|
|
this.setText(pText);
|
|
this.setTextColor(pTextColor);
|
|
}
|
|
|
|
/**设置文字*/
|
|
public void setText(String pText){
|
|
if(pText==null) this.mText="";
|
|
pText=ChatColor.translateAlternateColorCodes('&',pText);
|
|
Color tcolor=this.mTextColor;
|
|
ArrayList<JsonExtra> tChildExtrs=new ArrayList<>();
|
|
HashMap<Style,Boolean> tStyles=new HashMap<>();
|
|
tStyles.putAll(this.mStyles);
|
|
Matcher matcher=COLOR_FORMAT.matcher(pText);
|
|
int pos=0;
|
|
while(matcher.find()){
|
|
char cf=matcher.group(1).charAt(0);
|
|
if(matcher.start()!=pos){
|
|
JsonExtra te=new JsonExtra();
|
|
te.mText=pText.substring(pos,matcher.start());
|
|
te.mTextColor=tcolor;
|
|
te.mStyles.putAll(tStyles);
|
|
te.mInherit=false;
|
|
tChildExtrs.add(te);
|
|
}
|
|
if(Color.isColor(cf)){
|
|
tcolor=Color.getColor(cf);
|
|
tStyles.clear();
|
|
}else if(Style.isStyle(cf)){
|
|
if(cf=='r'){
|
|
tcolor=null;
|
|
tStyles.clear();
|
|
}else tStyles.put(Style.getStyle(cf),true);
|
|
}
|
|
pos=matcher.end();
|
|
}
|
|
JsonExtra te=new JsonExtra();
|
|
te.mText=pText.substring(pos,pText.length());
|
|
te.mTextColor=tcolor;
|
|
te.mStyles.putAll(tStyles);
|
|
te.mInherit=false;
|
|
tChildExtrs.add(te);
|
|
|
|
JsonExtra headExtra=tChildExtrs.remove(0);
|
|
this.mText=headExtra.mText;
|
|
this.mTextColor=headExtra.mTextColor;
|
|
this.mStyles.clear();
|
|
this.mStyles.putAll(headExtra.mStyles);
|
|
this.mExtras.addAll(0,tChildExtrs);
|
|
}
|
|
|
|
/**设置文字颜色*/
|
|
public void setTextColor(Color pTextColor){
|
|
if(pTextColor==null) return;
|
|
this.mTextColor=pTextColor;
|
|
}
|
|
|
|
/**
|
|
* 设置字体样式
|
|
*/
|
|
public void setStyle(Style...pStyles){
|
|
if(pStyles==null) return;
|
|
for(Style sStyle : pStyles)
|
|
this.mStyles.put(sStyle,true);
|
|
}
|
|
|
|
/**
|
|
* 移除字体样式
|
|
*/
|
|
public void removeStyle(Style...pStyles){
|
|
if(pStyles==null) return;
|
|
for(Style sStyle : pStyles)
|
|
this.mStyles.remove(sStyle);
|
|
}
|
|
|
|
/**
|
|
* 清除所有格式
|
|
*/
|
|
public void clearStyle(){
|
|
this.mStyles.clear();
|
|
}
|
|
|
|
/**
|
|
* 将所有样式设置为false
|
|
*/
|
|
public void resetStyle(){
|
|
for(Style sStyle : Style.values())
|
|
this.mStyles.put(sStyle,false);
|
|
this.mStyles.put(Style.reset,true);
|
|
}
|
|
|
|
/**
|
|
* 设置是否继承父级的样式
|
|
*/
|
|
public void setInherit(boolean pInherit){
|
|
this.mInherit=pInherit;
|
|
}
|
|
|
|
/**
|
|
* 是否继承父级的样式
|
|
*/
|
|
public boolean isInherit(){
|
|
return this.mInherit;
|
|
}
|
|
|
|
/**
|
|
* 设置文字点击事件要执行的动作
|
|
* @param pAction 动作类型
|
|
* @param pValue 值
|
|
*/
|
|
public void setClickEvent(ClickAction pAction,String pValue){
|
|
if(pAction==null||StringUtils.isEmpty(pValue)) return;
|
|
this.mClickEvent=new JSONObject();
|
|
this.mClickEvent.put("action",pAction.name());
|
|
this.mClickEvent.put("value",pValue);
|
|
}
|
|
|
|
/**
|
|
* 设置文件在鼠标悬浮式要执行的动作
|
|
* @param pAction 动作
|
|
* @param pValue 值
|
|
*/
|
|
public void setHoverEvent(HoverAction pAction,String pValue){
|
|
if(pAction==null||StringUtils.isEmpty(pValue)) return;
|
|
this.mHoverEvent=new JSONObject();
|
|
this.mHoverEvent.put("action",pAction.name());
|
|
this.mHoverEvent.put("value",pValue);
|
|
}
|
|
|
|
private JSONObject getJson(){
|
|
JSONObject tJson=new JSONObject();
|
|
tJson.put("text",this.mText);
|
|
for(Style sStyle :Style.values()){
|
|
if(sStyle.getJsonLabel()==null) continue;
|
|
Boolean hasSet=this.mStyles.get(sStyle);
|
|
if(hasSet==null){
|
|
if(!this.mInherit) tJson.put(sStyle.getJsonLabel(),false);
|
|
}else{
|
|
tJson.put(sStyle.getJsonLabel(),hasSet.booleanValue());
|
|
}
|
|
}
|
|
if(this.mTextColor!=null) tJson.put("color",this.mTextColor.name());
|
|
if(this.mClickEvent!=null) tJson.put("clickEvent",this.mClickEvent);
|
|
if(this.mHoverEvent!=null) tJson.put("hoverEvent",this.mHoverEvent);
|
|
if(!this.mExtras.isEmpty()){
|
|
JSONArray tJsonArray=new JSONArray();
|
|
for(JsonExtra sExtra : this.mExtras){
|
|
tJsonArray.add(sExtra.getJson());
|
|
}
|
|
tJson.put("extra",tJsonArray);
|
|
}
|
|
return tJson;
|
|
}
|
|
|
|
@Override
|
|
public String toString(){
|
|
return this.getJson().toJSONString();
|
|
}
|
|
|
|
@Override
|
|
public JsonExtra clone(){
|
|
JsonExtra clone=new JsonExtra(this.mText,this.mTextColor);
|
|
JSONObject jsonObject=null;
|
|
if(this.mClickEvent!=null){
|
|
jsonObject=new JSONObject();
|
|
jsonObject.putAll((Map<?,?>)this.mClickEvent.clone());
|
|
clone.mClickEvent=jsonObject;
|
|
}
|
|
if(this.mHoverEvent!=null){
|
|
jsonObject=new JSONObject();
|
|
jsonObject.putAll((Map<?,?>)this.mHoverEvent.clone());
|
|
clone.mHoverEvent=jsonObject;
|
|
}
|
|
clone.mInherit=this.mInherit;
|
|
clone.mStyles.putAll(this.mStyles);
|
|
for(JsonExtra childExtra : this.mExtras){
|
|
clone.mExtras.add(childExtra.clone());
|
|
}
|
|
return clone;
|
|
}
|
|
|
|
public String toSimpleString(){
|
|
StringBuilder tStr=new StringBuilder();
|
|
if(this.mTextColor!=null) tStr.append(this.mTextColor.toString());
|
|
for(Entry<Style,Boolean> entry : this.mStyles.entrySet())
|
|
if(entry.getValue()) tStr.append(entry.getKey().toString());
|
|
tStr.append(this.mText);
|
|
for(JsonExtra sExtra : this.mExtras)
|
|
tStr.append(sExtra.toSimpleString());
|
|
return tStr.toString();
|
|
}
|
|
|
|
public void addExtra(JsonExtra pExtra){
|
|
if(pExtra==null) return;
|
|
this.mExtras.add(pExtra);
|
|
}
|
|
|
|
public void addNormalWords(String pWords,boolean pInherit){
|
|
if(StringUtils.isEmpty(pWords)) return;
|
|
JsonExtra tExtra=new JsonExtra(pWords,Color.white);
|
|
if(!pInherit)
|
|
tExtra.mInherit=false;
|
|
this.addExtra(tExtra);
|
|
}
|
|
|
|
/**
|
|
* 将Json消息发送给玩家<br />
|
|
* 如果CommandSender不是玩家,将只发送非Json的消息串
|
|
*/
|
|
public void sendToPlayer(CommandSender pSender){
|
|
if(pSender instanceof Player){
|
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(),"tellraw "+((Player)pSender).getName()+" "+this.toString());
|
|
}else pSender.sendMessage(this.toSimpleString());
|
|
//System.out.println(this.toString());
|
|
}
|
|
|
|
}
|