/// <summary> /// Search for a custom entity that matches the <see cref="EntityData.Name"/>.<br/> /// To register a custom entity, use <see cref="CustomEntityAttribute"/> or <see cref="Everest.Events.Level.OnLoadEntity"/>.<br/> /// <seealso href="https://github.com/EverestAPI/Resources/wiki/Custom-Entities-and-Triggers">Read More</seealso>. /// </summary> /// <param name="entityData"></param> /// <param name="level">The level to add the entity to.</param> /// <returns></returns> public static bool LoadCustomEntity(EntityData entityData, Level level) { LevelData levelData = level.Session.LevelData; Vector2 offset = new Vector2(levelData.Bounds.Left, levelData.Bounds.Top); if (Everest.Events.Level.LoadEntity(level, levelData, offset, entityData)) { return(true); } if (EntityLoaders.TryGetValue(entityData.Name, out EntityLoader loader)) { Entity loaded = loader(level, levelData, offset, entityData); if (loaded != null) { level.Add(loaded); return(true); } } if (entityData.Name == "everest/spaceController") { level.Add(new SpaceController()); return(true); } // The following entities have hardcoded "attributes." // Everest allows custom maps to set them. if (entityData.Name == "spinner") { if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustStaticSpinner(entityData, offset)); return(true); } CrystalColor color = CrystalColor.Blue; if (level.Session.Area.ID == 5) { color = CrystalColor.Red; } else if (level.Session.Area.ID == 6) { color = CrystalColor.Purple; } else if (level.Session.Area.ID == 10) { color = CrystalColor.Rainbow; } else if ("core".Equals(entityData.Attr("color"), StringComparison.InvariantCultureIgnoreCase)) { color = (CrystalColor)(-1); } else if (!Enum.TryParse(entityData.Attr("color"), true, out color)) { color = CrystalColor.Blue; } level.Add(new CrystalStaticSpinner(entityData, offset, color)); return(true); } if (entityData.Name == "trackSpinner") { if (level.Session.Area.ID == 10 || entityData.Bool("star")) { level.Add(new StarTrackSpinner(entityData, offset)); return(true); } else if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustTrackSpinner(entityData, offset)); return(true); } level.Add(new BladeTrackSpinner(entityData, offset)); return(true); } if (entityData.Name == "rotateSpinner") { if (level.Session.Area.ID == 10 || entityData.Bool("star")) { level.Add(new StarRotateSpinner(entityData, offset)); return(true); } else if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustRotateSpinner(entityData, offset)); return(true); } level.Add(new BladeRotateSpinner(entityData, offset)); return(true); } if (entityData.Name == "checkpoint" && entityData.Position == Vector2.Zero && !entityData.Bool("allowOrigin")) { // Workaround for mod levels with old versions of Ahorn containing a checkpoint at (0, 0): // Create the checkpoint and avoid the start position update in orig_Load. level.Add(new Checkpoint(entityData, offset)); return(true); } if (entityData.Name == "cloud") { patch_Cloud cloud = new Cloud(entityData, offset) as patch_Cloud; if (entityData.Has("small")) { cloud.Small = entityData.Bool("small"); } level.Add(cloud); return(true); } if (entityData.Name == "cobweb") { patch_Cobweb cobweb = new Cobweb(entityData, offset) as patch_Cobweb; if (entityData.Has("color")) { cobweb.OverrideColors = entityData.Attr("color")?.Split(',').Select(s => Calc.HexToColor(s)).ToArray(); } level.Add(cobweb); return(true); } if (entityData.Name == "movingPlatform") { patch_MovingPlatform platform = new MovingPlatform(entityData, offset) as patch_MovingPlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "sinkingPlatform") { patch_SinkingPlatform platform = new SinkingPlatform(entityData, offset) as patch_SinkingPlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "crumbleBlock") { patch_CrumblePlatform platform = new CrumblePlatform(entityData, offset) as patch_CrumblePlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "wire") { Wire wire = new Wire(entityData, offset); if (entityData.Has("color")) { wire.Color = entityData.HexColor("color"); } level.Add(wire); return(true); } if (!_LoadStrings.Contains(entityData.Name)) { Logger.Log(LogLevel.Warn, "LoadLevel", $"Failed loading entity {entityData.Name}"); } return(false); }
// Called from LoadLevel, patched via MonoModRules.PatchLevelLoader public static bool LoadCustomEntity(EntityData entityData, Level level) { LevelData levelData = level.Session.LevelData; Vector2 offset = new Vector2(levelData.Bounds.Left, levelData.Bounds.Top); if (Everest.Events.Level.LoadEntity(level, levelData, offset, entityData)) { return(true); } // Everest comes with a few core utility entities out of the box. if (entityData.Name == "everest/spaceController") { level.Add(new SpaceController()); return(true); } if (entityData.Name == "everest/spaceControllerBlocker") { level.Add(new SpaceControllerBlocker()); return(true); } if (entityData.Name == "everest/flagTrigger") { level.Add(new FlagTrigger(entityData, offset)); return(true); } if (entityData.Name == "everest/changeInventoryTrigger") { level.Add(new ChangeInventoryTrigger(entityData, offset)); return(true); } if (entityData.Name == "everest/coreMessage") { level.Add(new CustomCoreMessage(entityData, offset)); return(true); } if (entityData.Name == "everest/memorial") { level.Add(new CustomMemorial(entityData, offset)); return(true); } if (entityData.Name == "everest/npc") { level.Add(new CustomNPC(entityData, offset, new EntityID(levelData.Name, entityData.ID))); return(true); } if (entityData.Name == "everest/dialogTrigger" || entityData.Name == "dialog/dialogtrigger" || entityData.Name == "cavern/dialogtrigger") { level.Add(new DialogCutsceneTrigger(entityData, offset, new EntityID(levelData.Name, entityData.ID))); return(true); } if (entityData.Name == "everest/crystalShatterTrigger" || entityData.Name == "outback/destroycrystalstrigger") { level.Add(new CrystalShatterTrigger(entityData, offset)); return(true); } if (entityData.Name == "everest/completeAreaTrigger" || entityData.Name == "outback/completeareatrigger") { level.Add(new CompleteAreaTrigger(entityData, offset)); return(true); } if (entityData.Name == "everest/lavaBlockerTrigger" || entityData.Name == "cavern/lavablockertrigger") { level.Add(new LavaBlockerTrigger(entityData, offset)); return(true); } if (entityData.Name == "everest/coreModeTrigger" || entityData.Name == "cavern/coremodetrigger") { level.Add(new CoreModeTrigger(entityData, offset)); return(true); } // The following entities have hardcoded "attributes." // Everest allows custom maps to set them. if (entityData.Name == "spinner") { if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustStaticSpinner(entityData, offset)); return(true); } CrystalColor color = CrystalColor.Blue; if (level.Session.Area.ID == 5) { color = CrystalColor.Red; } else if (level.Session.Area.ID == 6) { color = CrystalColor.Purple; } else if ("core".Equals(entityData.Attr("color"), StringComparison.InvariantCultureIgnoreCase)) { color = (CrystalColor)(-1); } else if (!Enum.TryParse(entityData.Attr("color"), true, out color)) { color = CrystalColor.Blue; } level.Add(new CrystalStaticSpinner(entityData, offset, color)); return(true); } if (entityData.Name == "trackSpinner") { if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustTrackSpinner(entityData, offset)); return(true); } level.Add(new BladeTrackSpinner(entityData, offset)); return(true); } if (entityData.Name == "rotateSpinner") { if (level.Session.Area.ID == 3 || (level.Session.Area.ID == 7 && level.Session.Level.StartsWith("d-")) || entityData.Bool("dust")) { level.Add(new DustRotateSpinner(entityData, offset)); return(true); } level.Add(new BladeRotateSpinner(entityData, offset)); return(true); } if (entityData.Name == "checkpoint" && entityData.Position == Vector2.Zero && !entityData.Bool("allowOrigin")) { // Workaround for mod levels with old versions of Ahorn containing a checkpoint at (0, 0): // Create the checkpoint and avoid the start position update in orig_Load. level.Add(new Checkpoint(entityData, offset)); return(true); } if (entityData.Name == "triggerSpikesOriginalUp") { level.Add(new TriggerSpikesOriginal(entityData, offset, TriggerSpikesOriginal.Directions.Up)); return(true); } if (entityData.Name == "triggerSpikesOriginalDown") { level.Add(new TriggerSpikesOriginal(entityData, offset, TriggerSpikesOriginal.Directions.Down)); return(true); } if (entityData.Name == "triggerSpikesOriginalLeft") { level.Add(new TriggerSpikesOriginal(entityData, offset, TriggerSpikesOriginal.Directions.Left)); return(true); } if (entityData.Name == "triggerSpikesOriginalRight") { level.Add(new TriggerSpikesOriginal(entityData, offset, TriggerSpikesOriginal.Directions.Right)); return(true); } if (entityData.Name == "darkChaserEnd") { level.Add(new BadelineOldsiteEnd(entityData, offset)); return(true); } if (entityData.Name == "cloud") { patch_Cloud cloud = new Cloud(entityData, offset) as patch_Cloud; if (entityData.Has("small")) { cloud.Small = entityData.Bool("small"); } level.Add(cloud); return(true); } if (entityData.Name == "cobweb") { patch_Cobweb cobweb = new Cobweb(entityData, offset) as patch_Cobweb; if (entityData.Has("color")) { cobweb.OverrideColor = entityData.HexColor("color"); } level.Add(cobweb); return(true); } if (entityData.Name == "movingPlatform") { patch_MovingPlatform platform = new MovingPlatform(entityData, offset) as patch_MovingPlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "sinkingPlatform") { patch_SinkingPlatform platform = new SinkingPlatform(entityData, offset) as patch_SinkingPlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "crumbleBlock") { patch_CrumblePlatform platform = new CrumblePlatform(entityData, offset) as patch_CrumblePlatform; if (entityData.Has("texture")) { platform.OverrideTexture = entityData.Attr("texture"); } level.Add(platform); return(true); } if (entityData.Name == "wire") { Wire wire = new Wire(entityData, offset); if (entityData.Has("color")) { wire.Color = entityData.HexColor("color"); } level.Add(wire); return(true); } return(false); }