the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "com.mojang.nbt.h"
3#include "net.minecraft.world.level.h"
4#include "net.minecraft.world.entity.item.h"
5#include "net.minecraft.world.entity.player.h"
6#include "net.minecraft.world.item.h"
7#include "net.minecraft.world.entity.h"
8#include "net.minecraft.world.phys.h"
9#include "net.minecraft.network.packet.h"
10#include "SignTileEntity.h"
11#include <xuiapp.h>
12#include "..\Minecraft.Client\ClientConnection.h"
13#include "..\Minecraft.Client\Minecraft.h"
14#include "..\Minecraft.Client\ServerLevel.h"
15#include "..\Minecraft.World\Level.h"
16
17
18
19const int SignTileEntity::MAX_LINE_LENGTH = 15;
20
21SignTileEntity::SignTileEntity() : TileEntity()
22{
23 m_wsmessages[0] = L"";
24 m_wsmessages[1] = L"";
25 m_wsmessages[2] = L"";
26 m_wsmessages[3] = L"";
27 m_bVerified=true;
28 m_bCensored=false;
29
30 m_iSelectedLine = -1;
31
32 _isEditable = true;
33
34 playerWhoMayEdit = nullptr;
35}
36
37SignTileEntity::~SignTileEntity()
38{
39 // TODO ORBIS_STUBBED;
40#ifndef __ORBIS__
41 // 4J-PB - we don't need to verify strings anymore - InputManager.CancelQueuedVerifyStrings(&SignTileEntity::StringVerifyCallback,(LPVOID)this);
42#endif
43}
44
45void SignTileEntity::save(CompoundTag *tag)
46{
47 TileEntity::save(tag);
48 tag->putString(L"Text1", m_wsmessages[0] );
49 tag->putString(L"Text2", m_wsmessages[1] );
50 tag->putString(L"Text3", m_wsmessages[2] );
51 tag->putString(L"Text4", m_wsmessages[3] );
52#ifndef _CONTENT_PACKAGE
53 OutputDebugStringW(L"### - Saving a sign with text - \n");
54 for(int i=0;i<4;i++)
55 {
56 OutputDebugStringW(m_wsmessages[i].c_str());
57 OutputDebugStringW(L"\n");
58 }
59#endif
60}
61
62void SignTileEntity::load(CompoundTag *tag)
63{
64 _isEditable = false;
65 TileEntity::load(tag);
66 for (int i = 0; i < MAX_SIGN_LINES; i++)
67 {
68 wchar_t *buf = new wchar_t[256];
69 swprintf(buf, 256, L"Text%d", (i+1) );
70 m_wsmessages[i] = tag->getString( buf );
71 if (m_wsmessages[i].length() > MAX_LINE_LENGTH) m_wsmessages[i] = m_wsmessages[i].substr(0, MAX_LINE_LENGTH);
72 }
73#ifndef _CONTENT_PACKAGE
74 OutputDebugStringW(L"### - Loaded a sign with text - \n");
75 for(int i=0;i<4;i++)
76 {
77 OutputDebugStringW(m_wsmessages[i].c_str());
78 OutputDebugStringW(L"\n");
79 }
80#endif
81
82 // 4J Stu - Fix for #13531 - Bug: Signs do not Censor after loading a save
83 // Set verified as false so that it can be re-verified
84 m_bVerified=false;
85
86 setChanged();
87}
88
89shared_ptr<Packet> SignTileEntity::getUpdatePacket()
90{
91 wstring copy[MAX_SIGN_LINES];
92 for (int i = 0; i < MAX_SIGN_LINES; i++)
93 {
94 copy[i] = m_wsmessages[i];
95 }
96 return shared_ptr<SignUpdatePacket>( new SignUpdatePacket(x, y, z, m_bVerified, m_bCensored, copy) );
97}
98
99bool SignTileEntity::isEditable()
100{
101 return _isEditable;
102}
103
104void SignTileEntity::setEditable(bool isEditable)
105{
106 this->_isEditable = isEditable;
107 if (!isEditable)
108 {
109 playerWhoMayEdit = nullptr;
110 }
111}
112
113void SignTileEntity::setAllowedPlayerEditor(shared_ptr<Player> player)
114{
115 playerWhoMayEdit = player;
116}
117
118shared_ptr<Player> SignTileEntity::getPlayerWhoMayEdit()
119{
120 return playerWhoMayEdit;
121}
122
123void SignTileEntity::setChanged()
124{
125 Minecraft *pMinecraft=Minecraft::GetInstance();
126
127 // 4J-PB - For TU14 we are allowed to not verify strings anymore !
128 m_bVerified=true;
129 /*
130 if(!g_NetworkManager.IsLocalGame() && !m_bVerified)
131 //if (pMinecraft->level->isClientSide)
132 {
133 WCHAR *wcMessages[MAX_SIGN_LINES];
134 for (int i = 0; i < MAX_SIGN_LINES; ++i)
135 {
136 wcMessages[i]=new WCHAR [MAX_LINE_LENGTH+1];
137 ZeroMemory(wcMessages[i],sizeof(WCHAR)*(MAX_LINE_LENGTH+1));
138 if(m_wsmessages[i].length()>0)
139 {
140 memcpy(wcMessages[i],m_wsmessages[i].c_str(),m_wsmessages[i].length()*sizeof(WCHAR));
141 }
142 }
143 // at this point, we can ask the online string verifier if our sign text is ok
144#ifdef __ORBIS__
145 m_bVerified=true;
146#else
147
148 if(!InputManager.VerifyStrings((WCHAR**)&wcMessages,MAX_SIGN_LINES,&SignTileEntity::StringVerifyCallback,(LPVOID)this))
149 {
150 // Nothing to verify
151 m_bVerified=true;
152 }
153 for(unsigned int i = 0; i < MAX_SIGN_LINES; ++i)
154 {
155 delete [] wcMessages[i];
156 }
157#endif
158 }
159 else
160 {
161 // set the sign to allowed (local game)
162 m_bVerified=true;
163 }
164 */
165}
166
167
168void SignTileEntity::SetMessage(int iIndex,wstring &wsText)
169{
170 m_wsmessages[iIndex]=wsText;
171
172}
173
174// 4J-PB - added for string verification
175int SignTileEntity::StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE *pResults)
176{
177 // results will be in m_pStringVerifyResponse
178 SignTileEntity *pClass=(SignTileEntity *)lpParam;
179
180 pClass->m_bVerified=true;
181 pClass->m_bCensored=false;
182 for(int i=0;i<pResults->wNumStrings;i++)
183 {
184 if(pResults->pStringResult[i]!=ERROR_SUCCESS)
185 {
186 pClass->m_bCensored=true;
187 }
188 }
189
190 if(!pClass->level->isClientSide)
191 {
192 ServerLevel *serverLevel = (ServerLevel *)pClass->level;
193 // 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.
194 //pClass->level->sendTileUpdated(pClass->x, pClass->y, pClass->z);
195 serverLevel->queueSendTileUpdate(pClass->x, pClass->y, pClass->z);
196 }
197
198 return 0;
199}
200
201// 4J Added
202shared_ptr<TileEntity> SignTileEntity::clone()
203{
204 shared_ptr<SignTileEntity> result = shared_ptr<SignTileEntity>( new SignTileEntity() );
205 TileEntity::clone(result);
206
207 result->m_wsmessages[0] = m_wsmessages[0];
208 result->m_wsmessages[1] = m_wsmessages[1];
209 result->m_wsmessages[2] = m_wsmessages[2];
210 result->m_wsmessages[3] = m_wsmessages[3];
211 result->m_bVerified = m_bVerified;
212 result->m_bCensored = m_bCensored;
213 return result;
214}