diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 15:16:27 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 15:16:27 +0300 |
commit | 5a4d8ffad3b172eae67844deda6b65273b7c9757 (patch) | |
tree | 70b32f31eaf824fec947d890377bf1e40555225c /src/serverobject.cpp | |
parent | 08bbf9687742c0b159cc1d963ab470796f74c6c8 (diff) | |
download | minetest-5a4d8ffad3b172eae67844deda6b65273b7c9757.tar.gz minetest-5a4d8ffad3b172eae67844deda6b65273b7c9757.tar.bz2 minetest-5a4d8ffad3b172eae67844deda6b65273b7c9757.zip |
implemented rats in new system to verify that it works
Diffstat (limited to 'src/serverobject.cpp')
-rw-r--r-- | src/serverobject.cpp | 194 |
1 files changed, 190 insertions, 4 deletions
diff --git a/src/serverobject.cpp b/src/serverobject.cpp index 92a0b83f4..ce7259d67 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -91,7 +91,8 @@ ServerActiveObject* TestSAO::create(ServerEnvironment *env, u16 id, v3f pos, return new TestSAO(env, id, pos); } -void TestSAO::step(float dtime, Queue<ActiveObjectMessage> &messages) +void TestSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, + bool send_recommended) { m_age += dtime; if(m_age > 10) @@ -104,6 +105,9 @@ void TestSAO::step(float dtime, Queue<ActiveObjectMessage> &messages) if(m_base_position.Y > 8*BS) m_base_position.Y = 2*BS; + if(send_recommended == false) + return; + m_timer1 -= dtime; if(m_timer1 < 0.0) { @@ -137,7 +141,8 @@ ItemSAO::ItemSAO(ServerEnvironment *env, u16 id, v3f pos, const std::string inventorystring): ServerActiveObject(env, id, pos), m_inventorystring(inventorystring), - m_speed_f(0,0,0) + m_speed_f(0,0,0), + m_last_sent_position(0,0,0) { dstream<<"Server: ItemSAO created with inventorystring=\"" <<m_inventorystring<<"\""<<std::endl; @@ -161,7 +166,8 @@ ServerActiveObject* ItemSAO::create(ServerEnvironment *env, u16 id, v3f pos, return new ItemSAO(env, id, pos, inventorystring); } -void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages) +void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, + bool send_recommended) { core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.); collisionMoveResult moveresult; @@ -177,9 +183,13 @@ void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages) 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) + if(send_recommended == false) + return; + + if(pos_f.getDistanceFrom(m_last_sent_position) > 0.05*BS) { setBasePosition(pos_f); + m_last_sent_position = pos_f; std::ostringstream os(std::ios::binary); char buf[6]; @@ -250,4 +260,180 @@ InventoryItem * ItemSAO::createInventoryItem() } +/* + RatSAO +*/ + +// Prototype +RatSAO proto_RatSAO(NULL, 0, v3f(0,0,0)); + +RatSAO::RatSAO(ServerEnvironment *env, u16 id, v3f pos): + ServerActiveObject(env, id, pos), + m_speed_f(0,0,0) +{ + dstream<<"Server: RatSAO created"<<std::endl; + ServerActiveObject::registerType(getType(), create); + + m_oldpos = v3f(0,0,0); + m_last_sent_position = v3f(0,0,0); + m_yaw = 0; + m_counter1 = 0; + m_counter2 = 0; + m_age = 0; + m_touching_ground = false; +} + +ServerActiveObject* RatSAO::create(ServerEnvironment *env, u16 id, v3f pos, + const std::string &data) +{ + std::istringstream is(data, std::ios::binary); + char buf[1]; + // read version + is.read(buf, 1); + u8 version = buf[0]; + // check if version is supported + if(version != 0) + return NULL; + return new RatSAO(env, id, pos); +} + +void RatSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, + bool send_recommended) +{ + /* + The AI + */ + + m_age += dtime; + if(m_age > 60) + { + // Die + m_removed = true; + return; + } + + // Apply gravity + m_speed_f.Y -= dtime*9.81*BS; + + /* + Move around if some player is close + */ + bool player_is_close = false; + // Check connected players + core::list<Player*> players = m_env->getPlayers(true); + core::list<Player*>::Iterator i; + for(i = players.begin(); + i != players.end(); i++) + { + Player *player = *i; + v3f playerpos = player->getPosition(); + if(m_base_position.getDistanceFrom(playerpos) < BS*10.0) + { + player_is_close = true; + break; + } + } + + if(player_is_close == false) + { + m_speed_f.X = 0; + m_speed_f.Z = 0; + } + else + { + // Move around + v3f dir(cos(m_yaw/180*PI),0,sin(m_yaw/180*PI)); + f32 speed = 2*BS; + m_speed_f.X = speed * dir.X; + m_speed_f.Z = speed * dir.Z; + + if(m_touching_ground && (m_oldpos - m_base_position).getLength() + < dtime*speed/2) + { + m_counter1 -= dtime; + if(m_counter1 < 0.0) + { + m_counter1 += 1.0; + m_speed_f.Y = 5.0*BS; + } + } + + { + m_counter2 -= dtime; + if(m_counter2 < 0.0) + { + m_counter2 += (float)(myrand()%100)/100*3.0; + m_yaw += ((float)(myrand()%200)-100)/100*180; + m_yaw = wrapDegrees(m_yaw); + } + } + } + + m_oldpos = m_base_position; + + /* + Move it, with collision detection + */ + + core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.); + collisionMoveResult moveresult; + // 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); + m_touching_ground = moveresult.touching_ground; + + setBasePosition(pos_f); + + if(send_recommended == false) + return; + + if(pos_f.getDistanceFrom(m_last_sent_position) > 0.05*BS) + { + m_last_sent_position = pos_f; + + std::ostringstream os(std::ios::binary); + // command (0 = update position) + writeU8(os, 0); + // pos + writeV3F1000(os, m_base_position); + // yaw + writeF1000(os, m_yaw); + // create message and add to list + ActiveObjectMessage aom(getId(), false, os.str()); + messages.push_back(aom); + } +} + +std::string RatSAO::getClientInitializationData() +{ + std::ostringstream os(std::ios::binary); + // version + writeU8(os, 0); + // pos + writeV3F1000(os, m_base_position); + return os.str(); +} + +std::string RatSAO::getStaticData() +{ + dstream<<__FUNCTION_NAME<<std::endl; + std::ostringstream os(std::ios::binary); + // version + writeU8(os, 0); + return os.str(); +} + +InventoryItem* RatSAO::createPickedUpItem() +{ + std::istringstream is("CraftItem rat 1", std::ios_base::binary); + InventoryItem *item = InventoryItem::deSerialize(is); + return item; +} + |