1- using Celeste . Mod . Backdrops ;
1+ using Celeste . Mod . Backdrops ;
22using Celeste . Mod . Core ;
33using Celeste . Mod . Entities ;
44using Celeste . Mod . Helpers ;
5+ using Celeste . Mod . Registry ;
56using MAB . DotIgnore ;
67using Microsoft . Xna . Framework ;
78using Monocle ;
@@ -208,6 +209,7 @@ internal static void LoadAuto() {
208209
209210 watch . Stop ( ) ;
210211 Logger . Verbose ( "loader" , $ "ALL MODS LOADED IN { watch . ElapsedMilliseconds } ms") ;
212+ Logger . Info ( "loader" , $ "Loaded { Everest . _Modules . Count } modules") ;
211213
212214 try {
213215 Watcher = new FileSystemWatcher {
@@ -609,36 +611,68 @@ internal static void ProcessAssembly(EverestModuleMetadata meta, Assembly asm, T
609611
610612 patch_Level . EntityLoader loader = null ;
611613
612- ConstructorInfo ctor ;
614+ ConstructorInfo ctor = null ;
613615 MethodInfo gen ;
614616
615617 gen = type . GetMethod ( genName , new Type [ ] { typeof ( Level ) , typeof ( LevelData ) , typeof ( Vector2 ) , typeof ( EntityData ) } ) ;
616618 if ( gen != null && gen . IsStatic && gen . ReturnType . IsCompatible ( typeof ( Entity ) ) ) {
617- loader = ( level , levelData , offset , entityData ) => ( Entity ) gen . Invoke ( null , new object [ ] { level , levelData , offset , entityData } ) ;
619+ loader = ( level , levelData , offset , entityData ) => {
620+ var entityId = ( ( patch_Level ) level ) . CreateEntityId ( levelData , entityData ) ;
621+ var entity = ( patch_Entity ) gen . Invoke ( null , new object [ ] { level , levelData , offset , entityData } ) ;
622+ if ( entity != null ) {
623+ entity . SourceData = entityData ;
624+ entity . SourceId = entityId ;
625+ }
626+
627+ return entity ;
628+ } ;
618629 goto RegisterEntityLoader ;
619630 }
620631
621632 ctor = type . GetConstructor ( new Type [ ] { typeof ( EntityData ) , typeof ( Vector2 ) , typeof ( EntityID ) } ) ;
622633 if ( ctor != null ) {
623- loader = ( level , levelData , offset , entityData ) => ( Entity ) ctor . Invoke ( new object [ ] { entityData , offset , new EntityID ( levelData . Name , entityData . ID + ( patch_Level . _isLoadingTriggers ? 10000000 : 0 ) ) } ) ;
634+ loader = ( level , levelData , offset , entityData ) => {
635+ var entityId = ( ( patch_Level ) level ) . CreateEntityId ( levelData , entityData ) ;
636+ var entity = ( patch_Entity ) ctor . Invoke ( new object [ ] { entityData , offset , entityId } ) ;
637+ entity . SourceData = entityData ;
638+ entity . SourceId = entityId ;
639+
640+ return entity ;
641+ } ;
624642 goto RegisterEntityLoader ;
625643 }
626644
627645 ctor = type . GetConstructor ( new Type [ ] { typeof ( EntityData ) , typeof ( Vector2 ) } ) ;
628646 if ( ctor != null ) {
629- loader = ( level , levelData , offset , entityData ) => ( Entity ) ctor . Invoke ( new object [ ] { entityData , offset } ) ;
647+ loader = ( level , levelData , offset , entityData ) => {
648+ var entity = ( patch_Entity ) ctor . Invoke ( new object [ ] { entityData , offset } ) ;
649+ entity . SourceData = entityData ;
650+ entity . SourceId = ( ( patch_Level ) level ) . CreateEntityId ( levelData , entityData ) ;
651+
652+ return entity ;
653+ } ;
630654 goto RegisterEntityLoader ;
631655 }
632656
633657 ctor = type . GetConstructor ( new Type [ ] { typeof ( Vector2 ) } ) ;
634658 if ( ctor != null ) {
635- loader = ( level , levelData , offset , entityData ) => ( Entity ) ctor . Invoke ( new object [ ] { offset } ) ;
659+ loader = ( level , levelData , offset , entityData ) => {
660+ var entity = ( patch_Entity ) ctor . Invoke ( new object [ ] { offset } ) ;
661+ entity . SourceData = entityData ;
662+ entity . SourceId = ( ( patch_Level ) level ) . CreateEntityId ( levelData , entityData ) ;
663+ return entity ;
664+ } ;
636665 goto RegisterEntityLoader ;
637666 }
638667
639668 ctor = type . GetConstructor ( Type . EmptyTypes ) ;
640669 if ( ctor != null ) {
641- loader = ( level , levelData , offset , entityData ) => ( Entity ) ctor . Invoke ( null ) ;
670+ loader = ( level , levelData , offset , entityData ) => {
671+ var entity = ( patch_Entity ) ctor . Invoke ( null ) ;
672+ entity . SourceData = entityData ;
673+ entity . SourceId = ( ( patch_Level ) level ) . CreateEntityId ( levelData , entityData ) ;
674+ return entity ;
675+ } ;
642676 goto RegisterEntityLoader ;
643677 }
644678
@@ -647,6 +681,13 @@ internal static void ProcessAssembly(EverestModuleMetadata meta, Assembly asm, T
647681 Logger . Warn ( "core" , $ "Found custom entity without suitable constructor / { genName } (Level, LevelData, Vector2, EntityData): { id } ({ type . FullName } )") ;
648682 continue ;
649683 }
684+
685+ // Immediately register the connection when we're calling the ctor,
686+ // since we know the return type upfront.
687+ if ( ctor != null ) {
688+ EntityRegistry . RegisterSidToTypeConnection ( id , ctor . DeclaringType ) ;
689+ }
690+
650691 patch_Level . EntityLoaders [ id ] = loader ;
651692 }
652693 }
0 commit comments