fully implemented the sign with the new framework
This commit is contained in:
parent
fa08294d09
commit
fa736e138c
@ -1630,6 +1630,40 @@ void Client::sendSignText(v3s16 blockpos, s16 id, std::string text)
|
|||||||
Send(0, data, true);
|
Send(0, data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::sendSignNodeText(v3s16 p, std::string text)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
u16 command
|
||||||
|
v3s16 p
|
||||||
|
u16 textlen
|
||||||
|
textdata
|
||||||
|
*/
|
||||||
|
std::ostringstream os(std::ios_base::binary);
|
||||||
|
u8 buf[12];
|
||||||
|
|
||||||
|
// Write command
|
||||||
|
writeU16(buf, TOSERVER_SIGNNODETEXT);
|
||||||
|
os.write((char*)buf, 2);
|
||||||
|
|
||||||
|
// Write p
|
||||||
|
writeV3S16(buf, p);
|
||||||
|
os.write((char*)buf, 6);
|
||||||
|
|
||||||
|
u16 textlen = text.size();
|
||||||
|
// Write text length
|
||||||
|
writeS16(buf, textlen);
|
||||||
|
os.write((char*)buf, 2);
|
||||||
|
|
||||||
|
// Write text
|
||||||
|
os.write((char*)text.c_str(), textlen);
|
||||||
|
|
||||||
|
// Make data buffer
|
||||||
|
std::string s = os.str();
|
||||||
|
SharedBuffer<u8> data((u8*)s.c_str(), s.size());
|
||||||
|
// Send as reliable
|
||||||
|
Send(0, data, true);
|
||||||
|
}
|
||||||
|
|
||||||
void Client::sendInventoryAction(InventoryAction *a)
|
void Client::sendInventoryAction(InventoryAction *a)
|
||||||
{
|
{
|
||||||
std::ostringstream os(std::ios_base::binary);
|
std::ostringstream os(std::ios_base::binary);
|
||||||
|
@ -277,6 +277,7 @@ public:
|
|||||||
void clickObject(u8 button, v3s16 blockpos, s16 id, u16 item);
|
void clickObject(u8 button, v3s16 blockpos, s16 id, u16 item);
|
||||||
|
|
||||||
void sendSignText(v3s16 blockpos, s16 id, std::string text);
|
void sendSignText(v3s16 blockpos, s16 id, std::string text);
|
||||||
|
void sendSignNodeText(v3s16 p, std::string text);
|
||||||
void sendInventoryAction(InventoryAction *a);
|
void sendInventoryAction(InventoryAction *a);
|
||||||
void sendChatMessage(const std::wstring &message);
|
void sendChatMessage(const std::wstring &message);
|
||||||
|
|
||||||
|
@ -241,6 +241,14 @@ enum ToServerCommand
|
|||||||
wstring message
|
wstring message
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
TOSERVER_SIGNNODETEXT = 0x33,
|
||||||
|
/*
|
||||||
|
u16 command
|
||||||
|
v3s16 p
|
||||||
|
u16 textlen
|
||||||
|
textdata
|
||||||
|
*/
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time)
|
inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time)
|
||||||
|
45
src/main.cpp
45
src/main.cpp
@ -578,6 +578,25 @@ struct TextDestChat : public TextDest
|
|||||||
Client *m_client;
|
Client *m_client;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TextDestSignNode : public TextDest
|
||||||
|
{
|
||||||
|
TextDestSignNode(v3s16 p, Client *client)
|
||||||
|
{
|
||||||
|
m_p = p;
|
||||||
|
m_client = client;
|
||||||
|
}
|
||||||
|
void gotText(std::wstring text)
|
||||||
|
{
|
||||||
|
std::string ntext = wide_to_narrow(text);
|
||||||
|
dstream<<"Changing text of a sign node: "
|
||||||
|
<<ntext<<std::endl;
|
||||||
|
m_client->sendSignNodeText(m_p, ntext);
|
||||||
|
}
|
||||||
|
|
||||||
|
v3s16 m_p;
|
||||||
|
Client *m_client;
|
||||||
|
};
|
||||||
|
|
||||||
class MyEventReceiver : public IEventReceiver
|
class MyEventReceiver : public IEventReceiver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -2830,6 +2849,8 @@ int main(int argc, char *argv[])
|
|||||||
infotext = narrow_to_wide(meta->infoText());
|
infotext = narrow_to_wide(meta->infoText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MapNode node = client.getNode(nodepos);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Handle digging
|
Handle digging
|
||||||
*/
|
*/
|
||||||
@ -2956,8 +2977,32 @@ int main(int argc, char *argv[])
|
|||||||
if(g_input->getRightClicked())
|
if(g_input->getRightClicked())
|
||||||
{
|
{
|
||||||
std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
|
std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
|
||||||
|
|
||||||
|
if(meta && meta->typeId() == CONTENT_SIGN_WALL)
|
||||||
|
{
|
||||||
|
dstream<<"Sign node right-clicked"<<std::endl;
|
||||||
|
|
||||||
|
if(random_input == false)
|
||||||
|
{
|
||||||
|
// Get a new text for it
|
||||||
|
|
||||||
|
TextDest *dest = new TextDestSignNode(nodepos, &client);
|
||||||
|
|
||||||
|
SignNodeMetadata *signmeta = (SignNodeMetadata*)meta;
|
||||||
|
|
||||||
|
std::wstring wtext =
|
||||||
|
narrow_to_wide(signmeta->getText());
|
||||||
|
|
||||||
|
(new GUITextInputMenu(guienv, guiroot, -1,
|
||||||
|
&g_menumgr, dest,
|
||||||
|
wtext))->drop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
client.groundAction(1, nodepos, neighbourpos, g_selected_item);
|
client.groundAction(1, nodepos, neighbourpos, g_selected_item);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nodepos_old = nodepos;
|
nodepos_old = nodepos;
|
||||||
}
|
}
|
||||||
|
@ -1878,8 +1878,6 @@ void MapBlock::serialize(std::ostream &os, u8 version)
|
|||||||
flags |= 0x02;
|
flags |= 0x02;
|
||||||
if(m_lighting_expired)
|
if(m_lighting_expired)
|
||||||
flags |= 0x04;
|
flags |= 0x04;
|
||||||
/*if(m_not_fully_generated)
|
|
||||||
flags |= 0x08;*/
|
|
||||||
os.write((char*)&flags, 1);
|
os.write((char*)&flags, 1);
|
||||||
|
|
||||||
u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
|
u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
|
||||||
@ -1913,6 +1911,14 @@ void MapBlock::serialize(std::ostream &os, u8 version)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
compress(databuf, os, version);
|
compress(databuf, os, version);
|
||||||
|
|
||||||
|
/*
|
||||||
|
NodeMetadata
|
||||||
|
*/
|
||||||
|
if(version >= 14)
|
||||||
|
{
|
||||||
|
m_node_metadata.serialize(os);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2002,7 +2008,6 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
|
|||||||
is_underground = (flags & 0x01) ? true : false;
|
is_underground = (flags & 0x01) ? true : false;
|
||||||
m_day_night_differs = (flags & 0x02) ? true : false;
|
m_day_night_differs = (flags & 0x02) ? true : false;
|
||||||
m_lighting_expired = (flags & 0x04) ? true : false;
|
m_lighting_expired = (flags & 0x04) ? true : false;
|
||||||
//m_not_fully_generated = (flags & 0x08) ? true : false;
|
|
||||||
|
|
||||||
// Uncompress data
|
// Uncompress data
|
||||||
std::ostringstream os(std::ios_base::binary);
|
std::ostringstream os(std::ios_base::binary);
|
||||||
@ -2027,6 +2032,14 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
|
|||||||
{
|
{
|
||||||
data[i].param2 = s[i+nodecount*2];
|
data[i].param2 = s[i+nodecount*2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
NodeMetadata
|
||||||
|
*/
|
||||||
|
if(version >= 14)
|
||||||
|
{
|
||||||
|
m_node_metadata.deSerialize(is);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -307,7 +307,7 @@ void init_mapnode()
|
|||||||
f->wall_mounted = true;
|
f->wall_mounted = true;
|
||||||
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
|
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
|
||||||
if(f->initial_metadata == NULL)
|
if(f->initial_metadata == NULL)
|
||||||
f->initial_metadata = new SignNodeMetadata();
|
f->initial_metadata = new SignNodeMetadata("Some sign");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,11 +46,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
11: (dev) zlib'd blocks, block flags
|
11: (dev) zlib'd blocks, block flags
|
||||||
12: (dev) UnlimitedHeightmap now uses interpolated areas
|
12: (dev) UnlimitedHeightmap now uses interpolated areas
|
||||||
13: (dev) Mapgen v2
|
13: (dev) Mapgen v2
|
||||||
|
14: (dev) NodeMetadata
|
||||||
*/
|
*/
|
||||||
// This represents an uninitialized or invalid format
|
// This represents an uninitialized or invalid format
|
||||||
#define SER_FMT_VER_INVALID 255
|
#define SER_FMT_VER_INVALID 255
|
||||||
// Highest supported serialization version
|
// Highest supported serialization version
|
||||||
#define SER_FMT_VER_HIGHEST 13
|
#define SER_FMT_VER_HIGHEST 14
|
||||||
// Lowest supported serialization version
|
// Lowest supported serialization version
|
||||||
#define SER_FMT_VER_LOWEST 2
|
#define SER_FMT_VER_LOWEST 2
|
||||||
|
|
||||||
|
@ -1221,6 +1221,8 @@ void Server::AsyncRunStep()
|
|||||||
{
|
{
|
||||||
//u16 peer_id = i.getNode()->getKey();
|
//u16 peer_id = i.getNode()->getKey();
|
||||||
RemoteClient *client = i.getNode()->getValue();
|
RemoteClient *client = i.getNode()->getValue();
|
||||||
|
Player *player = m_env.getPlayer(client->peer_id);
|
||||||
|
std::cout<<player->getName()<<" ";
|
||||||
client->PrintInfo(std::cout);
|
client->PrintInfo(std::cout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2395,6 +2397,52 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
|||||||
|
|
||||||
obj->getBlock()->setChangedFlag();
|
obj->getBlock()->setChangedFlag();
|
||||||
}
|
}
|
||||||
|
else if(command == TOSERVER_SIGNNODETEXT)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
u16 command
|
||||||
|
v3s16 p
|
||||||
|
u16 textlen
|
||||||
|
textdata
|
||||||
|
*/
|
||||||
|
std::string datastring((char*)&data[2], datasize-2);
|
||||||
|
std::istringstream is(datastring, std::ios_base::binary);
|
||||||
|
u8 buf[6];
|
||||||
|
// Read stuff
|
||||||
|
is.read((char*)buf, 6);
|
||||||
|
v3s16 p = readV3S16(buf);
|
||||||
|
is.read((char*)buf, 2);
|
||||||
|
u16 textlen = readU16(buf);
|
||||||
|
std::string text;
|
||||||
|
for(u16 i=0; i<textlen; i++)
|
||||||
|
{
|
||||||
|
is.read((char*)buf, 1);
|
||||||
|
text += (char)buf[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeMetadata *meta = m_env.getMap().getNodeMetadata(p);
|
||||||
|
if(!meta)
|
||||||
|
return;
|
||||||
|
if(meta->typeId() != CONTENT_SIGN_WALL)
|
||||||
|
return;
|
||||||
|
SignNodeMetadata *signmeta = (SignNodeMetadata*)meta;
|
||||||
|
signmeta->setText(text);
|
||||||
|
|
||||||
|
v3s16 blockpos = getNodeBlockPos(p);
|
||||||
|
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(blockpos);
|
||||||
|
if(block)
|
||||||
|
{
|
||||||
|
block->setChangedFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(core::map<u16, RemoteClient*>::Iterator
|
||||||
|
i = m_clients.getIterator();
|
||||||
|
i.atEnd()==false; i++)
|
||||||
|
{
|
||||||
|
RemoteClient *client = i.getNode()->getValue();
|
||||||
|
client->SetBlockNotSent(blockpos);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(command == TOSERVER_INVENTORY_ACTION)
|
else if(command == TOSERVER_INVENTORY_ACTION)
|
||||||
{
|
{
|
||||||
/*// Ignore inventory changes if in creative mode
|
/*// Ignore inventory changes if in creative mode
|
||||||
@ -3376,12 +3424,12 @@ void setCreativeInventory(Player *player)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Sign
|
/*// Sign
|
||||||
{
|
{
|
||||||
InventoryItem *item = new MapBlockObjectItem("Sign Example text");
|
InventoryItem *item = new MapBlockObjectItem("Sign Example text");
|
||||||
void* r = player->inventory.addItem("main", item);
|
void* r = player->inventory.addItem("main", item);
|
||||||
assert(r == NULL);
|
assert(r == NULL);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
Player *Server::emergePlayer(const char *name, const char *password,
|
Player *Server::emergePlayer(const char *name, const char *password,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user