Guest User

Untitled

a guest
Mar 25th, 2022
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.17 KB | None | 0 0
  1. package tech.cookiepower.blueberrytools.util
  2.  
  3. import org.bukkit.World
  4. import org.bukkit.entity.Entity
  5. import org.bukkit.event.entity.CreatureSpawnEvent
  6. import taboolib.module.nms.nmsClass
  7. import taboolib.module.nms.obcClass
  8. import tech.cookitpower.blueberrytools.unit.PrimitiveType
  9. import java.lang.reflect.Method
  10. import java.util.*
  11. import java.util.function.Function
  12.  
  13. class DeSerializeEntity(compound:String, private val world: World) {
  14.     private var changeUUID : Boolean = false
  15.     private var entity : Any? = null
  16.     private var worldServer : Any? = null
  17.     companion object{
  18.         private val nbtClass = nmsClass("NBTTagCompound")
  19.         private val nbtCloneMethod = nbtClass.getMethod("clone")
  20.         private val entityClass = nmsClass("Entity")
  21.         private val parseMethod = nmsClass("MojangsonParser").getMethod("parse",Class.forName("java.lang.String"))
  22.         private val getHandleWorldMethod = obcClass("CraftWorld").getMethod("getHandle")
  23.         private val entityA = nmsClass("EntityTypes").getMethod("a",
  24.             nbtClass, Class.forName("net.minecraft.world.level.World"), Class.forName("java.util.function.Function")
  25.         )
  26.         private val prepare = nmsClass("EntityInsentient").getMethod(
  27.             "prepare",
  28.             nmsClass("WorldAccess"),
  29.             nmsClass("DifficultyDamageScaler"),
  30.             nmsClass("EnumMobSpawn"),
  31.             nmsClass("GroupDataEntity"),
  32.             nmsClass("NBTTagCompound")
  33.         )
  34.         val addEntity: Method = obcClass("CraftWorld").getMethod("addEntity",nmsClass("Entity"), CreatureSpawnEvent.SpawnReason::class.java)
  35.     }
  36.    
  37.     init {
  38.         val nbtTagCompound = parseMethod.invoke(null,compound)
  39.             nbtClass.getMethod("setFloat", Class.forName("java.lang.String"),PrimitiveType.FLOAT)
  40.             .invoke(nbtTagCompound,"Health",1.0F)
  41.  
  42.  
  43.         val clone = nbtCloneMethod.invoke(nbtTagCompound)
  44.         this.worldServer = getHandleWorldMethod.invoke(world)
  45.         this.entity = entityA.invoke(null,clone,worldServer,
  46.             EntityFunction<Entity, Entity>(changeUUID)
  47.         )
  48.     }
  49.  
  50.     fun changeUUID(changeUUID: Boolean){
  51.         this.changeUUID = changeUUID
  52.     }
  53.  
  54.     fun build():Entity?{
  55.         if (entity != null){
  56.             prepare.invoke(
  57.                 entity,
  58.                 worldServer,
  59.                 nmsClass("WorldServer").getMethod("getDamageScaler", nmsClass("BlockPosition"))
  60.                     .invoke(worldServer,
  61.                         entityClass.getMethod("getChunkCoordinates").invoke(entity)
  62.                     ),
  63.                 nmsClass("EnumMobSpawn").enumConstants[13],
  64.                 null,
  65.                 null
  66.             )
  67.             addEntity.invoke(world, entity, CreatureSpawnEvent.SpawnReason.CUSTOM)
  68.             return entityClass.getMethod("getBukkitEntity").invoke(entity) as Entity
  69.         }
  70.         return null
  71.     }
  72.     class EntityFunction<TE,RE>(private val changeUUID: Boolean) : Function<TE, RE> {
  73.         override fun apply(t: TE): RE {
  74.             if (changeUUID)
  75.                 entityClass.getMethod("a_",UUID::class.java).invoke(t,UUID.randomUUID())
  76.             return t as RE
  77.         }
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment