Note: this is not a plug-in, but a desktop application. Don't put it in your plugins folder. This is the configuration tool for my custom items plug-in.

This tool is a graphical user application (although very ugly) that is needed to configure my custom items plug-in (which items you want, which textures to give them, and many other features).

Basic tutorials:
Text: https://knokko.github.io/custom%20items/tutorials/basic%20tools.html
Video: https://www.youtube.com/playlist?list=PLcc-tPs9PuADC-shEBRynL9s2j6slSWCa

Advanced tutorials:
Custom containers (video): https://knokko.github.io/custom%20items/tutorials/containers/index.html

Why a GUI rather than just a simple config file?
Adding new textures to a minecraft server isn't really possible without a resourcepack. Writing resourcepacks is generally a nasty task, and is even more terrifying when you need to work with custom items: you would need to write files like this by hand:
{
"parent": "item/handheld",
"textures": {
"layer0": "item/stone_hoe"
},
"overrides": [
{ "predicate": {"damaged": 0, "damage": 0.007633587786259542}, "model": "customitems/steel_bar"},
{ "predicate": {"damaged": 0, "damage": 0.015267175572519083}, "model": "customitems/iron_bar"},
{ "predicate": {"damaged": 0, "damage": 0.022900763358778626}, "model": "customitems/iron_scrap"},
{ "predicate": {"damaged": 0, "damage": 0.030534351145038167}, "model": "customitems/steel_scrap"},
{ "predicate": {"damaged": 0, "damage": 0.03816793893129771}, "model": "customitems/withered_iron_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.04580152671755725}, "model": "customitems/withered_iron_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.05343511450381679}, "model": "customitems/mithril_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.061068702290076333}, "model": "customitems/mithril_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.06870229007633588}, "model": "customitems/aetherium_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.07633587786259542}, "model": "customitems/aetherium_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.08396946564885496}, "model": "customitems/enderite_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.0916030534351145}, "model": "customitems/enderite_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.09923664122137404}, "model": "customitems/steel_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.10687022900763359}, "model": "customitems/lead_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.11450381679389313}, "model": "customitems/lead_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.12213740458015267}, "model": "customitems/withered_bone"},
{ "predicate": {"damaged": 0, "damage": 0.1297709923664122}, "model": "customitems/powered_metheorite"},
{ "predicate": {"damaged": 0, "damage": 0.13740458015267176}, "model": "customitems/titanium_ingot"},
{ "predicate": {"damaged": 0, "damage": 0.1450381679389313}, "model": "customitems/titanium_scraps"},
{ "predicate": {"damaged": 0, "damage": 0.15267175572519084}, "model": "customitems/iron_plate"},
{ "predicate": {"damaged": 0, "damage": 0.16030534351145037}, "model": "customitems/steel_plate"},
{ "predicate": {"damaged": 0, "damage": 0.16793893129770993}, "model": "customitems/lead_plate"},
{ "predicate": {"damaged": 0, "damage": 0.17557251908396945}, "model": "customitems/mithril_plate"},
{ "predicate": {"damaged": 0, "damage": 0.183206106870229}, "model": "customitems/withered_iron_plate"},
{ "predicate": {"damaged": 0, "damage": 0.19083969465648856}, "model": "customitems/aetherium_plate"},
{ "predicate": {"damaged": 0, "damage": 0.1984732824427481}, "model": "customitems/enderite_plate"},
{ "predicate": {"damaged": 0, "damage": 0.20610687022900764}, "model": "customitems/titanium_plate"},
{ "predicate": {"damaged": 0, "damage": 0.21374045801526717}, "model": "customitems/netherite_plate"},
{ "predicate": {"damaged": 0, "damage": 0.22137404580152673}, "model": "customitems/withered_iron_bar"},
{ "predicate": {"damaged": 0, "damage": 0.22900763358778625}, "model": "customitems/mithril_bar"},
{ "predicate": {"damaged": 0, "damage": 0.2366412213740458}, "model": "customitems/lead_bar"},
{ "predicate": {"damaged": 0, "damage": 0.24427480916030533}, "model": "customitems/netherite_bar"},
{ "predicate": {"damaged": 0, "damage": 0.25190839694656486}, "model": "customitems/enderite_bar"},
{ "predicate": {"damaged": 0, "damage": 0.2595419847328244}, "model": "customitems/aetherium_bar"},
{ "predicate": {"damaged": 0, "damage": 0.26717557251908397}, "model": "customitems/titanium_bar"},
{ "predicate": {"damaged": 0, "damage": 0.2748091603053435}, "model": "customitems/steel_handgrip"},
{ "predicate": {"damaged": 0, "damage": 0.2824427480916031}, "model": "customitems/enchanted_handgrip"},
{ "predicate": {"damaged": 0, "damage": 0.2900763358778626}, "model": "customitems/guardian_plated_handgrip"},
{ "predicate": {"damaged": 0, "damage": 0.29770992366412213}, "model": "customitems/vorpal_handgrip"},
{ "predicate": {"damaged": 0, "damage": 0.3053435114503817}, "model": "customitems/aetherium_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.31297709923664124}, "model": "customitems/enderite_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.32061068702290074}, "model": "customitems/lead_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.3282442748091603}, "model": "customitems/mithril_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.33587786259541985}, "model": "customitems/netherite_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.3435114503816794}, "model": "customitems/steel_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.3511450381679389}, "model": "customitems/titanium_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.35877862595419846}, "model": "customitems/withered_iron_axehead"},
{ "predicate": {"damaged": 0, "damage": 0.366412213740458}, "model": "customitems/comp_block_lapis"},
{ "predicate": {"damaged": 0, "damage": 0.37404580152671757}, "model": "customitems/comp_block_gold"},
{ "predicate": {"damaged": 0, "damage": 0.3816793893129771}, "model": "customitems/comp_block_redstone"},
{ "predicate": {"damaged": 0, "damage": 0.3893129770992366}, "model": "customitems/comp_block_coal"},
{ "predicate": {"damaged": 0, "damage": 0.3969465648854962}, "model": "customitems/comp_block_iron"},
{ "predicate": {"damaged": 0, "damage": 0.40458015267175573}, "model": "customitems/comp_block_diamond"},
{ "predicate": {"damaged": 0, "damage": 0.4122137404580153}, "model": "customitems/comp_block_emerald"},
{ "predicate": {"damaged": 0, "damage": 0.4198473282442748}, "model": "customitems/comp_block_cobblestone"},
{ "predicate": {"damaged": 0, "damage": 0.42748091603053434}, "model": "customitems/comp_block_andesite"},
{ "predicate": {"damaged": 0, "damage": 0.4351145038167939}, "model": "customitems/comp_block_granite"},
{ "predicate": {"damaged": 0, "damage": 0.44274809160305345}, "model": "customitems/comp_block_diorite"},
{ "predicate": {"damaged": 0, "damage": 0.45038167938931295}, "model": "customitems/comp_block_stone"},
{ "predicate": {"damaged": 0, "damage": 0.4580152671755725}, "model": "customitems/comp_block_blackstone"},
{ "predicate": {"damaged": 0, "damage": 0.46564885496183206}, "model": "customitems/comp_block_basalt"},
{ "predicate": {"damaged": 0, "damage": 0.4732824427480916}, "model": "customitems/comp_block_sand"},
{ "predicate": {"damaged": 0, "damage": 0.48091603053435117}, "model": "customitems/comp_block_netherrack"},
{ "predicate": {"damaged": 0, "damage": 0.48854961832061067}, "model": "customitems/comp_block_gravel"},
{ "predicate": {"damaged": 0, "damage": 0.4961832061068702}, "model": "customitems/comp_block_obsidian"},
{ "predicate": {"damaged": 0, "damage": 0.5038167938931297}, "model": "customitems/comp_block_crying"},
{ "predicate": {"damaged": 1, "damage": 0}, "model": "item/stone_hoe"}
]
}

When I would have forgotten a single quote or curly bracket in the example file above, it wouldn't work at all. This GUI application will write the entire resourcepack, so that you don't need to do it yourself.

Why is the GUI so ugly?
First of all, designing and implementing a good GUI takes a lot of time. Big companies have an entire art team for this. But, this plug-in is primarily maintained by a college student in this spare time, so time is limited. Also, I used this project to try my own GUI library, and... well... I discovered some flaws while doing so. Improving it would require rewriting it all in a better GUI library, which would probably take more than 100 hours.