summaryrefslogtreecommitdiff
path: root/src/net/tmwa
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2011-03-03 02:50:03 +0200
committerAndrei Karas <akaras@inbox.ru>2011-03-03 02:50:03 +0200
commitde51eaa43e05c2126fc1eef2a7e115843f972547 (patch)
tree286a05a069e048247f90c7595f1b8939be784608 /src/net/tmwa
parentd4c08d3bf69410a35a50875de50cc6fe74b3bf3e (diff)
parent8627c7745f47492ab349da6a74e98e3d5813418f (diff)
downloadmv-de51eaa43e05c2126fc1eef2a7e115843f972547.tar.gz
mv-de51eaa43e05c2126fc1eef2a7e115843f972547.tar.bz2
mv-de51eaa43e05c2126fc1eef2a7e115843f972547.tar.xz
mv-de51eaa43e05c2126fc1eef2a7e115843f972547.zip
Merge branch 'coloritems'
Diffstat (limited to 'src/net/tmwa')
-rw-r--r--src/net/tmwa/beinghandler.cpp69
-rw-r--r--src/net/tmwa/charserverhandler.cpp101
-rw-r--r--src/net/tmwa/charserverhandler.h3
-rw-r--r--src/net/tmwa/inventoryhandler.cpp47
-rw-r--r--src/net/tmwa/inventoryhandler.h5
-rw-r--r--src/net/tmwa/itemhandler.cpp6
-rw-r--r--src/net/tmwa/loginhandler.cpp26
-rw-r--r--src/net/tmwa/network.cpp4
-rw-r--r--src/net/tmwa/network.h2
-rw-r--r--src/net/tmwa/protocol.h2
-rw-r--r--src/net/tmwa/tradehandler.cpp14
11 files changed, 204 insertions, 75 deletions
diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp
index 436b40d13..000941c30 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())
{
@@ -289,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);
@@ -620,15 +621,21 @@ 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();
+ if (type == 2 || serverVersion > 0)
+ id2 = msg.readInt16();
+ else
+ id2 = 1;
+ color = "";
}
if (dstBeing->getType() == Being::PLAYER)
@@ -646,57 +653,57 @@ 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
- dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::get(id));
+ dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::getHairColor(id));
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:
@@ -870,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)
@@ -887,19 +903,28 @@ 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);
- dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom);
- dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid);
- dstBeing->setSprite(SPRITE_HAT, headTop);
+ 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);
//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 5e2efbdd5..daf531f04 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,18 +83,23 @@ 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 && serverVersion > 0;
+ msg.skip(17); // Unused
delete_all(mCharacters);
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)
{
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 +129,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 +261,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<LoginHandler*>(Net::getLoginHandler())->getToken();
@@ -254,10 +278,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 +296,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();
- tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", true);
+ 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());
+ ColorDB::getHairColor(msg.readInt16()));
+
+ int misc2 = msg.readInt16();
tempPlayer->setName(msg.readString(24));
character->dummy = tempPlayer;
@@ -297,7 +319,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/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp
index 9828fb957..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
@@ -217,13 +220,13 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
if (inventory)
{
inventory->setItem(index, itemId, amount,
- 0, isEquipment);
+ 0, identified, isEquipment);
}
}
else
{
mInventoryItems.push_back(InventoryItem(index, itemId,
- amount, 0, false));
+ amount, 0, identified, false));
}
}
break;
@@ -255,8 +258,11 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
refine);
}
+ if (serverVersion < 1 && identified > 1)
+ identified = 1;
+
mInventoryItems.push_back(InventoryItem(index, itemId, amount,
- refine, false));
+ refine, identified, false));
}
break;
@@ -299,8 +305,11 @@ 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,
- equipType != 0);
+ identified, equipType != 0);
}
}
} break;
@@ -381,7 +390,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 +412,19 @@ 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);
+ {
+ if (serverVersion < 1 && identified > 1)
+ identified = 1;
+
+ mStorage->setItem(index, itemId, amount, refine,
+ identified, false);
+ }
}
break;
@@ -455,19 +470,31 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg)
{
index = msg.readInt16() - INVENTORY_OFFSET;
itemId = msg.readInt16();
- msg.readInt8(); // type
- msg.readInt8(); // identify flag
+ 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 (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, true);
+ inventory->setItem(index, itemId, 1, refine, identified, true);
if (equipType)
mEquips.setEquipment(getSlot(equipType), index);
+
}
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/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/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;
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/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
{
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
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;