// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.component;

import com.hypixel.hytale.component.spatial.SpatialResource;
import com.hypixel.hytale.component.spatial.SpatialStructure;
import com.hypixel.hytale.component.event.WorldEventType;
import com.hypixel.hytale.component.event.EntityEventType;
import com.hypixel.hytale.component.system.EcsEvent;
import com.hypixel.hytale.component.system.ISystem;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import java.util.function.Supplier;
import javax.annotation.Nonnull;

public interface IComponentRegistry<ECS_TYPE>
{
    @Nonnull
     <T extends Component<ECS_TYPE>> ComponentType<ECS_TYPE, T> registerComponent(@Nonnull final Class<? super T> p0, @Nonnull final Supplier<T> p1);
    
    @Nonnull
     <T extends Component<ECS_TYPE>> ComponentType<ECS_TYPE, T> registerComponent(@Nonnull final Class<? super T> p0, @Nonnull final String p1, @Nonnull final BuilderCodec<T> p2);
    
    @Nonnull
     <T extends Resource<ECS_TYPE>> ResourceType<ECS_TYPE, T> registerResource(@Nonnull final Class<? super T> p0, @Nonnull final Supplier<T> p1);
    
    @Nonnull
     <T extends Resource<ECS_TYPE>> ResourceType<ECS_TYPE, T> registerResource(@Nonnull final Class<? super T> p0, @Nonnull final String p1, @Nonnull final BuilderCodec<T> p2);
    
     <T extends ISystem<ECS_TYPE>> SystemType<ECS_TYPE, T> registerSystemType(@Nonnull final Class<? super T> p0);
    
    @Nonnull
     <T extends EcsEvent> EntityEventType<ECS_TYPE, T> registerEntityEventType(@Nonnull final Class<? super T> p0);
    
    @Nonnull
     <T extends EcsEvent> WorldEventType<ECS_TYPE, T> registerWorldEventType(@Nonnull final Class<? super T> p0);
    
    @Nonnull
    SystemGroup<ECS_TYPE> registerSystemGroup();
    
    void registerSystem(@Nonnull final ISystem<ECS_TYPE> p0);
    
    ResourceType<ECS_TYPE, SpatialResource<Ref<ECS_TYPE>, ECS_TYPE>> registerSpatialResource(@Nonnull final Supplier<SpatialStructure<Ref<ECS_TYPE>>> p0);
}
