diff --git a/src/nodemeta/content_nodemeta_cooking.cpp b/src/nodemeta/content_nodemeta_cooking.cpp index 108c2b2..dfa9d00 100644 --- a/src/nodemeta/content_nodemeta_cooking.cpp +++ b/src/nodemeta/content_nodemeta_cooking.cpp @@ -837,7 +837,7 @@ CrusherNodeMetadata::CrusherNodeMetadata() m_inventory->addList("fuel", 1); m_inventory->addList("src", 1); m_inventory->addList("main", 4); - m_inventory->addList("upgrades", 2); + m_inventory->addList("upgrades", 3); m_active_timer = 0.0; m_burn_counter = 0.0; @@ -925,8 +925,8 @@ NodeMetadata* CrusherNodeMetadata::create(std::istream &is) d->m_inventory = new Inventory(); d->m_inventory->addList("fuel", 1); d->m_inventory->addList("src", 1); - d->m_inventory->addList("main", 18); - d->m_inventory->addList("upgrades", 2); + d->m_inventory->addList("main", 16); + d->m_inventory->addList("upgrades", 3); } d->m_inventory->deSerialize(is); d->inventoryModified(); @@ -955,7 +955,7 @@ std::wstring CrusherNodeMetadata::infoText() if (m_is_locked) { snprintf(buff, 256, gettext("Locked Crusher owned by '%s'"), m_owner.c_str()); }else if (m_is_exo) { - snprintf(buff, 256, gettext("Exo Crusher")); + snprintf(buff, 256, gettext("Exo Crusher owned by '%s'"), m_owner.c_str()); }else{ snprintf(buff, 256, gettext("Crusher")); } @@ -975,11 +975,11 @@ bool CrusherNodeMetadata::nodeRemovalDisabled() for (int i = 0; i < 3; i++) { if (list[i] == NULL) continue; - if (list[i]->getUsedSlots() == 0) + if (list[i]->getUsedSlots() != 0) continue; - return true; + return false; } - return false; + return true; } void CrusherNodeMetadata::inventoryModified() @@ -1009,20 +1009,21 @@ void CrusherNodeMetadata::inventoryModified() if (m_is_exo) continue; inv = new Inventory(); - inv->addList("upgrades", 2); - inv->addList("main", 36); + inv->addList("upgrades", 3); + inv->addList("main", 16); il = inv->getList("upgrades"); im = inv->getList("main"); if (!il || !im) { delete inv; continue; } - for (k=0; k<2; k++) { + vlprintf(CN_INFO,"inv size: '%u' '%u'",l->getSize(),m->getSize()); + for (k=0; k<3; k++) { itm = l->changeItem(k,NULL); if (itm) il->addItem(k,itm); } - for (k=0; k<18; k++) { + for (k=0; k<4; k++) { itm = m->changeItem(k,NULL); if (itm) im->addItem(k,itm); @@ -1063,22 +1064,22 @@ void CrusherNodeMetadata::inventoryModified() if (m_is_expanded && !b[0]) { inv = new Inventory(); - inv->addList("upgrades", 2); - inv->addList("main", 18); + inv->addList("upgrades", 3); + inv->addList("main", 4); il = inv->getList("upgrades"); im = inv->getList("main"); if (!il || !im) { delete inv; }else{ - for (k=0; k<2; k++) { + for (k=0; k<3; k++) { itm = l->changeItem(k,NULL); if (itm) il->addItem(k,itm); } - for (k=0; k<36; k++) { + for (k=0; k<16; k++) { itm = m->changeItem(k,NULL); if (itm) { - if (k > 17) { + if (k > 3) { im->addItem(itm); }else{ im->addItem(k,itm); @@ -1122,15 +1123,16 @@ bool CrusherNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) InventoryItem *src_item; InventoryList *fuel_list; InventoryItem *fuel_item; + Player *player = NULL; if (dtime > 60.0) vlprintf(CN_INFO,"Crusher stepping a long time (%f)",dtime); if (m_is_exo) { - Player *p = env->getPlayer(m_owner.c_str()); - if (!p) + player = env->getPlayer(m_owner.c_str()); + if (!player) return false; - dst_list = p->inventory.getList("exo"); + dst_list = player->inventory.getList("exo"); }else{ dst_list = m_inventory->getList("main"); } @@ -1234,6 +1236,8 @@ bool CrusherNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) dst_list->addItem(crushresult); src_list->decrementMaterials(1); changed = true; + if (m_is_exo && player) + player->inventory_modified = true; } } } @@ -1243,24 +1247,51 @@ bool CrusherNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) std::string CrusherNodeMetadata::getDrawSpecString(Player *player) { float cook_time; + float v = 0; if (m_cook_upgrade < 1.0) m_cook_upgrade = 1.0; cook_time = 4.0/m_cook_upgrade; if (cook_time < 0.1) cook_time = 0.1; + if (m_burn_counter > 0.0 && m_burn_timer > 0.0) + v = ((100.0/cook_time)*m_burn_timer); - std::string spec("size[8,9]"); - spec += "list[current_name;fuel;2,3;1,1;]"; - spec += "ring[2,3;1;#FF0000;"; - float v = 0; - if (m_burn_counter > 0.0 && m_cook_timer > 0.0) - v = 100.0-((100.0/cook_time)*m_cook_timer); + std::string spec("size[9,10]"); + + if (!m_is_exo) { + InventoryList *l = m_inventory->getList("main"); + if (m_is_expanded && l && l->getUsedSlots() > 4) { + if (m_expanded_slot_id == 0) { + spec += "list[current_name;upgrades;1,0;2,1;1,2;]"; + }else if (m_expanded_slot_id == 1) { + spec += "list[current_name;upgrades;0,0;1,1;0,1;]"; + spec += "list[current_name;upgrades;2,0;1,1;2,1;]"; + }else{ + spec += "list[current_name;upgrades;0,0;2,1;0,2;]"; + } + }else{ + spec += "list[current_name;upgrades;0,0;3,1;]"; + } + } + + spec += "list[current_name;fuel;1.5,3.5;1,1;]"; + spec += "ring[1.5,3.5;1;#FF0000;"; spec += itos((int)v); spec += "]"; - spec += "list[current_name;src;2,1;1,1;]"; - spec += "list[current_name;main;5,1;2,2;]"; - spec += "list[current_player;main;0,5;8,4;]"; + spec += "list[current_name;src;1.5,1.5;1,1;]"; + + if (m_is_expanded) { + spec += "list[current_name;main;4,1;4,4;]"; + }else if (m_is_exo) { + spec += "list[current_player;exo;3,1;6,3;]"; + }else{ + spec += "list[current_name;main;5,1.5;2,2;]"; + } + + spec += "list[current_player;main;0.5,5.8;8,1;0,8;]"; + spec += "list[current_player;main;0.5,7;8,3;8,-1;]"; + return spec; } std::vector CrusherNodeMetadata::getNodeBoxes(MapNode &n) @@ -1278,7 +1309,7 @@ std::vector CrusherNodeMetadata::getNodeBoxes(MapNode &n) } std::string CrusherNodeMetadata::getOwner() { - if (m_is_locked) + if (m_is_locked || m_is_exo) return m_owner; return ""; } diff --git a/src/player.cpp b/src/player.cpp index 8ab1578..ac63f75 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -52,6 +52,7 @@ Player::Player(): swimming_up(false), in_bed(false), wake_timeout(0.0), + inventory_modified(true), craftresult_is_preview(true), health(100), air(100), diff --git a/src/player.h b/src/player.h index 364ad2b..ced66ab 100644 --- a/src/player.h +++ b/src/player.h @@ -238,6 +238,7 @@ public: u8 light; Inventory inventory; + bool inventory_modified; bool craftresult_is_preview; diff --git a/src/server.cpp b/src/server.cpp index 083be51..4c4588a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -857,6 +857,7 @@ Server::Server(): m_emergethread_trigger_timer = 0.0; m_savemap_timer = 0.0; m_send_object_info_timer = 0.0; + m_send_full_inventory_timer = 0.0; m_env_mutex.Init(); m_con_mutex.Init(); @@ -1186,33 +1187,6 @@ void Server::AsyncRunStep() } } - // Periodically print some info - { - float &counter = m_print_info_timer; - counter += dtime; - if(counter >= 30.0) - { - counter = 0.0; - - JMutexAutoLock lock2(m_con_mutex); - - if(m_clients.size() != 0) - infostream<<"Players:"<::Iterator - i = m_clients.getIterator(); - i.atEnd() == false; i++) - { - //u16 peer_id = i.getNode()->getKey(); - RemoteClient *client = i.getNode()->getValue(); - Player *player = m_env.getPlayer(client->peer_id); - if(player==NULL) - continue; - infostream<<"* "<getName()<<"\t"; - client->PrintInfo(infostream); - } - } - } - /* Check added and deleted active objects */ @@ -1227,6 +1201,12 @@ void Server::AsyncRunStep() int16_t radius = config_get_int("world.server.mob.range"); radius *= MAP_BLOCKSIZE; + bool send_inventory = false; + m_send_full_inventory_timer += dtime; + if (m_send_full_inventory_timer >= 60.0) { + m_send_full_inventory_timer -= 60.0; + send_inventory = true; + } for (core::map::Iterator i = m_clients.getIterator(); i.atEnd() == false; i++) { RemoteClient *client = i.getNode()->getValue(); @@ -1242,6 +1222,11 @@ void Server::AsyncRunStep() m_env.getRemovedActiveObjects(pos, radius, client->m_known_objects, removed_objects); m_env.getAddedActiveObjects(pos, radius, client->m_known_objects, added_objects); + if (send_inventory || player->inventory_modified) { + player->inventory_modified = false; + SendInventory(client->peer_id,true); + } + // Ignore if nothing happened if (removed_objects.size() == 0 && added_objects.size() == 0) { //infostream<<"active objects: none changed"<