// Path: src/main/java/de/robotricker/transportpipes/duct/DuctRegister.java
// public class DuctRegister {
// 
//     private List<BaseDuctType<? extends Duct>> baseDuctTypes;
// 
//     private TransportPipes plugin;
//     private GeneralConf generalConf;
// 
//     @Inject
//     public DuctRegister(TransportPipes plugin, GeneralConf generalConf) {
//         this.plugin = plugin;
//         this.generalConf = generalConf;
//         this.baseDuctTypes = new ArrayList<>();
//     }
// 
//     public <T extends Duct> BaseDuctType<T> registerBaseDuctType(String name, Class<? extends DuctManager<T>> ductManagerClass, Class<? extends DuctFactory<T>> ductFactoryClass, Class<? extends ItemManager<T>> itemManagerClass) {
//         if (baseDuctTypes.stream().anyMatch(bdt -> bdt.getName().equalsIgnoreCase(name))) {
//             throw new IllegalArgumentException("BaseDuctType '" + name + "' already exists");
//         }
//         BaseDuctType<T> baseDuctType = new BaseDuctType<>(name, plugin.getInjector().newInstance(ductManagerClass), plugin.getInjector().newInstance(ductFactoryClass), plugin.getInjector().newInstance(itemManagerClass));
//         this.baseDuctTypes.add(baseDuctType);
//         baseDuctType.getDuctManager().registerDuctTypes();
//         baseDuctType.getItemManager().registerItems();
// 
//         if (generalConf.isCraftingEnabled()) {
//             baseDuctType.getDuctManager().registerRecipes();
//         }
// 
//         return baseDuctType;
//     }
// 
//     public List<BaseDuctType<? extends Duct>> baseDuctTypes() {
//         return baseDuctTypes;
//     }
// 
//     public <T extends Duct> BaseDuctType<T> baseDuctTypeOf(String displayName) {
//         return (BaseDuctType<T>) baseDuctTypes().stream().filter(bdt -> bdt.getName().equalsIgnoreCase(displayName)).findAny().orElse(null);
//     }
// 
//     public void saveDuctTypeToNBTTag(DuctType ductType, CompoundTag ductTag) {
//         ductTag.putString("baseDuctType", ductType.getBaseDuctType().getName());
//         ductTag.putString("ductType", ductType.getName());
//     }
// 
//     public void saveBlockLocToNBTTag(BlockLocation blockLoc, CompoundTag ductTag) {
//         ductTag.putString("blockLoc", blockLoc.toString());
//     }
// 
//     public DuctType loadDuctTypeFromNBTTag(CompoundTag ductTag) {
//         BaseDuctType bdt = baseDuctTypeOf(ductTag.getString("baseDuctType"));
//         if (bdt == null) {
//             return null;
//         }
//         return bdt.ductTypeOf(ductTag.getString("ductType"));
//     }
// 
//     public BlockLocation loadBlockLocFromNBTTag(CompoundTag ductTag) {
//         return BlockLocation.fromString(ductTag.getString("blockLoc"));
//     }
// 
// }
// 
// Path: src/main/java/de/robotricker/transportpipes/duct/types/BaseDuctType.java
// public final class BaseDuctType<T extends Duct> {
// 
//     private String name;
//     private DuctManager<T> ductManager;
//     private DuctFactory<T> ductFactory;
//     private ItemManager<T> itemManager;
//     private VanillaRenderSystem vanillaRenderSystem;
//     private ModelledRenderSystem modelledRenderSystem;
// 
//     private List<DuctType> ductTypes;
// 
//     public BaseDuctType(String name, DuctManager<T> ductManager, DuctFactory<T> ductFactory, ItemManager<T> itemManager) {
//         this.name = name;
//         this.ductManager = ductManager;
//         this.ductFactory = ductFactory;
//         this.itemManager = itemManager;
//         this.ductTypes = new ArrayList<>();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public DuctManager<T> getDuctManager() {
//         return ductManager;
//     }
// 
//     public DuctFactory<T> getDuctFactory() {
//         return ductFactory;
//     }
// 
//     public ItemManager<T> getItemManager() {
//         return itemManager;
//     }
// 
//     public VanillaRenderSystem getVanillaRenderSystem() {
//         return vanillaRenderSystem;
//     }
// 
//     public ModelledRenderSystem getModelledRenderSystem() {
//         return modelledRenderSystem;
//     }
// 
//     public void setVanillaRenderSystem(VanillaRenderSystem vanillaRenderSystem) {
//         this.vanillaRenderSystem = vanillaRenderSystem;
//     }
// 
//     public void setModelledRenderSystem(ModelledRenderSystem modelledRenderSystem) {
//         this.modelledRenderSystem = modelledRenderSystem;
//     }
// 
//     public boolean is(String name) {
//         return this.name.equalsIgnoreCase(name);
//     }
// 
//     // ****************************************************
//     // DUCT MATERIAL
//     // ****************************************************
// 
//     public List<DuctType> ductTypes() {
//         return ductTypes;
//     }
// 
//     public <S extends DuctType> S ductTypeOf(String displayName) {
//         for (DuctType dt : ductTypes) {
//             if (dt.getName().equalsIgnoreCase(displayName)) {
//                 return (S) dt;
//             }
//         }
//         return null;
//     }
// 
//     public void registerDuctType(DuctType ductType) {
//         if (ductTypes.stream().anyMatch(dt -> dt.getName().equalsIgnoreCase(ductType.getName()))) {
//             throw new IllegalArgumentException("DuctType '" + ductType.getName() + "' already exists");
//         }
//         ductTypes.add(ductType);
//     }
// 
// }


import org.bukkit.inventory.ItemStack;
import de.robotricker.transportpipes.duct.DuctRegister;
import de.robotricker.transportpipes.duct.types.BaseDuctType;
package de.robotricker.transportpipes.rendersystems;



public abstract class VanillaRenderSystem extends RenderSystem {

    public VanillaRenderSystem(BaseDuctType baseDuctType) {
        super(baseDuctType);
    }

// Path: src/main/java/de/robotricker/transportpipes/duct/DuctRegister.java
// public class DuctRegister {
// 
//     private List<BaseDuctType<? extends Duct>> baseDuctTypes;
// 
//     private TransportPipes plugin;
//     private GeneralConf generalConf;
// 
//     @Inject
//     public DuctRegister(TransportPipes plugin, GeneralConf generalConf) {
//         this.plugin = plugin;
//         this.generalConf = generalConf;
//         this.baseDuctTypes = new ArrayList<>();
//     }
// 
//     public <T extends Duct> BaseDuctType<T> registerBaseDuctType(String name, Class<? extends DuctManager<T>> ductManagerClass, Class<? extends DuctFactory<T>> ductFactoryClass, Class<? extends ItemManager<T>> itemManagerClass) {
//         if (baseDuctTypes.stream().anyMatch(bdt -> bdt.getName().equalsIgnoreCase(name))) {
//             throw new IllegalArgumentException("BaseDuctType '" + name + "' already exists");
//         }
//         BaseDuctType<T> baseDuctType = new BaseDuctType<>(name, plugin.getInjector().newInstance(ductManagerClass), plugin.getInjector().newInstance(ductFactoryClass), plugin.getInjector().newInstance(itemManagerClass));
//         this.baseDuctTypes.add(baseDuctType);
//         baseDuctType.getDuctManager().registerDuctTypes();
//         baseDuctType.getItemManager().registerItems();
// 
//         if (generalConf.isCraftingEnabled()) {
//             baseDuctType.getDuctManager().registerRecipes();
//         }
// 
//         return baseDuctType;
//     }
// 
//     public List<BaseDuctType<? extends Duct>> baseDuctTypes() {
//         return baseDuctTypes;
//     }
// 
//     public <T extends Duct> BaseDuctType<T> baseDuctTypeOf(String displayName) {
//         return (BaseDuctType<T>) baseDuctTypes().stream().filter(bdt -> bdt.getName().equalsIgnoreCase(displayName)).findAny().orElse(null);
//     }
// 
//     public void saveDuctTypeToNBTTag(DuctType ductType, CompoundTag ductTag) {
//         ductTag.putString("baseDuctType", ductType.getBaseDuctType().getName());
//         ductTag.putString("ductType", ductType.getName());
//     }
// 
//     public void saveBlockLocToNBTTag(BlockLocation blockLoc, CompoundTag ductTag) {
//         ductTag.putString("blockLoc", blockLoc.toString());
//     }
// 
//     public DuctType loadDuctTypeFromNBTTag(CompoundTag ductTag) {
//         BaseDuctType bdt = baseDuctTypeOf(ductTag.getString("baseDuctType"));
//         if (bdt == null) {
//             return null;
//         }
//         return bdt.ductTypeOf(ductTag.getString("ductType"));
//     }
// 
//     public BlockLocation loadBlockLocFromNBTTag(CompoundTag ductTag) {
//         return BlockLocation.fromString(ductTag.getString("blockLoc"));
//     }
// 
// }
// 
// Path: src/main/java/de/robotricker/transportpipes/duct/types/BaseDuctType.java
// public final class BaseDuctType<T extends Duct> {
// 
//     private String name;
//     private DuctManager<T> ductManager;
//     private DuctFactory<T> ductFactory;
//     private ItemManager<T> itemManager;
//     private VanillaRenderSystem vanillaRenderSystem;
//     private ModelledRenderSystem modelledRenderSystem;
// 
//     private List<DuctType> ductTypes;
// 
//     public BaseDuctType(String name, DuctManager<T> ductManager, DuctFactory<T> ductFactory, ItemManager<T> itemManager) {
//         this.name = name;
//         this.ductManager = ductManager;
//         this.ductFactory = ductFactory;
//         this.itemManager = itemManager;
//         this.ductTypes = new ArrayList<>();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public DuctManager<T> getDuctManager() {
//         return ductManager;
//     }
// 
//     public DuctFactory<T> getDuctFactory() {
//         return ductFactory;
//     }
// 
//     public ItemManager<T> getItemManager() {
//         return itemManager;
//     }
// 
//     public VanillaRenderSystem getVanillaRenderSystem() {
//         return vanillaRenderSystem;
//     }
// 
//     public ModelledRenderSystem getModelledRenderSystem() {
//         return modelledRenderSystem;
//     }
// 
//     public void setVanillaRenderSystem(VanillaRenderSystem vanillaRenderSystem) {
//         this.vanillaRenderSystem = vanillaRenderSystem;
//     }
// 
//     public void setModelledRenderSystem(ModelledRenderSystem modelledRenderSystem) {
//         this.modelledRenderSystem = modelledRenderSystem;
//     }
// 
//     public boolean is(String name) {
//         return this.name.equalsIgnoreCase(name);
//     }
// 
//     // ****************************************************
//     // DUCT MATERIAL
//     // ****************************************************
// 
//     public List<DuctType> ductTypes() {
//         return ductTypes;
//     }
// 
//     public <S extends DuctType> S ductTypeOf(String displayName) {
//         for (DuctType dt : ductTypes) {
//             if (dt.getName().equalsIgnoreCase(displayName)) {
//                 return (S) dt;
//             }
//         }
//         return null;
//     }
// 
//     public void registerDuctType(DuctType ductType) {
//         if (ductTypes.stream().anyMatch(dt -> dt.getName().equalsIgnoreCase(ductType.getName()))) {
//             throw new IllegalArgumentException("DuctType '" + ductType.getName() + "' already exists");
//         }
//         ductTypes.add(ductType);
//     }
// 
// }


// Path: src/main/java/de/robotricker/transportpipes/rendersystems/VanillaRenderSystem.java
import org.bukkit.inventory.ItemStack;
import de.robotricker.transportpipes.duct.DuctRegister;
import de.robotricker.transportpipes.duct.types.BaseDuctType;

package de.robotricker.transportpipes.rendersystems;



public abstract class VanillaRenderSystem extends RenderSystem {

    public VanillaRenderSystem(BaseDuctType baseDuctType) {
        super(baseDuctType);
    }

    public static ItemStack getItem(DuctRegister ductRegister) {