1
1
package xyz.xenondevs.nova.world.block.logic.interact
2
2
3
- import net.minecraft.core.BlockPos
4
- import net.minecraft.world.level.LevelReader
5
- import net.minecraft.world.level.block.state.BlockBehaviour
6
- import net.minecraft.world.level.block.state.BlockState
7
- import org.bukkit.attribute.Attribute
8
3
import org.bukkit.block.Block
9
4
import org.bukkit.entity.EntityType
10
- import org.bukkit.entity.Player
11
5
import org.bukkit.event.EventHandler
12
6
import org.bukkit.event.EventPriority
13
7
import org.bukkit.event.Listener
@@ -17,10 +11,6 @@ import org.bukkit.event.block.BlockPistonExtendEvent
17
11
import org.bukkit.event.block.BlockPistonRetractEvent
18
12
import org.bukkit.event.entity.EntityChangeBlockEvent
19
13
import org.bukkit.event.entity.EntityExplodeEvent
20
- import org.bukkit.event.inventory.InventoryCreativeEvent
21
- import org.bukkit.event.inventory.InventoryType
22
- import org.bukkit.inventory.EquipmentSlot
23
- import org.bukkit.inventory.ItemStack
24
14
import xyz.xenondevs.nova.context.Context
25
15
import xyz.xenondevs.nova.context.intention.DefaultContextIntentions
26
16
import xyz.xenondevs.nova.context.intention.DefaultContextIntentions.BlockBreak
@@ -29,29 +19,24 @@ import xyz.xenondevs.nova.initialize.InitFun
29
19
import xyz.xenondevs.nova.initialize.InternalInit
30
20
import xyz.xenondevs.nova.initialize.InternalInitStage
31
21
import xyz.xenondevs.nova.integration.protection.ProtectionManager
22
+ import xyz.xenondevs.nova.network.event.PacketListener
23
+ import xyz.xenondevs.nova.network.event.registerPacketListener
32
24
import xyz.xenondevs.nova.util.BlockUtils
33
- import xyz.xenondevs.nova.util.nmsState
34
- import xyz.xenondevs.nova.util.reflection.ReflectionUtils
35
25
import xyz.xenondevs.nova.util.registerEvents
36
- import xyz.xenondevs.nova.util.serverLevel
37
26
import xyz.xenondevs.nova.world.format.WorldDataManager
38
27
import xyz.xenondevs.nova.world.player.WrappedPlayerInteractEvent
39
28
import xyz.xenondevs.nova.world.pos
40
- import net.minecraft.world.item.ItemStack as MojangStack
41
-
42
- private val BLOCK_BEHAVIOR_GET_CLONE_ITEM_STACK = ReflectionUtils .getMethodHandle(
43
- BlockBehaviour ::class , " getCloneItemStack" , LevelReader ::class , BlockPos ::class , BlockState ::class , Boolean ::class
44
- )
45
29
46
30
@InternalInit(
47
31
stage = InternalInitStage .POST_WORLD ,
48
32
dependsOn = [WorldDataManager ::class ]
49
33
)
50
- internal object BlockInteracting : Listener {
34
+ internal object BlockInteracting : Listener, PacketListener {
51
35
52
36
@InitFun
53
37
private fun init () {
54
38
registerEvents()
39
+ registerPacketListener()
55
40
}
56
41
57
42
@EventHandler(priority = EventPriority .LOW )
@@ -84,45 +69,6 @@ internal object BlockInteracting : Listener {
84
69
}
85
70
}
86
71
87
- @EventHandler(priority = EventPriority .HIGHEST , ignoreCancelled = true )
88
- private fun handleInventoryCreative (event : InventoryCreativeEvent ) {
89
- if (event.slotType != InventoryType .SlotType .QUICKBAR )
90
- return
91
-
92
- val player = event.whoClicked as Player
93
- val reach = player.getAttribute(Attribute .BLOCK_INTERACTION_RANGE )?.value ? : 8.0
94
- val rayTraceResult = player.rayTraceBlocks(reach)
95
- ? : return
96
- val targetBlock = rayTraceResult.hitBlock
97
- ? : return
98
- val targetPos = targetBlock.pos
99
-
100
- val vanillaCloneStack = (BLOCK_BEHAVIOR_GET_CLONE_ITEM_STACK .invoke(
101
- targetBlock.world.serverLevel,
102
- targetBlock.pos.nmsPos,
103
- targetBlock.nmsState
104
- ) as MojangStack ).asBukkitMirror()
105
-
106
- if (vanillaCloneStack != event.cursor)
107
- return
108
-
109
- val novaBlockState = WorldDataManager .getBlockState(targetPos)
110
- ? : return
111
-
112
- val ctx = Context .intention(DefaultContextIntentions .BlockInteract )
113
- .param(DefaultContextParamTypes .BLOCK_POS , targetPos)
114
- .param(DefaultContextParamTypes .BLOCK_STATE_NOVA , novaBlockState)
115
- .param(DefaultContextParamTypes .SOURCE_ENTITY , player)
116
- .param(DefaultContextParamTypes .CLICKED_BLOCK_FACE , rayTraceResult.hitBlockFace)
117
- .param(DefaultContextParamTypes .INTERACTION_HAND , EquipmentSlot .HAND )
118
- .param(DefaultContextParamTypes .INTERACTION_ITEM_STACK , event.cursor)
119
- .build()
120
-
121
- val novaCloneStack = novaBlockState.block.pickBlockCreative(targetPos, novaBlockState, ctx) ? : ItemStack .empty()
122
- event.cursor = novaCloneStack
123
- player.updateInventory()
124
- }
125
-
126
72
@EventHandler(priority = EventPriority .HIGHEST , ignoreCancelled = true )
127
73
private fun handlePistonExtend (event : BlockPistonExtendEvent ) {
128
74
if (event.blocks.any { WorldDataManager .getBlockState(it.pos) != null }) event.isCancelled = true
0 commit comments