Browse Source

update to 1.20.4

Marvin Löschenkohl 1 year ago
parent
commit
20737d7559

+ 2 - 3
src/me/hammerle/kp/Events.java

@@ -14,8 +14,8 @@ import org.bukkit.event.vehicle.VehicleExitEvent;
 import org.bukkit.event.weather.LightningStrikeEvent;
 import org.bukkit.event.world.PortalCreateEvent;
 import org.bukkit.event.world.WorldLoadEvent;
-import org.spigotmc.event.entity.EntityDismountEvent;
-import org.spigotmc.event.entity.EntityMountEvent;
+import org.bukkit.event.entity.EntityDismountEvent;
+import org.bukkit.event.entity.EntityMountEvent;
 import io.papermc.paper.event.player.PlayerArmSwingEvent;
 import me.hammerle.kp.plots.PlotEvents;
 import me.hammerle.kp.snuviscript.CommandManager;
@@ -78,7 +78,6 @@ public class Events implements Listener {
             return;
         }
         Player p = e.getPlayer();
-        NMS.patch(p);
         PlayerData.get(p).login(p);
         PlayerCommands.join(p);
         ScriptEvents.onPlayerJoin(e);

+ 0 - 1
src/me/hammerle/kp/KajetansPlugin.java

@@ -111,7 +111,6 @@ public class KajetansPlugin extends JavaPlugin implements ISnuviScheduler {
         EntityCommands.registerFunctions();
         LivingCommands.registerFunctions();
         ArmorStandCommands.registerFunctions();
-        HumanCommands.registerFunctions();
         CitizenCommands.registerFunctions();
         DatabaseCommands.registerFunctions();
         PlotCommands.registerFunctions();

+ 5 - 734
src/me/hammerle/kp/NMS.java

@@ -1,129 +1,27 @@
 package me.hammerle.kp;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.LinkedList;
-import java.util.Map;
 import java.util.UUID;
-import com.destroystokyo.paper.profile.CraftPlayerProfile;
-import com.destroystokyo.paper.profile.PlayerProfile;
-import com.destroystokyo.paper.profile.ProfileProperty;
-import com.mojang.authlib.GameProfile;
-import com.mojang.authlib.properties.Property;
-import com.mojang.authlib.properties.PropertyMap;
-import com.mojang.datafixers.util.Pair;
-import org.bukkit.craftbukkit.v1_18_R2.entity.*;
-import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R3.entity.*;
 import org.bukkit.Location;
 import org.bukkit.World;
 import org.bukkit.block.Block;
-import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock;
-import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock;
+import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
 import org.bukkit.entity.*;
 import org.bukkit.inventory.ItemStack;
-import me.hammerle.kp.snuviscript.ScriptEvents;
 import net.minecraft.core.BlockPosition;
-import net.minecraft.core.IRegistry;
-import net.minecraft.core.RegistryMaterials;
 import net.minecraft.nbt.MojangsonParser;
 import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.network.chat.ChatComponentText;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.network.syncher.DataWatcherObject;
 import net.minecraft.server.level.EntityPlayer;
 import net.minecraft.server.level.WorldServer;
-import net.minecraft.server.network.PlayerConnection;
 import net.minecraft.stats.StatisticList;
-import net.minecraft.world.damagesource.DamageSource;
-import net.minecraft.world.entity.EntityCreature;
-import net.minecraft.world.entity.EntityInsentient;
 import net.minecraft.world.entity.EntityLiving;
-import net.minecraft.world.entity.EntityTypes;
-import net.minecraft.world.entity.EnumCreatureType;
-import net.minecraft.world.entity.EnumItemSlot;
-import net.minecraft.world.entity.item.EntityItem;
-import net.minecraft.world.entity.monster.EntityCreeper;
-import net.minecraft.world.entity.monster.EntityMonster;
-import net.minecraft.world.entity.monster.IMonster;
-import net.minecraft.world.entity.player.EntityHuman;
-import net.minecraft.world.entity.projectile.EntityArrow;
-import net.minecraft.world.entity.projectile.EntityFireballFireball;
-import net.minecraft.world.entity.projectile.EntityFireworks;
-import net.minecraft.world.entity.projectile.EntityWitherSkull;
 import net.minecraft.world.level.block.entity.TileEntity;
 import net.minecraft.world.level.block.state.IBlockData;
-import net.minecraft.world.phys.Vec3D;
-import net.minecraft.world.entity.ai.attributes.AttributeDefaults;
-import net.minecraft.world.entity.ai.attributes.AttributeProvider;
-import net.minecraft.world.entity.ai.attributes.GenericAttributes;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalLookAtPlayer;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalMoveTowardsTarget;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStrollLand;
-import net.minecraft.world.entity.ai.goal.PathfinderGoalSelector;
-import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
-import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget;
 
 public class NMS {
-    private final static HashMap<String, DamageSource> DAMAGE_SOURCES = new HashMap<>();
-
-    private static EntityTypes<RawHuman.WrapperHuman> HUMAN_TYPE;
-    public static String humanPrefix = "A";
-    public static String humanSuffix = "B";
-
-    @SuppressWarnings("unchecked")
     public static void init() {
-        try {
-            Field f = RegistryMaterials.class.getDeclaredField("bL");
-            f.setAccessible(true);
-            f.set(RegistryMaterials.W, false);
-
-            Field cache = RegistryMaterials.class.getDeclaredField("bN");
-            cache.setAccessible(true);
-            cache.set(RegistryMaterials.W, new IdentityHashMap<>());
-
-            Method m = EntityTypes.class.getDeclaredMethod("a", String.class,
-                    EntityTypes.Builder.class);
-            m.setAccessible(true);
-            HUMAN_TYPE =
-                    (EntityTypes<RawHuman.WrapperHuman>) m.invoke(null, "human", EntityTypes.Builder
-                            .a(RawHuman.WrapperHuman::new, EnumCreatureType.a).a(0.6f, 1.95f));
-
-            final Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
-            unsafeField.setAccessible(true);
-            final sun.misc.Unsafe unsafe = (sun.misc.Unsafe) unsafeField.get(null);
-
-            Field attributesMapField = AttributeDefaults.class.getDeclaredField("b");
-            attributesMapField.setAccessible(true);
-
-            Object base = unsafe.staticFieldBase(attributesMapField);
-            long offset = unsafe.staticFieldOffset(attributesMapField);
-
-            Map<EntityTypes<? extends EntityLiving>, AttributeProvider> attributesMap =
-                    (Map<EntityTypes<? extends EntityLiving>, AttributeProvider>) attributesMapField
-                            .get(null);
-            attributesMap = new HashMap<>(attributesMap);
-            attributesMap.put(HUMAN_TYPE,
-                    EntityMonster.fE().a(GenericAttributes.a, 20.0).a(GenericAttributes.f, 1)
-                            .a(GenericAttributes.d, 0.23).a(GenericAttributes.h).a());
-            unsafe.putObject(base, offset, attributesMap);
-
-            AttributeDefaults.a();
-        } catch(Exception ex) {
-            ex.printStackTrace();
-            KajetansPlugin.warn(ex.getMessage());
-        }
-
         net.minecraft.world.item.ItemStack.maxStackSizeHook = (stack, vanilla) -> {
             return CustomItems.getMaxStackSize(stack.getBukkitStack(), vanilla);
         };
@@ -132,530 +30,6 @@ public class NMS {
         };
     }
 
-    private static CraftServer getCraftServer() {
-        return (CraftServer) Bukkit.getServer();
-    }
-
-    public static interface Human extends Creature {
-        public void setSkin(String texture, String signature);
-
-        public void setName(String name);
-
-        public void setSkin(PlayerProfile profile);
-
-        public void canMove(boolean b);
-
-        public void setAI(int type);
-
-        public int moveTo(double x, double y, double z);
-
-        public int getAI();
-
-        public String getName();
-    }
-
-    private static String cutName(String name) {
-        if(name.length() > 16) {
-            return name.substring(0, 16);
-        }
-        return name;
-    }
-
-    private static class RawHuman extends CraftCreature implements Human {
-        private static class WrapperHuman extends EntityCreature {
-            private static class Goal {
-                private static int ids = 0;
-                private int id = ids++;
-                private double x;
-                private double y;
-                private double z;
-                private int ticks = 20 * 30;
-
-                public Goal(double x, double y, double z) {
-                    this.x = x;
-                    this.y = y;
-                    this.z = z;
-                }
-            };
-
-            private EntityPlayer player = null;
-            private boolean canMove = false;
-            private int ai = 0;
-            private LinkedList<Goal> goals = new LinkedList<>();
-            private EntityLiving lastAttacker = null;
-            private int attackTimer = 0;
-
-            public WrapperHuman(EntityTypes<? extends WrapperHuman> type,
-                    net.minecraft.world.level.World world) {
-                super(type, world);
-                setPlayer("Default", world);
-            }
-
-            private void setPlayer(String name, net.minecraft.world.level.World world) {
-                EntityPlayer newPlayer =
-                        new EntityPlayer(getCraftServer().getServer(), (WorldServer) world,
-                                new GameProfile(cm(), cutName(name)));
-                if(player != null) {
-                    PropertyMap newProps = newPlayer.fq().getProperties();
-                    for(var entry : player.fq().getProperties().entries()) {
-                        newProps.put(entry.getKey(), entry.getValue());
-                    }
-                }
-                newPlayer.e(ae());
-                player = newPlayer;
-            }
-
-            private void tickGoals() {
-                if(goals.isEmpty()) {
-                    return;
-                }
-                Goal g = goals.getFirst();
-                double diffX = dc() - g.x;
-                double diffY = de() - g.y;
-                double diffZ = di() - g.z;
-                double distance = diffX * diffX + diffY * diffY + diffZ * diffZ;
-                if(distance < 1.0f) {
-                    goals.removeFirst();
-                    Human h = getWrappedEntity();
-                    ScriptEvents.onHumanGoalReach(h, new Location(h.getWorld(), g.x, g.y, g.z),
-                            g.id);
-                    return;
-                }
-                g.ticks--;
-                if(g.ticks <= 0) {
-                    goals.removeFirst();
-                    Human h = getWrappedEntity();
-                    ScriptEvents.onHumanGoalTimeout(h, new Location(h.getWorld(), g.x, g.y, g.z),
-                            g.id);
-                    return;
-                }
-                stopGoals();
-                D().a(g.x, g.y, g.z, 1.0);
-            }
-
-            @Override
-            public void k() { // tick
-                tickGoals();
-                super.k();
-                o(ce()); // setYRot(getYHeadRot());
-
-                if(attackTimer > 0) {
-                    attackTimer--;
-                    if(attackTimer == 0) {
-                        lastAttacker = null;
-                    }
-                }
-            }
-
-            @Override
-            public boolean a(DamageSource ds, float amount) { // hurt
-                if(ds.l() instanceof EntityLiving) {
-                    lastAttacker = (EntityLiving) ds.l();
-                    attackTimer = 20 * 60;
-                } else if(ds.k() instanceof EntityLiving) {
-                    lastAttacker = (EntityLiving) ds.k();
-                    attackTimer = 20 * 60;
-                }
-                if(ScriptEvents.onHumanHurt(ds, getWrappedEntity(), amount, ai == 0)) {
-                    return false;
-                }
-                return super.a(ds, amount);
-            }
-
-            public RawHuman getWrappedEntity() {
-                return new RawHuman(this);
-            }
-
-            @Override
-            public CraftEntity getBukkitEntity() {
-                return getWrappedEntity();
-            }
-
-            public EntityPlayer update(PacketPlayOutSpawnEntityLiving p) {
-                setTabName();
-                player.e(p.b()); // set id, get id
-                player.a(p.e(), p.f(), p.g(), 0.0f, 0.0f);
-                return player;
-            }
-
-            private void activateSkinOverlays() {
-                player.ai().b(EntityHuman.bP, (byte) 0xFF);
-            }
-
-            @SuppressWarnings({"unchecked", "rawtypes"})
-            private void copyMeta() {
-                var playerData = player.ai();
-                for(var item : ai().c()) {
-                    DataWatcherObject o = item.a();
-                    Object po = playerData.a(o);
-                    if(po.getClass() == item.b().getClass()) {
-                        playerData.b(o, item.b());
-                    }
-                }
-            }
-
-            public PacketPlayOutEntityMetadata update(PacketPlayOutEntityMetadata p) {
-                copyMeta();
-                activateSkinOverlays();
-                return new PacketPlayOutEntityMetadata(p.c(), player.ai(), true);
-            }
-
-            @Override
-            public void b(NBTTagCompound nbt) { // addAdditionalSaveData
-                super.b(nbt);
-
-                GameProfile gp = player.fq();
-                nbt.a("HumanName", gp.getName());
-
-                Collection<Property> c = gp.getProperties().get("textures");
-                for(Property p : c) {
-                    if(p.getName().equals("textures")) {
-                        nbt.a("HumanTexture", p.getValue());
-                        nbt.a("HumanSignature", p.getSignature());
-                        break;
-                    }
-                }
-
-                nbt.a("HumanCanMove", canMove);
-                nbt.a("HumanAI", ai);
-            }
-
-            @Override
-            public void a(NBTTagCompound nbt) { // readAdditionalSaveData
-                super.a(nbt);
-                if(nbt.b("HumanName", 8)) {
-                    String name = cutName(nbt.l("HumanName"));
-                    setPlayer(name, player.s);
-                }
-                if(nbt.b("HumanTexture", 8) && nbt.b("HumanSignature", 8)) {
-                    String texture = nbt.l("HumanTexture");
-                    String signature = nbt.l("HumanSignature");
-                    setSkinWithoutPacket(texture, signature);
-                }
-                if(nbt.b("HumanCanMove", 1)) {
-                    canMove = nbt.q("HumanCanMove");
-                }
-                if(nbt.b("HumanAI", 3)) {
-                    ai = nbt.h("HumanAI");
-                    setAI(ai);
-                }
-            }
-
-            private void updatePosition() {
-                Location l = getBukkitEntity().getLocation();
-                player.a(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch());
-            }
-
-            public void setSkinWithoutPacket(String texture, String signature) {
-                GameProfile gp = player.fq();
-                gp.getProperties().clear();
-                gp.getProperties().put("textures", new Property("textures", texture, signature));
-            }
-
-            private void setTabName() {
-                player.listName =
-                        new ChatComponentText(humanPrefix + player.fq().getName() + humanSuffix);
-            }
-
-            private void sync() {
-                updatePosition();
-                setTabName();
-                PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo(
-                        PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, player);
-                PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(player);
-                copyMeta();
-                activateSkinOverlays();
-                PacketPlayOutEntityMetadata meta =
-                        new PacketPlayOutEntityMetadata(player.ae(), player.ai(), true);
-
-                ArrayList<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list =
-                        new ArrayList<>();
-                for(EnumItemSlot slot : EnumItemSlot.values()) {
-                    list.add(new Pair<>(slot, this.b(slot)));
-                }
-                PacketPlayOutEntityEquipment equip =
-                        new PacketPlayOutEntityEquipment(player.ae(), list);
-
-                var channel = ((WorldServer) s).k();
-                channel.a(this, info);
-                channel.a(this, spawn);
-                channel.a(this, meta);
-                channel.a(this, equip);
-            }
-
-            public void setSkin(String texture, String signature) {
-                setSkinWithoutPacket(texture, signature);
-                sync();
-            }
-
-            public void setName(String name) {
-                setPlayer(name, player.s);
-                sync();
-            }
-
-            public void setSkin(PlayerProfile profile) {
-                GameProfile gp = player.fq();
-                gp.getProperties().clear();
-                for(ProfileProperty prop : profile.getProperties()) {
-                    gp.getProperties().put(prop.getName(),
-                            new Property(prop.getName(), prop.getValue(), prop.getSignature()));
-                }
-                sync();
-            }
-
-            @Override
-            protected void u() { // registerGoals
-                setAI(ai);
-            }
-
-            private void stopGoals(PathfinderGoalSelector p) {
-                var iter = p.c().iterator();
-                while(iter.hasNext()) {
-                    var next = iter.next();
-                    if(next.h()) { // isRunning
-                        next.d(); // stop
-                    }
-                }
-            }
-
-            private void stopGoals() {
-                stopGoals(bQ);
-                stopGoals(bR);
-            }
-
-            private void removeGoals(PathfinderGoalSelector p) {
-                var iter = p.c().iterator();
-                while(iter.hasNext()) {
-                    var next = iter.next();
-                    if(next.h()) { // isRunning
-                        next.d(); // stop
-                    }
-                    iter.remove();
-                }
-            }
-
-            public boolean angryAt(EntityLiving liv) {
-                return lastAttacker == liv;
-            }
-
-            public void setAI(int type) {
-                ai = type;
-                removeGoals(bQ);
-                removeGoals(bR);
-                switch(type) {
-                    case 1:
-                        bQ.a(4, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0f));
-                        bQ.a(3, new PathfinderGoalRandomLookaround(this));
-                        bQ.a(0, new PathfinderGoalMeleeAttack(this, 1.0, false));
-                        bQ.a(2, new PathfinderGoalRandomStrollLand(this, 1.0));
-                        bR.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class,
-                                true));
-                        break;
-                    case 2:
-                        bQ.a(1, new PathfinderGoalMeleeAttack(this, 1.2, true));
-                        bQ.a(2, new PathfinderGoalMoveTowardsTarget(this, 1.2, 32.0f));
-                        bQ.a(4, new PathfinderGoalRandomStrollLand(this, 1.0));
-                        bQ.a(5, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0f));
-                        bQ.a(6, new PathfinderGoalRandomLookaround(this));
-                        bR.a(2, new PathfinderGoalHurtByTarget(this, new Class[0]));
-                        bR.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class,
-                                10, true, false, this::angryAt));
-                        bR.a(3, new PathfinderGoalNearestAttackableTarget<>(this,
-                                EntityInsentient.class, 5, false, false, (liv) -> {
-                                    return liv instanceof IMonster
-                                            && !(liv instanceof EntityCreeper);
-                                }));
-                        break;
-                    default:
-                        bQ.a(0, new PathfinderGoalFloat(this));
-                        bQ.a(1, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0f));
-                        bQ.a(2, new PathfinderGoalRandomLookaround(this));
-                }
-            }
-
-            @Override
-            public void g(Vec3D velocity) { // setDeltaMovement
-                if(canMove) {
-                    super.g(velocity);
-                    return;
-                }
-                super.g(new Vec3D(0.0, velocity.c, 0.0));
-            }
-
-            @Override
-            public void n(double x, double y, double z) { // setDeltaMovement
-                if(canMove) {
-                    super.n(x, y, z);
-                    return;
-                }
-                super.n(0.0, y, 0.0);
-            }
-
-            public void canMove(boolean b) {
-                canMove = b;
-            }
-
-            public int moveTo(double x, double y, double z) {
-                Goal g = new Goal(x, y, z);
-                goals.add(g);
-                return g.id;
-            }
-        }
-
-        public final WrapperHuman human;
-
-        private RawHuman(WrapperHuman human) {
-            super(getCraftServer(), human);
-            this.human = human;
-            setRemoveWhenFarAway(false);
-        }
-
-        private RawHuman(WrapperHuman human, Location l, String name) {
-            this(human);
-            human.a(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch());
-            human.setPlayer(name, human.s);
-            human.W().b(human);
-        }
-
-        public RawHuman(Location l, String name) {
-            this(HUMAN_TYPE.a(map(l.getWorld())), l, name);
-        }
-
-        @Override
-        public void setSkin(String texture, String signature) {
-            human.setSkin(texture, signature);
-        }
-
-        @Override
-        public void setName(String name) {
-            human.setName(name);
-        }
-
-        @Override
-        public void setSkin(PlayerProfile profile) {
-            human.setSkin(profile);
-        }
-
-        @Override
-        public void canMove(boolean b) {
-            human.canMove(b);
-        }
-
-        @Override
-        public void setAI(int type) {
-            human.setAI(type);
-        }
-
-        @Override
-        public int moveTo(double x, double y, double z) {
-            return human.moveTo(x, y, z);
-        }
-
-        @Override
-        public int getAI() {
-            return human.ai;
-        }
-
-        @Override
-        public String getName() {
-            return human.player.fq().getName();
-        }
-    }
-
-    public static Human createHuman(String name, Location l) {
-        return new RawHuman(l, name);
-    }
-
-    private static class PluginConnection extends PlayerConnection {
-        public PluginConnection(PlayerConnection c) {
-            super(getCraftServer().getServer(), c.a, c.b);
-        }
-
-        @SuppressWarnings("deprecation")
-        private RawHuman.WrapperHuman getById(int id) {
-            net.minecraft.world.entity.Entity ent = b.x().b(id);
-            if(ent instanceof RawHuman.WrapperHuman) {
-                return (RawHuman.WrapperHuman) ent;
-            }
-            return null;
-        }
-
-        private boolean handle(PacketPlayOutSpawnEntityLiving p) {
-            if(p.d() != IRegistry.W.a(HUMAN_TYPE)) {
-                return false;
-            }
-            UUID uuid = p.c();
-            Entity ent = Bukkit.getEntity(uuid);
-            if(!(ent instanceof RawHuman)) {
-                return false;
-            }
-            RawHuman raw = (RawHuman) ent;
-            EntityPlayer player = raw.human.update(p);
-            PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo(
-                    PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, player);
-            PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(player);
-            super.a(info);
-            super.a(spawn);
-            return true;
-        }
-
-        private boolean handle(PacketPlayOutEntityMetadata p) {
-            RawHuman.WrapperHuman h = getById(p.c());
-            if(h == null) {
-                return false;
-            }
-            super.a(h.update(p));
-            return true;
-        }
-
-        private void handle(PacketPlayOutEntityDestroy p) {
-            for(int id : p.b()) {
-                RawHuman.WrapperHuman human = getById(id);
-                if(human != null) {
-                    PacketPlayOutPlayerInfo remove = new PacketPlayOutPlayerInfo(
-                            PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, human.player);
-                    super.a(remove);
-                }
-            }
-        }
-
-        @Override
-        public void a(Packet<?> p) {
-            if(p instanceof PacketPlayOutSpawnEntityLiving
-                    && handle((PacketPlayOutSpawnEntityLiving) p)) {
-                return;
-            } else if(p instanceof PacketPlayOutEntityMetadata
-                    && handle((PacketPlayOutEntityMetadata) p)) {
-                return;
-            } else if(p instanceof PacketPlayOutEntityDestroy) {
-                handle((PacketPlayOutEntityDestroy) p);
-            }
-            super.a(p);
-        }
-    }
-
-    public static void patch(Player p) {
-        map(p).b = new PluginConnection(map(p).b);
-    }
-
-    public static DamageSource getCurrentDamageSource() {
-        return CraftEventFactory.currentDamageCause;
-    }
-
-    public static Entity getImmediateSource(DamageSource ds) {
-        if(ds.k() == null) {
-            return null;
-        }
-        return map(ds.k());
-    }
-
-    public static Entity getTrueSource(DamageSource ds) {
-        if(ds.l() == null) {
-            return null;
-        }
-        return map(ds.l());
-    }
-
     public static EntityPlayer map(Player p) {
         return ((CraftPlayer) p).getHandle();
     }
@@ -676,117 +50,14 @@ public class NMS {
         return ((CraftLivingEntity) e).getHandle();
     }
 
-    public static EntityArrow map(Arrow e) {
-        return ((CraftArrow) e).getHandle();
-    }
-
-    public static EntityFireworks map(Firework e) {
-        return ((CraftFirework) e).getHandle();
-    }
-
-    public static EntityFireballFireball map(LargeFireball e) {
-        return ((CraftLargeFireball) e).getHandle();
-    }
-
-    public static EntityWitherSkull map(WitherSkull e) {
-        return ((CraftWitherSkull) e).getHandle();
-    }
-
-    public static EntityItem map(Item e) {
-        return (EntityItem) ((CraftItem) e).getHandle();
-    }
-
     public static WorldServer map(World e) {
         return ((CraftWorld) e).getHandle();
     }
 
-    public static GameProfile map(PlayerProfile profile) {
-        return ((CraftPlayerProfile) profile).getGameProfile();
-    }
-
     public static IBlockData map(Block b) {
         return ((CraftBlock) b).getNMS();
     }
 
-    public static DamageSource toDamageSource(Object o) {
-        return (DamageSource) o;
-    }
-
-    public static DamageSource parseDamageSource(String name) {
-        if(DAMAGE_SOURCES.isEmpty()) {
-            for(Field f : DamageSource.class.getFields()) {
-                if(f.getType() == DamageSource.class) {
-                    try {
-                        DamageSource ds = (DamageSource) f.get(null);
-                        DAMAGE_SOURCES.put(ds.u(), ds);
-                    } catch(Exception ex) {
-                    }
-                }
-            }
-        }
-        return DAMAGE_SOURCES.get(name);
-    }
-
-    public static DamageSource sting(LivingEntity liv) {
-        return DamageSource.b(map(liv));
-    }
-
-    public static DamageSource mobAttack(LivingEntity liv) {
-        return DamageSource.c(map(liv));
-    }
-
-    public static DamageSource mobIndirect(Entity ent, LivingEntity liv) {
-        return DamageSource.a(map(ent), map(liv));
-    }
-
-    public static DamageSource playerAttack(Player p) {
-        return DamageSource.a(map(p));
-    }
-
-    public static DamageSource arrow(Arrow arrow, Entity ent) {
-        return DamageSource.a(map(arrow), map(ent));
-    }
-
-    public static DamageSource trident(Entity ent, Entity ent2) {
-        return DamageSource.a(map(ent), map(ent2));
-    }
-
-    public static DamageSource firework(Firework firework, Entity ent) {
-        return DamageSource.a(map(firework), map(ent));
-    }
-
-    public static DamageSource fireball(LargeFireball fireball, Entity ent) {
-        return DamageSource.a(map(fireball), map(ent));
-    }
-
-    public static DamageSource witherSkull(WitherSkull witherSkull, Entity ent) {
-        return DamageSource.a(map(witherSkull), map(ent));
-    }
-
-    public static DamageSource projectile(Entity ent, Entity ent2) {
-        return DamageSource.a(map(ent), map(ent2));
-    }
-
-    public static DamageSource indirectMagic(Entity ent, Entity ent2) {
-        return DamageSource.c(map(ent), map(ent2));
-    }
-
-    public static DamageSource thorns(Entity ent) {
-        return DamageSource.a(map(ent));
-    }
-
-    public static DamageSource explosion(LivingEntity liv) {
-        return DamageSource.d(map(liv));
-    }
-
-    public static DamageSource explosionBed() {
-        return DamageSource.a();
-    }
-
-    public static void setMessageOfTheDay(String msg) {
-        ((CraftServer) Bukkit.getServer()).getServer().e(msg);
-    }
-
     public static String toString(ItemStack stack) {
         NBTTagCompound c = new NBTTagCompound();
         map(stack).b(c);
@@ -839,7 +110,7 @@ public class NMS {
         TileEntity fromEntity = nmsFromWorld.c_(convert(from));
         TileEntity toEntity = nmsToWorld.c_(posTo);
         if(fromEntity != null && toEntity != null && fromEntity.getClass() == toEntity.getClass()) {
-            NBTTagCompound nbtTagCompound = fromEntity.m();
+            NBTTagCompound nbtTagCompound = fromEntity.o();
             toEntity.a(nbtTagCompound);
             Block b = to.getBlock();
             nmsToWorld.a(posTo, map(b), map(b), 3);

+ 2 - 1
src/me/hammerle/kp/PlayerData.java

@@ -6,6 +6,7 @@ import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
 import org.bukkit.metadata.FixedMetadataValue;
 import org.bukkit.metadata.MetadataValue;
+import org.bukkit.scoreboard.Criteria;
 import org.bukkit.scoreboard.DisplaySlot;
 import org.bukkit.scoreboard.Objective;
 import org.bukkit.scoreboard.RenderType;
@@ -26,7 +27,7 @@ public class PlayerData {
     private boolean iterating = false;
 
     private PlayerData(Player p) {
-        objective = scoreboard.registerNewObjective("kajetansplugin", "dummy",
+        objective = scoreboard.registerNewObjective("kajetansplugin", Criteria.create("DUMMY"),
                 Component.text("Default"), RenderType.INTEGER);
         objective.setDisplaySlot(DisplaySlot.SIDEBAR);
         p.setScoreboard(scoreboard);

+ 2 - 3
src/me/hammerle/kp/plots/PlotEvents.java

@@ -15,7 +15,6 @@ import org.bukkit.event.player.*;
 import org.bukkit.event.weather.LightningStrikeEvent;
 import org.bukkit.inventory.Inventory;
 import org.bukkit.projectiles.ProjectileSource;
-import me.hammerle.kp.NMS;
 
 public class PlotEvents {
     private static boolean canBypass(Player p) {
@@ -74,8 +73,8 @@ public class PlotEvents {
         if(!shouldBeProtected(e.getEntity())) {
             return;
         }
-        Entity indirect = NMS.getImmediateSource(NMS.getCurrentDamageSource());
-        Entity direct = NMS.getTrueSource(NMS.getCurrentDamageSource());
+        Entity indirect = e.getDamageSource().getCausingEntity();
+        Entity direct = e.getDamageSource().getDirectEntity();
 
         Player p;
         if(indirect instanceof Player) {

+ 7 - 5
src/me/hammerle/kp/snuviscript/CommandManager.java

@@ -168,18 +168,20 @@ public class CommandManager {
 
         Map<CommandNode<CommandListenerWrapper>, CommandNode<ICompletionProvider>> map =
                 Maps.newIdentityHashMap();
+        // net.minecraft.server.level.ServerPlayer -> net.minecraft.server.MinecraftServer server
         RootCommandNode<CommandListenerWrapper> vanilla =
-                p.c.vanillaCommandDispatcher.a().getRoot();
+                p.d.vanillaCommandDispatcher.a().getRoot();
         RootCommandNode<ICompletionProvider> rootNode = new RootCommandNode<>();
         map.put(vanilla, rootNode);
-        CommandListenerWrapper cs = p.cQ();
+        //net.minecraft.world.entity.Entity -> net.minecraft.commands.CommandSourceStack createCommandSourceStack()
+        CommandListenerWrapper cs = p.dd();
         commandSourceNodesToSuggestionNodes(true, vanilla, rootNode, cs, map);
-        //commandSourceNodesToSuggestionNodes(true, p.c.aB.c.a().getRoot(), rootNode, cs, map);
-        commandSourceNodesToSuggestionNodes(true, p.c.aA().a().getRoot(), rootNode, cs, map);
+        //aE -> net.minecraft.commands.Commands getCommands()
+        commandSourceNodesToSuggestionNodes(true, p.d.aE().a().getRoot(), rootNode, cs, map);
         for(CommandNode node : CUSTOM_NODES.values()) {
             commandSourceNodesToSuggestionNodes(node, rootNode, cs, map);
         }
-        p.b.a(new PacketPlayOutCommands(rootNode));
+        p.c.a(new PacketPlayOutCommands(rootNode));
     }
 
     private static boolean checkNoPerm(boolean first, CommandNode<CommandListenerWrapper> c,

+ 11 - 46
src/me/hammerle/kp/snuviscript/ScriptEvents.java

@@ -12,6 +12,7 @@ import org.bukkit.Location;
 import org.bukkit.block.Block;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
+import org.bukkit.damage.DamageSource;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Item;
 import org.bukkit.entity.LivingEntity;
@@ -27,17 +28,14 @@ import org.bukkit.event.world.WorldLoadEvent;
 import org.bukkit.inventory.EquipmentSlot;
 import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
-import org.spigotmc.event.entity.EntityDismountEvent;
-import org.spigotmc.event.entity.EntityMountEvent;
+import org.bukkit.event.entity.EntityDismountEvent;
+import org.bukkit.event.entity.EntityMountEvent;
 import io.papermc.paper.event.player.PlayerArmSwingEvent;
 import me.hammerle.kp.KajetansPlugin;
-import me.hammerle.kp.NMS;
-import me.hammerle.kp.NMS.Human;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.SnuviUtils;
 import me.hammerle.snuviscript.inputprovider.Variable;
 import net.kyori.adventure.text.Component;
-import net.minecraft.world.damagesource.DamageSource;
 
 public class ScriptEvents {
     private static class WrappedBool {
@@ -227,42 +225,6 @@ public class ScriptEvents {
         }
     }
 
-    public static boolean onHumanHurt(DamageSource ds, Human h, float amount, boolean cancel) {
-        WrappedBool wb = new WrappedBool(cancel);
-        KajetansPlugin.scriptManager.callEvent("human_damage", sc -> {
-            sc.setVar("human", h);
-            sc.setVar("damage_source", ds);
-            sc.setVar("damage", (double) amount);
-            setCancel(sc, wb.wrapped);
-        }, sc -> {
-            Variable v = sc.getVar("cancel");
-            if(v == null) {
-                return;
-            }
-            try {
-                wb.wrapped = v.getBoolean(sc);
-            } catch(Exception ex) {
-            }
-        });
-        return wb.wrapped;
-    }
-
-    public static void onHumanGoalReach(Human h, Location goal, int id) {
-        KajetansPlugin.scriptManager.callEvent("human_goal_reach", sc -> {
-            sc.setVar("human", h);
-            sc.setVar("goal", goal);
-            sc.setVar("id", (double) id);
-        }, ScriptEvents::nothing);
-    }
-
-    public static void onHumanGoalTimeout(Human h, Location goal, int id) {
-        KajetansPlugin.scriptManager.callEvent("human_goal_timeout", sc -> {
-            sc.setVar("human", h);
-            sc.setVar("goal", goal);
-            sc.setVar("id", (double) id);
-        }, ScriptEvents::nothing);
-    }
-
     public static void onPlayerPreRespawn(PlayerRespawnEvent e) {
         handleEvent("player_pre_respawn", sc -> setPlayer(sc, e.getPlayer()));
     }
@@ -288,12 +250,13 @@ public class ScriptEvents {
     }
 
     public static void onEntityDamage(EntityDamageEvent e) {
-        String cause = e.getCause().toString();
+        String cause = e.getCause().name();
         Block damagerBlock = getBlock(e);
         Entity damagerEntity = getEntity(e);
+        DamageSource damageSource = e.getDamageSource();
         handleEvent(e, "entity_damage", (sc) -> {
             setEntity(sc, e.getEntity());
-            sc.setVar("damage_source", NMS.getCurrentDamageSource());
+            sc.setVar("damage_source", damageSource);
             sc.setVar("cause", cause);
             sc.setVar("damager_block", damagerBlock);
             sc.setVar("damager_entity", damagerEntity);
@@ -303,7 +266,7 @@ public class ScriptEvents {
     }
 
     public static void onEntityRegainHealth(EntityRegainHealthEvent e) {
-        String cause = e.getRegainReason().toString();
+        String cause = e.getRegainReason().name();
         KajetansPlugin.scriptManager.callEvent("entity_heal", sc -> {
             setEntity(sc, e.getEntity());
             sc.setVar("heal", e.getAmount());
@@ -317,8 +280,10 @@ public class ScriptEvents {
 
     public static void onEntityDeath(EntityDeathEvent e) {
         KajetansPlugin.scriptManager.callEvent("living_death", sc -> {
-            setLiving(sc, e.getEntity());
-            sc.setVar("damage_source", NMS.getCurrentDamageSource());
+            LivingEntity living = e.getEntity();
+            setLiving(sc, living);
+            DamageSource damageSource = living.getLastDamageCause().getDamageSource();
+            sc.setVar("damage_source", damageSource);
             sc.setVar("drops", e.getDrops());
             sc.setVar("experience", (double) e.getDroppedExp());
             setCancel(sc, e.isCancelled());

+ 12 - 2
src/me/hammerle/kp/snuviscript/commands/BlockCommands.java

@@ -19,6 +19,8 @@ import org.bukkit.block.data.Waterlogged;
 import org.bukkit.block.data.type.Bed;
 import org.bukkit.block.data.type.Door;
 import org.bukkit.block.data.type.Leaves;
+import org.bukkit.block.sign.Side;
+import org.bukkit.block.sign.SignSide;
 import org.bukkit.entity.LivingEntity;
 import me.hammerle.kp.KajetansPlugin;
 import me.hammerle.kp.NMS;
@@ -73,13 +75,21 @@ public class BlockCommands {
         KajetansPlugin.scriptManager.registerConsumer("block.setsign", (sc, in) -> {
             Block b = (Block) in[0].get(sc);
             Sign sign = (Sign) b.getState();
-            sign.line(in[1].getInt(sc), (Component) in[2].get(sc));
+            SignSide side = (SignSide) sign.getSide(Side.valueOf(in[1].getString(sc)));
+            side.line(in[2].getInt(sc), (Component) in[3].get(sc));
             sign.update(true, false);
         });
         KajetansPlugin.scriptManager.registerFunction("block.getsign", (sc, in) -> {
             Block b = (Block) in[0].get(sc);
             Sign sign = (Sign) b.getState();
-            return sign.line(in[1].getInt(sc));
+            SignSide side = (SignSide) sign.getSide(Side.valueOf(in[1].getString(sc)));
+            return side.line(in[2].getInt(sc));
+        });
+        KajetansPlugin.scriptManager.registerConsumer("block.signsetwaxed", (sc, in) -> {
+            Block b = (Block) in[0].get(sc);
+            Sign sign = (Sign) b.getState();
+            sign.setWaxed(in[1].getBoolean(sc));
+            sign.update(true, false);
         });
         KajetansPlugin.scriptManager.registerFunction("block.getinventory", (sc, in) -> {
             BlockState state = ((Block) in[0].get(sc)).getState();

+ 22 - 22
src/me/hammerle/kp/snuviscript/commands/CitizenCommands.java

@@ -8,26 +8,26 @@ import net.citizensnpcs.api.npc.NPC;
 import net.citizensnpcs.trait.SkinTrait;
 
 public class CitizenCommands {
-	public static void registerFunctions() {
-		KajetansPlugin.scriptManager.registerFunction("citizen.spawn", (sc, in) -> {
-			Location l = (Location) in[0].get(sc);
-			NPC npc =
-					CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, in[1].getString(sc));
-			npc.spawn(l);
-			return npc;
-		});
-		KajetansPlugin.scriptManager.registerConsumer("citizen.setskin", (sc, in) -> {
-			NPC npc = (NPC) in[0].get(sc);
-			SkinTrait skin = npc.getOrAddTrait(SkinTrait.class);
-			skin.setSkinPersistent(npc.getName(), in[2].getString(sc), in[1].getString(sc));
-		});
-		KajetansPlugin.scriptManager.registerConsumer("citizen.setname", (sc, in) -> {
-			NPC npc = (NPC) in[0].get(sc);
-			npc.setName(in[1].getString(sc));
-		});
-		KajetansPlugin.scriptManager.registerFunction("citizen.getname", (sc, in) -> {
-			NPC npc = (NPC) in[0].get(sc);
-			return npc.getName();
-		});
-	}
+    public static void registerFunctions() {
+        KajetansPlugin.scriptManager.registerFunction("citizen.spawn", (sc, in) -> {
+            Location l = (Location) in[0].get(sc);
+            NPC npc =
+                    CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, in[1].getString(sc));
+            npc.spawn(l);
+            return npc;
+        });
+        KajetansPlugin.scriptManager.registerConsumer("citizen.setskin", (sc, in) -> {
+            NPC npc = (NPC) in[0].get(sc);
+            SkinTrait skin = npc.getOrAddTrait(SkinTrait.class);
+            skin.setSkinPersistent(npc.getName(), in[2].getString(sc), in[1].getString(sc));
+        });
+        KajetansPlugin.scriptManager.registerConsumer("citizen.setname", (sc, in) -> {
+            NPC npc = (NPC) in[0].get(sc);
+            npc.setName(in[1].getString(sc));
+        });
+        KajetansPlugin.scriptManager.registerFunction("citizen.getname", (sc, in) -> {
+            NPC npc = (NPC) in[0].get(sc);
+            return npc.getName();
+        });
+    }
 }

+ 13 - 5
src/me/hammerle/kp/snuviscript/commands/CommandCommands.java

@@ -6,16 +6,23 @@ import com.mojang.brigadier.arguments.*;
 import com.mojang.brigadier.builder.*;
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
+import net.minecraft.commands.CommandBuildContext;
 import net.minecraft.commands.CommandDispatcher;
 import net.minecraft.commands.CommandListenerWrapper;
 import net.minecraft.commands.arguments.*;
 import net.minecraft.commands.arguments.blocks.ArgumentTile;
 import net.minecraft.commands.arguments.item.ArgumentItemStack;
 import net.minecraft.commands.synchronization.CompletionProviders;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.data.registries.VanillaRegistries;
 
 public class CommandCommands {
+    private static CommandBuildContext commandbuildcontext = null;
+
     @SuppressWarnings({"unchecked", "rawtypes"})
     public static void registerFunctions() {
+        commandbuildcontext = CommandDispatcher.a(VanillaRegistries.a());
+
         KajetansPlugin.scriptManager.registerConsumer("command.addignored",
                 (sc, in) -> CommandManager.addIgnored(in[0].getString(sc)));
         KajetansPlugin.scriptManager.registerConsumer("command.clearignored",
@@ -110,18 +117,19 @@ public class CommandCommands {
             switch(name) {
                 case "Item":
                     arg = CommandDispatcher.a(in[1].getString(sc),
-                            (ArgumentType) ArgumentItemStack.a());
+                            (ArgumentType) ArgumentItemStack.a(commandbuildcontext));
                     break;
                 case "Block":
-                    arg = CommandDispatcher.a(in[1].getString(sc), (ArgumentType) ArgumentTile.a());
+                    arg = CommandDispatcher.a(in[1].getString(sc),
+                            (ArgumentType) ArgumentTile.a(commandbuildcontext));
                     break;
                 case "Potion":
                     arg = CommandDispatcher.a(in[1].getString(sc),
-                            (ArgumentType) ArgumentMobEffect.a());
+                            (ArgumentType) ResourceArgument.a(commandbuildcontext, Registries.d));
                     break;
                 case "Enchantment":
                     arg = CommandDispatcher.a(in[1].getString(sc),
-                            (ArgumentType) ArgumentEnchantment.a());
+                            (ArgumentType) ResourceArgument.a(commandbuildcontext, Registries.f));
                     break;
                 case "Player":
                     arg = CommandDispatcher.a(in[1].getString(sc),
@@ -129,7 +137,7 @@ public class CommandCommands {
                     break;
                 case "Particle":
                     arg = CommandDispatcher.a(in[1].getString(sc),
-                            (ArgumentType) ArgumentParticle.a());
+                            (ArgumentType) ArgumentParticle.a(commandbuildcontext)); // will als arg CommandBuildContext registryAccess
                     break;
                 case "Sound":
                     arg = CommandDispatcher.a(in[1].getString(sc),

+ 4 - 3
src/me/hammerle/kp/snuviscript/commands/Commands.java

@@ -4,9 +4,7 @@ import org.bukkit.Bukkit;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
-import org.bukkit.metadata.Metadatable;
 import me.hammerle.kp.KajetansPlugin;
-import me.hammerle.kp.NMS;
 import me.hammerle.snuviscript.config.SnuviConfig;
 import net.citizensnpcs.api.npc.NPC;
 import net.kyori.adventure.text.Component;
@@ -14,7 +12,10 @@ import net.kyori.adventure.text.Component;
 public class Commands {
     public static void registerFunctions() {
         KajetansPlugin.scriptManager.registerConsumer("setmotd", (sc, in) -> {
-            NMS.setMessageOfTheDay(in[0].getString(sc));
+            org.bukkit.Bukkit.motd(Component.text(in[0].getString(sc)));
+        });
+        KajetansPlugin.scriptManager.registerFunction("getmotd", (sc, in) -> {
+            return org.bukkit.Bukkit.motd();
         });
         KajetansPlugin.scriptManager.registerConsumer("msg", (sc, in) -> {
             CommandUtils.sendMessageToGroup(in[0].get(sc), sc, (Component) in[1].get(sc));

+ 45 - 66
src/me/hammerle/kp/snuviscript/commands/DamageCommands.java

@@ -1,74 +1,53 @@
 package me.hammerle.kp.snuviscript.commands;
 
-import org.bukkit.entity.Arrow;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Firework;
-import org.bukkit.entity.LargeFireball;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.WitherSkull;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import org.bukkit.damage.DamageSource;
+import org.bukkit.damage.DamageType;
 import me.hammerle.kp.KajetansPlugin;
-import me.hammerle.kp.NMS;
 
 public class DamageCommands {
+    private final static HashMap<String, DamageType> DAMAGE_TYPES = new HashMap<>();
+
     public static void registerFunctions() {
-        KajetansPlugin.scriptManager.registerFunction("damage.getimmediatesource",
-                (sc, in) -> NMS.getImmediateSource(NMS.toDamageSource(in[0].get(sc))));
-        KajetansPlugin.scriptManager.registerFunction("damage.gettruesource",
-                (sc, in) -> NMS.getTrueSource(NMS.toDamageSource(in[0].get(sc))));
-        KajetansPlugin.scriptManager.registerFunction("damage.iscreativeplayer",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).i());
-        KajetansPlugin.scriptManager.registerFunction("damage.isabsolute",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).j());
-        KajetansPlugin.scriptManager.registerFunction("damage.isdifficultyscaled",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).w());
-        KajetansPlugin.scriptManager.registerFunction("damage.isexplosion",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).d());
-        KajetansPlugin.scriptManager.registerFunction("damage.isfire",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).s());
-        KajetansPlugin.scriptManager.registerFunction("damage.ismagic",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).x());
-        KajetansPlugin.scriptManager.registerFunction("damage.isprojectile",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).b());
-        KajetansPlugin.scriptManager.registerFunction("damage.isunblockable",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).f());
-        KajetansPlugin.scriptManager.registerFunction("damage.isfall",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).z());
-        KajetansPlugin.scriptManager.registerFunction("damage.isdamaginghelmet",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).g());
-        KajetansPlugin.scriptManager.registerFunction("damage.issweep",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).isSweep());
-        KajetansPlugin.scriptManager.registerFunction("damage.gettype",
-                (sc, in) -> NMS.toDamageSource(in[0].get(sc)).u());
-        KajetansPlugin.scriptManager.registerFunction("damage.get",
-                (sc, in) -> NMS.parseDamageSource(in[0].getString(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.sting",
-                (sc, in) -> NMS.sting((LivingEntity) in[0].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.mobattack",
-                (sc, in) -> NMS.mobAttack((LivingEntity) in[0].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.mobindirect",
-                (sc, in) -> NMS.mobIndirect((Entity) in[0].get(sc), (LivingEntity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.playerattack",
-                (sc, in) -> NMS.playerAttack((Player) in[0].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.arrow",
-                (sc, in) -> NMS.arrow((Arrow) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.trident",
-                (sc, in) -> NMS.trident((Entity) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.firework",
-                (sc, in) -> NMS.firework((Firework) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.fireball",
-                (sc, in) -> NMS.fireball((LargeFireball) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.witherskull",
-                (sc, in) -> NMS.witherSkull((WitherSkull) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.projectile",
-                (sc, in) -> NMS.projectile((Entity) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.indirectmagic",
-                (sc, in) -> NMS.indirectMagic((Entity) in[0].get(sc), (Entity) in[1].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.thorns",
-                (sc, in) -> NMS.thorns((Entity) in[0].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.explosion",
-                (sc, in) -> NMS.explosion((LivingEntity) in[0].get(sc)));
-        KajetansPlugin.scriptManager.registerFunction("damage.explosionbed",
-                (sc, in) -> NMS.explosionBed());
+        KajetansPlugin.scriptManager.registerFunction("damage.get", (sc, in) -> {
+            DamageType dt = parseDamageType(in[0].getString(sc));
+            return DamageSource.builder(dt).build();
+        });
+        KajetansPlugin.scriptManager.registerFunction("damage.gettype", (sc, in) -> {
+            DamageSource d = (DamageSource) in[0].get(sc);
+            return d.getDamageType().getTranslationKey();
+        });
+        KajetansPlugin.scriptManager.registerFunction("damage.getimmediatesource", (sc, in) -> {
+            DamageSource d = (DamageSource) in[0].get(sc);
+            return d.getDirectEntity();
+        });
+        KajetansPlugin.scriptManager.registerFunction("damage.gettruesource", (sc, in) -> {
+            DamageSource d = (DamageSource) in[0].get(sc);
+            return d.getCausingEntity();
+        });
+        KajetansPlugin.scriptManager.registerFunction("damage.isindirect", (sc, in) -> {
+            DamageSource d = (DamageSource) in[0].get(sc);
+            return d.isIndirect();
+        });
+        KajetansPlugin.scriptManager.registerFunction("damage.isdifficultyscaled", (sc, in) -> {
+            DamageSource d = (DamageSource) in[0].get(sc);
+            return d.scalesWithDifficulty();
+        });
+    }
+
+    public static DamageType parseDamageType(String name) {
+        if(DAMAGE_TYPES.isEmpty()) {
+            for(Field f : DamageType.class.getFields()) {
+                if(f.getType() == DamageType.class) {
+                    try {
+                        DamageType dt = (DamageType) f.get(null);
+                        DAMAGE_TYPES.put(dt.getTranslationKey(), dt);
+                    } catch(Exception ex) {
+                    }
+                }
+            }
+        }
+        return DAMAGE_TYPES.get(name);
     }
 }

+ 2 - 1
src/me/hammerle/kp/snuviscript/commands/EntityCommands.java

@@ -147,8 +147,9 @@ public class EntityCommands {
         KajetansPlugin.scriptManager.registerConsumer("entity.setgrowingage", (sc, in) -> {
             ((Ageable) in[0].get(sc)).setAge(in[1].getInt(sc));
         });
+        // net.minecraft.world.entity.Entity -> net.minecraft.world.entity.EntityType getType()
         KajetansPlugin.scriptManager.registerFunction("entity.gettype",
-                (sc, in) -> NMS.map(((Entity) in[0].get(sc))).ad().id);
+                (sc, in) -> NMS.map(((Entity) in[0].get(sc))).ai().toString());
         KajetansPlugin.scriptManager.registerFunction("sheep.issheared",
                 (sc, in) -> ((Sheep) in[0].get(sc)).isSheared());
         KajetansPlugin.scriptManager.registerFunction("sheep.getcolor",

+ 0 - 59
src/me/hammerle/kp/snuviscript/commands/HumanCommands.java

@@ -1,59 +0,0 @@
-package me.hammerle.kp.snuviscript.commands;
-
-import com.destroystokyo.paper.profile.PlayerProfile;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import me.hammerle.kp.KajetansPlugin;
-import me.hammerle.kp.NMS;
-import me.hammerle.kp.NMS.Human;
-
-public class HumanCommands {
-    public static void registerFunctions() {
-        KajetansPlugin.scriptManager.registerFunction("human.spawn", (sc, in) -> {
-            Location l = (Location) in[0].get(sc);
-            return NMS.createHuman(in[1].getString(sc), l);
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setskin", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            h.setSkin(in[1].getString(sc), in[2].getString(sc));
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setskinuuid", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            PlayerProfile profile = Bukkit.createProfile(CommandUtils.getUUID(in[1].get(sc)));
-            KajetansPlugin.scheduleAsyncTask(() -> {
-                profile.complete();
-                KajetansPlugin.scheduleTask(() -> h.setSkin(profile));
-            });
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setname", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            h.setName(in[1].getString(sc));
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.canmove", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            h.canMove(in[1].getBoolean(sc));
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setai", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            h.setAI(in[1].getInt(sc));
-        });
-        KajetansPlugin.scriptManager.registerFunction("human.getai", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            return (double) h.getAI();
-        });
-        KajetansPlugin.scriptManager.registerFunction("human.moveto", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            return (double) h.moveTo(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc));
-        });
-        KajetansPlugin.scriptManager.registerFunction("human.getname", (sc, in) -> {
-            Human h = (Human) in[0].get(sc);
-            return h.getName();
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setprefix", (sc, in) -> {
-            NMS.humanPrefix = in[0].getString(sc);
-        });
-        KajetansPlugin.scriptManager.registerConsumer("human.setsuffix", (sc, in) -> {
-            NMS.humanSuffix = in[0].getString(sc);
-        });
-    }
-}

+ 1 - 1
src/me/hammerle/kp/snuviscript/commands/ItemCommands.java

@@ -76,7 +76,7 @@ public class ItemCommands {
         KajetansPlugin.scriptManager.registerFunction("item.gettype",
                 (sc, in) -> ((ItemStack) in[0].get(sc)).getType());
         KajetansPlugin.scriptManager.registerFunction("item.getmaxamount",
-                (sc, in) -> (double) NMS.map((ItemStack) in[0].get(sc)).e());
+                (sc, in) -> (double) NMS.map((ItemStack) in[0].get(sc)).g());
         KajetansPlugin.scriptManager.registerFunction("item.getamount",
                 (sc, in) -> (double) ((ItemStack) in[0].get(sc)).getAmount());
         KajetansPlugin.scriptManager.registerConsumer("item.setamount",

+ 9 - 4
src/me/hammerle/kp/snuviscript/commands/LivingCommands.java

@@ -1,8 +1,11 @@
 package me.hammerle.kp.snuviscript.commands;
 
 import org.bukkit.Location;
+import org.bukkit.NamespacedKey;
+import org.bukkit.Registry;
 import org.bukkit.attribute.Attribute;
 import org.bukkit.attribute.AttributeInstance;
+import org.bukkit.damage.DamageSource;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Projectile;
 import org.bukkit.event.entity.EntityRegainHealthEvent;
@@ -75,11 +78,12 @@ public class LivingCommands {
         KajetansPlugin.scriptManager.registerConsumer("living.damage", (sc, in) -> {
             LivingEntity liv = (LivingEntity) in[0].get(sc);
             float damage = in[1].getFloat(sc);
-            var damageSource = NMS.toDamageSource(in[2].get(sc));
+            DamageSource damageSource = (DamageSource) in[2].get(sc);
+
             StackTrace trace = sc.getStackTrace();
             KajetansPlugin.scheduleTask(() -> {
                 try {
-                    NMS.map(liv).a(damageSource, damage);
+                    liv.damage(damage, damageSource);
                 } catch(Exception ex) {
                     sc.getScriptManager().getLogger().print(null, ex, "living.damage", sc.getName(),
                             sc, trace);
@@ -128,8 +132,9 @@ public class LivingCommands {
             }
         });
         KajetansPlugin.scriptManager.registerFunction("living.geteffectamplifier", (sc, in) -> {
-            PotionEffect effect = ((LivingEntity) in[0].get(sc))
-                    .getPotionEffect(PotionEffectType.getByName(in[1].getString(sc)));
+            NamespacedKey key = NamespacedKey.minecraft(in[1].getString(sc));
+            PotionEffectType effectType = Registry.POTION_EFFECT_TYPE.get(key);
+            PotionEffect effect = ((LivingEntity) in[0].get(sc)).getPotionEffect(effectType);
             return (double) (effect == null ? -1 : effect.getAmplifier());
         });
     }

+ 2 - 7
src/me/hammerle/kp/snuviscript/commands/PlayerCommands.java

@@ -211,12 +211,12 @@ public class PlayerCommands {
         });
         KajetansPlugin.scriptManager.registerFunction("player.getspawn", (sc, in) -> {
             Player p = (Player) in[0].get(sc);
-            return p.getBedSpawnLocation();
+            return p.getRespawnLocation();
         });
         KajetansPlugin.scriptManager.registerConsumer("player.setspawn", (sc, in) -> {
             Player p = (Player) in[0].get(sc);
             Location l = (Location) in[1].get(sc);
-            p.setBedSpawnLocation(l, true);
+            p.setRespawnLocation(l, true);
         });
         KajetansPlugin.scriptManager.registerConsumer("player.damageitem", (sc, in) -> {
             Player p = (Player) in[0].get(sc);
@@ -224,11 +224,6 @@ public class PlayerCommands {
             NMS.map(stack).a(in[1].getInt(sc), NMS.map(p), c -> {
             });
         });
-        KajetansPlugin.scriptManager.registerConsumer("player.damagearmor", (sc, in) -> {
-            Player p = (Player) in[0].get(sc);
-            NMS.map(p).fr().a(NMS.toDamageSource(in[2].get(sc)), in[1].getFloat(sc),
-                    new int[] {0, 1, 2, 3});
-        });
         KajetansPlugin.scriptManager.registerConsumer("player.addtotalexp", (sc, in) -> {
             ((Player) in[0].get(sc)).giveExp(in[1].getInt(sc));
         });

+ 1 - 1
src/me/hammerle/kp/snuviscript/commands/TitleCommands.java

@@ -20,7 +20,7 @@ public class TitleCommands {
             int fadeIn = in.length > 3 ? in[3].getInt(sc) : 20;
             int stay = in.length > 4 ? in[4].getInt(sc) : 60;
             int fadeOut = in.length > 5 ? in[5].getInt(sc) : 20;
-            p.sendTitlePart(TitlePart.TIMES, Title.Times.of(Duration.ofMillis(fadeIn * 50),
+            p.sendTitlePart(TitlePart.TIMES, Title.Times.times(Duration.ofMillis(fadeIn * 50),
                     Duration.ofMillis(stay * 50), Duration.ofMillis(fadeOut * 50)));
         });
     }