From 2dfad97503480edddc8ca5f9e024e42a2efce15e Mon Sep 17 00:00:00 2001 From: piebot Date: Tue, 14 Jul 2026 19:52:30 +0300 Subject: [PATCH] wip_feat(PS3): Implement SPU variants for a portion of TU19's blocks crashes at a stack overflow, cant be assed to fix it atm --- .../Common/XUI/XUI_TutorialPopup.cpp | 2 +- .../Leaderboards/DurangoStatsDebugger.cpp | 42 +++---- Minecraft.Client/Minecraft.Client.vcxproj | 60 +++------- .../Minecraft.Client.vcxproj.filters | 42 +++++-- .../PS3/PS3Extras/C4JSpursJob.cpp | 3 +- .../ChunkUpdate/ActivatorRailTile_SPU.h | 21 ++++ .../ChunkUpdate/BasePressurePlateTile_SPU.cpp | 41 +++++++ .../ChunkUpdate/BasePressurePlateTile_SPU.h | 16 +++ .../SPU_Tasks/ChunkUpdate/BaseRailTile_SPU.h | 31 +++++ .../SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h | 2 +- .../ChunkUpdate/ChunkRebuildData.cpp | 43 +++++-- .../SPU_Tasks/ChunkUpdate/ChunkRebuildData.h | 2 +- .../ChunkUpdate/ChunkUpdate.spu.vcxproj | 2 +- .../ChunkUpdate.spu.vcxproj.filters | 6 +- .../PS3/SPU_Tasks/ChunkUpdate/ClothTile_SPU.h | 11 -- .../SPU_Tasks/ChunkUpdate/ColoredClay_SPU.h | 11 ++ .../ChunkUpdate/DaylightDetectorTile_SPU.h | 21 ++++ .../ChunkUpdate/DetectorRailTile_SPU.h | 4 +- .../PS3/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h | 4 +- .../SPU_Tasks/ChunkUpdate/DropperTile_SPU.h | 37 ++++++ .../PS3/SPU_Tasks/ChunkUpdate/FireTile_SPU.h | 2 +- .../SPU_Tasks/ChunkUpdate/HayBlockTile_SPU.h | 19 ++++ .../ChunkUpdate/HugeMushroomTile_SPU.h | 4 +- .../PS3/SPU_Tasks/ChunkUpdate/Material_SPU.h | 2 +- .../ChunkUpdate/PoweredRailTile_SPU.h | 21 ++++ .../ChunkUpdate/PressurePlateTile_SPU.cpp | 41 ------- .../ChunkUpdate/PressurePlateTile_SPU.h | 30 ++--- .../PS3/SPU_Tasks/ChunkUpdate/RailTile_SPU.h | 57 ++-------- .../ChunkUpdate/RotatedPillarTile_SPU.h | 45 ++++++++ .../PS3/SPU_Tasks/ChunkUpdate/SkullTile_SPU.h | 2 +- .../SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp | 2 +- .../ChunkUpdate/StoneMonsterTile_SPU.h | 6 +- .../SPU_Tasks/ChunkUpdate/StoneSlabTile_SPU.h | 4 +- .../PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp | 70 +++++++----- .../PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.h | 106 +++++++++++++----- .../PS3/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h | 33 ++---- .../PS3/SPU_Tasks/ChunkUpdate/WallTile_SPU.h | 2 +- .../WeightedPressurePlateTile_SPU.h | 22 ++++ .../ChunkUpdate/WoolCarpetTile_SPU.h | 2 +- .../PS3/SPU_Tasks/ChunkUpdate/WoolTile_SPU.h | 11 ++ .../ObjFiles/Release/ChunkUpdate.ppu.o | Bin 161792 -> 164224 bytes 41 files changed, 574 insertions(+), 308 deletions(-) create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ActivatorRailTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.cpp create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BaseRailTile_SPU.h delete mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ClothTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ColoredClay_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DaylightDetectorTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DropperTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HayBlockTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PoweredRailTile_SPU.h delete mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.cpp create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RotatedPillarTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WeightedPressurePlateTile_SPU.h create mode 100644 Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolTile_SPU.h diff --git a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp index 98951d81..b7ebc17e 100644 --- a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp +++ b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp @@ -402,7 +402,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS } else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) { - m_pCraftingPic->SetIcon(m_iPad, Tile::rock_Id,0,1,10,31,false); + m_pCraftingPic->SetIcon(m_iPad, Tile::stone_Id,0,1,10,31,false); } else { diff --git a/Minecraft.Client/Durango/Leaderboards/DurangoStatsDebugger.cpp b/Minecraft.Client/Durango/Leaderboards/DurangoStatsDebugger.cpp index 68d2bb50..1c896968 100644 --- a/Minecraft.Client/Durango/Leaderboards/DurangoStatsDebugger.cpp +++ b/Minecraft.Client/Durango/Leaderboards/DurangoStatsDebugger.cpp @@ -112,22 +112,22 @@ DurangoStatsDebugger *DurangoStatsDebugger::Initialize() sp->addArgs(1, Tile::dirt_Id, 0); // works sp->addArgs(2, Tile::dirt_Id, 0); // works - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 0); // fixed (+ach 'Rainbow Collection') - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 1); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 2); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 3); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 4); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 5); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 6); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 7); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 8); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 9); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 10); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 11); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 12); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 13); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 14); - sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::cloth_Id, 15); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 0); // fixed (+ach 'Rainbow Collection') + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 1); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 2); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 3); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 4); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 5); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 6); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 7); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 8); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 9); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 10); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 11); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 12); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 13); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 14); + sp->addArgs(DsItemEvent::eAcquisitionMethod_Pickedup, Tile::wool_Id, 15); out->m_stats.push_back(sp); @@ -166,20 +166,20 @@ DurangoStatsDebugger *DurangoStatsDebugger::Initialize() sp = new StatParam(L"BlockBroken.BlockId.*"); sp->addArgs( Tile::dirt_Id ); - sp->addArgs( Tile::rock_Id ); + sp->addArgs( Tile::stone_Id ); sp->addArgs( Tile::emeraldOre_Id ); out->m_stats.push_back(sp); sp = new StatParam(L"BlockBroken.BlockId.*.BlockAux.*"); sp->addArgs( Tile::dirt_Id, 0 ); - sp->addArgs( Tile::rock_Id, 0 ); + sp->addArgs( Tile::stone_Id, 0 ); out->m_stats.push_back(sp); sp = new StatParam(L"BlockBroken.DifficultyLevelId.*.BlockId.*"); sp->addArgs( 1, Tile::dirt_Id ); sp->addArgs( 2, Tile::dirt_Id ); - sp->addArgs( 1, Tile::rock_Id ); - sp->addArgs( 2, Tile::rock_Id ); + sp->addArgs( 1, Tile::stone_Id ); + sp->addArgs( 2, Tile::stone_Id ); out->m_stats.push_back(sp); sp = new StatParam(L"BlockBroken"); @@ -188,7 +188,7 @@ DurangoStatsDebugger *DurangoStatsDebugger::Initialize() sp = new StatParam(L"BlockPlaced.BlockId.*"); sp->addArgs( Tile::dirt_Id ); - sp->addArgs( Tile::stoneBrick_Id ); + sp->addArgs( Tile::cobblestone_Id ); sp->addArgs( Tile::sand_Id ); // works sp->addArgs( Tile::sign_Id ); // fixed sp->addArgs( Tile::wallSign_Id ); // fixed diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 1d2f0337..00381930 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -630,6 +630,7 @@ $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers false + true true @@ -641,6 +642,7 @@ true $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + true true @@ -12954,6 +12956,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -13494,6 +13497,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -13809,6 +13813,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -14394,6 +14399,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -15114,7 +15120,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + + true true true @@ -15159,6 +15166,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -15204,51 +15212,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - + true true @@ -15429,6 +15393,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -16509,6 +16474,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -32377,7 +32343,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index ad3f55ca..a0aaab33 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -2665,15 +2665,9 @@ PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU @@ -3775,6 +3769,36 @@ PSVita + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + @@ -5001,9 +5025,6 @@ PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU @@ -5919,6 +5940,9 @@ PSVita + + PS3\ChunkRebuild_SPU + diff --git a/Minecraft.Client/PS3/PS3Extras/C4JSpursJob.cpp b/Minecraft.Client/PS3/PS3Extras/C4JSpursJob.cpp index 241ebf61..eba794ce 100644 --- a/Minecraft.Client/PS3/PS3Extras/C4JSpursJob.cpp +++ b/Minecraft.Client/PS3/PS3Extras/C4JSpursJob.cpp @@ -242,11 +242,10 @@ C4JSpursJob_ChunkUpdate::C4JSpursJob_ChunkUpdate(ChunkRebuildData* pDataIn, Chun extern const CellSpursJobHeader JOBHEADER_SYMBOL(ChunkUpdate); //E create job m_job256.header = JOBHEADER_SYMBOL(ChunkUpdate); - m_job256.header.sizeStack = (60*1024)>>4; + m_job256.header.sizeStack = (58*1024)>>4; m_job256.workArea.userData[0] = (uintptr_t)pDataIn; m_job256.workArea.userData[1] = (uintptr_t)pDataOut; assert(cellSpursJobQueueCheckJob(&m_job256, 256, 256) == CELL_OK); - } C4JSpursJob_LevelRenderer_cull::C4JSpursJob_LevelRenderer_cull(LevelRenderer_cull_DataIn* pDataIn) diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ActivatorRailTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ActivatorRailTile_SPU.h new file mode 100644 index 00000000..7021e716 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ActivatorRailTile_SPU.h @@ -0,0 +1,21 @@ +#pragma once + +#include "BaseRailTile_SPU.h" + +class ActivatorRailTile_SPU : public BaseRailTile_SPU +{ +public: + ActivatorRailTile_SPU(int id) : BaseRailTile_SPU(id) {} + + Icon_SPU *getTexture(int face, int data) + { + if ((data & RAIL_DATA_BIT) == 0) + { + return &ms_pTileData->activatorRailTile_icon; + } + else + { + return &ms_pTileData->activatorRailTile_iconPowered; + } + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.cpp new file mode 100644 index 00000000..ee3b607f --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.cpp @@ -0,0 +1,41 @@ +#include "stdafx.h" +#include "BasePressurePlateTile_SPU.h" +#include "ChunkRebuildData.h" + + +bool BasePressurePlateTile_SPU::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool BasePressurePlateTile_SPU::blocksLight() +{ + return false; +} + + +void BasePressurePlateTile_SPU::updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData, TileEntity* forceEntity) // 4J added forceData, forceEntity param +{ + int data = level->getData(x, y, z); + bool pressed = getSignalForData(data) > 0; // 0 is Redstone::SIGNAL_NONE + float o = 1 / 16.0f; + + if (pressed) + { + setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); + } + else + { + setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); + } +} + + +void BasePressurePlateTile_SPU::updateDefaultShape() +{ + float x = 8 / 16.0f; + float y = 2 / 16.0f; + float z = 8 / 16.0f; + setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); +} + diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.h new file mode 100644 index 00000000..a631d474 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BasePressurePlateTile_SPU.h @@ -0,0 +1,16 @@ +#pragma once +#include "Tile_SPU.h" + + +class BasePressurePlateTile_SPU : public Tile_SPU +{ +public: + BasePressurePlateTile_SPU(int id) : Tile_SPU(id) {} + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool blocksLight(); + + virtual void updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData = -1, TileEntity* forceEntity = NULL); // 4J added forceData, forceEntity param + virtual void updateDefaultShape(); +protected: + virtual int getSignalForData(int data) = 0; +}; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BaseRailTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BaseRailTile_SPU.h new file mode 100644 index 00000000..d7960600 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/BaseRailTile_SPU.h @@ -0,0 +1,31 @@ +#pragma once +#include "Tile_SPU.h" + +class BaseRailTile_SPU : public Tile_SPU +{ + +public: + static const int RAIL_DATA_BIT = 8; + static const int RAIL_DIRECTION_MASK = 7; + + BaseRailTile_SPU(int id) : Tile_SPU(id) {} + virtual bool isSolidRender(bool isServerLevel = false) { return false; } + virtual void updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData = -1, TileEntity* forceEntity = NULL) // 4J added forceData, forceEntity param + { + int data = level->getData(x, y, z); + if (data >= 2 && data <= 5) + { + setShape(0, 0, 0, 1, 2 / 16.0f + 0.5f, 1); + } else + { + setShape(0, 0, 0, 1, 2 / 16.0f, 1); + } + } + virtual int getRenderShape() { return Tile_SPU::SHAPE_RAIL; } + bool isUsesDataBit() + { + if(id == goldenRail_Id || id == detectorRail_Id || id == activatorRail_Id) + return true; + return false; + } +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h index 68d6da04..e80c6885 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h @@ -13,7 +13,7 @@ public: if(id == Tile_SPU::button_wood_Id) return TileRef_SPU(wood_Id)->getTexture(Facing::UP); else - return TileRef_SPU(rock_Id)->getTexture(Facing::UP); + return TileRef_SPU(stone_Id)->getTexture(Facing::UP); } virtual bool blocksLight() { return false; } virtual bool isSolidRender(bool isServerLevel = false) { return false; } diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp index 3e3565c3..ddabbd85 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp @@ -39,7 +39,7 @@ static const int Level_MAX_BRIGHTNESS = 15; #include "TileRenderer_SPU.h" #include "Tile_SPU.h" #include "ChunkRebuildData.h" -TileData_SPU g_tileSPUData; +//TileData_SPU g_tileSPUData; static const int MAX_LEVEL_SIZE = 30000000; static const int MAX_BRIGHTNESS = 15; @@ -89,30 +89,30 @@ void ChunkRebuildData::disableUnseenTiles() // Establish whether this tile and its neighbours are all made of rock, dirt, unbreakable tiles, or have already // been determined to meet this criteria themselves and have a tile of 255 set. - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; tileID = getTile(iX-1, iY, iZ); flags = getFlags(iX-1, iY, iZ); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; tileID = getTile(iX+1, iY, iZ); flags = getFlags(iX+1, iY, iZ); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; tileID = getTile(iX, iY, iZ-1); flags = getFlags(iX, iY, iZ-1); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; tileID = getTile(iX, iY, iZ+1); flags = getFlags(iX, iY, iZ+1); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; // Treat the bottom of the world differently - we shouldn't ever be able to look up at this, so consider tiles as invisible // if they are surrounded on sides other than the bottom if( iY > 0 ) { tileID = getTile(iX, iY-1, iZ); flags = getFlags(iX, iY-1, iZ); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; } tileID = getTile(iX, iY+1, iZ); flags = getFlags(iX, iY+1, iZ); - if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; + if( !( ( tileID == Tile_SPU::stone_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; // This tile is surrounded. Flag it as not requiring to be rendered by setting its id to 255. setFlag(iX, iY, iZ, e_flag_NoRender); @@ -157,7 +157,7 @@ void ChunkRebuildData::buildMaterials() buildMaterial(Material_SPU::plant_Id, Material::plant); buildMaterial(Material_SPU::replaceable_plant_Id, Material::replaceable_plant); buildMaterial(Material_SPU::sponge_Id, Material::sponge); - buildMaterial(Material_SPU::cloth_Id, Material::cloth); + buildMaterial(Material_SPU::wool_Id, Material::cloth); buildMaterial(Material_SPU::fire_Id, Material::fire); buildMaterial(Material_SPU::sand_Id, Material::sand); buildMaterial(Material_SPU::decoration_Id, Material::decoration); @@ -195,7 +195,7 @@ int ChunkRebuildData::getMaterialID(Tile* pTile) if(m == Material::plant) return Material_SPU::plant_Id; if(m == Material::replaceable_plant)return Material_SPU::replaceable_plant_Id; if(m == Material::sponge) return Material_SPU::sponge_Id; - if(m == Material::cloth) return Material_SPU::cloth_Id; + if(m == Material::cloth) return Material_SPU::wool_Id; if(m == Material::fire) return Material_SPU::fire_Id; if(m == Material::sand) return Material_SPU::sand_Id; if(m == Material::decoration) return Material_SPU::decoration_Id; @@ -341,9 +341,17 @@ void ChunkRebuildData::createTileData() setIconSPUFromIcon(&m_tileData.dispenserTile_iconFront, ((DispenserTile*)Tile::dispenser)->iconFront); setIconSPUFromIcon(&m_tileData.dispenserTile_iconFrontVertical, ((DispenserTile*)Tile::dispenser)->iconFrontVertical); + setIconSPUFromIcon(&m_tileData.dropperTile_iconFront, ((DropperTile*)Tile::dropper)->iconFront); + setIconSPUFromIcon(&m_tileData.dropperTile_iconFrontVertical, ((DropperTile*)Tile::dropper)->iconFrontVertical); + // RailTile setIconSPUFromIcon(&m_tileData.railTile_iconTurn, ((RailTile*)Tile::rail)->iconTurn); - setIconSPUFromIcon(&m_tileData.railTile_iconTurnGolden, ((RailTile*)Tile::goldenRail)->iconTurn); + + setIconSPUFromIcon(&m_tileData.poweredRailTile_icon, ((PoweredRailTile*)Tile::goldenRail)->icon); + setIconSPUFromIcon(&m_tileData.poweredRailTile_iconPowered, ((PoweredRailTile*)Tile::goldenRail)->iconPowered); + + setIconSPUFromIcon(&m_tileData.activatorRailTile_icon, ((PoweredRailTile*)Tile::activatorRail)->icon); + setIconSPUFromIcon(&m_tileData.activatorRailTile_iconPowered, ((PoweredRailTile*)Tile::activatorRail)->iconPowered); for(int i=0;i<2;i++) setIconSPUFromIcon(&m_tileData.detectorRailTile_icons[i], ((DetectorRailTile*)Tile::detectorRail)->icons[i]); @@ -413,8 +421,12 @@ void ChunkRebuildData::createTileData() setIconSPUFromIcon(&m_tileData.stoneSlab_iconSide, ((StoneSlabTile*)(Tile::stoneSlab))->iconSide); + //ColoredTile for(int i=0;i<16;i++) - setIconSPUFromIcon(&m_tileData.clothTile_icons[i], ((ColoredTile*)Tile::wool)->icons[i]); + setIconSPUFromIcon(&m_tileData.woolTile_icons[i], ((ColoredTile*)Tile::wool)->icons[i]); + + for(int i=0;i<16;i++) + setIconSPUFromIcon(&m_tileData.clayHardened_colored_icons[i], ((ColoredTile*)Tile::clayHardened_colored)->icons[i]); // CarrotTile for(int i=0;i<4;i++) @@ -438,6 +450,13 @@ void ChunkRebuildData::createTileData() setIconSPUFromIcon(&m_tileData.quartzBlock_iconTop, ((QuartzBlockTile*)Tile::quartzBlock)->iconTop); setIconSPUFromIcon(&m_tileData.quartzBlock_iconBottom, ((QuartzBlockTile*)Tile::quartzBlock)->iconBottom); + // HayBlockTile + setIconSPUFromIcon(&m_tileData.hayBlockTile_iconTop, ((HayBlockTile*)Tile::hayBlock)->iconTop); + setIconSPUFromIcon(&m_tileData.hayBlockTile_icon, ((HayBlockTile*)Tile::hayBlock)->icon); + + // DaylightDetectorTile + for(int i=0;i<1;i++) + setIconSPUFromIcon(&m_tileData.daylightDetector_icons[i], ((DaylightDetectorTile*)Tile::daylightDetector)->icons[i]); } // extern int g_lastHitBlockX; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h index ca8fa101..f257d444 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h @@ -59,7 +59,7 @@ public: int m_lastHitBlockX; int m_lastHitBlockY; int m_lastHitBlockZ; - unsigned int m_pad[5];// padding to 16 byte alignment + unsigned int m_pad[3];// padding to 16 byte alignment int getTileIdx(int x, int y, int z) { return (( x - m_x0 )*sc_size*sc_size) + (( y - m_y0 )*sc_size) + ( z - m_z0 ); } diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj index 2d024f54..e574f7dd 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj @@ -115,6 +115,7 @@ + @@ -126,7 +127,6 @@ - diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters index 779f17ba..ddc88af9 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters @@ -142,9 +142,6 @@ Source Files - - Source Files - Source Files @@ -166,5 +163,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ClothTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ClothTile_SPU.h deleted file mode 100644 index fb23dae9..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ClothTile_SPU.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include "Tile_SPU.h" - -class ClothTile_SPU : public Tile_SPU -{ -public: - ClothTile_SPU(int id) : Tile_SPU(id) {} - virtual Icon_SPU *getTexture(int face, int data) { return &ms_pTileData->clothTile_icons[data]; } - - -}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ColoredClay_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ColoredClay_SPU.h new file mode 100644 index 00000000..b5a094d2 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ColoredClay_SPU.h @@ -0,0 +1,11 @@ +#pragma once +#include "Tile_SPU.h" + +class ColoredClay_SPU : public Tile_SPU +{ +public: + ColoredClay_SPU(int id) : Tile_SPU(id) {} + virtual Icon_SPU *getTexture(int face, int data) { return &ms_pTileData->clayHardened_colored_icons[data]; } + + +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DaylightDetectorTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DaylightDetectorTile_SPU.h new file mode 100644 index 00000000..048872da --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DaylightDetectorTile_SPU.h @@ -0,0 +1,21 @@ +#pragma once +#include "EntityTile_SPU.h" + +class DaylightDetectorTile_SPU : public EntityTile_SPU +{ +public: + DaylightDetectorTile_SPU(int id) : EntityTile_SPU(id) {} + + Icon_SPU *getTexture(int face, int data) { + if (face == Facing::UP) + { + return &ms_pTileData->daylightDetector_icons[0]; + } + return &ms_pTileData->daylightDetector_icons[1]; + }; + + virtual bool isSolidRender(bool isServerLevel = false) { return false; } + + virtual void updateDefaultShape() { setShape(0, 0, 0, 1, 6.0f / 16.0f, 1); }; + virtual void updateShape() { setShape(0, 0, 0, 1, 6.0f / 16.0f, 1); }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DetectorRailTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DetectorRailTile_SPU.h index 8e33ed38..3ccaa5d9 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DetectorRailTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DetectorRailTile_SPU.h @@ -2,10 +2,10 @@ #include "RailTile_SPU.h" -class DetectorRailTile_SPU : public RailTile_SPU +class DetectorRailTile_SPU : public BaseRailTile_SPU { public: - DetectorRailTile_SPU(int id) : RailTile_SPU(id) {} + DetectorRailTile_SPU(int id) : BaseRailTile_SPU(id) {} Icon_SPU *getTexture(int face, int data) { if ((data & RAIL_DATA_BIT) != 0) diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h index 6c0746db..eba04808 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h @@ -21,9 +21,9 @@ public: { if (id==diode_on_Id) { - return TileRef_SPU(notGate_on_Id)->getTexture(face); + return TileRef_SPU(redstoneTorch_on_Id)->getTexture(face); } - return TileRef_SPU(notGate_off_Id)->getTexture(face); + return TileRef_SPU(redstoneTorch_off_Id)->getTexture(face); } if (face == Facing::UP) { diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DropperTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DropperTile_SPU.h new file mode 100644 index 00000000..9ec39e7d --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/DropperTile_SPU.h @@ -0,0 +1,37 @@ +#pragma once +#include "DispenserTile_SPU.h" +#include "Facing_SPU.h" + + +class DropperTile_SPU : public DispenserTile_SPU +{ +public: + DropperTile_SPU(int id) : DispenserTile_SPU(id) {} + +public: + virtual Icon_SPU *getTexture(int face, int data) + { + int dir = data & FACING_MASK; + if (face == dir) + { + if (dir == Facing::UP || dir == Facing::DOWN) + { + return &ms_pTileData->dropperTile_iconFrontVertical; + } + else + { + return &ms_pTileData->dropperTile_iconFront; + } + } + + if (dir == Facing::UP || dir == Facing::DOWN) + { + return &ms_pTileData->dispenserTile_iconTop; + } + else if (face == Facing::UP || face == Facing::DOWN) + { + return &ms_pTileData->dispenserTile_iconTop; + } + return icon(); + } +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/FireTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/FireTile_SPU.h index f3478796..c613a2f9 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/FireTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/FireTile_SPU.h @@ -33,7 +33,7 @@ public: case Tile_SPU::bookshelf_Id: case Tile_SPU::tnt_Id: case Tile_SPU::tallgrass_Id: - case Tile_SPU::cloth_Id: + case Tile_SPU::wool_Id: case Tile_SPU::vine_Id: return true; default: diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HayBlockTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HayBlockTile_SPU.h new file mode 100644 index 00000000..077f82d9 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HayBlockTile_SPU.h @@ -0,0 +1,19 @@ +#pragma once + +#include "RotatedPillarTile_SPU.h" + +class HayBlockTile_SPU : public RotatedPillarTile_SPU +{ + friend class ChunkRebuildData; +public: + HayBlockTile_SPU(int id) : RotatedPillarTile_SPU(id) {} + +protected: + Icon_SPU *getTopTexture(int type) { + return &ms_pTileData->hayBlockTile_iconTop; + }; + + Icon_SPU *getTypeTexture(int type) { + return &ms_pTileData->hayBlockTile_icon; + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HugeMushroomTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HugeMushroomTile_SPU.h index 805cb02c..c4afb486 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HugeMushroomTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/HugeMushroomTile_SPU.h @@ -14,8 +14,8 @@ public: Icon_SPU *getTexture(int face, int data) { Icon_SPU* icons = ms_pTileData->hugeMushroom_icons; - int type = 0; // hugeMushroom1_Id - if(id == hugeMushroom2_Id) + int type = 0; // hugemushroom_brown_Id + if(id == hugeMushroom_red_Id) type = 1; // 123 // 456 10 diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Material_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Material_SPU.h index 5b0dedf9..bd0e156a 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Material_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Material_SPU.h @@ -19,7 +19,7 @@ public: static const int plant_Id = 9; static const int replaceable_plant_Id = 10; static const int sponge_Id = 11; - static const int cloth_Id = 12; + static const int wool_Id = 12; static const int fire_Id = 13; static const int sand_Id = 14; static const int decoration_Id = 15; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PoweredRailTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PoweredRailTile_SPU.h new file mode 100644 index 00000000..44646193 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PoweredRailTile_SPU.h @@ -0,0 +1,21 @@ +#pragma once + +#include "BaseRailTile_SPU.h" + +class PoweredRailTile_SPU : public BaseRailTile_SPU +{ +public: + PoweredRailTile_SPU(int id) : BaseRailTile_SPU(id) {} + + Icon_SPU *getTexture(int face, int data) + { + if ((data & RAIL_DATA_BIT) == 0) + { + return &ms_pTileData->poweredRailTile_icon; + } + else + { + return &ms_pTileData->poweredRailTile_iconPowered; + } + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.cpp deleted file mode 100644 index b6b04c10..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "stdafx.h" -#include "PressurePlateTile_SPU.h" -#include "ChunkRebuildData.h" - - -bool PressurePlateTile_SPU::isSolidRender(bool isServerLevel) -{ - return false; -} - -bool PressurePlateTile_SPU::blocksLight() -{ - return false; -} - - -void PressurePlateTile_SPU::updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData, TileEntity* forceEntity) // 4J added forceData, forceEntity param -{ - bool pressed = level->getData(x, y, z) == 1; - - float o = 1 / 16.0f; - if (pressed) - { - this->setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); - } - else - { - setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); - } -} - - -void PressurePlateTile_SPU::updateDefaultShape() -{ - float x = 8 / 16.0f; - float y = 2 / 16.0f; - float z = 8 / 16.0f; - setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); - -} - diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.h index 6673bb61..24ee42f3 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.h @@ -1,21 +1,23 @@ #pragma once -#include "Tile_SPU.h" +#include "BasePressurePlateTile_SPU.h" - -class PressurePlateTile_SPU : public Tile_SPU +class PressurePlateTile_SPU : public BasePressurePlateTile_SPU { public: - enum Sensitivity + enum Sensitivity { - everything, - mobs, - players - }; + everything, mobs, players + }; - PressurePlateTile_SPU(int id) : Tile_SPU(id) {} - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool blocksLight(); +private: + Sensitivity sensitivity; - virtual void updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData = -1, TileEntity* forceEntity = NULL); // 4J added forceData, forceEntity param - virtual void updateDefaultShape(); -}; +public: + PressurePlateTile_SPU(int id) : BasePressurePlateTile_SPU(id) {} + +protected: + virtual int getSignalForData(int data) { + // 15 is Redstone::SIGNAL_MAX + return data == 1 ? 15 : 0; + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RailTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RailTile_SPU.h index 5ac91299..73b4e294 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RailTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RailTile_SPU.h @@ -1,58 +1,21 @@ #pragma once -#include "Tile_SPU.h" -class RailTile_SPU : public Tile_SPU +#include "BaseRailTile_SPU.h" + +class RailTile_SPU : public BaseRailTile_SPU { - public: - static const int RAIL_DATA_BIT = 8; - static const int RAIL_DIRECTION_MASK = 7; + RailTile_SPU(int id) : BaseRailTile_SPU(id) {} - RailTile_SPU(int id) : Tile_SPU(id) {} - virtual bool isSolidRender(bool isServerLevel = false) { return false; } - virtual void updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData = -1, TileEntity* forceEntity = NULL) // 4J added forceData, forceEntity param + Icon_SPU *getTexture(int face, int data) { - int data = level->getData(x, y, z); - if (data >= 2 && data <= 5) + if (data >= 6) { - setShape(0, 0, 0, 1, 2 / 16.0f + 0.5f, 1); - } else - { - setShape(0, 0, 0, 1, 2 / 16.0f, 1); + return &ms_pTileData->railTile_iconTurn; } - } - virtual Icon_SPU *getTexture(int face, int data) - { - bool usesDataBit = false; - Icon_SPU* iconTurn = &ms_pTileData->railTile_iconTurn; - if(id == goldenRail_Id) + else { - usesDataBit = true; - iconTurn = &ms_pTileData->railTile_iconTurnGolden; + return icon(); } - - if (usesDataBit) - { -// if (id == Tile::goldenRail_Id) -// { - if ((data & RAIL_DATA_BIT) == 0) - { - return icon(); - } - else - { - return iconTurn; // Actually the powered rail on version - } -// } - } else if (data >= 6) return iconTurn; - return icon(); - - } - virtual int getRenderShape() { return Tile_SPU::SHAPE_RAIL; } - bool isUsesDataBit() - { - if(id == goldenRail_Id || id == detectorRail_Id) - return true; - return false; - } + }; }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RotatedPillarTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RotatedPillarTile_SPU.h new file mode 100644 index 00000000..4ae95305 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/RotatedPillarTile_SPU.h @@ -0,0 +1,45 @@ +#pragma once + +#include "Tile_SPU.h" +#include "Facing_SPU.h" + +class RotatedPillarTile_SPU : public Tile_SPU +{ +public: + static const int MASK_TYPE = 0x3; + static const int MASK_FACING = 0xC; + static const int FACING_Y = 0 << 2; + static const int FACING_X = 1 << 2; + static const int FACING_Z = 2 << 2; + +protected: + RotatedPillarTile_SPU(int id) : Tile_SPU(id) {} + +public: + virtual int getRenderShape() { return Tile_SPU::SHAPE_TREE; }; + + virtual Icon_SPU *getTexture(int face, int data) { + int dir = data & MASK_FACING; + int type = data & MASK_TYPE; + + if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) + { + return getTopTexture(type); + } + else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) + { + return getTopTexture(type); + } + else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH)) + { + return getTopTexture(type); + } + + return getTypeTexture(type); + }; + +protected: + virtual Icon_SPU *getTypeTexture(int type) = 0; + + virtual Icon_SPU *getTopTexture(int type) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/SkullTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/SkullTile_SPU.h index d6bcf7ff..8d4d5a56 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/SkullTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/SkullTile_SPU.h @@ -43,5 +43,5 @@ public: } } - Icon_SPU *getTexture(int face, int data) { return TileRef_SPU(hellSand_Id)->getTexture(face); } + Icon_SPU *getTexture(int face, int data) { return TileRef_SPU(netherRack_Id)->getTexture(face); } }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp index 70b08c25..bd25d86d 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp @@ -39,7 +39,7 @@ bool StairTile_SPU::isStairs(int id) case Tile_SPU::stairs_wood_Id: case Tile_SPU::stairs_stone_Id: case Tile_SPU::stairs_bricks_Id: - case Tile_SPU::stairs_stoneBrickSmooth_Id: + case Tile_SPU::stairs_stoneBrick_Id: case Tile_SPU::stairs_netherBricks_Id: case Tile_SPU::stairs_sandstone_Id: case Tile_SPU::stairs_sprucewood_Id: diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneMonsterTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneMonsterTile_SPU.h index c50169f2..0796d2ca 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneMonsterTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneMonsterTile_SPU.h @@ -21,12 +21,12 @@ public: { if (data == HOST_COBBLE) { - return TileRef_SPU(stoneBrick_Id)->getTexture(face); + return TileRef_SPU(cobblestone_Id)->getTexture(face); } if (data == HOST_STONEBRICK) { - return TileRef_SPU(stoneBrickSmooth_Id)->getTexture(face); + return TileRef_SPU(stoneBrick_Id)->getTexture(face); } - return TileRef_SPU(rock_Id)->getTexture(face); + return TileRef_SPU(stone_Id)->getTexture(face); } }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneSlabTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneSlabTile_SPU.h index 65a365f8..c3d01215 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneSlabTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StoneSlabTile_SPU.h @@ -41,11 +41,11 @@ public: case WOOD_SLAB: return TileRef_SPU(wood_Id)->getTexture(face); //Tile::wood->getTexture(face); case COBBLESTONE_SLAB: - return TileRef_SPU(stoneBrick_Id)->getTexture(face); //Tile::stoneBrick->getTexture(face); + return TileRef_SPU(cobblestone_Id)->getTexture(face); //Tile::stoneBrick->getTexture(face); case BRICK_SLAB: return TileRef_SPU(redBrick_Id)->getTexture(face); //Tile::redBrick->getTexture(face); case SMOOTHBRICK_SLAB: - return TileRef_SPU(stoneBrickSmooth_Id)->getTexture(face); //Tile::stoneBrickSmooth->getTexture(face, SmoothStoneBrickTile::TYPE_DEFAULT); + return TileRef_SPU(stoneBrick_Id)->getTexture(face); //Tile::stoneBrickSmooth->getTexture(face, SmoothStoneBrickTile::TYPE_DEFAULT); case NETHERBRICK_SLAB: return TileRef_SPU(netherBrick_Id)->getTexture(Facing::UP); //Tile::netherBrick->getTexture(Facing::UP); case QUARTZ_SLAB: diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp index 72a59674..d00f15e9 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp @@ -12,6 +12,7 @@ #include "DirtTile_SPU.h" #include "DoorTile_SPU.h" #include "PressurePlateTile_SPU.h" +#include "WeightedPressurePlateTile_SPU.h" #include "FarmTile_SPU.h" #include "Bush_SPU.h" #include "TallGrass_SPU.h" @@ -32,7 +33,10 @@ #include "IceTile_SPU.h" #include "PortalTile_SPU.h" #include "DispenserTile_SPU.h" +#include "DropperTile_SPU.h" #include "RailTile_SPU.h" +#include "PoweredRailTile_SPU.h" +#include "ActivatorRailTile_SPU.h" #include "DetectorRailTile_SPU.h" #include "TntTile_SPU.h" #include "BookshelfTile_SPU.h" @@ -71,7 +75,7 @@ #include "EggTile_SPU.h" #include "CocoaTile_SPU.h" #include "RedlightTile_SPU.h" -#include "ClothTile_SPU.h" +#include "WoolTile_SPU.h" #include "SkullTile_SPU.h" #include "MobSpawnerTile_SPU.h" #include "EnderChestTile_SPU.h" @@ -83,6 +87,9 @@ #include "PotatoTile_SPU.h" #include "QuartzBlockTile_SPU.h" #include "WoolCarpetTile_SPU.h" +#include "ColoredClay_SPU.h" +#include "HayBlockTile_SPU.h" +#include "DaylightDetectorTile_SPU.h" #ifdef SN_TARGET_PS3_SPU #include "..\Common\spu_assert.h" @@ -514,7 +521,7 @@ void Tile_SPU::updateDefaultShape() // void Tile_SPU::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) // { // // 4J Stu - Special case - only record a crop destroy if is fully grown -// if(id==Tile_SPU::crops_Id) +// if(id==Tile_SPU::wheat_Id) // { // if( Tile_SPU::crops->getResource(data, NULL, 0) > 0 ) // player->awardStat(Stats::blocksMined[id], 1); @@ -681,6 +688,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(woodSlabHalf_Id, WoodSlabTile_SPU); CREATE_TILE_TYPE(chest_Id, ChestTile_SPU); + CREATE_TILE_TYPE(chest_trap_Id, ChestTile_SPU); CREATE_TILE_TYPE(ironFence_Id, ThinFenceTile_SPU); CREATE_TILE_TYPE(thinGlass_Id, ThinFenceTile_SPU); @@ -691,7 +699,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(stairs_wood_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_stone_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_bricks_Id, StairTile_SPU); - CREATE_TILE_TYPE(stairs_stoneBrickSmooth_Id, StairTile_SPU); + CREATE_TILE_TYPE(stairs_stoneBrick_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_netherBricks_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_sandstone_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_sprucewood_Id, StairTile_SPU); @@ -706,6 +714,9 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(pressurePlate_stone_Id, PressurePlateTile_SPU); CREATE_TILE_TYPE(pressurePlate_wood_Id, PressurePlateTile_SPU); + CREATE_TILE_TYPE(weightedPlate_light_Id, WeightedPressurePlateTile_SPU); + CREATE_TILE_TYPE(weightedPlate_heavy_Id, WeightedPressurePlateTile_SPU); + CREATE_TILE_TYPE(farmland_Id, FarmTile_SPU); CREATE_TILE_TYPE(flower_Id, Bush_SPU); @@ -722,19 +733,19 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(leaves_Id, LeafTile_SPU); - CREATE_TILE_TYPE(crops_Id, CropTile_SPU); + CREATE_TILE_TYPE(wheat_Id, CropTile_SPU); CREATE_TILE_TYPE(reeds_Id, ReedTile_SPU); CREATE_TILE_TYPE(torch_Id, TorchTile_SPU); - CREATE_TILE_TYPE(notGate_off_Id, TorchTile_SPU); // TorchTile->NotGateTile - CREATE_TILE_TYPE(notGate_on_Id, TorchTile_SPU); // TorchTile->NotGateTile + CREATE_TILE_TYPE(redstoneTorch_off_Id, TorchTile_SPU); // TorchTile->NotGateTile + CREATE_TILE_TYPE(redstoneTorch_on_Id, TorchTile_SPU); // TorchTile->NotGateTile - CREATE_TILE_TYPE(mushroom1_Id, Mushroom_SPU); - CREATE_TILE_TYPE(mushroom2_Id, Mushroom_SPU); + CREATE_TILE_TYPE(mushroom_brown_Id, Mushroom_SPU); + CREATE_TILE_TYPE(mushroom_red_Id, Mushroom_SPU); CREATE_TILE_TYPE(mobSpawner_Id, MobSpawnerTile_SPU); - CREATE_TILE_TYPE(musicBlock_Id, EntityTile_SPU); // MusicTile->EntityTile + CREATE_TILE_TYPE(noteblock_Id, EntityTile_SPU); // MusicTile->EntityTile CREATE_TILE_TYPE(furnace_Id, FurnaceTile_SPU); CREATE_TILE_TYPE(furnace_lit_Id, FurnaceTile_SPU); @@ -757,9 +768,12 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(portalTile_Id, PortalTile_SPU); CREATE_TILE_TYPE(dispenser_Id, DispenserTile_SPU); + CREATE_TILE_TYPE(dropper_Id, DropperTile_SPU); CREATE_TILE_TYPE(rail_Id, RailTile_SPU); - CREATE_TILE_TYPE(goldenRail_Id, RailTile_SPU); + + CREATE_TILE_TYPE(goldenRail_Id, PoweredRailTile_SPU); + CREATE_TILE_TYPE(activatorRail_Id, ActivatorRailTile_SPU); CREATE_TILE_TYPE(detectorRail_Id, DetectorRailTile_SPU); @@ -781,7 +795,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(cactus_Id, CactusTile_SPU); - CREATE_TILE_TYPE(recordPlayer_Id, RecordPlayerTile_SPU); + CREATE_TILE_TYPE(jukebox_Id, RecordPlayerTile_SPU); CREATE_TILE_TYPE(pumpkin_Id, PumpkinTile_SPU); CREATE_TILE_TYPE(litPumpkin_Id, PumpkinTile_SPU); @@ -792,10 +806,10 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(monsterStoneEgg_Id, StoneMonsterTile_SPU); - CREATE_TILE_TYPE(stoneBrickSmooth_Id, SmoothStoneBrickTile_SPU); + CREATE_TILE_TYPE(stoneBrick_Id, SmoothStoneBrickTile_SPU); - CREATE_TILE_TYPE(hugeMushroom1_Id, HugeMushroomTile_SPU); - CREATE_TILE_TYPE(hugeMushroom2_Id, HugeMushroomTile_SPU); + CREATE_TILE_TYPE(hugeMushroom_brown_Id, HugeMushroomTile_SPU); + CREATE_TILE_TYPE(hugeMushroom_red_Id, HugeMushroomTile_SPU); CREATE_TILE_TYPE(melon_Id, MelonTile_SPU); @@ -847,16 +861,18 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(skull_Id, SkullTile_SPU); - // these tile types don't have any additional code that we need. - CREATE_TILE_TYPE(stoneBrick_Id, Tile_SPU); // Tile + // these tile types don't have any additional code that we need. + CREATE_TILE_TYPE(cobblestone_Id, Tile_SPU); // Tile CREATE_TILE_TYPE(lapisBlock_Id, Tile_SPU); CREATE_TILE_TYPE(redBrick_Id, Tile_SPU); - CREATE_TILE_TYPE(mossStone_Id, Tile_SPU); + CREATE_TILE_TYPE(mossyCobblestone_Id, Tile_SPU); CREATE_TILE_TYPE(netherBrick_Id, Tile_SPU); - CREATE_TILE_TYPE(whiteStone_Id, Tile_SPU); + CREATE_TILE_TYPE(endStone_Id, Tile_SPU); CREATE_TILE_TYPE(unbreakable_Id, Tile_SPU); CREATE_TILE_TYPE(sponge_Id, Tile_SPU); - CREATE_TILE_TYPE(rock_Id, Tile_SPU); // StoneTile + CREATE_TILE_TYPE(coalBlock_Id, Tile_SPU); + CREATE_TILE_TYPE(redstoneBlock_Id, Tile_SPU); + CREATE_TILE_TYPE(stone_Id, Tile_SPU); // StoneTile CREATE_TILE_TYPE(obsidian_Id, Tile_SPU); // StoneTile->ObsidianTile CREATE_TILE_TYPE(sand_Id, Tile_SPU); // HeavyTile CREATE_TILE_TYPE(gravel_Id, Tile_SPU); // GravelTile @@ -872,12 +888,15 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(ironBlock_Id, Tile_SPU); // MetalTile CREATE_TILE_TYPE(diamondBlock_Id, Tile_SPU); // MetalTile CREATE_TILE_TYPE(snow_Id, Tile_SPU); // SnowTile - CREATE_TILE_TYPE(hellRock_Id, Tile_SPU); // HellStoneTile - CREATE_TILE_TYPE(hellSand_Id, Tile_SPU); // HellSandTile - CREATE_TILE_TYPE(lightGem_Id, Tile_SPU); // LightGemTile - CREATE_TILE_TYPE(aprilFoolsJoke_Id, Tile_SPU); // LockedChestTile + CREATE_TILE_TYPE(netherRack_Id, Tile_SPU); // NetherrackTile + CREATE_TILE_TYPE(soulsand_Id, Tile_SPU); // SoulSandTile + CREATE_TILE_TYPE(glowstone_Id, Tile_SPU); // Glowstonetile + // got replaced by stained_glass_Id, rest in peace locked chest + //CREATE_TILE_TYPE(aprilFoolsJoke_Id , Tile_SPU); // LockedChestTile + CREATE_TILE_TYPE(clayHardened_Id, Tile_SPU); // ColoredTile - CREATE_TILE_TYPE(cloth_Id, ClothTile_SPU); // wool + CREATE_TILE_TYPE(wool_Id, WoolTile_SPU); // wool + CREATE_TILE_TYPE(clayHardened_colored_Id, ColoredClay_SPU); // wool CREATE_TILE_TYPE(emeraldOre_Id, Tile_SPU); // OreTile @@ -895,5 +914,6 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(quartzBlock_Id, QuartzBlockTile_SPU); CREATE_TILE_TYPE(stairs_quartz_Id, StairTile_SPU); CREATE_TILE_TYPE(woolCarpet_Id, WoolCarpetTile_SPU); - + CREATE_TILE_TYPE(hayBlock_Id, HayBlockTile_SPU); + CREATE_TILE_TYPE(daylightDetector_Id, DaylightDetectorTile_SPU); }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.h index 5b80a0fa..cca7cd5d 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.h @@ -129,8 +129,14 @@ public: Icon_SPU dispenserTile_iconFront; Icon_SPU dispenserTile_iconFrontVertical; + Icon_SPU dropperTile_iconFront; + Icon_SPU dropperTile_iconFrontVertical; + Icon_SPU railTile_iconTurn; - Icon_SPU railTile_iconTurnGolden; + Icon_SPU poweredRailTile_icon; + Icon_SPU poweredRailTile_iconPowered; + Icon_SPU activatorRailTile_icon; + Icon_SPU activatorRailTile_iconPowered; Icon_SPU detectorRailTile_icons[2]; @@ -178,7 +184,7 @@ public: Icon_SPU redStoneDust_iconCrossOver; Icon_SPU redStoneDust_iconLineOver; - Icon_SPU clothTile_icons[16]; + Icon_SPU woolTile_icons[16]; Icon_SPU stoneSlab_iconSide; @@ -193,6 +199,12 @@ public: Icon_SPU quartzBlock_iconTop; Icon_SPU quartzBlock_iconBottom; + Icon_SPU clayHardened_colored_icons[16]; + Icon_SPU hayBlockTile_icon; + Icon_SPU hayBlockTile_iconTop; + + Icon_SPU daylightDetector_icons[2]; + int anvilPart; // normally part of the AnvilTile class @@ -296,19 +308,24 @@ public: static const int SHAPE_FLOWER_POT = 33; static const int SHAPE_BEACON = 34; static const int SHAPE_ANVIL = 35; + static const int SHAPE_HOPPER = 38; static const int SHAPE_QUARTZ = 39; + static const int SHAPE_THIN_PANE = 40; + + static const int SHAPE_COUNT = 41; // 4J - this array of simple constants made so the compiler can optimise references to Ids that were previous of the form Tile_SPU::->id, and are now simply Tile_SPU::whatever_Id - static const int rock_Id = 1; + static const int stone_Id = 1; static const int grass_Id = 2; static const int dirt_Id = 3; - static const int stoneBrick_Id = 4; + static const int cobblestone_Id = 4; static const int wood_Id = 5; static const int sapling_Id = 6; static const int unbreakable_Id = 7; static const int water_Id = 8; static const int calmWater_Id = 9; static const int lava_Id = 10; + static const int calmLava_Id = 11; static const int sand_Id = 12; static const int gravel_Id = 13; @@ -319,26 +336,29 @@ public: static const int leaves_Id = 18; static const int sponge_Id = 19; static const int glass_Id = 20; + static const int lapisOre_Id = 21; static const int lapisBlock_Id = 22; static const int dispenser_Id = 23; static const int sandStone_Id = 24; - static const int musicBlock_Id = 25; + static const int noteblock_Id = 25; static const int bed_Id = 26; static const int goldenRail_Id = 27; static const int detectorRail_Id = 28; static const int pistonStickyBase_Id = 29; static const int web_Id = 30; + static const int tallgrass_Id = 31; static const int deadBush_Id = 32; static const int pistonBase_Id = 33; static const int pistonExtensionPiece_Id = 34; - static const int cloth_Id = 35; + static const int wool_Id = 35; static const int pistonMovingPiece_Id = 36; static const int flower_Id = 37; static const int rose_Id = 38; - static const int mushroom1_Id = 39; - static const int mushroom2_Id = 40; + static const int mushroom_brown_Id = 39; + static const int mushroom_red_Id = 40; + static const int goldBlock_Id = 41; static const int ironBlock_Id = 42; static const int stoneSlab_Id = 43; @@ -346,9 +366,10 @@ public: static const int redBrick_Id = 45; static const int tnt_Id = 46; static const int bookshelf_Id = 47; - static const int mossStone_Id = 48; + static const int mossyCobblestone_Id = 48; static const int obsidian_Id = 49; static const int torch_Id = 50; + static const int fire_Id = 51; static const int mobSpawner_Id = 52; static const int stairs_wood_Id = 53; @@ -357,8 +378,9 @@ public: static const int diamondOre_Id = 56; static const int diamondBlock_Id = 57; static const int workBench_Id = 58; - static const int crops_Id = 59; + static const int wheat_Id = 59; static const int farmland_Id = 60; + static const int furnace_Id = 61; static const int furnace_lit_Id = 62; static const int sign_Id = 63; @@ -369,37 +391,40 @@ public: static const int wallSign_Id = 68; static const int lever_Id = 69; static const int pressurePlate_stone_Id = 70; + static const int door_iron_Id = 71; static const int pressurePlate_wood_Id = 72; static const int redStoneOre_Id = 73; static const int redStoneOre_lit_Id = 74; - static const int notGate_off_Id = 75; - static const int notGate_on_Id = 76; + static const int redstoneTorch_off_Id = 75; + static const int redstoneTorch_on_Id = 76; static const int button_stone_Id = 77; static const int topSnow_Id = 78; static const int ice_Id = 79; static const int snow_Id = 80; + static const int cactus_Id = 81; static const int clay_Id = 82; static const int reeds_Id = 83; - static const int recordPlayer_Id = 84; + static const int jukebox_Id = 84; static const int fence_Id = 85; static const int pumpkin_Id = 86; - static const int hellRock_Id = 87; - static const int hellSand_Id = 88; - static const int lightGem_Id = 89; + static const int netherRack_Id = 87; + static const int soulsand_Id = 88; + static const int glowstone_Id = 89; static const int portalTile_Id = 90; + static const int litPumpkin_Id = 91; static const int cake_Id = 92; static const int diode_off_Id = 93; static const int diode_on_Id = 94; - static const int aprilFoolsJoke_Id = 95; + static const int stained_glass_Id = 95; static const int trapdoor_Id = 96; - static const int monsterStoneEgg_Id = 97; - static const int stoneBrickSmooth_Id = 98; - static const int hugeMushroom1_Id = 99; - static const int hugeMushroom2_Id = 100; + static const int stoneBrick_Id = 98; + static const int hugeMushroom_brown_Id = 99; + static const int hugeMushroom_red_Id = 100; + static const int ironFence_Id = 101; static const int thinGlass_Id = 102; static const int melon_Id = 103; @@ -408,9 +433,9 @@ public: static const int vine_Id = 106; static const int fenceGate_Id = 107; static const int stairs_bricks_Id = 108; - static const int stairs_stoneBrickSmooth_Id = 109; - + static const int stairs_stoneBrick_Id = 109; static const int mycel_Id = 110; + static const int waterLily_Id = 111; static const int netherBrick_Id = 112; static const int netherFence_Id = 113; @@ -421,36 +446,55 @@ public: static const int cauldron_Id = 118; static const int endPortalTile_Id = 119; static const int endPortalFrameTile_Id = 120; - static const int whiteStone_Id = 121; + + static const int endStone_Id = 121; static const int dragonEgg_Id = 122; static const int redstoneLight_Id = 123; static const int redstoneLight_lit_Id = 124; - - static const int woodSlab_Id = 125; static const int woodSlabHalf_Id = 126; static const int cocoa_Id = 127; static const int stairs_sandstone_Id = 128; - static const int stairs_sprucewood_Id = 134; - static const int stairs_birchwood_Id = 135; - static const int stairs_junglewood_Id = 136; static const int emeraldOre_Id = 129; static const int enderChest_Id = 130; + static const int tripWireSource_Id = 131; static const int tripWire_Id = 132; static const int emeraldBlock_Id = 133; - + static const int stairs_sprucewood_Id = 134; + static const int stairs_birchwood_Id = 135; + static const int stairs_junglewood_Id = 136; + static const int commandBlock_Id = 137; + static const int beacon_Id = 138; static const int cobbleWall_Id = 139; static const int flowerPot_Id = 140; + static const int carrots_Id = 141; static const int potatoes_Id = 142; - static const int anvil_Id = 145; static const int button_wood_Id = 143; static const int skull_Id = 144; + static const int anvil_Id = 145; + static const int chest_trap_Id = 146; + static const int weightedPlate_light_Id = 147; + static const int weightedPlate_heavy_Id = 148; + static const int comparator_off_Id = 149; + static const int comparator_on_Id = 150; + + static const int daylightDetector_Id = 151; + static const int redstoneBlock_Id = 152; static const int netherQuartz_Id = 153; + static const int hopper_Id = 154; static const int quartzBlock_Id = 155; static const int stairs_quartz_Id = 156; + static const int activatorRail_Id = 157; + static const int dropper_Id = 158; + static const int clayHardened_colored_Id = 159; + static const int stained_glass_pane_Id = 160; + + static const int hayBlock_Id = 170; static const int woolCarpet_Id = 171; + static const int clayHardened_Id = 172; + static const int coalBlock_Id = 173; static Tile_SPU m_tiles[256]; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h index f4e10429..7674177c 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h @@ -1,10 +1,10 @@ #pragma once -#include "Tile_SPU.h" +#include "RotatedPillarTile_SPU.h" class Player; -class TreeTile_SPU : public Tile_SPU +class TreeTile_SPU : public RotatedPillarTile_SPU { public: static const int DARK_TRUNK = 1; @@ -19,29 +19,14 @@ public: static const int TREE_NAMES_LENGTH = 4; - TreeTile_SPU(int id) : Tile_SPU(id) {} - int getRenderShape() { return Tile_SPU::SHAPE_TREE; } - + TreeTile_SPU(int id) : RotatedPillarTile_SPU(id) {} public: - Icon_SPU *getTexture(int face, int data) - { - int dir = data & MASK_FACING; - int type = data & MASK_TYPE; - - if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) - { - return &ms_pTileData->treeTile_icons_top[type]; - } - else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) - { - return &ms_pTileData->treeTile_icons_top[type]; - } - else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH)) - { - return &ms_pTileData->treeTile_icons_top[type]; - } - + Icon_SPU *getTypeTexture(int type) { return &ms_pTileData->treeTile_icons_side[type]; - } + }; + + Icon_SPU *getTopTexture(int type) { + return &ms_pTileData->treeTile_icons_top[type]; + }; }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WallTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WallTile_SPU.h index a9489608..344407b3 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WallTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WallTile_SPU.h @@ -22,7 +22,7 @@ public: { if (data == TYPE_MOSSY) { - return TileRef_SPU(mossStone_Id)->getTexture(face); + return TileRef_SPU(mossyCobblestone_Id)->getTexture(face); } return TileRef_SPU(stoneBrick_Id)->getTexture(face); diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WeightedPressurePlateTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WeightedPressurePlateTile_SPU.h new file mode 100644 index 00000000..bf308f38 --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WeightedPressurePlateTile_SPU.h @@ -0,0 +1,22 @@ +#pragma once +#include "BasePressurePlateTile_SPU.h" + +class WeightedPressurePlateTile_SPU : public BasePressurePlateTile_SPU +{ +public: + enum Sensitivity + { + everything, mobs, players + }; + +private: + Sensitivity sensitivity; + +public: + WeightedPressurePlateTile_SPU(int id) : BasePressurePlateTile_SPU(id) {} + +protected: + virtual int getSignalForData(int data) { + return data; + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolCarpetTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolCarpetTile_SPU.h index c86ea802..4e7123ac 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolCarpetTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolCarpetTile_SPU.h @@ -7,7 +7,7 @@ class WoolCarpetTile_SPU : public Tile_SPU public: WoolCarpetTile_SPU(int id) : Tile_SPU(id) {} - Icon_SPU *getTexture(int face, int data) { return TileRef_SPU(cloth_Id)->getTexture(face, data); } + Icon_SPU *getTexture(int face, int data) { return TileRef_SPU(wool_Id)->getTexture(face, data); } bool isSolidRender(bool isServerLevel = false) { return false; } void updateDefaultShape() { updateShape(0); } void updateShape(ChunkRebuildData *level, int x, int y, int z) { updateShape(level->getData(x, y, z)); } diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolTile_SPU.h new file mode 100644 index 00000000..e21b3b0c --- /dev/null +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/WoolTile_SPU.h @@ -0,0 +1,11 @@ +#pragma once +#include "Tile_SPU.h" + +class WoolTile_SPU : public Tile_SPU +{ +public: + WoolTile_SPU(int id) : Tile_SPU(id) {} + virtual Icon_SPU *getTexture(int face, int data) { return &ms_pTileData->woolTile_icons[data]; } + + +}; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ObjFiles/Release/ChunkUpdate.ppu.o b/Minecraft.Client/PS3/SPU_Tasks/ObjFiles/Release/ChunkUpdate.ppu.o index 3f0472d62ee6fc770abc560791f0dd9c4a1c087a..55b4af16f22af80734997fe3f1e8559d2826d0fd 100644 GIT binary patch delta 45784 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 delta 44010 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