aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/SignTileEntity.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/SignTileEntity.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/SignTileEntity.cpp')
-rw-r--r--Minecraft.World/SignTileEntity.cpp198
1 files changed, 198 insertions, 0 deletions
diff --git a/Minecraft.World/SignTileEntity.cpp b/Minecraft.World/SignTileEntity.cpp
new file mode 100644
index 00000000..09b8e022
--- /dev/null
+++ b/Minecraft.World/SignTileEntity.cpp
@@ -0,0 +1,198 @@
+#include "stdafx.h"
+#include "com.mojang.nbt.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.entity.item.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.item.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.phys.h"
+#include "net.minecraft.network.packet.h"
+#include "SignTileEntity.h"
+#include <xuiapp.h>
+#include "..\Minecraft.Client\ClientConnection.h"
+#include "..\Minecraft.Client\Minecraft.h"
+#include "..\Minecraft.Client\ServerLevel.h"
+#include "..\Minecraft.World\Level.h"
+
+
+
+const int SignTileEntity::MAX_LINE_LENGTH = 15;
+
+SignTileEntity::SignTileEntity() : TileEntity()
+{
+ m_wsmessages[0] = L"";
+ m_wsmessages[1] = L"";
+ m_wsmessages[2] = L"";
+ m_wsmessages[3] = L"";
+ m_bVerified=true;
+ m_bCensored=false;
+
+ m_iSelectedLine = -1;
+
+ _isEditable = true;
+}
+
+SignTileEntity::~SignTileEntity()
+{
+ // TODO ORBIS_STUBBED;
+#ifndef __ORBIS__
+ // 4J-PB - we don't need to verify strings anymore - InputManager.CancelQueuedVerifyStrings(&SignTileEntity::StringVerifyCallback,(LPVOID)this);
+#endif
+}
+
+void SignTileEntity::save(CompoundTag *tag)
+{
+ TileEntity::save(tag);
+ tag->putString(L"Text1", m_wsmessages[0] );
+ tag->putString(L"Text2", m_wsmessages[1] );
+ tag->putString(L"Text3", m_wsmessages[2] );
+ tag->putString(L"Text4", m_wsmessages[3] );
+#ifndef _CONTENT_PACKAGE
+ OutputDebugStringW(L"### - Saving a sign with text - \n");
+ for(int i=0;i<4;i++)
+ {
+ OutputDebugStringW(m_wsmessages[i].c_str());
+ OutputDebugStringW(L"\n");
+ }
+#endif
+}
+
+void SignTileEntity::load(CompoundTag *tag)
+{
+ _isEditable = false;
+ TileEntity::load(tag);
+ for (int i = 0; i < MAX_SIGN_LINES; i++)
+ {
+ wchar_t *buf = new wchar_t[256];
+ swprintf(buf, 256, L"Text%d", (i+1) );
+ m_wsmessages[i] = tag->getString( buf );
+ if (m_wsmessages[i].length() > MAX_LINE_LENGTH) m_wsmessages[i] = m_wsmessages[i].substr(0, MAX_LINE_LENGTH);
+ }
+#ifndef _CONTENT_PACKAGE
+ OutputDebugStringW(L"### - Loaded a sign with text - \n");
+ for(int i=0;i<4;i++)
+ {
+ OutputDebugStringW(m_wsmessages[i].c_str());
+ OutputDebugStringW(L"\n");
+ }
+#endif
+
+ // 4J Stu - Fix for #13531 - Bug: Signs do not Censor after loading a save
+ // Set verified as false so that it can be re-verified
+ m_bVerified=false;
+
+ setChanged();
+}
+
+shared_ptr<Packet> SignTileEntity::getUpdatePacket()
+{
+ wstring copy[MAX_SIGN_LINES];
+ for (int i = 0; i < MAX_SIGN_LINES; i++)
+ {
+ copy[i] = m_wsmessages[i];
+ }
+ return shared_ptr<SignUpdatePacket>( new SignUpdatePacket(x, y, z, m_bVerified, m_bCensored, copy) );
+}
+
+bool SignTileEntity::isEditable()
+{
+ return _isEditable;
+}
+
+void SignTileEntity::setEditable(bool isEditable)
+{
+ this->_isEditable = isEditable;
+}
+
+void SignTileEntity::setChanged()
+{
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+
+ // 4J-PB - For TU14 we are allowed to not verify strings anymore !
+ m_bVerified=true;
+ /*
+ if(!g_NetworkManager.IsLocalGame() && !m_bVerified)
+ //if (pMinecraft->level->isClientSide)
+ {
+ WCHAR *wcMessages[MAX_SIGN_LINES];
+ for (int i = 0; i < MAX_SIGN_LINES; ++i)
+ {
+ wcMessages[i]=new WCHAR [MAX_LINE_LENGTH+1];
+ ZeroMemory(wcMessages[i],sizeof(WCHAR)*(MAX_LINE_LENGTH+1));
+ if(m_wsmessages[i].length()>0)
+ {
+ memcpy(wcMessages[i],m_wsmessages[i].c_str(),m_wsmessages[i].length()*sizeof(WCHAR));
+ }
+ }
+ // at this point, we can ask the online string verifier if our sign text is ok
+#ifdef __ORBIS__
+ m_bVerified=true;
+#else
+
+ if(!InputManager.VerifyStrings((WCHAR**)&wcMessages,MAX_SIGN_LINES,&SignTileEntity::StringVerifyCallback,(LPVOID)this))
+ {
+ // Nothing to verify
+ m_bVerified=true;
+ }
+ for(unsigned int i = 0; i < MAX_SIGN_LINES; ++i)
+ {
+ delete [] wcMessages[i];
+ }
+#endif
+ }
+ else
+ {
+ // set the sign to allowed (local game)
+ m_bVerified=true;
+ }
+ */
+}
+
+
+void SignTileEntity::SetMessage(int iIndex,wstring &wsText)
+{
+ m_wsmessages[iIndex]=wsText;
+
+}
+
+// 4J-PB - added for string verification
+int SignTileEntity::StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE *pResults)
+{
+ // results will be in m_pStringVerifyResponse
+ SignTileEntity *pClass=(SignTileEntity *)lpParam;
+
+ pClass->m_bVerified=true;
+ pClass->m_bCensored=false;
+ for(int i=0;i<pResults->wNumStrings;i++)
+ {
+ if(pResults->pStringResult[i]!=ERROR_SUCCESS)
+ {
+ pClass->m_bCensored=true;
+ }
+ }
+
+ if(!pClass->level->isClientSide)
+ {
+ ServerLevel *serverLevel = (ServerLevel *)pClass->level;
+ // 4J Stu - This callback gets called on the main thread, but tried to access things on the server thread. Change to go through the protected method.
+ //pClass->level->sendTileUpdated(pClass->x, pClass->y, pClass->z);
+ serverLevel->queueSendTileUpdate(pClass->x, pClass->y, pClass->z);
+ }
+
+ return 0;
+}
+
+// 4J Added
+shared_ptr<TileEntity> SignTileEntity::clone()
+{
+ shared_ptr<SignTileEntity> result = shared_ptr<SignTileEntity>( new SignTileEntity() );
+ TileEntity::clone(result);
+
+ result->m_wsmessages[0] = m_wsmessages[0];
+ result->m_wsmessages[1] = m_wsmessages[1];
+ result->m_wsmessages[2] = m_wsmessages[2];
+ result->m_wsmessages[3] = m_wsmessages[3];
+ result->m_bVerified = m_bVerified;
+ result->m_bCensored = m_bCensored;
+ return result;
+} \ No newline at end of file