Make mob entity uuids the same as their NPC uuid

This commit is contained in:
fullwall 2020-10-18 18:32:33 +08:00
parent 8cdda471b9
commit a944c3ca9c
9 changed files with 87 additions and 9 deletions

View File

@ -312,7 +312,7 @@ public class NPCCommands {
@Command(
aliases = { "npc" },
usage = "command|cmd (add [command] | remove [id] | permissions [permissions] | sequential | random) (-l[eft]/-r[ight]) (-p[layer] -o[p]), --cooldown [seconds] --delay [ticks] --permissions [perms] --n [max # of uses]",
usage = "command|cmd (add [command] | remove [id] | permissions [permissions] | sequential | random | cost) (-l[eft]/-r[ight]) (-p[layer] -o[p]), --cooldown [seconds] --delay [ticks] --permissions [perms] --n [max # of uses]",
desc = "Controls commands which will be run when clicking on an NPC",
help = Messages.NPC_COMMAND_HELP,
modifiers = { "command", "cmd" },

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_10_R1.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -12,6 +13,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_10_R1.World;
public abstract class MobEntityController extends AbstractEntityController {
@ -31,9 +33,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -58,4 +65,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_10_R1.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_11_R1.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -12,6 +13,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_11_R1.World;
public abstract class MobEntityController extends AbstractEntityController {
@ -31,9 +33,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -58,4 +65,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_11_R1.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_12_R1.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -12,6 +13,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_12_R1.World;
public abstract class MobEntityController extends AbstractEntityController {
@ -31,9 +33,15 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -58,4 +66,6 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_12_R1.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_13_R2.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -12,6 +13,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_13_R2.World;
public abstract class MobEntityController extends AbstractEntityController {
@ -31,9 +33,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -58,4 +65,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_13_R2.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_14_R1.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -13,6 +14,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.nms.v1_14_R1.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_14_R1.EntityTypes;
import net.minecraft.server.v1_14_R1.World;
@ -36,9 +38,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -63,4 +70,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_14_R1.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_15_R1.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -13,6 +14,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.nms.v1_15_R1.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_15_R1.EntityTypes;
import net.minecraft.server.v1_15_R1.World;
@ -36,9 +38,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -63,4 +70,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_15_R1.Entity.class,
"uniqueID");
}

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.nms.v1_16_R2.entity;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.util.Map;
@ -13,6 +14,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.nms.v1_16_R2.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_16_R2.EntityTypes;
import net.minecraft.server.v1_16_R2.World;
@ -36,9 +38,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.setOnGround(true);
}
try {
UUID_FIELD.invoke(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -63,4 +70,7 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final MethodHandle UUID_FIELD = NMS.getSetter(net.minecraft.server.v1_16_R2.Entity.class,
"uniqueID");
}

View File

@ -1,6 +1,7 @@
package net.citizensnpcs.nms.v1_8_R3.entity;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Map;
import org.bukkit.Location;
@ -12,6 +13,7 @@ import com.google.common.collect.Maps;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_8_R3.World;
public abstract class MobEntityController extends AbstractEntityController {
@ -31,9 +33,14 @@ public abstract class MobEntityController extends AbstractEntityController {
// entity.onGround isn't updated right away - we approximate here so
// that things like pathfinding still work *immediately* after spawn.
org.bukkit.Material beneath = at.getBlock().getRelative(BlockFace.DOWN).getType();
if (beneath.isBlock()) {
if (beneath.isSolid()) {
entity.onGround = true;
}
try {
UUID_FIELD.set(entity, npc.getUniqueId());
} catch (Throwable e) {
e.printStackTrace();
}
return entity.getBukkitEntity();
}
@ -58,4 +65,5 @@ public abstract class MobEntityController extends AbstractEntityController {
}
private static final Map<Class<?>, Constructor<?>> CONSTRUCTOR_CACHE = Maps.newHashMap();
private static final Field UUID_FIELD = NMS.getField(net.minecraft.server.v1_8_R3.Entity.class, "uniqueID");
}