import React, { createContext, useContext } from 'react' // Default texture source: zardoy/mc-assets gh-pages export const MC_ASSETS_BASE = 'https://raw.githubusercontent.com/zardoy/mc-assets/refs/heads/gh-pages' export const MC_ITEMS_BASE = `${MC_ASSETS_BASE}/1.21.11/textures` export const MC_GUI_BASE = MC_ASSETS_BASE export interface TextureConfig { baseUrl: string /** * Resolve item texture URL. * When `item.textureKey` is set it is used as the path relative to the items texture root * (e.g. `"item/dye_black"` → `/item/dye_black.png`). * Otherwise falls back to `name` then `type`. */ getItemTextureUrl(item: { type: number; name?: string; textureKey?: string }): string getBlockTextureUrl(item: { type: number; name?: string }): string /** Supports full mc-assets paths (e.g. "1.21.11/textures/gui/container/anvil.png") */ getGuiTextureUrl(path: string, version?: string): string } function buildDefault(base: string): TextureConfig { const isRemote = base.startsWith('http') // For remote default: use standardized versioned paths from mc-assets. const guiBase = isRemote ? MC_GUI_BASE : base return { baseUrl: base, getItemTextureUrl({ type, name, textureKey }) { const root = isRemote ? MC_ITEMS_BASE : base if (textureKey) return `${root}/${textureKey}.png` if (name) return `${root}/item/${name}.png` return `${root}/item/${type}.png` }, getBlockTextureUrl({ type, name }) { const root = isRemote ? MC_ITEMS_BASE : base if (name) return `${root}/block/${name}.png` return `${root}/block/${type}.png` }, getGuiTextureUrl(path: string, version = '1.16.4') { if (isRemote) { // New format: "1.21.11/textures/gui/container/anvil.png" if (path.endsWith('.png') && path.includes('/textures/')) { return `${guiBase}/${path}` } // Backward compatibility with legacy "gui/container/anvil" + version fields. return `${guiBase}/${version}/textures/${path}.png` } return `${base}/textures/${path}.png` }, } } const defaultTextureConfig = buildDefault(MC_ITEMS_BASE) const TextureContext = createContext(defaultTextureConfig) export function useTextures(): TextureConfig { return useContext(TextureContext) } interface TextureProviderProps { config?: Partial baseUrl?: string children: React.ReactNode } export function TextureProvider({ config, baseUrl, children }: TextureProviderProps) { const base = baseUrl ?? config?.baseUrl ?? MC_ITEMS_BASE const merged: TextureConfig = { ...buildDefault(base), ...config, } return {children} } export { defaultTextureConfig }