diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-04-04 05:12:33 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-04-04 05:12:33 +0300 |
commit | fa736e138c2eb04f50bcc0431fc5a0435bf34bc6 (patch) | |
tree | ec56483bbb6196b5959d9c43a16e04f3b26e227b /src | |
parent | fa08294d09a46b603e9ff5e034010c0a7986c61a (diff) | |
download | minetest-fa736e138c2eb04f50bcc0431fc5a0435bf34bc6.tar.gz minetest-fa736e138c2eb04f50bcc0431fc5a0435bf34bc6.tar.bz2 minetest-fa736e138c2eb04f50bcc0431fc5a0435bf34bc6.zip |
fully implemented the sign with the new framework
Diffstat (limited to 'src')
-rw-r--r-- | src/client.cpp | 34 | ||||
-rw-r--r-- | src/client.h | 1 | ||||
-rw-r--r-- | src/clientserver.h | 8 | ||||
-rw-r--r-- | src/main.cpp | 47 | ||||
-rw-r--r-- | src/mapblock.cpp | 19 | ||||
-rw-r--r-- | src/mapnode.cpp | 2 | ||||
-rw-r--r-- | src/serialization.h | 3 | ||||
-rw-r--r-- | src/server.cpp | 52 |
8 files changed, 158 insertions, 8 deletions
diff --git a/src/client.cpp b/src/client.cpp index 009591c41..2fb14cb68 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1630,6 +1630,40 @@ void Client::sendSignText(v3s16 blockpos, s16 id, std::string text) 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) { std::ostringstream os(std::ios_base::binary); diff --git a/src/client.h b/src/client.h index 391528286..fdb98d28d 100644 --- a/src/client.h +++ b/src/client.h @@ -277,6 +277,7 @@ public: void clickObject(u8 button, v3s16 blockpos, s16 id, u16 item); void sendSignText(v3s16 blockpos, s16 id, std::string text); + void sendSignNodeText(v3s16 p, std::string text); void sendInventoryAction(InventoryAction *a); void sendChatMessage(const std::wstring &message); diff --git a/src/clientserver.h b/src/clientserver.h index 52b4e520e..7baa79fa6 100644 --- a/src/clientserver.h +++ b/src/clientserver.h @@ -241,6 +241,14 @@ enum ToServerCommand wstring message */ + TOSERVER_SIGNNODETEXT = 0x33, + /* + u16 command + v3s16 p + u16 textlen + textdata + */ + }; inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time) diff --git a/src/main.cpp b/src/main.cpp index 4b968865f..c9099f69b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -578,6 +578,25 @@ struct TextDestChat : public TextDest 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
{
public:
@@ -2829,6 +2848,8 @@ int main(int argc, char *argv[]) {
infotext = narrow_to_wide(meta->infoText());
}
+
+ //MapNode node = client.getNode(nodepos);
/*
Handle digging
@@ -2956,7 +2977,31 @@ int main(int argc, char *argv[]) if(g_input->getRightClicked())
{
std::cout<<DTIME<<"Ground right-clicked"<<std::endl;
- client.groundAction(1, nodepos, neighbourpos, g_selected_item);
+
+ 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);
+ }
}
nodepos_old = nodepos;
diff --git a/src/mapblock.cpp b/src/mapblock.cpp index e895f7749..c14fbd04e 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -1878,8 +1878,6 @@ void MapBlock::serialize(std::ostream &os, u8 version) flags |= 0x02; if(m_lighting_expired) flags |= 0x04; - /*if(m_not_fully_generated) - flags |= 0x08;*/ os.write((char*)&flags, 1); u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; @@ -1913,6 +1911,14 @@ void MapBlock::serialize(std::ostream &os, u8 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; m_day_night_differs = (flags & 0x02) ? true : false; m_lighting_expired = (flags & 0x04) ? true : false; - //m_not_fully_generated = (flags & 0x08) ? true : false; // Uncompress data 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]; } + + /* + NodeMetadata + */ + if(version >= 14) + { + m_node_metadata.deSerialize(is); + } } /* diff --git a/src/mapnode.cpp b/src/mapnode.cpp index c8a7e504c..cb8bf7c42 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -307,7 +307,7 @@ void init_mapnode() f->wall_mounted = true; f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; if(f->initial_metadata == NULL) - f->initial_metadata = new SignNodeMetadata(); + f->initial_metadata = new SignNodeMetadata("Some sign"); } diff --git a/src/serialization.h b/src/serialization.h index e84ceee3e..fed5bb522 100644 --- a/src/serialization.h +++ b/src/serialization.h @@ -46,11 +46,12 @@ with this program; if not, write to the Free Software Foundation, Inc., 11: (dev) zlib'd blocks, block flags 12: (dev) UnlimitedHeightmap now uses interpolated areas 13: (dev) Mapgen v2 + 14: (dev) NodeMetadata */ // This represents an uninitialized or invalid format #define SER_FMT_VER_INVALID 255 // Highest supported serialization version -#define SER_FMT_VER_HIGHEST 13 +#define SER_FMT_VER_HIGHEST 14 // Lowest supported serialization version #define SER_FMT_VER_LOWEST 2 diff --git a/src/server.cpp b/src/server.cpp index b3ce9c13a..44c26dbc3 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1221,6 +1221,8 @@ void Server::AsyncRunStep() { //u16 peer_id = i.getNode()->getKey(); RemoteClient *client = i.getNode()->getValue(); + Player *player = m_env.getPlayer(client->peer_id); + std::cout<<player->getName()<<" "; client->PrintInfo(std::cout); } } @@ -2395,6 +2397,52 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) 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) { /*// Ignore inventory changes if in creative mode @@ -3376,12 +3424,12 @@ void setCreativeInventory(Player *player) } #endif - // Sign + /*// Sign { InventoryItem *item = new MapBlockObjectItem("Sign Example text"); void* r = player->inventory.addItem("main", item); assert(r == NULL); - } + }*/ } Player *Server::emergePlayer(const char *name, const char *password, |