diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/AbstractTexturePack.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/AbstractTexturePack.cpp')
| -rw-r--r-- | Minecraft.Client/AbstractTexturePack.cpp | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/Minecraft.Client/AbstractTexturePack.cpp b/Minecraft.Client/AbstractTexturePack.cpp new file mode 100644 index 00000000..a4eb7f01 --- /dev/null +++ b/Minecraft.Client/AbstractTexturePack.cpp @@ -0,0 +1,399 @@ +#include "stdafx.h" +#include "Textures.h" +#include "AbstractTexturePack.h" +#include "..\Minecraft.World\InputOutputStream.h" +#include "..\Minecraft.World\StringHelpers.h" + +AbstractTexturePack::AbstractTexturePack(DWORD id, File *file, const wstring &name, TexturePack *fallback) : id(id), name(name) +{ + // 4J init + textureId = -1; + m_colourTable = NULL; + + + this->file = file; + this->fallback = fallback; + + m_iconData = NULL; + m_iconSize = 0; + + m_comparisonData = NULL; + m_comparisonSize = 0; + + // 4J Stu - These calls need to be in the most derived version of the class + //loadIcon(); + //loadDescription(); +} + +wstring AbstractTexturePack::trim(wstring line) +{ + if (!line.empty() && line.length() > 34) + { + line = line.substr(0, 34); + } + return line; +} + +void AbstractTexturePack::loadIcon() +{ +#ifdef _XBOX + // 4J Stu - Temporary only + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/TexturePackIcon.png"); + + UINT size = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_iconData, &size); + m_iconSize = size; +#endif +} + +void AbstractTexturePack::loadComparison() +{ +#ifdef _XBOX + // 4J Stu - Temporary only + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DefaultPack_Comparison.png"); + + UINT size = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_comparisonData, &size); + m_comparisonSize = size; +#endif +} + +void AbstractTexturePack::loadDescription() +{ + // 4J Unused currently +#if 0 + InputStream *inputStream = NULL; + BufferedReader *br = NULL; + //try { + inputStream = getResourceImplementation(L"/pack.txt"); + br = new BufferedReader(new InputStreamReader(inputStream)); + desc1 = trim(br->readLine()); + desc2 = trim(br->readLine()); + //} catch (IOException ignored) { + //} finally { + // TODO [EB]: use IOUtils.closeSilently() + // try { + if (br != NULL) + { + br->close(); + delete br; + } + if (inputStream != NULL) + { + inputStream->close(); + delete inputStream; + } + // } catch (IOException ignored) { + // } + //} +#endif +} + +void AbstractTexturePack::loadName() +{ +} + +InputStream *AbstractTexturePack::getResource(const wstring &name, bool allowFallback) //throws IOException +{ + app.DebugPrintf("texture - %ls\n",name.c_str()); + InputStream *is = getResourceImplementation(name); + if (is == NULL && fallback != NULL && allowFallback) + { + is = fallback->getResource(name, true); + } + + return is; +} + +// 4J Currently removed due to override in TexturePack class +//InputStream *AbstractTexturePack::getResource(const wstring &name) //throws IOException +//{ +// return getResource(name, true); +//} + +void AbstractTexturePack::unload(Textures *textures) +{ + if (iconImage != NULL && textureId != -1) + { + textures->releaseTexture(textureId); + } +} + +void AbstractTexturePack::load(Textures *textures) +{ + if (iconImage != NULL) + { + if (textureId == -1) + { + textureId = textures->getTexture(iconImage); + } + glBindTexture(GL_TEXTURE_2D, textureId); + textures->clearLastBoundId(); + } + else + { + // 4J Stu - Don't do this + //textures->bindTexture(L"/gui/unknown_pack.png"); + } +} + +bool AbstractTexturePack::hasFile(const wstring &name, bool allowFallback) +{ + bool hasFile = this->hasFile(name); + + return !hasFile && (allowFallback && fallback != NULL) ? fallback->hasFile(name, allowFallback) : hasFile; +} + +DWORD AbstractTexturePack::getId() +{ + return id; +} + +wstring AbstractTexturePack::getName() +{ + return texname; +} + +wstring AbstractTexturePack::getWorldName() +{ + return m_wsWorldName; +} + +wstring AbstractTexturePack::getDesc1() +{ + return desc1; +} + +wstring AbstractTexturePack::getDesc2() +{ + return desc2; +} + +wstring AbstractTexturePack::getAnimationString(const wstring &textureName, const wstring &path, bool allowFallback) +{ + return getAnimationString(textureName, path); +} + +wstring AbstractTexturePack::getAnimationString(const wstring &textureName, const wstring &path) +{ + wstring animationDefinitionFile = textureName + L".txt"; + + bool requiresFallback = !hasFile(L"\\" + textureName + L".png", false); + + InputStream *fileStream = getResource(L"\\" + path + animationDefinitionFile, requiresFallback); + + //Minecraft::getInstance()->getLogger().info("Found animation info for: " + animationDefinitionFile); +#ifndef _CONTENT_PACKAGE + wprintf(L"Found animation info for: %ls\n", animationDefinitionFile.c_str() ); +#endif + InputStreamReader isr(fileStream); + BufferedReader br(&isr); + + wstring result = L""; + + wstring line = br.readLine(); + while (!line.empty()) + { + line = trimString(line); + if (line.length() > 0) + { + result.append(L","); + result.append(line); + } + line = br.readLine(); + } + delete fileStream; + + return result; +} + +BufferedImage *AbstractTexturePack::getImageResource(const wstring& File, bool filenameHasExtension /*= false*/, bool bTitleUpdateTexture /*=false*/, const wstring &drive /*=L""*/) +{ + const char *pchTexture=wstringtofilename(File); + app.DebugPrintf("AbstractTexturePack::getImageResource - %s, drive is %s\n",pchTexture, wstringtofilename(drive)); + + return new BufferedImage(TexturePack::getResource(L"/" + File),filenameHasExtension,bTitleUpdateTexture,drive); +} + +void AbstractTexturePack::loadDefaultUI() +{ +#ifdef _XBOX + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + // Load new skin + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/skin_Minecraft.xur"); + + XuiFreeVisuals(L""); + app.LoadSkin(szResourceLocator,NULL);//L"TexturePack"); + //CXuiSceneBase::GetInstance()->SetVisualPrefix(L"TexturePack"); + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#else + ui.ReloadSkin(); +#endif +} + +void AbstractTexturePack::loadColourTable() +{ + loadDefaultColourTable(); + loadDefaultHTMLColourTable(); +} + +void AbstractTexturePack::loadDefaultColourTable() +{ + // Load the file + File coloursFile(AbstractTexturePack::getPath(true).append(L"res/colours.col")); + + if(coloursFile.exists()) + { + DWORD dwLength = coloursFile.length(); + byteArray data(dwLength); + + FileInputStream fis(coloursFile); + fis.read(data,0,dwLength); + fis.close(); + if(m_colourTable != NULL) delete m_colourTable; + m_colourTable = new ColourTable(data.data, dwLength); + + delete [] data.data; + } + else + { + app.DebugPrintf("Failed to load the default colours table\n"); + app.FatalLoadError(); + } +} + +void AbstractTexturePack::loadDefaultHTMLColourTable() +{ +#ifdef _XBOX + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + // Try and load the HTMLColours.col based off the common XML first, before the deprecated xuiscene_colourtable + wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/HTMLColours.col"); + BYTE *data; + UINT dataLength; + if(XuiResourceLoadAll(szResourceLocator, &data, &dataLength) == S_OK) + { + m_colourTable->loadColoursFromData(data,dataLength); + + XuiFree(data); + } + else + { + wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); + HXUIOBJ hScene; + HRESULT hr = XuiSceneCreate(szResourceLocator,L"xuiscene_colourtable.xur", NULL, &hScene); + + if(HRESULT_SUCCEEDED(hr)) + { + loadHTMLColourTableFromXuiScene(hScene); + } + } +#else + if(app.hasArchiveFile(L"HTMLColours.col")) + { + byteArray textColours = app.getArchiveFile(L"HTMLColours.col"); + m_colourTable->loadColoursFromData(textColours.data,textColours.length); + + delete [] textColours.data; + } +#endif +} + +#ifdef _XBOX +void AbstractTexturePack::loadHTMLColourTableFromXuiScene(HXUIOBJ hObj) +{ + HXUIOBJ child; + HRESULT hr = XuiElementGetFirstChild(hObj, &child); + + while(HRESULT_SUCCEEDED(hr) && child != NULL) + { + LPCWSTR childName; + XuiElementGetId(child,&childName); + m_colourTable->setColour(childName,XuiTextElementGetText(child)); + + //eMinecraftTextColours colourIndex = eTextColor_NONE; + //for(int i = 0; i < (int)eTextColor_MAX; i++) + //{ + // if(wcscmp(HTMLColourTableElements[i],childName)==0) + // { + // colourIndex = (eMinecraftTextColours)i; + // break; + // } + //} + + //LPCWSTR stringValue = XuiTextElementGetText(child); + + //m_htmlColourTable[colourIndex] = XuiTextElementGetText(child); + + hr = XuiElementGetNext(child, &child); + } +} +#endif + +void AbstractTexturePack::loadUI() +{ + loadColourTable(); + +#ifdef _XBOX + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#endif +} + +void AbstractTexturePack::unloadUI() +{ + // Do nothing +} + +wstring AbstractTexturePack::getXuiRootPath() +{ + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + // Load new skin + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/"); + return szResourceLocator; +} + +PBYTE AbstractTexturePack::getPackIcon(DWORD &dwImageBytes) +{ + if(m_iconSize == 0 || m_iconData == NULL) loadIcon(); + dwImageBytes = m_iconSize; + return m_iconData; +} + +PBYTE AbstractTexturePack::getPackComparison(DWORD &dwImageBytes) +{ + if(m_comparisonSize == 0 || m_comparisonData == NULL) loadComparison(); + + dwImageBytes = m_comparisonSize; + return m_comparisonData; +} + +unsigned int AbstractTexturePack::getDLCParentPackId() +{ + return 0; +} + +unsigned char AbstractTexturePack::getDLCSubPackId() +{ + return 0; +}
\ No newline at end of file |
