diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 12:34:12 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 12:34:12 +0300 |
commit | 08bbf9687742c0b159cc1d963ab470796f74c6c8 (patch) | |
tree | 2e49b47fd1572b36e78016f47b7df01a7926e029 | |
parent | fd7a0735c9aeaa7978190049319e3cdfe48920a4 (diff) | |
download | minetest-08bbf9687742c0b159cc1d963ab470796f74c6c8.tar.gz minetest-08bbf9687742c0b159cc1d963ab470796f74c6c8.tar.bz2 minetest-08bbf9687742c0b159cc1d963ab470796f74c6c8.zip |
items now fall by gravity... also some other random updating
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/activeobject.h | 1 | ||||
-rw-r--r-- | src/clientobject.cpp | 78 | ||||
-rw-r--r-- | src/main.cpp | 15 | ||||
-rw-r--r-- | src/mapblockobject.cpp | 2 | ||||
-rw-r--r-- | src/mapblockobject.h | 2 | ||||
-rw-r--r-- | src/server.cpp | 13 | ||||
-rw-r--r-- | src/serverobject.cpp | 74 | ||||
-rw-r--r-- | src/serverobject.h | 7 |
9 files changed, 147 insertions, 46 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 17eabcb91..1f7ad2200 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,6 +50,7 @@ configure_file( ) set(common_SRCS + collision.cpp nodemetadata.cpp serverobject.cpp noise.cpp diff --git a/src/activeobject.h b/src/activeobject.h index 041be0778..e1fc6beaf 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -39,6 +39,7 @@ struct ActiveObjectMessage #define ACTIVEOBJECT_TYPE_INVALID 0 #define ACTIVEOBJECT_TYPE_TEST 1 #define ACTIVEOBJECT_TYPE_ITEM 2 +#define ACTIVEOBJECT_TYPE_RAT 3 /* Parent class for ServerActiveObject and ClientActiveObject diff --git a/src/clientobject.cpp b/src/clientobject.cpp index a6aa033ef..901b3d072 100644 --- a/src/clientobject.cpp +++ b/src/clientobject.cpp @@ -258,6 +258,27 @@ void ItemCAO::removeFromScene() void ItemCAO::updateLight(u8 light_at_pos) { + if(m_node == NULL) + return; + + u8 li = decode_light(light_at_pos); + video::SColor color(255,li,li,li); + + scene::IMesh *mesh = m_node->getMesh(); + if(mesh == NULL) + return; + + u16 mc = mesh->getMeshBufferCount(); + for(u16 j=0; j<mc; j++) + { + scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); + video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices(); + u16 vc = buf->getVertexCount(); + for(u16 i=0; i<vc; i++) + { + vertices[i].Color = color; + } + } } v3s16 ItemCAO::getLightPosition() @@ -290,35 +311,54 @@ void ItemCAO::step(float dtime, ClientEnvironment *env) void ItemCAO::processMessage(const std::string &data) { - dstream<<"ItemCAO: Got data: "<<data<<std::endl; + dstream<<"ItemCAO: Got message"<<std::endl; std::istringstream is(data, std::ios::binary); - u16 cmd; - is>>cmd; + char buf[4]; + // command + is.read(buf, 1); + u8 cmd = buf[0]; if(cmd == 0) { - v3f newpos; - is>>newpos.X; - is>>newpos.Y; - is>>newpos.Z; - m_position = newpos; + // pos + is.read(buf, 4); + m_position.X = (float)readS32((u8*)buf)/1000.0; + is.read(buf, 4); + m_position.Y = (float)readS32((u8*)buf)/1000.0; + is.read(buf, 4); + m_position.Z = (float)readS32((u8*)buf)/1000.0; updateNodePos(); } } void ItemCAO::initialize(const std::string &data) { - dstream<<"ItemCAO: Got init data: "<<data<<std::endl; + dstream<<"ItemCAO: Got init data"<<std::endl; + + { + std::istringstream is(data, std::ios::binary); + char buf[4]; + // version + is.read(buf, 1); + u8 version = buf[0]; + // check version + if(version != 0) + return; + // pos + is.read(buf, 4); + m_position.X = (float)readS32((u8*)buf)/1000.0; + is.read(buf, 4); + m_position.Y = (float)readS32((u8*)buf)/1000.0; + is.read(buf, 4); + m_position.Z = (float)readS32((u8*)buf)/1000.0; + // inventorystring + m_inventorystring = deSerializeString(is); + } - Strfnd fn(data); - - v3f newpos; - newpos.X = stoi(fn.next(",")); - newpos.Y = stoi(fn.next(",")); - newpos.Z = stoi(fn.next(":")); - m_position = newpos; updateNodePos(); - m_inventorystring = fn.next(""); + /* + Update image of node + */ if(m_node == NULL) return; @@ -333,9 +373,7 @@ void ItemCAO::initialize(const std::string &data) if(buf == NULL) return; - /* - Create an inventory item to see what is its image - */ + // Create an inventory item to see what is its image std::istringstream is(m_inventorystring, std::ios_base::binary); video::ITexture *texture = NULL; try{ diff --git a/src/main.cpp b/src/main.cpp index 7749266d9..92c012a90 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,10 +72,6 @@ SUGG: Split MapBlockObject serialization to to-client and to-disk them to clients
- Not applicable. MapBlockObjects will be removed in the future.
-SUGG: MovingObject::move and Player::move are basically the same.
- combine them.
- - NOTE: Player::move is more up-to-date.
-
SUGG: Precalculate lighting translation table at runtime (at startup)
- This is not doable because it is currently hand-made and not
based on some mathematical function.
@@ -204,6 +200,10 @@ Objects: TODO: Get rid of MapBlockObjects and use ActiveObjects
+SUGG: MovingObject::move and Player::move are basically the same.
+ combine them.
+ - NOTE: Player::move is more up-to-date.
+
Map:
----
@@ -2602,7 +2602,8 @@ int main(int argc, char *argv[]) core::aabbox3d<f32> *selection_box
= selected_active_object->getSelectionBox();
- // Box should exist because it was returned in the first place
+ // Box should exist because object was returned in the
+ // first place
assert(selection_box);
v3f pos = selected_active_object->getPosition();
@@ -2614,8 +2615,8 @@ int main(int argc, char *argv[]) hilightboxes.push_back(box_on_map);
- infotext = narrow_to_wide("A ClientActiveObject");
- //infotext = narrow_to_wide(selected_object->infoText());
+ //infotext = narrow_to_wide("A ClientActiveObject");
+ infotext = narrow_to_wide(selected_active_object->infoText());
if(g_input->getLeftClicked())
{
diff --git a/src/mapblockobject.cpp b/src/mapblockobject.cpp index cd1618c3a..f59a90a5f 100644 --- a/src/mapblockobject.cpp +++ b/src/mapblockobject.cpp @@ -17,6 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +// This file contains the DEPRECATED MapBlockObject system + #include "mapblockobject.h" #include "mapblock.h" // For object wrapping diff --git a/src/mapblockobject.h b/src/mapblockobject.h index d157162ec..6a0c36d9c 100644 --- a/src/mapblockobject.h +++ b/src/mapblockobject.h @@ -17,6 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +// This file contains the DEPRECATED MapBlockObject system + #ifndef MAPBLOCKOBJECT_HEADER #define MAPBLOCKOBJECT_HEADER diff --git a/src/server.cpp b/src/server.cpp index ab4032743..4334d77c7 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2436,12 +2436,17 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) return; } - v3f pos = intToFloat(p_over, BS); - pos.Y -= BS*0.45; - dout_server<<"Placing a miscellaneous item on map" <<std::endl; - + + // Calculate a position for it + v3f pos = intToFloat(p_over, BS); + //pos.Y -= BS*0.45; + pos.Y -= BS*0.25; // let it drop a bit + // Randomize a bit + pos.X += BS*0.2*(float)myrand_range(-1000,1000)/1000.0; + pos.Z += BS*0.2*(float)myrand_range(-1000,1000)/1000.0; + /* Create an ItemSAO */ diff --git a/src/serverobject.cpp b/src/serverobject.cpp index f0ef7d8d6..92a0b83f4 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <fstream> #include "environment.h" #include "inventory.h" +#include "collision.h" core::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types; @@ -135,7 +136,8 @@ ItemSAO proto_ItemSAO(NULL, 0, v3f(0,0,0), ""); ItemSAO::ItemSAO(ServerEnvironment *env, u16 id, v3f pos, const std::string inventorystring): ServerActiveObject(env, id, pos), - m_inventorystring(inventorystring) + m_inventorystring(inventorystring), + m_speed_f(0,0,0) { dstream<<"Server: ItemSAO created with inventorystring=\"" <<m_inventorystring<<"\""<<std::endl; @@ -147,7 +149,12 @@ ServerActiveObject* ItemSAO::create(ServerEnvironment *env, u16 id, v3f pos, { std::istringstream is(data, std::ios::binary); char buf[1]; - is.read(buf, 1); // read version + // read version + is.read(buf, 1); + u8 version = buf[0]; + // check if version is supported + if(version != 0) + return NULL; std::string inventorystring = deSerializeString(is); dstream<<"ItemSAO::create(): Creating item \"" <<inventorystring<<"\""<<std::endl; @@ -156,20 +163,59 @@ ServerActiveObject* ItemSAO::create(ServerEnvironment *env, u16 id, v3f pos, void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages) { + core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.); + collisionMoveResult moveresult; + // Apply gravity + m_speed_f += v3f(0, -dtime*9.81*BS, 0); + // Maximum movement without glitches + f32 pos_max_d = BS*0.25; + // Limit speed + if(m_speed_f.getLength()*dtime > pos_max_d) + m_speed_f *= pos_max_d / (m_speed_f.getLength()*dtime); + v3f pos_f = getBasePosition(); + v3f pos_f_old = pos_f; + moveresult = collisionMoveSimple(&m_env->getMap(), pos_max_d, + box, dtime, pos_f, m_speed_f); + + if(pos_f.getDistanceFrom(pos_f_old) > 0.01*BS) + { + setBasePosition(pos_f); + + std::ostringstream os(std::ios::binary); + char buf[6]; + // command (0 = update position) + buf[0] = 0; + os.write(buf, 1); + // pos + writeS32((u8*)buf, m_base_position.X*1000); + os.write(buf, 4); + writeS32((u8*)buf, m_base_position.Y*1000); + os.write(buf, 4); + writeS32((u8*)buf, m_base_position.Z*1000); + os.write(buf, 4); + // create message and add to list + ActiveObjectMessage aom(getId(), false, os.str()); + messages.push_back(aom); + } } std::string ItemSAO::getClientInitializationData() { - dstream<<__FUNCTION_NAME<<std::endl; - std::string data; - data += itos(m_base_position.X); - data += ","; - data += itos(m_base_position.Y); - data += ","; - data += itos(m_base_position.Z); - data += ":"; - data += m_inventorystring; - return data; + std::ostringstream os(std::ios::binary); + char buf[6]; + // version + buf[0] = 0; + os.write(buf, 1); + // pos + writeS32((u8*)buf, m_base_position.X*1000); + os.write(buf, 4); + writeS32((u8*)buf, m_base_position.Y*1000); + os.write(buf, 4); + writeS32((u8*)buf, m_base_position.Z*1000); + os.write(buf, 4); + // inventorystring + os<<serializeString(m_inventorystring); + return os.str(); } std::string ItemSAO::getStaticData() @@ -177,8 +223,10 @@ std::string ItemSAO::getStaticData() dstream<<__FUNCTION_NAME<<std::endl; std::ostringstream os(std::ios::binary); char buf[1]; - buf[0] = 0; //version + // version + buf[0] = 0; os.write(buf, 1); + // inventorystring os<<serializeString(m_inventorystring); return os.str(); } diff --git a/src/serverobject.h b/src/serverobject.h index a307c421f..5e3afb57b 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -32,9 +32,11 @@ Some planning * Server environment adds an active object, which gets the id 1 * The active object list is scanned for each client once in a while, and it finds out what objects have been added that are not known - by the client yet. This scan is initiated by the server and the - result ends up directly to the server. + by the client yet. This scan is initiated by the Server class and + the result ends up directly to the server. * A network packet is created with the info and sent to the client. +* Environment converts objects to static data and static data to + objects, based on how close players are to them. */ @@ -148,6 +150,7 @@ public: InventoryItem* createInventoryItem(); private: std::string m_inventorystring; + v3f m_speed_f; }; #endif |