From 1b57518ca97c670174f89c5af28659b6ad0c3d42 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 27 Feb 2011 03:36:52 +0200 Subject: Implement receiving item color from server. --- src/net/tmwa/inventoryhandler.cpp | 13 ++++++++----- src/net/tmwa/inventoryhandler.h | 5 ++++- src/net/tmwa/tradehandler.cpp | 14 ++++++++++---- 3 files changed, 22 insertions(+), 10 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp index 9828fb957..340f0c4b2 100644 --- a/src/net/tmwa/inventoryhandler.cpp +++ b/src/net/tmwa/inventoryhandler.cpp @@ -223,7 +223,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) else { mInventoryItems.push_back(InventoryItem(index, itemId, - amount, 0, false)); + amount, 0, identified, false)); } } break; @@ -256,7 +256,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) } mInventoryItems.push_back(InventoryItem(index, itemId, amount, - refine, false)); + refine, identified, false)); } break; @@ -381,7 +381,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) for (; it != it_end; ++it) { mStorage->setItem((*it).slot, (*it).id, (*it).quantity, - (*it).equip); + (*it).refine, (*it).color, (*it).equip); } mInventoryItems.clear(); @@ -403,13 +403,16 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) if (Item *item = mStorage->getItem(index)) { - item->setId(itemId); + item->setId(itemId, identified); item->increaseQuantity(amount); } else { if (mStorage) - mStorage->setItem(index, itemId, amount, false); + { + mStorage->setItem(index, itemId, amount, refine, + identified, false); + } } break; diff --git a/src/net/tmwa/inventoryhandler.h b/src/net/tmwa/inventoryhandler.h index cc2286f2f..8dd39a781 100644 --- a/src/net/tmwa/inventoryhandler.h +++ b/src/net/tmwa/inventoryhandler.h @@ -109,15 +109,18 @@ class InventoryItem int slot; int id; int quantity; + unsigned char color; int refine; bool equip; - InventoryItem(int slot, int id, int quantity, int refine, bool equip) + InventoryItem(int slot, int id, int quantity, int refine, + unsigned char color, bool equip) { this->slot = slot; this->id = id; this->quantity = quantity; this->refine = refine; + this->color = color; this->equip = equip; } }; diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp index 3fb05399d..815c8f54d 100644 --- a/src/net/tmwa/tradehandler.cpp +++ b/src/net/tmwa/tradehandler.cpp @@ -193,18 +193,23 @@ void TradeHandler::handleMessage(Net::MessageIn &msg) { int amount = msg.readInt32(); int type = msg.readInt16(); - msg.readInt8(); // identified flag + int identify = msg.readInt8(); // identified flag msg.readInt8(); // attribute - msg.readInt8(); // refine + int refine = msg.readInt8(); // refine msg.skip(8); // card (4 shorts) // TODO: handle also identified, etc if (tradeWindow) { if (type == 0) + { tradeWindow->setMoney(amount); + } else - tradeWindow->addItem(type, false, amount, false); + { + tradeWindow->addItem(type, false, amount, refine, + identify, false); + } } } break; @@ -233,7 +238,8 @@ void TradeHandler::handleMessage(Net::MessageIn &msg) if (tradeWindow) { tradeWindow->addItem(item->getId(), true, quantity, - item->isEquipment()); + item->getRefine(), item->getColor(), + item->isEquipment()); } item->increaseQuantity(-quantity); break; -- cgit v1.2.3-70-g09d2 From df5c7ae83a80db63ab90142df9e3a93f5ee630d0 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 27 Feb 2011 18:08:34 +0200 Subject: First part of implimintation item colors. --- src/actorsprite.cpp | 9 +++++++-- src/actorsprite.h | 3 ++- src/actorspritemanager.cpp | 6 +++--- src/actorspritemanager.h | 3 ++- src/being.cpp | 16 +++++++++------- src/being.h | 3 ++- src/flooritem.cpp | 9 ++++++--- src/flooritem.h | 4 +++- src/gui/outfitwindow.cpp | 3 ++- src/inventory.cpp | 2 +- src/item.cpp | 13 ++++++++----- src/item.h | 2 +- src/net/manaserv/beinghandler.cpp | 2 +- src/net/manaserv/buysellhandler.cpp | 2 +- src/net/manaserv/itemhandler.cpp | 2 +- src/net/tmwa/beinghandler.cpp | 29 ++++++++++++++++------------- src/net/tmwa/charserverhandler.cpp | 2 +- src/net/tmwa/inventoryhandler.cpp | 20 +++++++++++++++----- src/net/tmwa/itemhandler.cpp | 6 +++--- src/resources/iteminfo.cpp | 28 ++++++++++++++++++++++++++++ src/resources/iteminfo.h | 4 ++++ src/utils/stringutils.cpp | 10 ++++++++++ src/utils/stringutils.h | 2 ++ 23 files changed, 128 insertions(+), 52 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp index fc648741c..4188ff224 100644 --- a/src/actorsprite.cpp +++ b/src/actorsprite.cpp @@ -301,7 +301,8 @@ void ActorSprite::handleStatusEffect(StatusEffect *effect, int effectId) } void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, - bool forceDisplay, int imageType) + bool forceDisplay, int imageType, + std::string color) { clear(); @@ -310,7 +311,9 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, for (it = display.sprites.begin(), it_end = display.sprites.end(); it != it_end; ++it) { - std::string file = "graphics/sprites/" + (*it)->sprite; + std::string file = "graphics/sprites/" + + combineDye((*it)->sprite, color); + int variant = (*it)->variant; addSprite(AnimatedSprite::load(file, variant)); } @@ -336,6 +339,8 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, imagePath = "graphics/items/" + display.floor; break; } + imagePath = combineDye(imagePath, color); + Image *img = resman->getImage(imagePath); if (!img) diff --git a/src/actorsprite.h b/src/actorsprite.h index 00b694e26..7ec5cc391 100644 --- a/src/actorsprite.h +++ b/src/actorsprite.h @@ -211,7 +211,8 @@ protected: virtual void handleStatusEffect(StatusEffect *effect, int effectId); void setupSpriteDisplay(const SpriteDisplay &display, - bool forceDisplay = true, int imageType = 0); + bool forceDisplay = true, int imageType = 0, + std::string color = ""); int mId; Uint16 mStunMode; /**< Stun mode; zero if not stunned */ diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp index 0c5cfe04d..03ed09835 100644 --- a/src/actorspritemanager.cpp +++ b/src/actorspritemanager.cpp @@ -190,10 +190,10 @@ Being *ActorSpriteManager::createBeing(int id, ActorSprite::Type type, return being; } -FloorItem *ActorSpriteManager::createItem(int id, int itemId, - int x, int y, int amount) +FloorItem *ActorSpriteManager::createItem(int id, int itemId, int x, int y, + int amount, unsigned char color) { - FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap, amount); + FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap, amount, color); mActors.insert(floorItem); return floorItem; diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h index 3af157f17..c7deba867 100644 --- a/src/actorspritemanager.h +++ b/src/actorspritemanager.h @@ -68,7 +68,8 @@ class ActorSpriteManager: public ConfigListener /** * Create a FloorItem and add it to the list of ActorSprites. */ - FloorItem *createItem(int id, int itemId, int x, int y, int amount); + FloorItem *createItem(int id, int itemId, int x, int y, + int amount, unsigned char color); /** * Destroys the given ActorSprite at the end of diff --git a/src/being.cpp b/src/being.cpp index 7265aa337..2f2e69d16 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -1483,8 +1483,8 @@ void Being::updateColors() } } -void Being::setSprite(unsigned int slot, int id, const std::string &color, - bool isWeapon, bool isTempSprite) +void Being::setSprite(unsigned int slot, int id, std::string color, + unsigned char colorId, bool isWeapon, bool isTempSprite) { if (slot >= Net::getCharHandler()->maxSprite()) return; @@ -1508,13 +1508,15 @@ void Being::setSprite(unsigned int slot, int id, const std::string &color, } else { - std::string filename = ItemDB::get(id).getSprite(mGender); + ItemInfo info = ItemDB::get(id); + std::string filename = info.getSprite(mGender); AnimatedSprite *equipmentSprite = NULL; if (!filename.empty()) { - if (!color.empty()) - filename += "|" + color; + if (color.empty()) + color = info.getDyeColorsString(colorId); + filename = combineDye(filename, color); equipmentSprite = AnimatedSprite::load( paths.getStringValue("sprites") + filename); @@ -1931,7 +1933,7 @@ void Being::recalcSpritesOrder() if (repIt->second != 1) { setSprite(removeSprite, repIt->second, - mSpriteColors[removeSprite], false, true); + mSpriteColors[removeSprite], 1, false, true); } } } @@ -2066,7 +2068,7 @@ void Being::recalcSpritesOrder() if (!id) continue; - setSprite(slot, id, mSpriteColors[slot], false, true); + setSprite(slot, id, mSpriteColors[slot], 1, false, true); } // logger->log("slot %d = %d", slot, mSpriteRemap[slot]); } diff --git a/src/being.h b/src/being.h index 49127629f..1d5ca7c19 100644 --- a/src/being.h +++ b/src/being.h @@ -333,7 +333,8 @@ class Being : public ActorSprite, public ConfigListener * Sets visible equipments for this being. */ void setSprite(unsigned int slot, int id, - const std::string &color = "", bool isWeapon = false, + std::string color = "", + unsigned char colorId = 1, bool isWeapon = false, bool isTempSprite = false); void setSpriteID(unsigned int slot, int id); diff --git a/src/flooritem.cpp b/src/flooritem.cpp index 619be25ea..700d9ed25 100644 --- a/src/flooritem.cpp +++ b/src/flooritem.cpp @@ -41,7 +41,8 @@ FloorItem::FloorItem(int id, int x, int y, Map *map, - int amount): + int amount, + unsigned char color): ActorSprite(id), mItemId(itemId), mX(x), @@ -49,7 +50,8 @@ FloorItem::FloorItem(int id, mMap(map), // mAlpha(1.0f), mAmount(amount), - mPickupCount(0) + mPickupCount(0), + mColor(color) { mDropTime = cur_time; @@ -69,7 +71,8 @@ FloorItem::FloorItem(int id, mPos.y = 0; } - setupSpriteDisplay(ItemDB::get(itemId).getDisplay(), true, 1); + ItemInfo info = ItemDB::get(itemId); + setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeString(mColor)); } const ItemInfo &FloorItem::getInfo() const diff --git a/src/flooritem.h b/src/flooritem.h index deff05bc8..f1d19b89f 100644 --- a/src/flooritem.h +++ b/src/flooritem.h @@ -48,7 +48,8 @@ class FloorItem : public ActorSprite int x, int y, Map *map, - int amount); + int amount, + unsigned char color); Type getType() const { return FLOOR_ITEM; } @@ -88,6 +89,7 @@ class FloorItem : public ActorSprite int mDropTime; int mAmount; unsigned mPickupCount; + unsigned char mColor; }; #endif diff --git a/src/gui/outfitwindow.cpp b/src/gui/outfitwindow.cpp index 2796e13c8..ea2b7980c 100644 --- a/src/gui/outfitwindow.cpp +++ b/src/gui/outfitwindow.cpp @@ -292,7 +292,8 @@ void OutfitWindow::draw(gcn::Graphics *graphics) } if (!foundItem) { - Image *image = Item::getImage(mItems[mCurrentOutfit][i]); + //+++ need use colors in outfits + Image *image = Item::getImage(mItems[mCurrentOutfit][i], 1); if (image) g->drawImage(image, itemX, itemY); } diff --git a/src/inventory.cpp b/src/inventory.cpp index 4544c09be..705ae9329 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -100,7 +100,7 @@ void Inventory::setItem(int index, int id, int quantity, if (!mItems[index] && id > 0) { - Item *item = new Item(id, quantity, refine, equipment); + Item *item = new Item(id, quantity, refine, color, equipment); item->setInvIndex(index); mItems[index] = item; mUsed++; diff --git a/src/item.cpp b/src/item.cpp index c3c9b9c18..02f775834 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -75,8 +75,9 @@ void Item::setId(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = paths.getStringValue("itemIcons") + display.image; - mImage = resman->getImage(imagePath); - mDrawImage = resman->getImage(imagePath); + std::string dye = combineDye(imagePath, info.getDyeString(color)); + mImage = resman->getImage(dye); + mDrawImage = resman->getImage(dye); if (!mImage) { @@ -98,12 +99,14 @@ bool Item::isHaveTag(int tagId) return mTags[tagId] > 0; } -Image *Item::getImage(int id) +Image *Item::getImage(int id, unsigned char color) { ResourceManager *resman = ResourceManager::getInstance(); - SpriteDisplay display = ItemDB::get(id).getDisplay(); + ItemInfo info = ItemDB::get(id); + SpriteDisplay display = info.getDisplay(); std::string imagePath = "graphics/items/" + display.image; - Image *image = resman->getImage(imagePath); + Image *image; + image = resman->getImage(combineDye(imagePath, info.getDyeString(color))); if (!image) image = Theme::getImageFromTheme("unknown-item.png"); diff --git a/src/item.h b/src/item.h index cb58f6f9f..ae2cc9dfb 100644 --- a/src/item.h +++ b/src/item.h @@ -154,7 +154,7 @@ class Item const ItemInfo &getInfo() const { return ItemDB::get(mId); } - static Image *getImage(int id); + static Image *getImage(int id, unsigned char color); bool isHaveTag(int tagId); diff --git a/src/net/manaserv/beinghandler.cpp b/src/net/manaserv/beinghandler.cpp index f5fa7d26c..8ba2e5967 100644 --- a/src/net/manaserv/beinghandler.cpp +++ b/src/net/manaserv/beinghandler.cpp @@ -155,7 +155,7 @@ static void handleLooks(Being *being, Net::MessageIn &msg) { if (!(mask & (1 << i))) continue; int id = msg.readInt16(); - being->setSprite(slots[i], id, "", (slots[i] == SPRITE_WEAPON)); + being->setSprite(slots[i], id, "", 1, (slots[i] == SPRITE_WEAPON)); } } diff --git a/src/net/manaserv/buysellhandler.cpp b/src/net/manaserv/buysellhandler.cpp index 7334fe928..07737e20b 100644 --- a/src/net/manaserv/buysellhandler.cpp +++ b/src/net/manaserv/buysellhandler.cpp @@ -96,7 +96,7 @@ void BuySellHandler::handleMessage(Net::MessageIn &msg) int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); - dialog->addItem(new Item(itemId, amount, false), value); + dialog->addItem(new Item(itemId, amount, 1, false), value); } break; } diff --git a/src/net/manaserv/itemhandler.cpp b/src/net/manaserv/itemhandler.cpp index ce1d0965a..0afd12d21 100644 --- a/src/net/manaserv/itemhandler.cpp +++ b/src/net/manaserv/itemhandler.cpp @@ -68,7 +68,7 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) actorSpriteManager->createItem(id, itemId, x / map->getTileWidth(), y / map->getTileHeight(), - 0); + 0, 1); } else { diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index b6589e260..15792cf3a 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -620,15 +620,18 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) int type = msg.readInt8(); int id = 0; int id2 = 0; + std::string color; if (msg.getId() == SMSG_BEING_CHANGE_LOOKS) { id = msg.readInt8(); + id2 = 1; // default color } else { // SMSG_BEING_CHANGE_LOOKS2 id = msg.readInt16(); id2 = msg.readInt16(); + color = ""; } if (dstBeing->getType() == Being::PLAYER) @@ -646,21 +649,21 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) dstBeing->setSpriteID(SPRITE_HAIR, id *-1); break; case 2: // Weapon ID in id, Shield ID in id2 - dstBeing->setSprite(SPRITE_WEAPON, id, "", true); + dstBeing->setSprite(SPRITE_WEAPON, id, "", 1, true); if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHIELD); break; case 3: // Change lower headgear for eAthena, pants for us - dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, id); + dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_BOTTOMCLOTHES); break; case 4: // Change upper headgear for eAthena, hat for us - dstBeing->setSprite(SPRITE_HAT, id); + dstBeing->setSprite(SPRITE_HAT, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_HAT); break; case 5: // Change middle headgear for eathena, armor for us - dstBeing->setSprite(SPRITE_TOPCLOTHES, id); + dstBeing->setSprite(SPRITE_TOPCLOTHES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_TOPCLOTHES); break; case 6: // eAthena LOOK_HAIR_COLOR @@ -668,35 +671,35 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) break; case 8: // eAthena LOOK_SHIELD if (!config.getBoolValue("hideShield")) - dstBeing->setSprite(SPRITE_SHIELD, id); + dstBeing->setSprite(SPRITE_SHIELD, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHIELD); break; case 9: // eAthena LOOK_SHOES - dstBeing->setSprite(SPRITE_SHOE, id); + dstBeing->setSprite(SPRITE_SHOE, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHOE); break; case 10: // LOOK_GLOVES - dstBeing->setSprite(SPRITE_GLOVES, id); + dstBeing->setSprite(SPRITE_GLOVES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_GLOVES); break; case 11: // LOOK_CAPE - dstBeing->setSprite(SPRITE_CAPE, id); + dstBeing->setSprite(SPRITE_CAPE, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_CAPE); break; case 12: - dstBeing->setSprite(SPRITE_MISC1, id); + dstBeing->setSprite(SPRITE_MISC1, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_MISC1); break; case 13: - dstBeing->setSprite(SPRITE_MISC2, id); + dstBeing->setSprite(SPRITE_MISC2, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_MISC2); break; case 14: - dstBeing->setSprite(SPRITE_EVOL1, id); + dstBeing->setSprite(SPRITE_EVOL1, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_EVOL1); break; case 15: - dstBeing->setSprite(SPRITE_EVOL2, id); + dstBeing->setSprite(SPRITE_EVOL2, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_EVOL2); break; default: @@ -890,7 +893,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) ? GENDER_FEMALE : GENDER_MALE); // Set these after the gender, as the sprites may be gender-specific - dstBeing->setSprite(SPRITE_WEAPON, weapon, "", true); + dstBeing->setSprite(SPRITE_WEAPON, weapon, "", 1, true); if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, shield); //dstBeing->setSprite(SPRITE_SHOE, shoes); diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 5e2efbdd5..ec61b4be2 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -273,7 +273,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, tempPlayer->setSubtype(msg.readInt16()); // class (used for race) int hairStyle = msg.readInt16(); Uint16 weapon = msg.readInt16(); - tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", true); + tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", 1, true); character->data.mAttributes[LEVEL] = msg.readInt16(); diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp index 340f0c4b2..fc32c3ec3 100644 --- a/src/net/tmwa/inventoryhandler.cpp +++ b/src/net/tmwa/inventoryhandler.cpp @@ -217,7 +217,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) if (inventory) { inventory->setItem(index, itemId, amount, - 0, isEquipment); + 0, identified, isEquipment); } } else @@ -300,7 +300,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) amount += inventory->getItem(index)->getQuantity(); inventory->setItem(index, itemId, amount, refine, - equipType != 0); + identified, equipType != 0); } } } break; @@ -458,19 +458,29 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) { index = msg.readInt16() - INVENTORY_OFFSET; itemId = msg.readInt16(); - msg.readInt8(); // type - msg.readInt8(); // identify flag + if (itemId == 1172) + logger->log("step1"); + int itemType = msg.readInt8(); // type + identified = msg.readInt8(); // identify flag msg.readInt16(); // equip type equipType = msg.readInt16(); msg.readInt8(); // attribute refine = msg.readInt8(); msg.skip(8); // card + if (itemId == 1172) + logger->log("step2"); if (inventory) - inventory->setItem(index, itemId, 1, refine, true); + inventory->setItem(index, itemId, 1, refine, identified, true); if (equipType) mEquips.setEquipment(getSlot(equipType), index); + + if (debugInventory) + { + logger->log("Index: %d, ID: %d, Type: %d, Identified: %d", + index, itemId, itemType, identified); + } } break; diff --git a/src/net/tmwa/itemhandler.cpp b/src/net/tmwa/itemhandler.cpp index 5840d99b2..897ed1fb5 100644 --- a/src/net/tmwa/itemhandler.cpp +++ b/src/net/tmwa/itemhandler.cpp @@ -52,7 +52,7 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) { int id = msg.readInt32(); int itemId = msg.readInt16(); - msg.readInt8(); // identify flag + unsigned char identify = msg.readInt8(); // identify flag int x = msg.readInt16(); int y = msg.readInt16(); // msg.skip(4); // amount,subX,subY / subX,subY,amount @@ -64,12 +64,12 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) if (msg.getId() == SMSG_ITEM_VISIBLE) { actorSpriteManager->createItem(id, itemId, - x, y, amount1); + x, y, amount1, identify); } else { actorSpriteManager->createItem(id, itemId, - x, y, amount2); + x, y, amount2, identify); } } } diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 255a9a7b3..49aadc23d 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -81,3 +81,31 @@ std::map &ItemInfo::addReplaceSprite(int sprite) } return it->second; } + +std::string ItemInfo::getDyeString(int color) const +{ + if (mId == 1172) + { + if (color == 1) + return "W:#115511,22aa22,99dd99;R:#547000,a5dc00,d1ff46"; + if (color == 0) + return "W:#547000,a5dc00,d1ff46;R:#115511,22aa22,99dd99"; + if (color == 3) + return "W:#ffffff,000000,000000;R:#333333,333333,333333"; + } + return ""; +} + +std::string ItemInfo::getDyeColorsString(int color) const +{ + if (mId == 1172) + { + if (color == 1) + return "#115511,22aa22,99dd99;#547000,a5dc00,d1ff46"; + if (color == 0) + return "#547000,a5dc00,d1ff46;#115511,22aa22,99dd99"; + if (color == 3) + return "#ffffff,000000,000000;#333333,333333,333333"; + } + return ""; +} \ No newline at end of file diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 5ea537fae..3b72c7830 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -231,6 +231,10 @@ class ItemInfo std::map > getSpriteToItemReplaceMap() const { return mSpriteToItemReplaceMap; } + std::string getDyeString(int color) const; + + std::string getDyeColorsString(int color) const; + protected: SpriteDisplay mDisplay; /**< Display info (like icon) */ std::string mName; diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index d914efe30..835f9ce00 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -387,3 +387,13 @@ std::list splitToIntList(const std::string &text, char separator) return tokens; } + +std::string combineDye(std::string file, std::string dye) +{ + if (dye.empty()) + return file; + size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + return file.substr(0, pos) + "|" + dye; + return file + "|" + dye; +} diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index ab16bb64b..52b47e6a2 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -170,4 +170,6 @@ std::set splitToIntSet(const std::string &text, char separator); std::list splitToIntList(const std::string &text, char separator); +std::string combineDye(std::string file, std::string dye); + #endif // UTILS_STRINGUTILS_H -- cgit v1.2.3-70-g09d2 From d59fc28844c92534c3c211cb971c0d21e6c54313 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 28 Feb 2011 16:22:11 +0200 Subject: Change client version to 3. --- src/net/tmwa/network.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/network.h b/src/net/tmwa/network.h index 3202282ae..45f3cfac6 100644 --- a/src/net/tmwa/network.h +++ b/src/net/tmwa/network.h @@ -39,7 +39,7 @@ * Protocol version, reported to the eAthena char and mapserver who can adjust * the protocol accordingly. */ -#define CLIENT_PROTOCOL_VERSION 2 +#define CLIENT_PROTOCOL_VERSION 3 namespace TmwAthena { -- cgit v1.2.3-70-g09d2 From 1373ea47dc7d6a2afd1ce118d5f9e307326beb02 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 28 Feb 2011 22:43:06 +0200 Subject: Add support for reading item colors for char list and created char (for extended servers) --- src/net/tmwa/charserverhandler.cpp | 91 ++++++++++++++++++++++++++++++-------- src/net/tmwa/charserverhandler.h | 3 +- src/net/tmwa/network.cpp | 4 +- src/net/tmwa/protocol.h | 2 + 4 files changed, 78 insertions(+), 22 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index ec61b4be2..686b67a0e 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -61,6 +61,7 @@ CharServerHandler::CharServerHandler() SMSG_CHAR_LOGIN, SMSG_CHAR_LOGIN_ERROR, SMSG_CHAR_CREATE_SUCCEEDED, + SMSG_CHAR_CREATE_SUCCEEDED2, SMSG_CHAR_CREATE_FAILED, SMSG_CHAR_DELETE_SUCCEEDED, SMSG_CHAR_DELETE_FAILED, @@ -82,7 +83,8 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) int slots = msg.readInt16(); if (slots > 0 && slots < 30) loginData.characterSlots = slots; - msg.skip(18); // Unused + bool version = msg.readInt8() == 1; + msg.skip(17); // Unused delete_all(mCharacters); mCharacters.clear(); @@ -93,7 +95,7 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) for (int i = 0; i < count; ++i) { Net::Character *character = new Net::Character; - readPlayerData(msg, character); + readPlayerData(msg, character, version); mCharacters.push_back(character); logger->log("CharServer: Player: %s (%d)", character->dummy->getName().c_str(), character->slot); @@ -123,7 +125,24 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) case SMSG_CHAR_CREATE_SUCCEEDED: { Net::Character *character = new Net::Character; - readPlayerData(msg, character); + readPlayerData(msg, character, false); + mCharacters.push_back(character); + + updateCharSelectDialog(); + + // Close the character create dialog + if (mCharCreateDialog) + { + mCharCreateDialog->scheduleDelete(); + mCharCreateDialog = 0; + } + } + break; + + case SMSG_CHAR_CREATE_SUCCEEDED2: + { + Net::Character *character = new Net::Character; + readPlayerData(msg, character, true); mCharacters.push_back(character); updateCharSelectDialog(); @@ -238,7 +257,8 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) } void CharServerHandler::readPlayerData(Net::MessageIn &msg, - Net::Character *character) + Net::Character *character, + bool withColors) { const Token &token = static_cast(Net::getLoginHandler())->getToken(); @@ -254,10 +274,10 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, character->data.mStats[JOB].base = temp; character->data.mStats[JOB].mod = temp; - tempPlayer->setSprite(SPRITE_SHOE, msg.readInt16()); - tempPlayer->setSprite(SPRITE_GLOVES, msg.readInt16()); - tempPlayer->setSprite(SPRITE_CAPE, msg.readInt16()); - tempPlayer->setSprite(SPRITE_MISC1, msg.readInt16()); + int shoes = msg.readInt16(); + int gloves = msg.readInt16(); + int cape = msg.readInt16(); + int misc1 = msg.readInt16(); msg.readInt32(); // option msg.readInt32(); // karma @@ -272,24 +292,22 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, msg.readInt16(); // speed tempPlayer->setSubtype(msg.readInt16()); // class (used for race) int hairStyle = msg.readInt16(); - Uint16 weapon = msg.readInt16(); + Uint16 weapon = msg.readInt16(); // server not used it. may be need use? tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", 1, true); character->data.mAttributes[LEVEL] = msg.readInt16(); msg.readInt16(); // skill point - tempPlayer->setSprite(SPRITE_BOTTOMCLOTHES, msg.readInt16()); - //to avoid show error (error.xml) need remove this sprite - if (!config.getBoolValue("hideShield")) - tempPlayer->setSprite(SPRITE_SHIELD, msg.readInt16()); - else - msg.readInt16(); + int bottomClothes = msg.readInt16(); + int shield = msg.readInt16(); + + int hat = msg.readInt16(); // head option top + int topClothes = msg.readInt16(); - tempPlayer->setSprite(SPRITE_HAT, msg.readInt16()); // head option top - tempPlayer->setSprite(SPRITE_TOPCLOTHES, msg.readInt16()); tempPlayer->setSprite(SPRITE_HAIR, hairStyle * -1, ColorDB::get(msg.readInt16())); - tempPlayer->setSprite(SPRITE_MISC2, msg.readInt16()); + + int misc2 = msg.readInt16(); tempPlayer->setName(msg.readString(24)); character->dummy = tempPlayer; @@ -297,7 +315,42 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, for (int i = 0; i < 6; i++) character->data.mStats[i + STR].base = msg.readInt8(); - character->slot = msg.readInt8(); // character slot + if (withColors) + { + tempPlayer->setSprite(SPRITE_SHOE, shoes, "", msg.readInt8()); + tempPlayer->setSprite(SPRITE_GLOVES, gloves, "", msg.readInt8()); + tempPlayer->setSprite(SPRITE_CAPE, cape, "", msg.readInt8()); + tempPlayer->setSprite(SPRITE_MISC1, misc1, "", msg.readInt8()); + tempPlayer->setSprite(SPRITE_BOTTOMCLOTHES, bottomClothes, "", msg.readInt8()); + //to avoid show error (error.xml) need remove this sprite + if (!config.getBoolValue("hideShield")) + tempPlayer->setSprite(SPRITE_SHIELD, shield, "", msg.readInt8()); + else + msg.readInt8(); + + tempPlayer->setSprite(SPRITE_HAT, hat, "", msg.readInt8()); // head option top + tempPlayer->setSprite(SPRITE_TOPCLOTHES, topClothes, "", msg.readInt8()); + tempPlayer->setSprite(SPRITE_MISC2, misc2, "", msg.readInt8()); + msg.skip(5); + character->slot = msg.readInt8(); // character slot + } + else + { + tempPlayer->setSprite(SPRITE_SHOE, shoes); + tempPlayer->setSprite(SPRITE_GLOVES, gloves); + tempPlayer->setSprite(SPRITE_CAPE, cape); + tempPlayer->setSprite(SPRITE_MISC1, misc1); + tempPlayer->setSprite(SPRITE_BOTTOMCLOTHES, bottomClothes); + //to avoid show error (error.xml) need remove this sprite + if (!config.getBoolValue("hideShield")) + tempPlayer->setSprite(SPRITE_SHIELD, shield); + + tempPlayer->setSprite(SPRITE_HAT, hat); // head option top + tempPlayer->setSprite(SPRITE_TOPCLOTHES, topClothes); + tempPlayer->setSprite(SPRITE_MISC2, misc2); + character->slot = msg.readInt8(); // character slot + } + msg.readInt8(); // unknown } diff --git a/src/net/tmwa/charserverhandler.h b/src/net/tmwa/charserverhandler.h index 77c726566..9d65639b9 100644 --- a/src/net/tmwa/charserverhandler.h +++ b/src/net/tmwa/charserverhandler.h @@ -80,7 +80,8 @@ class CharServerHandler : public MessageHandler, public Net::CharHandler void connect(); private: - void readPlayerData(Net::MessageIn &msg, Net::Character *character); + void readPlayerData(Net::MessageIn &msg, Net::Character *character, + bool withColors); }; } // namespace TmwAthena diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index a19957ae7..ad8be300c 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -79,10 +79,10 @@ short packet_lengths[] = 8, 14, 10, 35, 6, 8, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6, 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1, -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10, -// #0x2000 +// #0x0200 26, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 19, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; const unsigned int BUFFER_SIZE = 655360; diff --git a/src/net/tmwa/protocol.h b/src/net/tmwa/protocol.h index 3f7f65d4e..696f83646 100644 --- a/src/net/tmwa/protocol.h +++ b/src/net/tmwa/protocol.h @@ -83,6 +83,8 @@ static const int STORAGE_OFFSET = 1; #define SMSG_CHAR_LOGIN 0x006b #define SMSG_CHAR_LOGIN_ERROR 0x006c #define SMSG_CHAR_CREATE_SUCCEEDED 0x006d +#define SMSG_CHAR_CREATE_SUCCEEDED2 0x0221 + #define SMSG_CHAR_CREATE_FAILED 0x006e #define SMSG_CHAR_DELETE_SUCCEEDED 0x006f #define SMSG_CHAR_DELETE_FAILED 0x0070 -- cgit v1.2.3-70-g09d2 From 98d5d99550b7f4c76da6a7ac2b8a21c8ba6cfa62 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 1 Mar 2011 03:50:27 +0200 Subject: Add support for reading colors in moveing players packets. --- src/net/tmwa/beinghandler.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 15792cf3a..9c5c45185 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -167,6 +167,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) Being *srcBeing, *dstBeing; int hairStyle, hairColor, flag; int hp, maxHP, oldHP; + unsigned char colors[9]; switch (msg.getId()) { @@ -876,8 +877,17 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) headTop = msg.readInt16(); headMid = msg.readInt16(); hairColor = msg.readInt16(); - shoes = msg.readInt16(); - gloves = msg.readInt16(); //sd->head_dir + + colors[0] = msg.readInt8(); + colors[1] = msg.readInt8(); + colors[2] = msg.readInt8(); + logger->log("msg: %x", msg.getId()); + logger->log("colors: %d, %d, %d", colors[0], colors[1], colors[2]); + + msg.readInt8(); //unused +// shoes = msg.readInt16(); +// gloves = msg.readInt16(); //sd->head_dir + guild = msg.readInt32(); // guild if (guild == 0) @@ -897,9 +907,10 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, shield); //dstBeing->setSprite(SPRITE_SHOE, shoes); - dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom); - dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid); - dstBeing->setSprite(SPRITE_HAT, headTop); + logger->log("bmt: %d, %d, %d", colors[0], colors[2], colors[1]); + dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom, "", colors[0]); + dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid, "", colors[2]); + dstBeing->setSprite(SPRITE_HAT, headTop, "", colors[1]); //dstBeing->setSprite(SPRITE_GLOVES, gloves); //dstBeing->setSprite(SPRITE_CAPE, cape); //dstBeing->setSprite(SPRITE_MISC1, misc1); -- cgit v1.2.3-70-g09d2 From 218dbbd7ce5415fe8c26857f06c5907c7cc6d175 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 1 Mar 2011 19:44:49 +0200 Subject: Fix char slots number calculation. --- src/net/tmwa/charserverhandler.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 686b67a0e..a1b7c83b8 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -90,7 +90,11 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) mCharacters.clear(); // Derive number of characters from message length - const int count = (msg.getLength() - 24) / 106; + int count = (msg.getLength() - 24); + if (version) + count /= 120; + else + count /= 106; for (int i = 0; i < count; ++i) { -- cgit v1.2.3-70-g09d2 From 582428edf9e40db0d1ed7b78222562a7a5031fe4 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 2 Mar 2011 01:51:25 +0200 Subject: Add serverversion checks. And disable some advanced features in old servers. --- src/client.cpp | 1 + src/client.h | 1 + src/net/tmwa/beinghandler.cpp | 21 ++++++++++++++++----- src/net/tmwa/charserverhandler.cpp | 2 +- src/net/tmwa/inventoryhandler.cpp | 32 +++++++++++++++++++++++--------- src/net/tmwa/loginhandler.cpp | 26 +++++++++++++++++--------- 6 files changed, 59 insertions(+), 24 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/client.cpp b/src/client.cpp index 4eaad4234..e1753753e 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -151,6 +151,7 @@ volatile int frame_count = 0; /**< Counts the frames during one second */ volatile int cur_time; volatile bool runCounters; bool isSafeMode = false; +int serverVersion; /** * Advances game logic counter. diff --git a/src/client.h b/src/client.h index 3ed9482dd..e3f596c1a 100644 --- a/src/client.h +++ b/src/client.h @@ -59,6 +59,7 @@ extern volatile int fps; extern volatile int tick_time; extern volatile int cur_time; extern bool isSafeMode; +extern int serverVersion; class ErrorListener : public gcn::ActionListener { diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 9c5c45185..0548a2715 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -631,7 +631,10 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) else { // SMSG_BEING_CHANGE_LOOKS2 id = msg.readInt16(); - id2 = msg.readInt16(); + if (type == 2 || serverVersion > 0) + id2 = msg.readInt16(); + else + id2 = 1; color = ""; } @@ -907,10 +910,18 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, shield); //dstBeing->setSprite(SPRITE_SHOE, shoes); - logger->log("bmt: %d, %d, %d", colors[0], colors[2], colors[1]); - dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom, "", colors[0]); - dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid, "", colors[2]); - dstBeing->setSprite(SPRITE_HAT, headTop, "", colors[1]); + if (serverVersion > 0) + { + dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom, "", colors[0]); + dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid, "", colors[2]); + dstBeing->setSprite(SPRITE_HAT, headTop, "", colors[1]); + } + else + { + dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom); + dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid); + dstBeing->setSprite(SPRITE_HAT, headTop); + } //dstBeing->setSprite(SPRITE_GLOVES, gloves); //dstBeing->setSprite(SPRITE_CAPE, cape); //dstBeing->setSprite(SPRITE_MISC1, misc1); diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index a1b7c83b8..35cca6f07 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -83,7 +83,7 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) int slots = msg.readInt16(); if (slots > 0 && slots < 30) loginData.characterSlots = slots; - bool version = msg.readInt8() == 1; + bool version = msg.readInt8() == 1 && serverVersion > 0; msg.skip(17); // Unused delete_all(mCharacters); diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp index fc32c3ec3..7113cddb3 100644 --- a/src/net/tmwa/inventoryhandler.cpp +++ b/src/net/tmwa/inventoryhandler.cpp @@ -209,6 +209,9 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) cards[0], cards[1], cards[2], cards[3]); } + if (serverVersion < 1 && identified > 1) + identified = 1; + if (msg.getId() == SMSG_PLAYER_INVENTORY) { // Trick because arrows are not considered equipment @@ -255,6 +258,9 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) refine); } + if (serverVersion < 1 && identified > 1) + identified = 1; + mInventoryItems.push_back(InventoryItem(index, itemId, amount, refine, identified, false)); } @@ -299,6 +305,9 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) if (item && item->getId() == itemId) amount += inventory->getItem(index)->getQuantity(); + if (serverVersion < 1 && identified > 1) + identified = 1; + inventory->setItem(index, itemId, amount, refine, identified, equipType != 0); } @@ -410,6 +419,9 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) { if (mStorage) { + if (serverVersion < 1 && identified > 1) + identified = 1; + mStorage->setItem(index, itemId, amount, refine, identified, false); } @@ -458,29 +470,31 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) { index = msg.readInt16() - INVENTORY_OFFSET; itemId = msg.readInt16(); - if (itemId == 1172) - logger->log("step1"); int itemType = msg.readInt8(); // type identified = msg.readInt8(); // identify flag + msg.readInt16(); // equip type equipType = msg.readInt16(); msg.readInt8(); // attribute refine = msg.readInt8(); msg.skip(8); // card - if (itemId == 1172) - logger->log("step2"); - if (inventory) - inventory->setItem(index, itemId, 1, refine, identified, true); - - if (equipType) - mEquips.setEquipment(getSlot(equipType), index); if (debugInventory) { logger->log("Index: %d, ID: %d, Type: %d, Identified: %d", index, itemId, itemType, identified); } + + if (serverVersion < 1 && identified > 1) + identified = 1; + + if (inventory) + inventory->setItem(index, itemId, 1, refine, identified, true); + + if (equipType) + mEquips.setEquipment(getSlot(equipType), index); + } break; diff --git a/src/net/tmwa/loginhandler.cpp b/src/net/tmwa/loginhandler.cpp index a1b3c0f95..810d97056 100644 --- a/src/net/tmwa/loginhandler.cpp +++ b/src/net/tmwa/loginhandler.cpp @@ -198,15 +198,23 @@ void LoginHandler::handleMessage(Net::MessageIn &msg) { // TODO: verify these! - msg.readInt8(); // -1 - msg.readInt8(); // T - msg.readInt8(); // M - msg.readInt8(); // W - - unsigned int options = msg.readInt32(); - - mRegistrationEnabled = options; -// mRegistrationEnabled = (options & 1); + char b1 = msg.readInt8(); // -1 + char b2 = msg.readInt8(); // T + char b3 = msg.readInt8(); // M + char b4 = msg.readInt8(); // W + if (b1 == -1 && b2 == 'E' && b3 == 'V' && b4 == 'L') + { + unsigned int options = msg.readInt8(); + mRegistrationEnabled = options; + msg.skip(2); + serverVersion = msg.readInt8(); + } + else + { + unsigned int options = msg.readInt32(); + mRegistrationEnabled = options; + serverVersion = 0; + } // Leave this last mVersionResponse = true; -- cgit v1.2.3-70-g09d2 From 22f79fd0d623c8e11994905534f53da267e22935 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 3 Mar 2011 01:25:21 +0200 Subject: Dehardcode item colors. Now reading all from configs. --- src/actorsprite.cpp | 4 +-- src/flooritem.cpp | 2 +- src/gui/charcreatedialog.cpp | 8 ++--- src/item.cpp | 4 +-- src/net/manaserv/beinghandler.cpp | 4 +-- src/net/manaserv/charhandler.cpp | 2 +- src/net/tmwa/beinghandler.cpp | 6 ++-- src/net/tmwa/charserverhandler.cpp | 2 +- src/resources/colordb.cpp | 74 ++++++++++++++++++++++++++++++++------ src/resources/colordb.h | 32 +++++++++++++++-- src/resources/itemdb.cpp | 2 ++ src/resources/iteminfo.cpp | 36 +++++++++---------- src/resources/iteminfo.h | 12 ++++++- src/utils/stringutils.cpp | 41 +++++++++++++++++++++ src/utils/stringutils.h | 5 +++ 15 files changed, 186 insertions(+), 48 deletions(-) (limited to 'src/net/tmwa') diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp index 4188ff224..686c871e7 100644 --- a/src/actorsprite.cpp +++ b/src/actorsprite.cpp @@ -312,7 +312,7 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, it != it_end; ++it) { std::string file = "graphics/sprites/" - + combineDye((*it)->sprite, color); + + combineDye2((*it)->sprite, color); int variant = (*it)->variant; addSprite(AnimatedSprite::load(file, variant)); @@ -339,7 +339,7 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, imagePath = "graphics/items/" + display.floor; break; } - imagePath = combineDye(imagePath, color); + imagePath = combineDye2(imagePath, color); Image *img = resman->getImage(imagePath); diff --git a/src/flooritem.cpp b/src/flooritem.cpp index 700d9ed25..740daf387 100644 --- a/src/flooritem.cpp +++ b/src/flooritem.cpp @@ -72,7 +72,7 @@ FloorItem::FloorItem(int id, } ItemInfo info = ItemDB::get(itemId); - setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeString(mColor)); + setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeColorsString(mColor)); } const ItemInfo &FloorItem::getInfo() const diff --git a/src/gui/charcreatedialog.cpp b/src/gui/charcreatedialog.cpp index dff591dd9..ae4401572 100644 --- a/src/gui/charcreatedialog.cpp +++ b/src/gui/charcreatedialog.cpp @@ -58,7 +58,7 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot): mPlayer = new Being(0, ActorSprite::PLAYER, 0, NULL); mPlayer->setGender(GENDER_MALE); - int numberOfHairColors = ColorDB::size(); + int numberOfHairColors = ColorDB::getHairSize(); mHairStyle = rand() % mPlayer->getNumOfHairstyles(); mHairColor = rand() % numberOfHairColors; @@ -364,10 +364,10 @@ void CharCreateDialog::updateHair() if (mHairStyle < 0) mHairStyle += Being::getNumOfHairstyles(); - mHairColor %= ColorDB::size(); + mHairColor %= ColorDB::getHairSize(); if (mHairColor < 0) - mHairColor += ColorDB::size(); + mHairColor += ColorDB::getHairSize(); mPlayer->setSprite(Net::getCharHandler()->hairSprite(), - mHairStyle * -1, ColorDB::get(mHairColor)); + mHairStyle * -1, ColorDB::getHairColor(mHairColor)); } diff --git a/src/item.cpp b/src/item.cpp index 02f775834..ed0685a9d 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -75,7 +75,7 @@ void Item::setId(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = paths.getStringValue("itemIcons") + display.image; - std::string dye = combineDye(imagePath, info.getDyeString(color)); + std::string dye = combineDye2(imagePath, info.getDyeColorsString(color)); mImage = resman->getImage(dye); mDrawImage = resman->getImage(dye); @@ -106,7 +106,7 @@ Image *Item::getImage(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = "graphics/items/" + display.image; Image *image; - image = resman->getImage(combineDye(imagePath, info.getDyeString(color))); + image = resman->getImage(combineDye2(imagePath, info.getDyeColorsString(color))); if (!image) image = Theme::getImageFromTheme("unknown-item.png"); diff --git a/src/net/manaserv/beinghandler.cpp b/src/net/manaserv/beinghandler.cpp index 8ba2e5967..b726bc52e 100644 --- a/src/net/manaserv/beinghandler.cpp +++ b/src/net/manaserv/beinghandler.cpp @@ -185,7 +185,7 @@ void BeingHandler::handleBeingEnterMessage(Net::MessageIn &msg) being->setName(name); } int hs = msg.readInt8(), hc = msg.readInt8(); - being->setSprite(SPRITE_HAIR, hs * -1, ColorDB::get(hc)); + being->setSprite(SPRITE_HAIR, hs * -1, ColorDB::getHairColor(hc)); being->setGender(msg.readInt8() == GENDER_MALE ? GENDER_MALE : GENDER_FEMALE); handleLooks(being, msg); @@ -350,7 +350,7 @@ void BeingHandler::handleBeingLooksChangeMessage(Net::MessageIn &msg) { int style = msg.readInt16(); int color = msg.readInt16(); - being->setSprite(SPRITE_HAIR, style * -1, ColorDB::get(color)); + being->setSprite(SPRITE_HAIR, style * -1, ColorDB::getHairColor(color)); } } diff --git a/src/net/manaserv/charhandler.cpp b/src/net/manaserv/charhandler.cpp index 20dda5b70..163aad988 100644 --- a/src/net/manaserv/charhandler.cpp +++ b/src/net/manaserv/charhandler.cpp @@ -377,7 +377,7 @@ void CharHandler::updateCharacters() player->setName(info.name); player->setGender(info.gender); player->setSprite(SPRITE_HAIR, info.hairStyle * -1, - ColorDB::get(info.hairColor)); + ColorDB::getHairColor(info.hairColor)); character->data.mAttributes[LEVEL] = info.level; character->data.mAttributes[CHAR_POINTS] = info.characterPoints; character->data.mAttributes[CORR_POINTS] = info.correctionPoints; diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 0548a2715..b1c173df6 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -290,7 +290,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) ? GENDER_FEMALE : GENDER_MALE); // Set these after the gender, as the sprites may be gender-specific dstBeing->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(hairColor)); + ColorDB::getHairColor(hairColor)); dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom); dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid); dstBeing->setSprite(SPRITE_HAT, headTop); @@ -671,7 +671,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) player_node->imitateOutfit(dstBeing, SPRITE_TOPCLOTHES); break; case 6: // eAthena LOOK_HAIR_COLOR - dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::get(id)); + dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::getHairColor(id)); break; case 8: // eAthena LOOK_SHIELD if (!config.getBoolValue("hideShield")) @@ -927,7 +927,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) //dstBeing->setSprite(SPRITE_MISC1, misc1); //dstBeing->setSprite(SPRITE_MISC2, misc2); dstBeing->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(hairColor)); + ColorDB::getHairColor(hairColor)); player_node->imitateOutfit(dstBeing); diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 35cca6f07..daf531f04 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -309,7 +309,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, int topClothes = msg.readInt16(); tempPlayer->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(msg.readInt16())); + ColorDB::getHairColor(msg.readInt16())); int misc2 = msg.readInt16(); tempPlayer->setName(msg.readString(24)); diff --git a/src/resources/colordb.cpp b/src/resources/colordb.cpp index c35cec95e..79622e8ed 100644 --- a/src/resources/colordb.cpp +++ b/src/resources/colordb.cpp @@ -28,9 +28,10 @@ namespace { - ColorDB::Colors mColors; + ColorDB::Colors mHairColors; bool mLoaded = false; std::string mFail = "#ffffff"; + ColorDB::ColorLists mColorLists; } void ColorDB::load() @@ -38,6 +39,12 @@ void ColorDB::load() if (mLoaded) unload(); + loadHair(); + loadColorLists(); +} + +void ColorDB::loadHair() +{ XML::Document *doc = new XML::Document("hair.xml"); xmlNodePtr root = doc->rootNode(); bool hairXml = true; @@ -55,7 +62,7 @@ void ColorDB::load() if (!root || !xmlStrEqual(root->name, BAD_CAST "colors")) { logger->log1("ColorDB: Failed to find any color files."); - mColors[0] = mFail; + mHairColors[0] = mFail; mLoaded = true; delete doc; @@ -69,10 +76,10 @@ void ColorDB::load() { int id = XML::getProperty(node, "id", 0); - if (mColors.find(id) != mColors.end()) + if (mHairColors.find(id) != mHairColors.end()) logger->log("ColorDB: Redefinition of dye ID %d", id); - mColors[id] = hairXml ? + mHairColors[id] = hairXml ? XML::getProperty(node, "value", "#FFFFFF") : XML::getProperty(node, "dye", "#FFFFFF"); } @@ -83,22 +90,59 @@ void ColorDB::load() mLoaded = true; } +void ColorDB::loadColorLists() +{ + XML::Document *doc = new XML::Document("itemcolors.xml"); + xmlNodePtr root = doc->rootNode(); + if (!root) + return; + + for_each_xml_child_node(node, root) + { + if (xmlStrEqual(node->name, BAD_CAST "list")) + { + std::string name = XML::getProperty(node, "name", ""); + if (name.empty()) + continue; + + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + colors = it->second; + + for_each_xml_child_node(colorNode, node) + { + if (xmlStrEqual(colorNode->name, BAD_CAST "color")) + { + ItemColor c(XML::getProperty(colorNode, "id", -1), + XML::getProperty(colorNode, "name", ""), + XML::getProperty(colorNode, "value", "")); + if (c.id > -1) + colors[c.id] = c; + } + } + mColorLists[name] = colors; + } + } +} + void ColorDB::unload() { logger->log1("Unloading color database..."); - mColors.clear(); + mHairColors.clear(); mLoaded = false; } -std::string &ColorDB::get(int id) +std::string &ColorDB::getHairColor(int id) { if (!mLoaded) load(); - ColorIterator i = mColors.find(id); + ColorIterator i = mHairColors.find(id); - if (i == mColors.end()) + if (i == mHairColors.end()) { logger->log("ColorDB: Error, unknown dye ID# %d", id); return mFail; @@ -109,7 +153,17 @@ std::string &ColorDB::get(int id) } } -int ColorDB::size() +int ColorDB::getHairSize() { - return static_cast(mColors.size()); + return static_cast(mHairColors.size()); +} + +std::map *ColorDB::getColorsList(std::string name) +{ + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + return &it->second; + return 0; } diff --git a/src/resources/colordb.h b/src/resources/colordb.h index 72d34afe8..fb0da0036 100644 --- a/src/resources/colordb.h +++ b/src/resources/colordb.h @@ -29,23 +29,51 @@ */ namespace ColorDB { + class ItemColor + { + public: + ItemColor() + { } + ItemColor(int id, std::string name, std::string color) + { + this->id = id; + this->name = name; + this->color = color; + } + + int id; + std::string name; + std::string color; + }; + /** * Loads the color data from colors.xml. */ void load(); + /** + * Loads the color data from colors.xml. + */ + void loadHair(); + + void loadColorLists(); + /** * Clear the color data */ void unload(); - std::string &get(int id); + std::string &getHairColor(int id); + + int getHairSize(); - int size(); + std::map *getColorsList(std::string name); // Color DB typedef std::map Colors; typedef Colors::iterator ColorIterator; + typedef std::map > ColorLists; + typedef ColorLists::iterator ColorListsIterator; } #endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 418bfb848..d515495de 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -207,6 +207,7 @@ void ItemDB::load() std::string drawBefore = XML::getProperty(node, "drawBefore", ""); std::string drawAfter = XML::getProperty(node, "drawAfter", ""); std::string removeSprite = XML::getProperty(node, "removeSprite", ""); + std::string colors = XML::getProperty(node, "colors", ""); std::string tags[3]; tags[0] = XML::getProperty(node, "tag", @@ -266,6 +267,7 @@ void ItemDB::load() itemInfo->setDrawBefore(parseSpriteName(drawBefore)); itemInfo->setDrawAfter(parseSpriteName(drawAfter)); itemInfo->setDrawPriority(drawPriority); + itemInfo->setColorsList(colors); std::string effect; for (int i = 0; i < int(sizeof(fields) / sizeof(fields[0])); ++i) diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 49aadc23d..990c78f45 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -82,30 +82,28 @@ std::map &ItemInfo::addReplaceSprite(int sprite) return it->second; } -std::string ItemInfo::getDyeString(int color) const +void ItemInfo::setColorsList(std::string name) { - if (mId == 1172) + if (name.empty()) { - if (color == 1) - return "W:#115511,22aa22,99dd99;R:#547000,a5dc00,d1ff46"; - if (color == 0) - return "W:#547000,a5dc00,d1ff46;R:#115511,22aa22,99dd99"; - if (color == 3) - return "W:#ffffff,000000,000000;R:#333333,333333,333333"; + mColors = 0; + mColorList = ""; + } + else + { + mColors = ColorDB::getColorsList(name); + mColorList = name; } - return ""; } std::string ItemInfo::getDyeColorsString(int color) const { - if (mId == 1172) - { - if (color == 1) - return "#115511,22aa22,99dd99;#547000,a5dc00,d1ff46"; - if (color == 0) - return "#547000,a5dc00,d1ff46;#115511,22aa22,99dd99"; - if (color == 3) - return "#ffffff,000000,000000;#333333,333333,333333"; - } - return ""; + if (!mColors || mColorList.empty()) + return ""; + + std::map ::iterator it = mColors->find(color); + if (it == mColors->end()) + return ""; + + return it->second.color; } \ No newline at end of file diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 3b72c7830..297c1b036 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -25,6 +25,7 @@ #include "being.h" +#include "resources/colordb.h" #include "resources/spritedef.h" #include @@ -111,7 +112,9 @@ class ItemInfo mDrawPriority(0), mIsRemoveSprites(false), mAttackAction(SpriteAction::INVALID), - mAttackRange(0) + mAttackRange(0), + mColors(0), + mColorList("") { } @@ -235,6 +238,11 @@ class ItemInfo std::string getDyeColorsString(int color) const; + void setColorsList(std::string name); + + bool isHaveColors() + { return !mColorList.empty(); } + protected: SpriteDisplay mDisplay; /**< Display info (like icon) */ std::string mName; @@ -269,6 +277,8 @@ class ItemInfo /** Stores the names of sounds to be played at certain event. */ std::map < EquipmentSoundEvent, std::vector > mSounds; std::map mTags; + std::map *mColors; + std::string mColorList; }; #endif diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index 835f9ce00..63924eb78 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -388,6 +388,19 @@ std::list splitToIntList(const std::string &text, char separator) return tokens; } + +std::list splitToStringList(const std::string &text, + char separator) +{ + std::list tokens; + std::stringstream ss(text); + std::string item; + while(std::getline(ss, item, separator)) + tokens.push_back(item); + + return tokens; +} + std::string combineDye(std::string file, std::string dye) { if (dye.empty()) @@ -397,3 +410,31 @@ std::string combineDye(std::string file, std::string dye) return file.substr(0, pos) + "|" + dye; return file + "|" + dye; } + +std::string combineDye2(std::string file, std::string dye) +{ + if (dye.empty()) + return file; + + size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + { + std::string dye1 = file.substr(pos + 1); + std::string str = ""; + file = file.substr(0, pos); + std::list list1 = splitToStringList(dye1, ';'); + std::list list2 = splitToStringList(dye, ';'); + std::list::iterator it1, it1_end = list1.end(); + std::list::iterator it2, it2_end = list2.end(); + for (it1 = list1.begin(), it2 = list2.begin(); + it1 != it1_end && it2 != it2_end; ++it1, ++it2) + { + str += (*it1) + ":" + (*it2) + ";"; + } + return file + "|" + str; + } + else + { + return file; + } +} diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index 52b47e6a2..02c25eddb 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -170,6 +170,11 @@ std::set splitToIntSet(const std::string &text, char separator); std::list splitToIntList(const std::string &text, char separator); +std::list splitToStringList(const std::string &text, + char separator); + std::string combineDye(std::string file, std::string dye); +std::string combineDye2(std::string file, std::string dye); + #endif // UTILS_STRINGUTILS_H -- cgit v1.2.3-70-g09d2