Skip to content

Commit

Permalink
NMS Item
Browse files Browse the repository at this point in the history
  • Loading branch information
TheRedMagic committed Jun 17, 2024
1 parent 0b2e477 commit c7996be
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.redmagic.undefinedapi.nms.interfaces

import org.bukkit.inventory.ItemStack

interface NMSItemEntity: NMSEntity {

var itemStack: ItemStack

fun update()

}
2 changes: 1 addition & 1 deletion common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ repositories {


dependencies {
compileOnly("org.spigotmc:spigot-api:1.20.6-R0.1-SNAPSHOT")
compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT")

implementation(project(":api"))
implementation(project(":v1_20_4"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.redmagic.undefinedapi.menu.MenuManager
import com.redmagic.undefinedapi.nms.NMSManager
import net.kyori.adventure.platform.bukkit.BukkitAudiences
import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.entity.Player
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.plugin.java.JavaPlugin
import org.yaml.snakeyaml.Yaml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.redmagic.undefinedapi.nms.interfaces.NMSPlayer
import org.bukkit.entity.EntityType
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack


@Deprecated("Use createFakeEntity instead")
Expand All @@ -33,6 +34,7 @@ fun UndefinedAPI.createFakeEntity(entityType: EntityType, vararg data: Any): NMS
val isLivingEntity = LivingEntity::class.java.isAssignableFrom(entityType.entityClass!!)
val isPlayer = entityType == EntityType.PLAYER
val isSlime = entityType == EntityType.SLIME
val isItem = entityType == EntityType.DROPPED_ITEM

return when(getNMSVersion()) {
"1.20.4" -> when {
Expand All @@ -45,6 +47,7 @@ fun UndefinedAPI.createFakeEntity(entityType: EntityType, vararg data: Any): NMS
3 -> com.redmagic.undefinedapi.nms.v1_20_4.npc.NMSPlayer(data[0] as String, data[1] as String, data[2] as String)
else -> null
}
isItem -> com.redmagic.undefinedapi.nms.v1_20_4.entity.entityClasses.NMSItemEntity(data[0] as ItemStack)
else -> com.redmagic.undefinedapi.nms.v1_20_4.entity.NMSEntity(entityType)
}

Expand All @@ -58,6 +61,7 @@ fun UndefinedAPI.createFakeEntity(entityType: EntityType, vararg data: Any): NMS
3 -> com.redmagic.undefinedapi.nms.v1_20_5.npc.NMSPlayer(data[0] as String, data[1] as String, data[2] as String)
else -> null
}
isItem -> com.redmagic.undefinedapi.nms.v1_20_5.entity.entityClass.NMSItemEntity(data[0] as ItemStack)
else -> com.redmagic.undefinedapi.nms.v1_20_5.entity.NMSEntity(entityType)
}

Expand Down
11 changes: 6 additions & 5 deletions server/src/main/java/com/redmagic/undefinedapi/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,14 @@ class Main: JavaPlugin() {
override fun onEnable() {
api = UndefinedAPI(this)

event<EntityIgniteEvent> {
event<PlayerJoinEvent> {

println("${entity.type} Ignite")
}
val item = api.createFakeEntity(EntityType.DROPPED_ITEM, ItemStack(Material.DIAMOND))!!

item.addViewer(player)

item.spawn(player.location)

event<EntityExtinguishEvent> {
println("${entity.type} Extinguish")
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,17 @@
package com.redmagic.undefinedapi.nms.v1_20_4.entity

import com.redmagic.undefinedapi.nms.EntityInteract
import com.redmagic.undefinedapi.nms.extensions.getPrivateField
import com.redmagic.undefinedapi.nms.interfaces.NMSEntity
import com.redmagic.undefinedapi.nms.v1_20_4.NMSManager
import com.redmagic.undefinedapi.nms.v1_20_4.SpigotNMSMappings
import com.redmagic.undefinedapi.nms.v1_20_4.entity.entityClasses.UndefinedEntity
import com.redmagic.undefinedapi.nms.v1_20_4.extensions.sendPacket
import net.minecraft.ChatFormatting
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.EntityDataSerializers
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import net.minecraft.world.level.Level
import net.minecraft.world.scores.PlayerTeam
import net.minecraft.world.scores.Scoreboard
import net.minecraft.world.scores.Team
import org.bukkit.ChatColor
Expand All @@ -27,7 +21,6 @@ import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntityType
import org.bukkit.craftbukkit.v1_20_R3.util.CraftChatMessage
import org.bukkit.entity.EntityType
import org.bukkit.entity.Player
import kotlin.random.Random

open class NMSEntity(open val entityType: EntityType): NMSEntity {
override val viewers: MutableList<Player> = mutableListOf()
Expand Down Expand Up @@ -198,13 +191,13 @@ open class NMSEntity(open val entityType: EntityType): NMSEntity {
open fun getUndefinedEntityClass(entityType: net.minecraft.world.entity.EntityType<*>, level: Level): Entity = UndefinedEntity(entityType, level)

fun sendMetaPackets() {
if (entity == null) return
entity!!.entityData.nonDefaultValues?.let {
ClientboundSetEntityDataPacket(
entity!!.id,
it
)
}?.let { viewers.sendPacket(it) }

entity?.let { entity ->
entity.entityData.nonDefaultValues?.let {
ClientboundSetEntityDataPacket(
entity!!.id,
it
)
}?.let { viewers.sendPacket(it) }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.redmagic.undefinedapi.nms.v1_20_4.entity.entityClasses
package com.redmagic.undefinedapi.nms.v1_20_4.entity

import net.minecraft.nbt.CompoundTag
import net.minecraft.world.entity.Entity
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.redmagic.undefinedapi.nms.v1_20_4.entity.entityClasses

import com.redmagic.undefinedapi.nms.interfaces.NMSItemEntity
import com.redmagic.undefinedapi.nms.v1_20_4.entity.NMSEntity
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.EntityDataSerializers
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.item.ItemEntity
import net.minecraft.world.level.Level
import org.bukkit.Location
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack
import org.bukkit.entity.EntityType
import org.bukkit.inventory.ItemStack

class NMSItemEntity(item: ItemStack): NMSEntity(EntityType.DROPPED_ITEM), NMSItemEntity {

private val DATA_ITEM: EntityDataAccessor<net.minecraft.world.item.ItemStack> = SynchedEntityData.defineId(
ItemEntity::class.java, EntityDataSerializers.ITEM_STACK
)

override var itemStack: ItemStack = item
set(value) {

entity?.let {
it.entityData.set(DATA_ITEM, CraftItemStack.asNMSCopy(value))

sendMetaPackets()
field = value
}

}

override fun spawn(newLocation: Location) {
super.spawn(newLocation)
update()
}

override fun update() {
itemStack = itemStack
}

override fun getUndefinedEntityClass(entityType: net.minecraft.world.entity.EntityType<*>, level: Level): Entity = ItemEntity(net.minecraft.world.entity.EntityType.ITEM, level)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.redmagic.undefinedapi.nms.EntityInteract
import com.redmagic.undefinedapi.nms.interfaces.NMSEntity
import com.redmagic.undefinedapi.nms.v1_20_5.NMSManager
import com.redmagic.undefinedapi.nms.v1_20_5.SpigotNMSMappings
import com.redmagic.undefinedapi.nms.v1_20_5.entity.entityClass.UndefinedEntity
import com.redmagic.undefinedapi.nms.v1_20_5.extensions.sendPacket
import net.minecraft.ChatFormatting
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket
Expand All @@ -13,7 +12,6 @@ import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket
import net.minecraft.world.entity.Entity
import net.minecraft.world.level.Level
import net.minecraft.world.scores.PlayerTeam
import net.minecraft.world.scores.Scoreboard
import net.minecraft.world.scores.Team
import org.bukkit.ChatColor
Expand All @@ -23,7 +21,6 @@ import org.bukkit.craftbukkit.entity.CraftEntityType
import org.bukkit.craftbukkit.util.CraftChatMessage
import org.bukkit.entity.EntityType
import org.bukkit.entity.Player
import kotlin.random.Random

open class NMSEntity(open val entityType: EntityType): NMSEntity {
override val viewers: MutableList<Player> = mutableListOf()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.redmagic.undefinedapi.nms.v1_20_5.entity.entityClass
package com.redmagic.undefinedapi.nms.v1_20_5.entity

import net.minecraft.nbt.CompoundTag
import net.minecraft.network.syncher.SynchedEntityData
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.redmagic.undefinedapi.nms.v1_20_5.entity.entityClass

import com.redmagic.undefinedapi.nms.interfaces.NMSItemEntity
import com.redmagic.undefinedapi.nms.v1_20_5.entity.NMSEntity
import net.minecraft.network.syncher.EntityDataSerializers
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.item.ItemEntity
import net.minecraft.world.level.Level
import org.bukkit.Location
import org.bukkit.craftbukkit.inventory.CraftItemStack
import org.bukkit.entity.EntityType
import org.bukkit.inventory.ItemStack

class NMSItemEntity(item: ItemStack): NMSEntity(EntityType.ITEM), NMSItemEntity {
override var itemStack: ItemStack = item
set(value) {

entity?.let {

val itemEntity = entity as ItemEntity

itemEntity.entityData.set(
SynchedEntityData.defineId(
ItemEntity::class.java, EntityDataSerializers.ITEM_STACK
), CraftItemStack.asNMSCopy(value))

sendMetaPackets()
field = value
}

}

override fun spawn(newLocation: Location) {
super.spawn(newLocation)
update()
}

override fun update() {
itemStack = itemStack
}

override fun getUndefinedEntityClass(entityType: net.minecraft.world.entity.EntityType<*>, level: Level): Entity = ItemEntity(net.minecraft.world.entity.EntityType.ITEM, level)
}

0 comments on commit c7996be

Please sign in to comment.