Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.pl3x.plugin;
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import net.minecraft.world.entity.ai.Brain;
- import net.minecraft.world.entity.ai.sensing.Sensor;
- import net.minecraft.world.entity.ai.sensing.SensorType;
- import org.bukkit.Bukkit;
- import org.bukkit.Location;
- import org.bukkit.World;
- import org.bukkit.craftbukkit.v1_19_R1.entity.CraftLivingEntity;
- import org.bukkit.entity.Entity;
- import org.bukkit.entity.EntityType;
- import org.bukkit.entity.LivingEntity;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.server.ServerLoadEvent;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.bukkit.scheduler.BukkitRunnable;
- import java.io.IOException;
- import java.io.RandomAccessFile;
- import java.lang.reflect.Field;
- import java.nio.ByteBuffer;
- import java.nio.channels.FileChannel;
- import java.nio.file.Path;
- import java.util.Arrays;
- import java.util.Locale;
- import java.util.Map;
- import java.util.TreeMap;
- public class TestPlugin extends JavaPlugin {
- @Override
- public void onEnable() {
- getServer().getPluginManager().registerEvents(new Listener() {
- @EventHandler
- public void on(ServerLoadEvent event) {
- // wait 5 seconds, then scan mobs
- new ScanMobs().runTaskLater(TestPlugin.this, 20);
- }
- }, this);
- }
- public void start() {
- //
- }
- public static class ScanMobs extends BukkitRunnable {
- @Override
- public void run() {
- System.out.println("Scanning mobs...");
- World world = Bukkit.getWorlds().get(0);
- Location loc = new Location(world, 0, 0, 0);
- Map<String, Map<String, Integer>> map = new TreeMap<>();
- Arrays.stream(EntityType.values())
- .forEach(type -> {
- Class<? extends Entity> clazz = type.getEntityClass();
- if (clazz != null && LivingEntity.class.isAssignableFrom(clazz) && type != EntityType.PLAYER) {
- System.out.println("Type: " + type.name());
- Entity entity = world.spawn(loc, clazz);
- Brain<?> brain = ((CraftLivingEntity) entity).getHandle().getBrain();
- Map<String, Integer> entityMap = map.computeIfAbsent(type.name().toLowerCase(Locale.ROOT), k -> new TreeMap<>());
- try {
- Field f = Brain.class.getDeclaredField("e"); // sensors
- f.setAccessible(true);
- var sensors = (Map<SensorType<?>, Sensor<?>>) f.get(brain);
- for (Map.Entry<SensorType<?>, Sensor<?>> entry : sensors.entrySet()) {
- Sensor<?> sensor = entry.getValue();
- try {
- Field i = Sensor.class.getDeclaredField("j"); // scanRate
- i.setAccessible(true);
- int scanRate = i.getInt(sensor);
- String key = io.papermc.paper.util.ObfHelper.INSTANCE.deobfClassName(sensor.getClass().getName());
- int lastSeparator = key.lastIndexOf('.');
- if (lastSeparator != -1) {
- key = key.substring(lastSeparator + 1);
- }
- key = key.toLowerCase(java.util.Locale.ROOT);
- entityMap.put(key, scanRate);
- System.out.println(key + ": " + scanRate);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
- });
- System.out.println("Done.");
- Gson gson = new GsonBuilder()
- .setPrettyPrinting()
- .create();
- String json = gson.toJson(map);
- System.out.println(json);
- write(json, Path.of("sensors.json"));
- }
- public static void write(String str, Path path) {
- try (
- RandomAccessFile raf = new RandomAccessFile(path.toFile(), "rw");
- FileChannel rw = raf.getChannel().truncate(0)
- ) {
- ByteBuffer buf = rw.map(FileChannel.MapMode.READ_WRITE, 0, str.length());
- buf.put(str.getBytes());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement