From aeef4449ce3c1bdc531fb90699fef68bd48ca644 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 25 Sep 2010 13:01:26 +0000 Subject: trading bugfixes: corrects client side screen update issues --- src/client/buymenu.cc | 23 +++++++++---------- src/client/inventorylistview.cc | 14 +++++++++++- src/client/trademenu.cc | 49 ++++++++++++++++++++++++++++++----------- src/client/trademenu.h | 1 + src/core/inventory.cc | 1 - src/core/item.cc | 15 ++++++++----- src/core/netconnection.cc | 19 ++++++++-------- src/game/base/cargo.cc | 3 ++- src/ui/button.cc | 28 ++++++++++++++--------- 9 files changed, 101 insertions(+), 52 deletions(-) diff --git a/src/client/buymenu.cc b/src/client/buymenu.cc index ba93f42..b42dc00 100644 --- a/src/client/buymenu.cc +++ b/src/client/buymenu.cc @@ -65,6 +65,8 @@ void BuyMenu::set_item(core::Info *info) menu_infotext.clear(); menu_namelabel->set_text(0); menu_modelview->set_modelname(0); + menu_buybutton->hide(); + menu_modelview->hide(); // if the information timestamp is 0, the info is available menu_inforecord = info; @@ -78,22 +80,19 @@ void BuyMenu::set_item(core::Info *info) } else { for (core::Info::Text::const_iterator it = menu_inforecord->text().begin(); it != menu_inforecord->text().end(); it++) { menu_infotext.push_back((*it)); - } - - menu_infotimestamp = menu_inforecord->timestamp(); - if (menu_inforecord->type() && !menu_inforecord->timestamp()) { + } + if (menu_inforecord->type()) { menu_namelabel->set_text(menu_inforecord->name()); menu_modelview->set_modelname(menu_inforecord->modelname()); - menu_buybutton->set_command("remote buy " + menu_inforecord->type()->label() + ' ' + menu_inforecord->label() + "; view hide"); - menu_buybutton->set_label("buy " + menu_inforecord->name()); + if (menu_inforecord->label().size()) { + menu_buybutton->set_command("remote buy " + menu_inforecord->type()->label() + ' ' + menu_inforecord->label() + "; view hide"); + menu_buybutton->set_label("buy " + menu_inforecord->type()->label() + ' ' + menu_inforecord->label()); - menu_buybutton->show(); - menu_modelview->show(); - } else { - menu_buybutton->hide(); - menu_modelview->hide(); - } + menu_buybutton->show(); + menu_modelview->show(); + } + } menu_infotimestamp = menu_inforecord->timestamp(); } } diff --git a/src/client/inventorylistview.cc b/src/client/inventorylistview.cc index e2b613b..87cc367 100644 --- a/src/client/inventorylistview.cc +++ b/src/client/inventorylistview.cc @@ -96,13 +96,25 @@ void InventoryListView::draw() if (listview_inventory && listview_infotype) { // inventory was updated if (listview_timestamp != listview_inventory->timestamp()) { + //con_debug << "CLIENT inventory update from " << listview_timestamp << " to " << listview_inventory->timestamp() << std::endl; set_inventory(listview_inventory, listview_infotype); // inventory info was updated } else if (!verify_inventory()) { + //con_debug << "CLIENT inventory info update" << std::endl; set_inventory(listview_inventory, listview_infotype); } } - + + /* + * DEBUG + std::ostringstream str; + if (listview_inventory && listview_infotype) { + str << listview_timestamp << " " << listview_inventory->timestamp() << " " << listview_infotimestamp; + } else { + str << "EMPTY"; + } + ui::Paint::draw_label(global_location(), size(), font(), str.str() , ui::AlignBottom) ; + */ ListView::draw(); } diff --git a/src/client/trademenu.cc b/src/client/trademenu.cc index 91724f7..8aa9a52 100644 --- a/src/client/trademenu.cc +++ b/src/client/trademenu.cc @@ -38,6 +38,12 @@ TradeMenu::TradeMenu(ui::Widget *parent, const char * label) : ui::Window(parent menu_slider = new ui::Slider(menu_tradewindow); menu_slider->set_background(false); menu_slider->set_border(true); + + menu_msgtext = new ui::Label(menu_tradewindow); + menu_msgtext->set_label("label"); + menu_msgtext->set_background(false); + menu_msgtext->set_border(false); + menu_msgtext->set_alignment(ui::AlignCenter); menu_namelabel = new ui::Label(menu_tradewindow); menu_namelabel->set_label("label"); @@ -113,11 +119,17 @@ void TradeMenu::set_itemtype(core::InfoType *item_type) void TradeMenu::set_item(ui::ListItem *item) { menu_infotext.clear(); + menu_namelabel->set_text("Trade"); + menu_tradertext->clear(); - menu_buybutton->hide(); + menu_msgtext->clear(); + menu_msgtext->hide(); menu_slider->hide(); + menu_buybutton->set_command(""); + menu_buybutton->hide(); // FIXME enable/disable button + if (item != menu_listitem) { menu_slider->set_range(0, 2); menu_slider->set_value(1); @@ -148,7 +160,7 @@ void TradeMenu::set_item(ui::ListItem *item) if (item->parent() == menu_inventorylistview) { // item in ship inventory selected (SELL) - + menu_buybutton->set_text("Sell"); menu_traderlistview->deselect(); const core::Item *trader_item = (menu_traderlistview->inventory() ? menu_traderlistview->inventory()->find(item->info()) : 0); @@ -164,14 +176,14 @@ void TradeMenu::set_item(ui::ListItem *item) std::ostringstream commandstr; commandstr << "remote sell " << item->info()->type()->label() << " " << item->info()->label() << " " << amount; menu_buybutton->set_command(commandstr.str()); - menu_buybutton->set_text("Sell"); + + menu_buybutton->enable(); menu_buybutton->show(); } - if (amount < 1) { - menu_buybutton->set_command(""); - menu_buybutton->set_text("^1Can not sell"); - menu_buybutton->show(); + if (amount < 1) { + menu_msgtext->set_text("^1Can not sell"); + menu_msgtext->show(); } std::ostringstream str; @@ -179,7 +191,8 @@ void TradeMenu::set_item(ui::ListItem *item) << "Volume: " << std::setw(12) << std::setprecision(2) << (float)(amount > 0 ? amount : 1) * trader_item->info()->volume(); menu_tradertext->set_text(str.str()); } else { - menu_tradertext->set_text(" ^1Can not sell here"); + menu_msgtext->set_text("^1Can not sell here"); + menu_msgtext->show(); } std::ostringstream labelstr; @@ -192,7 +205,7 @@ void TradeMenu::set_item(ui::ListItem *item) } else if (item->parent() == menu_traderlistview) { // item in trader inventory selected (BUY) - + menu_buybutton->set_text("Buy"); menu_inventorylistview->deselect(); if (menu_inventorylistview->inventory()) { @@ -213,14 +226,20 @@ void TradeMenu::set_item(ui::ListItem *item) std::ostringstream commandstr; commandstr << "remote buy " << item->info()->type()->label() << " " << item->info()->label() << " " << amount; menu_buybutton->set_command(commandstr.str()); - menu_buybutton->set_text("Buy"); + + menu_buybutton->enable(); menu_buybutton->show(); } if (amount < 1) { - menu_buybutton->set_command(""); - menu_buybutton->set_text("^1Can not buy"); - menu_buybutton->show(); + if (item_unit_price > core::localplayer()->credits()) { + menu_msgtext->set_text("^1Not enough credits"); + } else if (item_unit_volume > menu_inventorylistview->inventory()->capacity_available()) { + menu_msgtext->set_text("^1Not enough cargo space"); + } else { + menu_msgtext->set_text("^1Can not buy"); + } + menu_msgtext->show(); } std::ostringstream str; @@ -272,6 +291,10 @@ void TradeMenu::resize() // resize slider menu_slider->set_size(menu_modelview->width(), fontmargin); menu_slider->set_location(menu_modelview->left(), menu_modelview->bottom() - menu_slider->height()); + + // warning text + menu_msgtext->set_size(menu_slider->size()); + menu_msgtext->set_location(menu_slider->location()); // resize scrollpane menu_scrollpane->set_size(menu_tradewindow->width() - 2.0f * ui::UI::elementsize.width() - fontmargin * 4.0f, menu_inventorylistview->height() + 2.0f * fontmargin - ui::UI::elementsize.width()); diff --git a/src/client/trademenu.h b/src/client/trademenu.h index e835043..5ea34aa 100644 --- a/src/client/trademenu.h +++ b/src/client/trademenu.h @@ -51,6 +51,7 @@ private: ui::ModelView *menu_modelview; ui::ScrollPane *menu_scrollpane; ui::Slider *menu_slider; + ui::Label *menu_msgtext; ui::Button *menu_closebutton; ui::Button *menu_buybutton; diff --git a/src/core/inventory.cc b/src/core/inventory.cc index 7957294..28327a3 100644 --- a/src/core/inventory.cc +++ b/src/core/inventory.cc @@ -54,7 +54,6 @@ void Inventory::add(Item *item) return; } inventory_items.push_back(item); - inventory_dirty = true; } void Inventory::remove(Item *item) diff --git a/src/core/item.cc b/src/core/item.cc index e9d9f65..8ab4784 100644 --- a/src/core/item.cc +++ b/src/core/item.cc @@ -14,12 +14,17 @@ namespace core /* ---- class Item ------------------------------------------------- */ +// Note: initializing the timestamp with 1 instead of 0 is a small hack +// since cient-side inventory timestamps are initialized at 0, setting +// the item timestamp to 0 would prevent the client from updating +// the trade window the first time it is opened on a base + Item::Item(const Info *info) { item_info = info; item_amount = 0; item_price = info->price(); - set_timestamp(game() ? game()->timestamp() : 0); + set_timestamp(game() ? game()->timestamp() : 1); } Item::~Item() @@ -31,25 +36,25 @@ Item::~Item() void Item::set_amount(const long amount) { item_amount = amount; - set_timestamp(game() ? game()->timestamp() : 0); + set_timestamp(game() ? game()->timestamp() : 1); } void Item::inc_amount(const long amount) { item_amount += amount; - set_timestamp(game() ? game()->timestamp() : 0); + set_timestamp(game() ? game()->timestamp() : 1); } void Item::dec_amount(const long amount) { item_amount -= amount; - set_timestamp(game() ? game()->timestamp() : 0); + set_timestamp(game() ? game()->timestamp() : 1); } void Item::set_price(const long price) { item_price = price; - set_timestamp(game() ? game()->timestamp() : 0); + set_timestamp(game() ? game()->timestamp() : 1); } void Item::set_timestamp(const unsigned long timestamp) diff --git a/src/core/netconnection.cc b/src/core/netconnection.cc index 11e23c9..3318c1e 100644 --- a/src/core/netconnection.cc +++ b/src/core/netconnection.cc @@ -432,7 +432,7 @@ void NetConnection::send_info_request(Info *info) msg << "inf " << info->id() << "\n"; this->send_raw(msg.str()); - info->set_timestamp(timestamp()); + info->set_timestamp(application()->timestamp()); } // send an inventory update request @@ -871,9 +871,9 @@ void NetConnection::parse_incoming_message(const std::string & message) info->receive_server_update(msgstream); //info->clear_timestamp(); - info->set_timestamp(timestamp()); + info->set_timestamp(application()->timestamp()); - //con_debug << "Received info for " << info->id() << " " << info->type()->label() << ":" << info->label() << std::endl; + //con_debug << "CLIENT info for " << info->id() << " " << info->type()->label() << ":" << info->label() << " timestamp " << info->timestamp() << std::endl; } else if (command.compare("inv") == 0) { @@ -897,9 +897,8 @@ void NetConnection::parse_incoming_message(const std::string & message) return; } - //con_debug << "CLIENT received inv message for entity " << id << " server timestamp " << server_timestamp << " client timestamp " << entity->inventory()->timestamp() << std::endl; - - + //con_debug << "CLIENT received inv message for entity " << id << " client timestamp " << entity->inventory()->timestamp() << " server timestamp " << server_timestamp << std::endl; + if (server_timestamp < entity->inventory()->timestamp()) return; @@ -907,7 +906,7 @@ void NetConnection::parse_incoming_message(const std::string & message) if (!(msgstream >> nbitems)) nbitems = 0; - //con_debug << "CLIENT number of items: " << nbitems << std::endl; + //con_debug << "CLIENT number of items: " << nbitems << std::endl; for (size_t i = 0; i < nbitems; i++) { if (!(msgstream >> id)) { con_warn << "Received inventory update without info id for existing entity " << id << "!" << std::endl; @@ -922,9 +921,11 @@ void NetConnection::parse_incoming_message(const std::string & message) } item->receive_server_update(msgstream); } - - entity->inventory()->set_timestamp(server_timestamp); + entity->inventory()->recalculate(); + entity->inventory()->set_timestamp(server_timestamp); + + //con_debug << "CLIENT inventory updated timestamp " << entity->inventory()->timestamp() << " for " << nbitems << " items" << std::endl; } } diff --git a/src/game/base/cargo.cc b/src/game/base/cargo.cc index 3014a1e..626a1b3 100644 --- a/src/game/base/cargo.cc +++ b/src/game/base/cargo.cc @@ -164,6 +164,7 @@ void Cargo::sell(core::EntityControlable *seller, core::Entity *buyer, const int seller_item->dec_amount(negotiated_amount); seller->owner()->set_credits(seller->owner()->credits() + negotiated_price * negotiated_amount); + seller->owner()->set_dirty(); seller->inventory()->set_dirty(); if (buyer_item->amount() >= 0) { @@ -283,7 +284,7 @@ void Cargo::buy(core::EntityControlable *buyer, core::Entity *seller, const int } buyer_item->inc_amount(negotiated_amount); buyer->owner()->set_credits(buyer->owner()->credits() - negotiated_price * negotiated_amount); - + buyer->owner()->set_dirty(); buyer->inventory()->set_dirty(); // send a cargo purchased message diff --git a/src/ui/button.cc b/src/ui/button.cc index 95158a2..ddcc72d 100644 --- a/src/ui/button.cc +++ b/src/ui/button.cc @@ -49,7 +49,9 @@ void Button::set_command(const std::string &command) void Button::draw_border() { - if (has_mouse_focus()) { + if (disabled()) { + Paint::set_color(palette()->disabled()); + } else if (has_mouse_focus()) { math::Color color(palette()->foreground()); float t = core::application()->time(); t = t - floorf(t); @@ -57,8 +59,9 @@ void Button::draw_border() t = 1 - t; color.a = 0.5f + t; Paint::set_color(color); - } else + } else { Paint::set_color(palette()->border()); + } Paint::draw_border(global_location(), size()); } @@ -68,22 +71,25 @@ void Button::draw() if (!text().size()) return; - if (has_mouse_focus()) + if (disabled()) { + Paint::set_color(palette()->disabled()); + } else if (has_mouse_focus()) { Paint::set_color(palette()->highlight()); - else + } else { Paint::set_color(palette()->foreground()); - + } Paint::draw_label(global_location(), size(), font(), text(), alignment()); } bool Button::on_keypress(const int key, const unsigned int modifier) { if (key == 512 + SDL_BUTTON_LEFT) { - core::cmd() << button_command << std::endl; - audio::play("ui/button"); - - emit(EventButtonClicked); + if (enabled()) { + core::cmd() << button_command << std::endl; + audio::play("ui/button"); + emit(EventButtonClicked); + } return true; } @@ -97,7 +103,9 @@ bool Button::on_keyrelease(const int key, const unsigned int modifier) void Button::on_mouseover(const math::Vector2f &cursor) { - audio::play("ui/select"); + if (enabled()) { + audio::play("ui/select"); + } } } -- cgit v1.2.3