Search in sources :

Example 6 with MarkerAPI

use of org.dynmap.markers.MarkerAPI in project MyMaid2 by jaoafa.

the class Cmd_City method onCommand.

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    Plugin dynmap = plugin.getServer().getPluginManager().getPlugin("dynmap");
    if (dynmap == null || !dynmap.isEnabled()) {
        SendMessage(sender, cmd, "Dynmapプラグインが停止中、もしくは存在しないため、このコマンドを利用できません。");
        return true;
    }
    if (!(sender instanceof Player)) {
        SendMessage(sender, cmd, "このコマンドはサーバ内から実行可能です。");
        return true;
    }
    Player player = (Player) sender;
    DynmapAPI dynmapapi = (DynmapAPI) dynmap;
    MarkerAPI markerapi = dynmapapi.getMarkerAPI();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    if (args.length >= 1 && args[0].equalsIgnoreCase("help")) {
        SendUsageMessage(sender, cmd);
        return true;
    }
    if (markerapi.getMarkerSet("towns") == null) {
        Bukkit.getLogger().info("エリア情報を保管するDynmapSets「towns」が存在しないため、作成します。");
        markerapi.createMarkerSet("towns", "Towns", null, true);
    }
    if (args.length == 1) {
        if (args[0].equalsIgnoreCase("addcorner")) {
            // /city addcorner - コーナーを追加
            Set<Location> corner = new LinkedHashSet<Location>();
            if (Corner.containsKey(player.getName())) {
                corner.addAll(Corner.get(player.getName()));
            }
            Location loc = player.getLocation();
            corner.add(loc);
            Corner.put(player.getName(), corner);
            SendMessage(sender, cmd, "次の地点をコーナーキューに追加しました: #" + corner.size() + " X: " + loc.getBlockX() + " Z: " + loc.getBlockZ());
            return true;
        } else if (args[0].equalsIgnoreCase("clearcorner")) {
            // /city clearcorner - コーナーを削除
            if (Corner.containsKey(player.getName())) {
                Corner.remove(player.getName());
                SendMessage(sender, cmd, "削除に成功しました。");
                return true;
            } else {
                SendMessage(sender, cmd, "削除に失敗しました。");
                return true;
            }
        } else if (args[0].equalsIgnoreCase("undocorner")) {
            // /city undocorner - ひとつ前に追加したコーナーを削除
            if (Corner.containsKey(player.getName())) {
                Set<Location> corner = new LinkedHashSet<Location>();
                int now = 0;
                Location loc = null;
                for (Location one : Corner.get(player.getName())) {
                    if (now == (Corner.get(player.getName()).size() - 1)) {
                        loc = one;
                        break;
                    }
                    corner.add(one);
                    now++;
                }
                if (loc == null) {
                    SendMessage(sender, cmd, "ひとつ前のコーナーの削除に失敗しました。");
                    return true;
                }
                Corner.put(player.getName(), corner);
                SendMessage(sender, cmd, "ひとつ前のコーナー(X: " + loc.getBlockX() + " / Z: " + loc.getBlockZ() + ")の削除に成功しました。");
                return true;
            } else {
                SendMessage(sender, cmd, "ひとつ前のコーナーの削除に失敗しました。");
                return true;
            }
        } else if (args[0].equalsIgnoreCase("show")) {
            // /city show [エリア名] - エリアの情報を表示。エリア名を設定しないといまいるところのエリア情報を表示(できるかどうか)
            WorldGuardPlugin wg = MyMaid2.getWorldGuard();
            Location loc = player.getLocation();
            Vector v = new Vector(loc.getX(), loc.getY(), loc.getZ());
            RegionManager rm = wg.getRegionManager(player.getWorld());
            List<String> regionlist = rm.getApplicableRegionsIDs(v);
            if (regionlist.size() == 0) {
                SendMessage(sender, cmd, "この場所は登録されていません。");
                return true;
            }
            List<ProtectedRegion> inheritance = new LinkedList<ProtectedRegion>();
            ProtectedRegion lastregion = null;
            for (String region : regionlist) {
                ProtectedRegion r = rm.getRegion(region);
                if (lastregion == null) {
                    lastregion = r;
                }
                inheritance.add(r);
            }
            Collections.reverse(inheritance);
            ListIterator<ProtectedRegion> it = inheritance.listIterator(inheritance.size());
            int indent = 0;
            while (it.hasPrevious()) {
                ProtectedRegion cur = it.previous();
                String msg = "";
                // Put symbol for child
                if (indent != 0) {
                    for (int i = 0; i < indent; i++) {
                        msg += "  ";
                    }
                    msg += "\u2517";
                }
                // Put name
                SendMessage(sender, cmd, msg + cur.getId());
                indent++;
            }
            SendMessage(sender, cmd, "Owners: " + String.join(", ", lastregion.getOwners().getPlayers()));
            SendMessage(sender, cmd, "Members: " + String.join(", ", lastregion.getMembers().getPlayers()));
            return true;
        /*
				long start = System.currentTimeMillis();
				Location now = player.getLocation();
				MarkerSet markerset = markerapi.getMarkerSet("towns");
				boolean bool = true;
				for(AreaMarker areamarker : markerset.getAreaMarkers()){
					List<Location> locs = new ArrayList<>();
					for(int i = 0; i < areamarker.getCornerCount(); i++){
						Location loc = new Location(Bukkit.getWorld(areamarker.getWorld()), areamarker.getCornerX(i), -114514, areamarker.getCornerZ(i));
						locs.add(loc);
					}
					if(inArea(now, locs)){
						SendMessage(sender, cmd, "この場所は「" + areamarker.getLabel() + "」という名前のエリアです。");
						SendMessage(sender, cmd, "説明: " + areamarker.getDescription());
						bool = true;
					}
				}
				if(bool) SendMessage(sender, cmd, "この場所はエリア登録されていません。");

				if(DebugMode){
					long end = System.currentTimeMillis();
					System.out.println("処理時間: " + (end - start)  + "ms");
				}
				 */
        /*
				MarkerSet markerset = markerapi.getMarkerSet("towns");
				for(AreaMarker areamarker : markerset.getAreaMarkers()){
					// @param XorZ Xならtrue, Zならfalse
					// @param isMaxMaxならtrue, Minならfalse
					int maxX = getMaxOrMin(areamarker, true, true);
					int maxZ = getMaxOrMin(areamarker, false, true);
					int minX = getMaxOrMin(areamarker, true, false);
					int minZ = getMaxOrMin(areamarker, false, false);
					if(DebugMode) System.out.println("最大最小" + maxX + ", " + maxZ + ", " + minX + ", " + minZ);
ocation playerloc = player.getLocation();
					if(playerloc.getX() < minX || playerloc.getZ() > maxX){
						double x = playerloc.getX();
						double z = playerloc.getZ();
						int count = getCorners(areamarker, (int) x, (int) z);
						if(DebugMode) System.out.println("Count: " + count);

						if(count % 2 != 0){
							// 範囲内
							SendMessage(sender, cmd, "この場所は「" + areamarker.getLabel() + "」という名前のエリアです。");
							SendMessage(sender, cmd, "説明: " + areamarker.getDescription());

							if(DebugMode){
								long end = System.currentTimeMillis();
								System.out.println("処理時間: " + (end - start)  + "ms");
							}
							return true;
						}
					}
				}

				SendMessage(sender, cmd, "この場所はエリア登録されていません。");

				if(DebugMode){
					long end = System.currentTimeMillis();
					System.out.println("処理時間: " + (end - start)  + "ms");
				}
				return true;
				 */
        /*
				double minX = 0;
				double maxX = 0;
				boolean bool = true;
				int c = 0;
				MarkerSet markerset = markerapi.getMarkerSet("towns");
				for(AreaMarker areamarker : markerset.getAreaMarkers()){
					for(int i = 0; i < areamarker.getCornerCount(); i++){
						double x = areamarker.getCornerX(i);
						if(minX > x){
							minX = x;
						}
						if(maxX < x){
							maxX = x;
						}
						c++;
					}
				}
				SendMessage(sender, cmd, "minX: " + minX);
				SendMessage(sender, cmd, "maxX: " + maxX);
				SendMessage(sender, cmd, "Count: " + c);

				if(minX < player.getLocation().getX() && maxX < player.getLocation().getX()){
					SendMessage(sender, cmd, "この場所はエリア登録されていません。");
				}else if(minX > player.getLocation().getX() && maxX > player.getLocation().getX()){
					SendMessage(sender, cmd, "+1");
				}else if(minX < player.getLocation().getX() && maxX > player.getLocation().getX()){
					SendMessage(sender, cmd, "線分より右にいるのか左にいるのかを判定し、結果次第");
				}
				 */
        }
    } else if (args.length == 2) {
        if (args[0].equalsIgnoreCase("del")) {
            String cityName = args[1];
            MarkerSet markerset = markerapi.getMarkerSet("towns");
            for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                if (areamarker.getLabel().equals(cityName)) {
                    areamarker.deleteMarker();
                    SendMessage(sender, cmd, "指定されたエリア名のエリアを削除しました。");
                    DiscordSend("254166905852657675", "::cityscape:**Cityデータが削除されました。(" + sdf.format(new Date()) + ")**\n" + "プレイヤー: `" + player.getName() + "`\n" + "市名: `" + areamarker.getLabel() + "`");
                    return true;
                }
            }
            SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
            return true;
        } else if (args[0].equalsIgnoreCase("show")) {
            String cityName = args[1];
            AreaMarker select = null;
            MarkerSet markerset = markerapi.getMarkerSet("towns");
            for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                if (areamarker.getLabel().equals(cityName)) {
                    select = areamarker;
                }
            }
            if (select == null) {
                SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
                return true;
            }
            String label = select.getLabel();
            String desc = select.getDescription();
            SendMessage(sender, cmd, "--- " + label + " ---");
            SendMessage(sender, cmd, "説明: " + desc);
            return true;
        } else if (args[0].equalsIgnoreCase("addcorner")) {
            String cityName = args[1];
            AreaMarker select = null;
            MarkerSet markerset = markerapi.getMarkerSet("towns");
            for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                if (areamarker.getLabel().equals(cityName)) {
                    select = areamarker;
                }
            }
            if (select == null) {
                SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
                return true;
            }
            List<Double> Xs = new LinkedList<>();
            List<Double> Zs = new LinkedList<>();
            for (int i = 0; i < select.getCornerCount(); i++) {
                Xs.add(select.getCornerX(i));
                Zs.add(select.getCornerZ(i));
            }
            Location loc = player.getLocation();
            Xs.add(loc.getBlockX() + 0.5);
            Zs.add(loc.getBlockZ() + 0.5);
            double[] ArrXs = Xs.stream().mapToDouble(Double::doubleValue).toArray();
            double[] ArrZs = Zs.stream().mapToDouble(Double::doubleValue).toArray();
            select.setCornerLocations(ArrXs, ArrZs);
            SendMessage(sender, cmd, "エリア「" + select.getLabel() + "」に新しいコーナーを追加しました。");
            SendMessage(sender, cmd, "順番を変更したりする場合は、「/city editcorner <Name>」コマンドをお使いください。");
            return true;
        } else if (args[0].equalsIgnoreCase("editcorner")) {
            SendMessage(sender, cmd, "システム障害が多くみられるため、一時的にeditcornerの使用を停止しています。");
            return true;
        /*
				String cityName = args[1];
				AreaMarker select = null;
				MarkerSet markerset = markerapi.getMarkerSet("towns");
				for(AreaMarker areamarker : markerset.getAreaMarkers()){
					if(areamarker.getLabel().equals(cityName)){
						select = areamarker;
					}
				}
				if(select == null){
					SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
					return true;
				}
				new _OpenGUI(player, select).runTaskLater(plugin, 1);
				return true;
				 */
        }
    } else if (args.length == 3) {
        if (args[0].equalsIgnoreCase("add")) {
            // /city add <Name> <Color> - エリアの範囲を設定(Dynmapに表示)
            if (!Corner.containsKey(player.getName())) {
                // コーナー未登録
                SendMessage(sender, cmd, "コーナーが未登録です。/city addcornerを使用してコーナーを登録してください。");
                return true;
            }
            Set<Location> corner = Corner.get(player.getName());
            if (corner.size() < 2) {
                // コーナー数が2つ未満
                SendMessage(sender, cmd, "コーナー数が足りません。/city addcornerを使用してコーナーを登録してください。");
                return true;
            }
            String cityName = args[1];
            String color = args[2];
            for (MarkerSet markerset : markerapi.getMarkerSets()) {
                for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                    if (areamarker.getLabel().equals(cityName)) {
                        SendMessage(sender, cmd, "登録しようとしたエリア名は既に存在します。再登録する場合は削除してください。");
                        return true;
                    }
                }
            }
            MarkerSet set = markerapi.getMarkerSet("towns");
            List<Double> Xs = new LinkedList<>();
            List<Double> Zs = new LinkedList<>();
            for (Location loc : corner) {
                Xs.add(new Double(loc.getBlockX()) + 0.5);
                Zs.add(new Double(loc.getBlockZ()) + 0.5);
            }
            double[] ArrXs = Xs.stream().mapToDouble(Double::doubleValue).toArray();
            double[] ArrZs = Zs.stream().mapToDouble(Double::doubleValue).toArray();
            AreaMarker area = set.createAreaMarker(null, cityName, false, player.getWorld().getName(), ArrXs, ArrZs, true);
            if (area == null) {
                SendMessage(sender, cmd, "登録に失敗しました。");
                return true;
            }
            area.setFillStyle(area.getFillOpacity(), 0x808080);
            int colorint;
            try {
                colorint = Integer.parseInt(color, 16);
            } catch (NumberFormatException e) {
                SendMessage(sender, cmd, "登録に失敗しました。");
                SendMessage(sender, cmd, "色の指定が不正です。");
                return true;
            }
            area.setLineStyle(area.getLineWeight(), area.getLineOpacity(), colorint);
            SendMessage(sender, cmd, "登録に成功しました。");
            Corner.remove(player.getName());
            DiscordSend("254166905852657675", "::cityscape:**Cityデータが追加されました。(" + sdf.format(new Date()) + ")**\n" + "プレイヤー: `" + player.getName() + "`\n" + "市名: `" + area.getLabel() + "`\n" + "市色: " + color + " (16進数: " + colorint + ")");
            return true;
        } else if (args[0].equalsIgnoreCase("setcolor")) {
            // /city color <Name> <Color> - エリアの色を変更
            String cityName = args[1];
            String color = args[2];
            AreaMarker select = null;
            MarkerSet markerset = markerapi.getMarkerSet("towns");
            for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                if (areamarker.getLabel().equals(cityName)) {
                    select = areamarker;
                }
            }
            if (select == null) {
                SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
                return true;
            }
            int newcolorint;
            try {
                newcolorint = Integer.parseInt(color, 16);
            } catch (NumberFormatException e) {
                SendMessage(sender, cmd, "登録に失敗しました。");
                SendMessage(sender, cmd, "色の指定が不正です。");
                return true;
            }
            select.setLineStyle(select.getLineWeight(), select.getLineOpacity(), newcolorint);
            SendMessage(sender, cmd, "エリア色の変更に成功しました。");
            DiscordSend("254166905852657675", "::cityscape:**Cityデータが変更されました。(" + sdf.format(new Date()) + ") - SETCOLOR**\n" + "プレイヤー: `" + player.getName() + "`\n" + "市名: `" + select.getLabel() + "`\n" + "新市色: " + color + " (16進数: " + newcolorint + ")");
            return true;
        } else if (args[0].equalsIgnoreCase("setdesc")) {
            String cityName = args[1];
            String desc = "";
            int c = 2;
            while (args.length > c) {
                desc += args[c] + " ";
                c++;
            }
            AreaMarker select = null;
            MarkerSet markerset = markerapi.getMarkerSet("towns");
            for (AreaMarker areamarker : markerset.getAreaMarkers()) {
                if (areamarker.getLabel().equals(cityName)) {
                    select = areamarker;
                }
            }
            if (select == null) {
                SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
                return true;
            }
            desc = htmlspecialchars(desc);
            select.setDescription("<b>" + select.getLabel() + "</b><br />" + desc);
            SendMessage(sender, cmd, "指定されたエリア名のエリアへ説明文を追加しました。");
            DiscordSend("254166905852657675", "::cityscape:**Cityデータが変更されました。(" + sdf.format(new Date()) + ") - SETDESC**\n" + "プレイヤー: `" + player.getName() + "`\n" + "市名: `" + select.getLabel() + "`\n" + "新説明: " + desc);
            return true;
        }
    } else if (args.length >= 3 && args[0].equalsIgnoreCase("setdesc")) {
        String cityName = args[1];
        String desc = "";
        int c = 2;
        while (args.length > c) {
            desc += args[c] + " ";
            c++;
        }
        AreaMarker select = null;
        MarkerSet markerset = markerapi.getMarkerSet("towns");
        for (AreaMarker areamarker : markerset.getAreaMarkers()) {
            if (areamarker.getLabel().equals(cityName)) {
                select = areamarker;
            }
        }
        if (select == null) {
            SendMessage(sender, cmd, "指定されたエリア名のエリアは見つかりませんでした。");
            return true;
        }
        desc = htmlspecialchars(desc);
        select.setDescription("<b>" + select.getLabel() + "</b><br />" + desc);
        SendMessage(sender, cmd, "指定されたエリア名のエリアへ説明文を追加しました。");
        DiscordSend("254166905852657675", "::cityscape:**Cityデータが変更されました。(" + sdf.format(new Date()) + ") - SETDESC**\n" + "プレイヤー: `" + player.getName() + "`\n" + "市名: `" + select.getLabel() + "`\n" + "新説明: " + desc);
        return true;
    }
    SendUsageMessage(sender, cmd);
    return true;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) WorldGuardPlugin(com.sk89q.worldguard.bukkit.WorldGuardPlugin) ProtectedRegion(com.sk89q.worldguard.protection.regions.ProtectedRegion) RegionManager(com.sk89q.worldguard.protection.managers.RegionManager) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Vector(com.sk89q.worldedit.Vector) MarkerSet(org.dynmap.markers.MarkerSet) Player(org.bukkit.entity.Player) DynmapAPI(org.dynmap.DynmapAPI) AreaMarker(org.dynmap.markers.AreaMarker) MarkerAPI(org.dynmap.markers.MarkerAPI) ListIterator(java.util.ListIterator) Date(java.util.Date) LinkedList(java.util.LinkedList) SimpleDateFormat(java.text.SimpleDateFormat) Plugin(org.bukkit.plugin.Plugin) WorldGuardPlugin(com.sk89q.worldguard.bukkit.WorldGuardPlugin) JavaPlugin(org.bukkit.plugin.java.JavaPlugin) Location(org.bukkit.Location)

Aggregations

MarkerAPI (org.dynmap.markers.MarkerAPI)6 MarkerSet (org.dynmap.markers.MarkerSet)6 Marker (org.dynmap.markers.Marker)4 ArrayList (java.util.ArrayList)3 List (java.util.List)3 Location (org.bukkit.Location)3 Player (org.bukkit.entity.Player)3 Plugin (org.bukkit.plugin.Plugin)3 JavaPlugin (org.bukkit.plugin.java.JavaPlugin)3 DynmapAPI (org.dynmap.DynmapAPI)3 CircleMarker (org.dynmap.markers.CircleMarker)3 PolyLineMarker (org.dynmap.markers.PolyLineMarker)3 Date (java.util.Date)2 MarkerIcon (org.dynmap.markers.MarkerIcon)2 Vector (com.sk89q.worldedit.Vector)1 WorldGuardPlugin (com.sk89q.worldguard.bukkit.WorldGuardPlugin)1 RegionManager (com.sk89q.worldguard.protection.managers.RegionManager)1 ProtectedRegion (com.sk89q.worldguard.protection.regions.ProtectedRegion)1 SimpleDateFormat (java.text.SimpleDateFormat)1 HashMap (java.util.HashMap)1