/* * * This file is a part of the SteamWar software. * * Copyright (C) 2020 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * / */ package de.steamwar.misslewars.slowmo; import de.steamwar.Reflection; import org.bukkit.Bukkit; import org.bukkit.World; import java.lang.reflect.Field; public class SlowMoUtils { private static final Field field; public static final boolean freezeEnabled; private static final Reflection.Method getWorldHandle = Reflection.getTypedMethod(Reflection.getClass("org.bukkit.craftbukkit.CraftWorld"), "getHandle", null); private static boolean frozen = false; private static final World world; static { Field temp; try { temp = Reflection.getClass("net.minecraft.server.level.ServerLevel").getField("freezed"); } catch (NoSuchFieldException e) { temp = null; } field = temp; if (field != null) field.setAccessible(true); freezeEnabled = field != null; world = Bukkit.getWorlds().get(0); } public static void freeze() { setFreeze(world, true); } public static void unfreeze() { setFreeze(world, false); } public static boolean frozen() { return freezeEnabled && frozen; } private static void setFreeze(World world, boolean state) { if (freezeEnabled) { if (frozen == state) return; try { field.set(getWorldHandle.invoke(world), state); frozen = state; } catch (IllegalAccessException e) { // Ignored; } } } }