Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2010-09-25 13:01:26 +0000
committerStijn Buys <ingar@osirion.org>2010-09-25 13:01:26 +0000
commitaeef4449ce3c1bdc531fb90699fef68bd48ca644 (patch)
tree969c2ec24f382a6a75e01b1b3315dd9fe8f26d46
parent158706fac974527436a3167cfa94a7ea82070d41 (diff)
trading bugfixes: corrects client side screen update issues
-rw-r--r--src/client/buymenu.cc23
-rw-r--r--src/client/inventorylistview.cc14
-rw-r--r--src/client/trademenu.cc49
-rw-r--r--src/client/trademenu.h1
-rw-r--r--src/core/inventory.cc1
-rw-r--r--src/core/item.cc15
-rw-r--r--src/core/netconnection.cc19
-rw-r--r--src/game/base/cargo.cc3
-rw-r--r--src/ui/button.cc28
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");
+ }
}
}