Custom Spawn

 avatar
unknown
javascript
2 years ago
8.4 kB
12
Indexable
var Bukkit = Java.type("org.bukkit.Bukkit");
var CreatureSpawnEvent = Java.type("org.bukkit.event.entity.CreatureSpawnEvent");
var EntityType = Java.type("org.bukkit.entity.EntityType");
var Location = Java.type("org.bukkit.Location");

var Double = Java.type("java.lang.Double");
var File = Java.type("java.io.File");
var Scanner = Java.type("java.util.Scanner");
var Integer = Java.type("java.lang.Integer");
var InputStreamReader = Java.type("java.io.InputStreamReader");
var Reader = Java.type("java.io.Reader");

var FileConfiguration = Java.type("org.bukkit.configuration.file.FileConfiguration");
var YamlConfiguration = Java.type("org.bukkit.configuration.file.YamlConfiguration");

var config = null;
var configFile = null;
var FAPI;

var npcs;
var spawned;

function reloadNpcs() {
    if (config == null)
        return;

    var worlds = config.getKeys(false);

    worlds.forEach(function(world) {
        var entities = config.getConfigurationSection(world);
        var entitiesKey = entities.getKeys(false);
    
        entitiesKey.forEach(function(entity) {
            var npc = entities.getConfigurationSection(entity);
            var data = {
                world: world.toString(),
                entity: entity.toString(),
                id: npc.toString(),
                tab: npc.getInt("tab"),
                probability: npc.getDouble("probability")
            };
            
            npcs.push(data);
        });
    }); 
}

function onInit() {
    FAPI = API.getTempData("FAPI");
    npcs = [];
    spawned = [];

    registerConfig();
    reloadNpcs();

    FAPI.registerCommand("sc-create", null, null, function (event) {
        var player = event.getPlayer();
        var args = event.getArguments();

        if (args.length < 5) {
            sendInfo(player);
            return;
        }

        var config = getConfig();

        try {
            var world = Bukkit.getWorld(args[0]);
            var entity = args[1].toUpperCase();
            var npc = args[2];
            var tab = args[3];
            var probability = args[4];
            var path;

            if (world == null) {
                API.message(player, "&c¡El mundo ingresado no existe!");
                return;
            }

            if (EntityType.valueOf(entity) == null) {
                API.message(player, "&c¡La entidad de reemplazo ingresada no existe!");
                return;
            }

            if (isNaN(tab) || isNaN(probability)) {
                API.message(player, "&c¡El tab y la probabilidad debe ser numérica!");
                return;
            }

            path = world.getName() + "." + entity + "." + npc;

            if (config.getString(path) != null) {
                API.message(player, "&c¡El NPC ya está registrado!");
                return;
            }

            tab = Integer.parseInt(tab);
            probability = Double.parseDouble(probability);

            config.set(path + ".tab", tab);
            config.set(path + ".probability", probability);
            saveConfig();
            API.message(player, "&a¡NPC registrado correctamente!");
        } catch (exception) {
            API.message(player, "&e&lOcurrió un error &7-> &c" + exception);
        }
    });

    FAPI.registerCommand("sc-delete", null, null, function (event) {
        var player = event.getPlayer();
        var args = event.getArguments();

        if (args.length < 3) {
            sendInfo(player);
            return;
        }

        var config = getConfig();

        try {
            var world = Bukkit.getWorld(args[0]);
            var entity = args[1];
            var npc = args[2]
            var path;

            if (world == null) {
                API.message(player, "&c¡El mundo ingresado no existe!");
                return;
            }

            if (EntityType.valueOf(entity) == null) {
                API.message(player, "&c¡La entidad de reemplazo ingresada no existe!");
                return;
            }

            path = world.getName() + "." + entity + "." + npc;

            if (config.get(path) == null) {
                API.message(player, "&c¡El NPC no está registrado!");
                return;
            }

            config.set(path, null);
            saveConfig();
            API.message(player, "&a¡NPC eliminado correctamente!");
        } catch (exception) {
            API.message(player, "&eOcurrió un error &7-> &c" + exception);
        }
    });

    FAPI.registerCommand("sc-reload", null, null, function (event) {
        var player = event.getPlayer();

        reloadConfig(); 
        reloadNpcs();
        API.message(player, "&a¡Configuración recargada correctamente!");
    });

    FAPI.registerCommand("sc-list", null, null, function (event) {
        var player = event.getPlayer();

        API.message(player, "&a&lLISTA:");
        previewFile(player);
    });

    API.registerListener(CreatureSpawnEvent.class, function(event) {
        var entity = event.getEntity();
        var location = entity.getLocation();

        for (var i = 0; i < npcs.length; i++) {
            try {
                var npc = npcs[i];

                if (entity.getWorld().getName() != npc.world) 
                    continue;

                if (entity.getType() != EntityType.valueOf(npc.entity))
                    continue;

                if (Math.random() * 100 > npc.probability)
                    continue;

                entity.remove();
                var optional = API.spawnClone(npc.id, npc.tab, location);

                optional.ifPresent(function(metadata) {
                    metadata.getNpc().ifPresent(function(n) {
                        var data = {
                            npc: n,
                            timestamp: Date.now()
                        };

                        spawned.push(data);
                    });
                });
            } catch (exception) {
                //
            }
        }
    });

    API.runRepeatingTask(function() {
        for (var i = spawned.length - 1; i >= 0; i--) {
            try {
                var data = spawned[i];

                if (Date.now() - data.timestamp > 600000) {
                    if (data.npc != null)
                        data.npc.despawn();

                    spawned.splice(i, 1);
                }
            } catch (exception) {
                //
            }
        }
    }, 1200);
}

function sendInfo(player) {
    API.message(player, "&8------ &f&lSPAWN CUSTOM &8------");
    API.message(player, "/sc-create <mundo> <entidad de reemplazo> <npc> <tab> <probabilidad>");
    API.message(player, "/sc-delete <mundo> <entidad de reemplazo> <npc>");
    API.message(player, "/sc-reload");
    API.message(player, "/sc-list");
}

function reloadConfig() {
	if (config == null) {
		configFile = new File(getDataFolder(), "spawncustom.yml");
	}

	config = YamlConfiguration.loadConfiguration(configFile);
	var defConfigStream;

	try {
		defConfigStream = new InputStreamReader(configFile, "UTF8");

		if (defConfigStream != null) {
			var defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
			config.setDefaults(defConfig);
		}
	} catch(exception) {
		exception.printStackTrace();
	}
}

function getConfig() {
    if (config == null) {
        reloadConfig();
    }

    return config;
}
 
function saveConfig() {
	try {
		config.save(configFile);			
	} catch(exception) {
		exception.printStackTrace();
	}
}
 
function registerConfig() {
	configFile = new File(getDataFolder(), "spawncustom.yml");

	if (!configFile.exists()) {
		getConfig().options().copyDefaults(true);
		saveConfig();
	}
}

function previewFile(player) {
    try {
        var scan = new Scanner(configFile);

        while (scan.hasNextLine()) {
            var line = scan.nextLine();
            API.message(player, "&a" + line);
        }
        scan.close();
    } catch (exception) {
        exception.printStackTrace();
    }
}

function getDataFolder() {
    return new File(".");
}
Editor is loading...