import:
	org.bukkit.Bukkit
	org.bukkit.event.inventory.InventoryDragEvent
	net.minecraft.world.inventory.InventoryCrafting
	net.minecraft.world.inventory.ContainerWorkbench
	net.minecraft.world.entity.player.PlayerInventory
	net.minecraft.world.item.crafting.Recipes
	org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack

function openWorkbench(p: player) :: object:
	set metadata tag "fancyTable" of {_p} to chest inventory with 6 rows named "Crafting table"
	set slot (integers between 0 and 44) of metadata tag "fancyTable" of {_p} to black stained glass pane named "&0"
	set slot (integers between 45 and 54) of metadata tag "fancyTable" of {_p} to red stained glass pane named "&0"
	set slot (10, 11, 12, 19, 20, 21, 28, 29, 30) and (49, 24) of metadata tag "fancyTable" of {_p} to (air, air, air, air, air, air, air, air, air) and (barrier named "&cClose" and barrier named "&cInvalid recipe pattern" with lore "&7Put items in a correct", "&7pattern in the grid.")
	open (metadata tag "fancyTable" of {_p}) to {_p}

function updateWorkbench(p: player):
	wait a tick
	set {_ic} to new InventoryCrafting((new ContainerWorkbench(-1, new PlayerInventory(null))), 3, 3, null)
	loop (10, 11, 12, 19, 20, 21, 28, 29, 30):
		{_ic}.setItem(({_} ? 0), (CraftItemStack.asNMSCopy(random item of (slot loop-value of (metadata tag "fancyTable" of {_p})))))
		add 1 to {_}
	set {_optional} to Bukkit.getServer().getHandle().getServer().getCraftingManager().craft(Recipes.a, {_ic}, null)
	if {_optional}.isPresent():
		set {_itemstack} to CraftItemStack.asBukkitCopy({_optional}.get().a({_ic}))
		set line ((size of lore of {_itemstack}) + 1) of lore of {_itemstack} to "&l&e&l"
		set slot 24 of (metadata tag "fancyTable" of {_p}) to {_itemstack}
		set slot (integers between 45 and 54) of metadata tag "fancyTable" of {_p} to (light green stained glass pane named "&0")
		set slot 49 of metadata tag "fancyTable" of {_p} to barrier named "&cClose"
	else:
		set slot (integers between 45 and 54) of metadata tag "fancyTable" of {_p} to red stained glass pane named "&0"
		set slot (49, 24) of metadata tag "fancyTable" of {_p} to (barrier named "&cClose" and barrier named "&cInvalid recipe pattern" with lore "&7Put items in a correct", "&7pattern in the grid.")

function craftWorkbench(p: player, click: click type, slot: item):
	set {_result} to slot 24 of metadata tag "fancyTable" of {_p}
	clear line (size of lore of {_result}) of lore of {_result}
	if "%{_click}%" is "left mouse button" or "right mouse button" or "double click using mouse":
		((cursor slot of {_p}'s item amount) + (item amount of {_slot})) < {_slot}.getMaxStackSize()
		if 1 of {_p}'s cursor slot is 1 of {_result}:
			add (item amount of slot 24 of metadata tag "fancyTable" of {_p}) to item amount of {_p}'s cursor slot
			removeItems({_p}, 1)
		else if type of {_p}'s cursor slot is air:
			set cursor slot of {_p} to {_result}
			removeItems({_p}, 1)
	else if "%{_click}%" is "left mouse button with shift" or "right mouse button with shift":
		give ({_result} and removeItems({_p}, 1)) to {_p} if {_p} has enough space for {_result}

function removeItems(p: player, count: number) :: object:
	loop (10, 11, 12, 19, 20, 21, 28, 29, 30):
		set item amount of slot loop-value of metadata tag "fancyTable" of {_p} to (item amount of slot loop-value of metadata tag "fancyTable" of {_p}) - {_count}

on rightclick on crafting table:
	cancel event if openWorkbench(player) is not true

on inventory click:
	updateWorkbench(player) if player's current inventory is (metadata tag "fancyTable" of player)
	if event-inventory is (metadata tag "fancyTable" of player):
		cancel event if (10, 11, 12, 19, 20, 21, 28, 29, 30) doesn't contain index of event-slot
		close player's inventory if index of event-slot is 49
		craftWorkbench(player, click type, event-slot) if ((true if (index of event-slot) is 24, else 1) is (true if (name of event-slot) is not "&cInvalid recipe pattern", else 2))

on inventory close:
	player's current inventory is (metadata tag "fancyTable" of player)
	set {_v} to (vector from yaw player's yaw and pitch player's pitch) ** (vector(0.3, 0.3, 0.3))
	loop (10, 11, 12, 19, 20, 21, 28, 29 and 30):
		if player has enough space for (slot loop-value of (metadata tag "fancyTable" of player)):
			give (slot loop-value of (metadata tag "fancyTable" of player)) to player
		else:
			drop (slot loop-value of (metadata tag "fancyTable" of player)) 1 above player's location
			set velocity of last dropped item to {_v}

on InventoryDragEvent:
	updateWorkbench(event.getWhoClicked()) if event.getWhoClicked()'s current inventory is (metadata tag "fancyTable" of event.getWhoClicked())