
CatFrame
A shared frameworks backporting Modern Minecraft Systems to the archaic 1.7.10 version.
- Загрузки
- 560
- Подписчики
- 3
- Обновлён
- 21 августа 2026 г.
- Лицензия
- MIT
Опубликован 29 мая 2026 г.
CatFrame
A modern foundation library for Minecraft Forge 1.7.10.
CatFrame is a modern foundation library for Minecraft Forge 1.7.10, backporting many of the engine, rendering, resource, and UI systems introduced in newer versions of Minecraft.
Its goal is not simply to recreate individual features, but to provide the underlying architecture needed for modern, data-driven mod development on the legacy 1.7.10 platform.
Features
Rendering & Resources
- Complete 26.1+ JSON Model pipeline
- Modern Blockstate system
- Runtime model baking
- Namespace-based resource loading
- Automatic texture stitching
- Display transforms
- Multi-layer item rendering
- Modern Item Model definitions
Data-Driven Systems
- Data Components
- Vanilla-style Tag System
- Extensible model mapping
- Property-based state resolution
- Resource-driven configuration
UI Framework
CatFrame also provides a reusable GUI toolkit for building modern interfaces on Minecraft 1.7.10.
Included components include:
- Tab framework
- GuiCyclableButton
- ContentPanelRenderer
- Scrollable widgets
- Modern layout helpers
- Reusable GUI controls
- Extensible UI components
Designed for Mod Developers
CatFrame is intended as a shared infrastructure library rather than a standalone content mod.
It serves as the foundation for my Minecraft 1.7.10 projects and is designed to make modern, maintainable, and data-driven mod development possible on a legacy Minecraft version.
Ченджлог
0.7.1Релиз1.7.10 · 21 августа 2026 г.
CatFrame - 0.7.1
What is changed?
Change version number from previous to 0.7.1
➕Add:
- Implement IconedButton as the IconButton counterpart: centered AbstractComponent icon over Button background/text, icon-sized and explicit-size constructors, builder with size/pos/useVanillaTexture options
- Reject non-90-degree blockstate rotations: add BlockstateKeyValidator.validateRotations (invalid variants fall back to builtin/missing, invalid multipart apply entries dropped), wired into validate() and VanillaModelManager.registerResidentBlockModel to cover blocks without typed state definitions
- Add optional JarUtils integration for cross-mod JSON lang discovery: new JarUtilsLangScanner consumes JarUtils's parallel-built jar index at postInit, filters assets//lang/xx_xx.json entries (lowercase codes, foreign domains only) and injects them via LanguageRegister.injectExternal; LangFileEntry now carries resourceDomain/resourceDir so resource-pack reload covers external files; CommonProxy.postInit guards with Loader.isModLoaded, CatFrame gets soft 'after:jarutils' ordering
🔧Fix:
- Fix scissor missing GUI scale factor: multiply scissor coordinates by ScaledResolution scale in AbstractScrollArea.enableScissor and AbstractTextAreaWidget.renderWidget
❗❗❗Deprecated:
- Remove retired vanillaIcons snapshot table from VanillaTextureTracker
- Drop optional jar-utils integration: delete JarUtilsLangScanner and the lib jar, revert after:jarutils ordering and postInit wiring. Lang discovery stays on the original single-threaded jar scan; LanguageRegister.injectExternal is kept as the compat-layer fill-in entry for cross-mod lang files
- Remove LanguageRegister.domain() multi-domain registration concept; replace with single-path load() that scans CatFrame's own jar/directory for assets/catframe/lang JSON files. Simplify domainLangFiles map to a flat langFiles list, drop getDomains(), dedent reloadFromResourceManager loop. CommonProxy.preInit now calls LanguageRegister.load().
- Stage D cleanup: remove dead sprites/findSprite from CatAtlasManager (always-empty ConcurrentHashMap, never-used lookup); remove dead CatSprite override branch in LeavesGraphicsExtension (findSprite was always null since CatAtlas retirement); clean stale imports (ConcurrentHashMap, CatAtlasManager, CatSprite, CatFrame); update plan doc ticking off all Stage A/B/C/D items
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.7.1
0.7.1.1Релиз1.7.10 · 18 августа 2026 г.
CatFrame - 0.7.1.1
What is changed?
Change version number from previous to 0.7.1.1
➕Add:
- Phase B: build the catframe:ui atlas body — add assets/catframe/atlases/ui.json (directory sources per gui subfolder), extract shared definition-driven collection into AtlasDefinitionLoader.collectRefs (reused by CatAtlasManager and the new UiTextureAtlasManager), add mipmapEnabled switch to CatAtlas (UI mode: no mipmap per tri-domain red line), drive Pre collect / On stitch+upload+TextureManager-register / Post publish via GuiTextureStitchEvent, hook UI animation tick into ClientOverlayHandler and register the manager in ClientProxy
🔧Fix:
- Rename UI atlas definition ui.json to gui.json (catframe:ui -> catframe:gui) across code/docs; migrate UI texture consumers to atlas lookup: TextureStretching auto-routes catframe:gui textures to atlas sprite UV with beginBatch/endBatch batched submits, UiTextureAtlasManager.resolve/toSpritePath lookup entry, TooltipRenderUtil batches background+frame layers into one bind+draw; tick off stages A/B/C in the plan doc
- Fix stale class-level JavaDoc on WorldRenderHandler to match the Hot Update rollback semantics: describe the vanilla-backend no-op gate and the CatAtlas-backend flush branch instead of the removed always-bind-CatAtlas behavior
❗❗❗Deprecated:
- Retire CatAtlas blocks/items backend per tri-domain architecture (phase A): remove catAtlasBackend switch from CatFrameConfig, shrink CatAtlasManager to vanilla-backend output (registerDefinedSprites + missing fallbacks), delete WorldRenderHandler/WorldRenderBuffer and the flushWorld chain in FeatureRenderDispatcher, fix BLOCK_WORLD to flushInline-only, add GuiTextureStitchEvent (Pre/On/Post) bridged by GuiTextureStitchHandler in ClientProxy, sync outdated JavaDocs across QuadWriter/UniformRenderPipeline/RenderCommandBuffers/LeavesGraphicsExtension/VanillaTextureTracker
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.7.1.1
0.7.0-hotfixРелиз1.7.10 · 17 августа 2026 г.
CatFrame - 0.7.0-hotfix
What is changed?
Change version number from previous to 0.7.0-hotfix
➕Add:
- No new features
🔧Fix:
- Hot Update rollback: default world rendering back to vanilla TextureMap backend. Add experimental catAtlasBackend config switch (default off); feed data-driven atlas collection into vanilla TextureMap via registerIcon at Pre stage; reroute BLOCK_WORLD to flushInline when switch is off; make TextureSlots.findIcon backend-aware accepting vanilla IIcon; gate TexturesStitch stitch/registerDefinedSprites by switch; add Post-stage diagnostic comparing registered keys vs mapUploadedSprites; rename CatStitcher/CatStitchException to TextureStitcher/TextureStitchException; bump version to 0.7.0-hotfix. CatAtlas remains dormant and switchable back.
❗❗❗Deprecated:
- No deprecations
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.7.0-hotfix
0.7.0Релиз1.7.10 · 16 августа 2026 г.
CatFrame - 0.7.0
What is changed?
Change version number from previous to 0.7.0
➕Add:
- Add atlas degrade guard, decode diagnostics and GL state hygiene: skip atlas when >50% sprites fail to decode (vanilla fallback), log real decode exceptions with full ResourceLocation, publish iconName alias keys and query them in TextureSlots.findIcon to avoid vanilla-UV space mismatch, restore GL_UNPACK_ALIGNMENT after upload
- Implement M1 custom texture atlas system: add CatSprite (IIcon) / CatStitcher (26.1.2 bin packing) / CatAtlas (CPU assembly + GL upload) / CatAtlasManager (orchestration + publish + fallback); hook CatAtlasManager.stitch() into TextureStitchEvent.Pre after ModelManagerDataLoader.init(); dual-Post idempotent publish into textureIcons before bake barrier; CatSprite branches in TextureSlots.isBlockAtlas and ItemModelGenerator.bakeSideFaces; rebind built-in render groups to catframe:atlas/blocks|items on upload success
- add bingo plushy, modify bluey plushy item
🔧Fix:
- Fix iron bars Z-fighting with vanilla-style multipart (post only when isolated); change bow use_duration to raw elapsed ticks with range_dispatch scale 0.05 so the pull animation reaches pulling_1/pulling_2; add powered property (meta bit 8) to comparator state definitions, mirror comparator torch geometry to match 1.7.10 RenderBlocks (single output torch at north, sunken in compare mode; pair input torches at south, lit when powered), add template_comparator_subtract, fix comparator side texture to stone_slab_side and expand both comparator blockstates to 16 facing/mode/powered variants with corrected rotation table; include prior torch/hopper/ladder/rail asset cleanups
- Fix missingno sprite in CatSprite.missing(): use 8x8 cells (x>>3) forming the vanilla 2x2 checkerboard (magenta top-left/bottom-right, black otherwise) instead of the previous 2px-cell 8x8 grid with inverted colors
- Add minecraft namespace fallback for unqualified texture references in ModelResolver.resolveTextureVariables and prefix grass_block.json textures with minecraft: to fix missingno rendering
- Add camera-distance painter sorting for translucent world batches (W1): sort blend groups far-to-near in flushWorldGroup, stable TimSort with per-submit square distance; fix stale UniformRenderPipeline JavaDoc; add design doc covering architecture, lookup semantics, SWOT and file index
- Make the CatAtlas the single texture source for world rendering too: BLOCK_WORLD submissions are now collected into a thread-safe WorldRenderBuffer and flushed at RenderWorldEvent.Post by the new FeatureRenderDispatcher.flushWorld, which binds the CatAtlas (block_atlas_solid/translucent) and merges all submissions into one Tessellator batch per group (2 draw calls per frame) with GL state isolated via push/pop. resolveWorldIcon is removed - world quads sample CatSprite UVs directly against the CatAtlas, so a texture-table miss renders the CatAtlas missing purple-black square exactly like item rendering; the destroy overlay keeps its vanilla atlas batch (destroy_stage icons live in the vanilla atlas space). Translucent blocks are grouped by getRenderBlockPass().
- Fix unresolved textures rendering as garbled UVs instead of missingno: findIcon in TextureSlots now accepts only CatFrame data-driven CatSprites from the texture table, skips leftover vanilla values (missingImage/empty sprites whose UVs belong to the vanilla atlas space), and drops the vanilla-atlas fallback entirely. A table miss now returns the owning CatAtlas built-in missing sprite (purple-black square, CatAtlas-space UVs) directly, so item rendering bound to a CatAtlas samples the true missingno.
- Remove the texture compatibility layer: atlas JSON definitions are now the single source of truth. Drop resolveActualPath candidate probing, canonical/alias dual-key publishing and model-driven forced stitching; model references must match definition outputs literally. Any unresolved texture now returns missingno (vanilla missing semantics) with an explicit texture-error report, never transparent or auto-corrected. Every atlas keeps a built-in missing sprite for final fallback; vanilla atlas key conversion (toVanillaBaseKey) is restored to plain 1.7.10 base-path semantics.
- Refactor: retire the hard-coded texture prefix compatibility layer (resolveTextureName). CatAtlas identity is now data-driven via CatSpriteLoader.resolveActualPath (candidate PNG probing, cached per stitch); merge/publish keys are actual resource paths with dual-key publication (canonical + every original spelling); vanilla registry/query keys derive from the resolved path (toVanillaKey) with a lightweight base-key fallback (toVanillaBaseKey); TextureSlots.findIcon drops the alias branch; LeavesGraphicsExtension reuses toVanillaKey; reformat compass.json
- Fix model texture references to real 1.7.10 vanilla names (rails, crops, stems, cocoa, stairs, pressure plates, dispenser vertical, grass snow, wooden hoe, tripwire hook, writable book, dark oak sapling), fix bingo texture slot #0 to #bingo, reformat compact item/block jsons, remove orphan item models (dye, enchantment_table, end_frame)
- Fix item icon leaks from singular/plural texture reference races: skip leftover vanilla missingImage in TextureSlots.findIcon level-1 lookup, publish normalized alias keys and normalized spritesByIconName reverse-lookup keys in CatAtlasManager so failed decodes no longer collapse onto the missingno key
- Fix item-model bake race: normalize element rotation into local vars in JsonModelBake.bakeElement (stop mutating the shared cached Element.rotation, null-guard axis) and isolate per-task failures in AsyncBakePipeline so one bad model no longer discards the whole bake round. Prevents item models from vanishing or rendering garbled geometry.
- Fix ItemBlock item-render UV mismatch: findIcon prefers CatAtlas CatSprite before vanilla fallback (CatAtlasManager.findSprite reverse map + warn logs), leaves _opaque override uses CatSprite in item phases, raise BakedModelCache cap 2048->3200, fix items/log.json fallback to oak_log
- Fix bingo model texture refs: replace Blockbench absolute paths with namespaced catframe:items/bingo so the sprite resolves to assets/catframe/textures/items/bingo.png instead of falling to minecraft namespace (missingno)
- Fix directory source prefix to plural form (blocks/, items/) matching 1.7.10 model references: per Wiki the prefix is prepended verbatim, so source=items + prefix=items/ yields minecraft:items/apple; also sync AtlasDecoder javadoc (atlases/ dir) and design doc
- Align atlas definitions with the vanilla Wiki format: definitions live at assets//atlases/.json (plural dir) and atlas ids become minecraft:blocks / minecraft:items; rewrite unstitch source to the divisor_x/y + regions[] form (per-region sprite/x/y/width/height block coords); rewrite paletted_permutations to plain namespace-id permutation values plus separator; fix PalettedPermutationsSource readPixels 1.7.10 plural-folder fallback; delete the never-consumed catframe:item ghost definition; sync design doc
- Implement M2-M4 of custom texture atlas: AtlasDecoder sources (directory/filter/single/unstitch/paletted_permutations), ResourcePackEnumerator pack traversal, CatSpriteLoader parallel PNG+mcmeta animation decode, CatSprite frame state machine, CatAtlas animation region glTexSubImage2D re-upload with mip rebuild, CatAtlasManager definition-driven merge (model-first dedup + filter) and tick hook in ClientOverlayHandler; singularize definition JSON prefixes
- Fix item rendering bilinear blur: CatAtlas MAG_FILTER to GL_NEAREST, add CPU box-filter mipmap chain with GL_NEAREST_MIPMAP_LINEAR min filter, set GL_TEXTURE_MAX_LEVEL
- Fix world-rendering UV space mismatch: publish replaced baked quad icons with CatSprites (CatAtlas UV space) while BLOCK_WORLD/BLOCK_DESTROY batches still bind the vanilla blocks atlas via flushInline, causing blurred/blank textures. Keep a vanilla sprite snapshot in VanillaTextureTracker before publish and remap CatSprite icons back to the vanilla sprite space in QuadWriter.writeBlockQuads (resolveWorldIcon)
❗❗❗Deprecated:
- remove the compact base to the catframe compact mod
- Migrate all legacy UI component render entries to the Renderable-based pipeline: replace deprecated render(int,int,float) overrides with renderWidget(GuiGraphicsExtractor,...) across AbstractButton/Button/TabButton/CyclingButton/CyclingArea/GuiButtonAdapter/AbstractSelectionList/ScrollableLayout/WaitingPanel/TitleOverlay/ActionBarOverlay/contextual bar components and the Toast system; make Toast extend Renderable, drive toasts via extractRenderState in ToastManager, propagate GuiGraphicsExtractor through renderBackground/renderListItems/renderItem hooks and drop the deprecated render bridge in AbstractComponent
- Remove deprecated BLOCK_GUI and ITEM_HAND render phases: drop dead GUI branches in QuadWriter.writeBlockQuads and UniformRenderPipeline.renderBlockQuads, simplify isBlockPhase/isItemGlintPhase/isHandPhase/getDisplayKey, remove BLOCK_GUI tint case, update stale comments/examples; also include build-touched gradle.properties modVersion bump
- Delete the compatibility layer to the compat mod
- Remove the legacy
block/foo/item/foo/blocks/foo/items/foocompatibility util layer
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.7.0
⚠️ Warning: This version introduced the modern data-driven texture map and stitch. And make it as the only source of all the model of item and the block world render. May cause OptiFine / Angelica / SwanSong / ShaderMods broke with this wersion.
0.6.7Релиз1.7.10 · 12 августа 2026 г.
CatFrame - 0.6.7
What is changed?
Change version number from previous to 0.6.7
➕Add:
- Add model_mappings.json resource-pack override support in ResourcePackModelDetector: scan per-namespace pack overrides via content comparison, merge into loadedMappings as whole-file replacement, restore classpath baseline on pack removal, and trigger full re-registration when mapping overrides appear or vanish.
🔧Fix:
- No fixes
❗❗❗Deprecated:
- remove bundle thing to the Dmod unofficial
- Remove Bundle placeholder registrations (bundle/has_selected_item, bundle/fullness) from ItemPropertyRegistry and the minecraft:bundle/selected_item type check from ItemStateNode; drop Bundle references from tooltip component comments (TooltipComponent, ClientTooltipComponent, Tooltip, GuiGraphicsExtractor)
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.6.7
0.6.6Релиз1.7.10 · 10 августа 2026 г.
CatFrame - 0.6.6
What is changed?
Change version number from previous to 0.6.6
➕Add:
- No new features
🔧Fix:
- Fix enchantment glint overflow over transparent texels: QuadWriter.writeGlintQuads now skips solid-color side quads, whose depth is written by the second untextured pass with forced-opaque alpha (no cutout). Replaying them under GL_EQUAL painted glint wherever side projections landed, including transparent texels on rotated hand-held flat items. Glint now matches the opaque texel contour of the normal pass, same as vanilla 1.7.10. Updated JavaDoc in QuadWriter and GuiGraphicsExtractor.
- Fix held-item brightness: sample world light at the player's position (getLightBrightnessForSkyBlocks) for ITEM_HAND_FIRST_PERSON/THIRD_PERSON phases instead of hardcoded full-bright 15728880, so held items render fully black in completely dark areas; update stale javadoc in RenderPhase.isHandPhase
- Fix GUI shading by computing screen-space directional light from the display-rotated face normal, keeping display.gui.rotation at 225; block models now show top-brightest / left-0.8 / right-0.6 regardless of rotation, 2D items (gui_light=front) stay full-bright
- Fix GUI block light by rotating display to 135; reorder quad vertices after X/Y rotation (FaceInfo winding) so AO maps to correct corners on rotated logs; skip GL_LIGHTING for hand-held item phases
❗❗❗Deprecated:
- No deprecations
0.6.5Релиз1.7.10 · 9 августа 2026 г.
CatFrame - 0.6.5
What is changed?
Change version number from previous to 0.6.5
➕Add:
- Add group-claim SPI: IRenderGroupHandler (claim + flush with RenderSubmitView) in model.render.api with OIT boundary contract (collector/executor/gatekeeper, inline never claimable, background-thread-zero-GL), RenderGroupHandlerRegistry with slot arbitration snapshot, FeatureRenderDispatcher extracts flushGroup and falls back to built-in path on no-handler/exception
- Replace RenderType enum with runtime RenderTypeRegistry (CopyOnWriteArrayList + volatile sorted snapshot, explicit sortKey 0/1/2/3 preserving flush order), RenderSubmit.type now RenderTypeKey entry reference, SubmitNodeStorage EnumMap to HashMap keyed by registry entries, adapt FeatureRenderDispatcher/UniformRenderPipeline/RenderCommandBuffers
- Systemize render extension chain with priority contract (DEFAULT_PRIORITY=0, BUILTIN_PRIORITY_BASE=-1000, stable sorted insert) and per-extension Throwable isolation in ModelRenderRegistry; ThreadLocal state in DisplayTransform/GuiLight/Tint extensions; ConcurrentHashMap data sources (textureIcons, spriteCache, stateBlockData, loadedItemStates, ModelRegistry registries, LeavesGraphics maps); drop redundant bindTexture in flushInline; add isEscapeKeyPressed/isSpaceKeyPressed to KeyTypedEvent
- Add section 8: GuiGraphicsExtractor dependency graph review (DC1-DC7) -- cover 19 dependents and 18 imports, identify bidirectional coupling with FeatureRenderDispatcher, MATRIX_BUFFER duplication, ItemGuiDrawer abstraction inversion, TooltipComponent silent discard, hasFoil hot-path NBT chain, EntityPipRenderer scissor contract drift, and OversizedItemPipRenderer empty shell delegation
🔧Fix:
- Add ItemPhysic compat: replay its physical drop rotation in RenderJsonItemModel ENTITY render while keeping CatFrame JSON model and ground display transform; new compact.itemphysic.ItemPhysicCompact resolves ClientPhysic.tick/ItemDummyContainer.rotateSpeed/ServerPhysic.getFluid reflectively with zero compile-time dependency
- Fix destroy decal UV orientation in QuadWriter: vertical faces now use V = 16 - y16 (vanilla binds V(0) to the top edge, previously upside down) and NORTH/EAST faces flip U (16 - x16 / 16 - z16) so the decal wraps continuously around the block perimeter, matching vanilla renderFace semantics
- Add BLOCK_DESTROY phase with destroy overlay rendering: BlockDestroyExtension (full-bright white decal via ThreadLocal icon injection), block-space decal UV projection in QuadWriter, BLOCK_ATLAS_DESTROY render type registration, resolveBlockModel extraction plus renderBlockDestroy in RenderDispatcher, renderBlockUsingTexture mixin interception, and GuiLightExtension gating on the destroy pass; bump mod version to 0.6.5-ThreadSafe
- Add block destroy texture rendering for CatFrame pipeline: new BLOCK_DESTROY phase and BlockDestroyExtension (icon override, full brightness, white color), block-space projected UV branch in QuadWriter, renderBlockDestroy in RenderDispatcher sharing the resolved model paths, and MixinRenderBlocks injection into renderBlockUsingTexture to intercept the vanilla destroy pass
❗❗❗Deprecated:
- Remove ItemPhysic crash-on-load detection (revert of the rejectItemPhysic part of 2933964d): drop CompactBase.rejectItemPhysic()/classExists and its preInit call in CatFrame; keep the ItemPhysicCompat removal intact. Compatibility with the Kotmatross Mixin fork is deferred to a future combined plan
- Revert ItemPhysic compat (6e7c007c) and reject the mod outright: CompactBase.rejectItemPhysic() crashes in CatFrame.preInit when ItemPhysic is loaded (Loader probe + class-existence fallback) since its ASM doRender takeover structurally conflicts with CatFrame's IItemRenderer dropped-item render
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.6.5
0.6.4Релиз1.7.10 · 7 августа 2026 г.
CatFrame - 0.6.4
What is changed?
Change version number from previous to 0.6.4
➕Add:
- Add IngameIME compat: IgIMECompact bridges CatFrame text-area focus (onControlFocus) and caret sync (setCaretPos) into IngameIME pipeline, with IMEInputBackport mutual exclusion; IngameIME dev jar moved to compileOnly in build.gradle
- Refactor ImageButton/ImageWidget to use WidgetSprites: add ImageButton (26.1.2 counterpart) and remove misspelled ImageButon, refactor ImageWidget into abstract base with Texture/Sprite variants.
- Add SpriteIconedButton component (26.1.2 SpriteIconButton counterpart): WidgetSprites four-state sprite collection (enabled/disabled/highlighted/highlightedDisabled), CenteredIcon/TextAndIcon layout variants, builder with sprite/tooltip/size config
🔧Fix:
- Fix keyboard input chain break and mixin side filtering: Screen.keyTyped now forwards to the focused child via dispatchKeyTyped after Esc handling (legacy keyTyped bridge in ScreenKeyboardInput reaches leaf components like edit boxes and buttons); CatFrameMixinPlugin.getMixins() returns null so mixins.catframe.json client list side filtering takes effect, preventing dedicated server crash from loading client-only MixinGuiScreen; reflow IgIMECompact javadoc.
- Fix S3: vanilla FontRenderer getStringWidth only accounts for bold (section-l), not italic (section-o) -- verified against source of vanilla
- Fix scrollbar drag runaway: use relative mouse delta (mouseY - lastDragY) instead of absolute mouseY when accumulating scroll amount in AbstractScrollArea.mouseDrag, matching the high-version Minecraft AbstractScrollArea formula scrollAmount + dy * yDragScale; record drag-start Y in updateScrolling and keep the baseline in sync on edge branches
❗❗❗Deprecated:
- deprecate AbstractComponent.render legacy entry
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.6.4
Комментарии
Загружаем…