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

package com.hypixel.hytale.component;

import com.hypixel.hytale.component.event.WorldEventType;
import com.hypixel.hytale.component.event.EntityEventType;
import com.hypixel.hytale.component.system.EcsEvent;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;

public interface ComponentAccessor<ECS_TYPE>
{
    @Nullable
     <T extends Component<ECS_TYPE>> T getComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1);
    
    @Nonnull
     <T extends Component<ECS_TYPE>> T ensureAndGetComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1);
    
    @Nonnull
    Archetype<ECS_TYPE> getArchetype(@Nonnull final Ref<ECS_TYPE> p0);
    
    @Nonnull
     <T extends Resource<ECS_TYPE>> T getResource(@Nonnull final ResourceType<ECS_TYPE, T> p0);
    
    @Nonnull
    ECS_TYPE getExternalData();
    
     <T extends Component<ECS_TYPE>> void putComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1, @Nonnull final T p2);
    
     <T extends Component<ECS_TYPE>> void addComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1, @Nonnull final T p2);
    
     <T extends Component<ECS_TYPE>> T addComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1);
    
    Ref<ECS_TYPE>[] addEntities(@Nonnull final Holder<ECS_TYPE>[] p0, @Nonnull final AddReason p1);
    
    @Nullable
    Ref<ECS_TYPE> addEntity(@Nonnull final Holder<ECS_TYPE> p0, @Nonnull final AddReason p1);
    
    @Nonnull
    Holder<ECS_TYPE> removeEntity(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final Holder<ECS_TYPE> p1, @Nonnull final RemoveReason p2);
    
     <T extends Component<ECS_TYPE>> void removeComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1);
    
     <T extends Component<ECS_TYPE>> void tryRemoveComponent(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final ComponentType<ECS_TYPE, T> p1);
    
     <Event extends EcsEvent> void invoke(@Nonnull final Ref<ECS_TYPE> p0, @Nonnull final Event p1);
    
     <Event extends EcsEvent> void invoke(@Nonnull final EntityEventType<ECS_TYPE, Event> p0, @Nonnull final Ref<ECS_TYPE> p1, @Nonnull final Event p2);
    
     <Event extends EcsEvent> void invoke(@Nonnull final Event p0);
    
     <Event extends EcsEvent> void invoke(@Nonnull final WorldEventType<ECS_TYPE, Event> p0, @Nonnull final Event p1);
}
