All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.shynixn.petblocks.bukkit.nms.NMSRegistry Maven / Gradle / Ivy

package com.github.shynixn.petblocks.bukkit.nms;

import com.github.shynixn.petblocks.api.PetBlocksApi;
import com.github.shynixn.petblocks.api.business.entity.PetBlock;
import com.github.shynixn.petblocks.api.business.enumeration.PluginDependency;
import com.github.shynixn.petblocks.api.business.service.DependencyService;
import com.github.shynixn.petblocks.api.business.service.DependencyWorldGuardService;
import com.github.shynixn.petblocks.api.persistence.entity.PetMeta;
import com.github.shynixn.petblocks.bukkit.PetBlocksPlugin;
import com.github.shynixn.petblocks.core.logic.business.helper.ReflectionUtils;
import org.bukkit.Location;

import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;

public final class NMSRegistry {

    private static CustomEntityType.WrappedRegistry wrappedRegistry;
    private static final Class rabbitClazz;
    private static final Class zombieClazz;

    static {
        try {
            rabbitClazz = findClassFromVersion("com.github.shynixn.petblocks.bukkit.nms.VERSION.CustomRabbit");
            zombieClazz = findClassFromVersion("com.github.shynixn.petblocks.bukkit.nms.VERSION.CustomZombie");
        } catch (final ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    private NMSRegistry() {
        super();
    }

    /**
     * Creates a new petblock from the given location and meta.
     *
     * @param location location
     * @param meta     meta
     * @return petblock
     */
    public static PetBlock createPetBlock(Location location, PetMeta meta) {
        try {
            if (wrappedRegistry == null) {
                if (VersionSupport.getServerVersion().isVersionLowerThan(VersionSupport.VERSION_1_11_R1)) {
                    wrappedRegistry = new CustomEntityType.Registry10();
                } else if (VersionSupport.getServerVersion().isVersionLowerThan(VersionSupport.VERSION_1_13_R1)) {
                    wrappedRegistry = new CustomEntityType.Registry11();
                } else {
                    wrappedRegistry = new CustomEntityType.Registry13();
                }
            }
            if (!wrappedRegistry.isRegistered(rabbitClazz)) {
                wrappedRegistry.register(rabbitClazz, CustomEntityType.RABBIT);
                wrappedRegistry.register(zombieClazz, CustomEntityType.ZOMBIE);
            }
            return (PetBlock) ReflectionUtils.invokeConstructor(findClassFromVersion("com.github.shynixn.petblocks.bukkit.nms.VERSION.CustomGroundArmorstand")
                    , new Class[]{location.getClass(), PetMeta.class}, new Object[]{location, meta});
        } catch (final IllegalAccessException | InvocationTargetException | NoSuchMethodException | InstantiationException | ClassNotFoundException e) {
            PetBlocksPlugin.logger().log(Level.WARNING, "Cannot create petblock.", e);
            return null;
        } catch (final Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Unregisters all custom entities.
     *
     * @throws Exception exception
     */
    public static void unregisterCustomEntities() throws Exception {
        if (wrappedRegistry != null) {
            wrappedRegistry.unregister(rabbitClazz, CustomEntityType.RABBIT);
            wrappedRegistry.unregister(zombieClazz, CustomEntityType.ZOMBIE);
            wrappedRegistry = null;
        }
    }

    /**
     * Returns the class managed by version
     *
     * @param path path
     * @return class
     * @throws ClassNotFoundException exception
     */
    private static Class findClassFromVersion(String path) throws ClassNotFoundException {
        return Class.forName(path.replace("VERSION", VersionSupport.getServerVersion().getVersionText()));
    }

    /**
     * Compatibility method.
     *
     * @param location location
     */
    @Deprecated
    public static void accessWorldGuardSpawn(Location location) {
        final DependencyService dependencyService = PetBlocksApi.INSTANCE.resolve(DependencyService.class);

        if (!dependencyService.isInstalled(PluginDependency.WORLDGUARD)) {
            return;
        }

        final DependencyWorldGuardService dependencyWorldGuardService = PetBlocksApi.INSTANCE.resolve(DependencyWorldGuardService.class);

        try {
            dependencyWorldGuardService.prepareSpawningRegion(location);
        } catch (final Exception e) {
            PetBlocksPlugin.logger().log(Level.WARNING, "Failed to handle region spawning.", e);
        }
    }

    /**
     * Compatibility method.
     *
     * @param location location
     */
    @Deprecated
    public static void rollbackWorldGuardSpawn(Location location) {
        final DependencyService dependencyService = PetBlocksApi.INSTANCE.resolve(DependencyService.class);

        if (!dependencyService.isInstalled(PluginDependency.WORLDGUARD)) {
            return;
        }

        final DependencyWorldGuardService dependencyWorldGuardService = PetBlocksApi.INSTANCE.resolve(DependencyWorldGuardService.class);

        try {
            dependencyWorldGuardService.resetSpawningRegion(location);
        } catch (final Exception e) {
            PetBlocksPlugin.logger().log(Level.WARNING, "Failed to handle region spawning.", e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy