summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/tmwa/adminhandler.cpp3
-rw-r--r--src/net/tmwa/beinghandler.cpp58
-rw-r--r--src/net/tmwa/charserverhandler.cpp25
-rw-r--r--src/net/tmwa/charserverhandler.h2
4 files changed, 58 insertions, 30 deletions
diff --git a/src/net/tmwa/adminhandler.cpp b/src/net/tmwa/adminhandler.cpp
index c60050bd..4c4ecdad 100644
--- a/src/net/tmwa/adminhandler.cpp
+++ b/src/net/tmwa/adminhandler.cpp
@@ -68,10 +68,7 @@ void AdminHandler::handleMessage(MessageIn &msg)
id = msg.readInt32();
int ip = msg.readInt32();
if (Being *player = actorSpriteManager->findBeing(id))
- {
player->setIp(ip);
- player->updateName();
- }
break;
}
}
diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp
index e2c4f158..ba983542 100644
--- a/src/net/tmwa/beinghandler.cpp
+++ b/src/net/tmwa/beinghandler.cpp
@@ -78,29 +78,51 @@ BeingHandler::BeingHandler(bool enableSync):
handledMessages = _messages;
}
-static Being *createBeing(int id, short job)
+static ActorSprite::Type typeFromJob(short job)
{
- ActorSprite::Type type = ActorSprite::UNKNOWN;
if (job <= 25 || (job >= 4001 && job <= 4049))
- type = ActorSprite::PLAYER;
- else if (job >= 46 && job <= 1000)
- type = ActorSprite::NPC;
- else if (job > 1000 && job <= 2000)
- type = ActorSprite::MONSTER;
- else if (job == 45)
+ return ActorSprite::PLAYER;
+ if (job >= 46 && job <= 1000)
+ return ActorSprite::NPC;
+ if (job > 1000 && job <= 2000)
+ return ActorSprite::MONSTER;
+ if (job == 45)
+ return ActorSprite::PORTAL;
+
+ return ActorSprite::UNKNOWN;
+}
+
+static Being *createBeing(int id, short job)
+{
+ const auto type = typeFromJob(job);
+ if (type == ActorSprite::PORTAL)
return nullptr; // Skip portals
Being *being = actorSpriteManager->createBeing(id, type, job);
if (type == ActorSprite::PLAYER || type == ActorSprite::NPC)
{
- MessageOut outMsg(0x0094);
- outMsg.writeInt32(id);//readLong(2));
+ MessageOut outMsg(CMSG_NAME_REQUEST);
+ outMsg.writeInt32(id);
}
return being;
}
+static void updateBeingType(Being *being, short job)
+{
+ const auto type = typeFromJob(job);
+ const bool typeChanged = being->getType() != type;
+
+ being->setType(type, job);
+
+ if (typeChanged && type == ActorSprite::PLAYER)
+ {
+ MessageOut outMsg(CMSG_NAME_REQUEST);
+ outMsg.writeInt32(being->getId());
+ }
+}
+
static void handleMoveMessage(Map *map, Being *dstBeing,
Uint16 srcX, Uint16 srcY,
Uint16 dstX, Uint16 dstY)
@@ -209,7 +231,7 @@ void BeingHandler::handleMessage(MessageIn &msg)
speed = 150.0f; // In ticks per tile * 10
dstBeing->setMoveSpeed(Vector(speed / 10, speed / 10));
- dstBeing->setSubtype(job);
+ updateBeingType(dstBeing, job);
hairStyle = msg.readInt16();
weapon = msg.readInt16();
headBottom = msg.readInt16();
@@ -417,6 +439,9 @@ void BeingHandler::handleMessage(MessageIn &msg)
switch (type)
{
+ case LOOK::BASE:
+ updateBeingType(dstBeing, id);
+ break;
case LOOK::HAIR:
{
// const int look = id / 256;
@@ -531,7 +556,7 @@ void BeingHandler::handleMessage(MessageIn &msg)
else
dstBeing->setMoveSpeed(Net::getPlayerHandler()->getDefaultMoveSpeed());
- dstBeing->setSubtype(job);
+ updateBeingType(dstBeing, job);
hairStyle = msg.readInt16();
weapon = msg.readInt16();
shield = msg.readInt16();
@@ -545,8 +570,9 @@ void BeingHandler::handleMessage(MessageIn &msg)
headTop = msg.readInt16();
headMid = msg.readInt16();
hairColor = msg.readInt16();
- shoes = msg.readInt16();
- gloves = msg.readInt16();
+ msg.readInt16(); // clothes_color
+ msg.readInt8(); // head_dir
+ msg.readInt8(); // unused2
msg.readInt32(); // guild
msg.readInt16(); // emblem
msg.readInt16(); // manner
@@ -601,11 +627,11 @@ void BeingHandler::handleMessage(MessageIn &msg)
}
else if (msg.getId() == SMSG_PLAYER_MOVE)
{
- msg.readInt8(); // unknown
+ msg.readInt8(); // five
}
msg.readInt8(); // Lv
- msg.readInt8(); // unknown
+ msg.readInt8(); // unused
dstBeing->setStunMode(stunMode);
dstBeing->setStatusEffectBlock(0, (statusEffects >> 16) & 0xffff);
diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp
index 636b58ce..39155201 100644
--- a/src/net/tmwa/charserverhandler.cpp
+++ b/src/net/tmwa/charserverhandler.cpp
@@ -28,7 +28,6 @@
#include "gui/charcreatedialog.h"
#include "gui/okdialog.h"
-#include "net/logindata.h"
#include "net/net.h"
#include "net/tmwa/gamehandler.h"
@@ -210,21 +209,20 @@ void CharServerHandler::readPlayerData(MessageIn &msg, Net::Character *character
const Token &token =
static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
- auto *tempPlayer = new LocalPlayer(msg.readInt32(), 0);
- tempPlayer->setGender(token.sex);
+ const int id = msg.readInt32();
character->data.mAttributes[EXP] = msg.readInt32();
character->data.mAttributes[MONEY] = msg.readInt32();
character->data.mStats[JOB].exp = msg.readInt32();
- int temp = msg.readInt32();
+ const int temp = msg.readInt32();
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());
+ const int shoe = msg.readInt16();
+ const int gloves = msg.readInt16();
+ const int cape = msg.readInt16();
+ const int misc1 = msg.readInt16();
msg.readInt32(); // option
msg.readInt32(); // karma
@@ -240,8 +238,15 @@ void CharServerHandler::readPlayerData(MessageIn &msg, Net::Character *character
const uint16_t race = msg.readInt16(); // class (used for race)
int hairStyle = msg.readInt8();
msg.readInt8(); // look
- tempPlayer->setSubtype(race);
- Uint16 weapon = msg.readInt16();
+ const uint16_t weapon = msg.readInt16();
+
+ auto *tempPlayer = new LocalPlayer(id, race);
+ tempPlayer->setGender(token.sex);
+
+ tempPlayer->setSprite(SPRITE_SHOE, shoe);
+ tempPlayer->setSprite(SPRITE_GLOVES, gloves);
+ tempPlayer->setSprite(SPRITE_CAPE, cape);
+ tempPlayer->setSprite(SPRITE_MISC1, misc1);
tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", true);
character->data.mAttributes[LEVEL] = msg.readInt16();
diff --git a/src/net/tmwa/charserverhandler.h b/src/net/tmwa/charserverhandler.h
index 646a545e..b0d3e970 100644
--- a/src/net/tmwa/charserverhandler.h
+++ b/src/net/tmwa/charserverhandler.h
@@ -74,7 +74,7 @@ class CharServerHandler final : public MessageHandler, public Net::CharHandler
void connect();
private:
- void readPlayerData(MessageIn &msg, Net::Character *character);
+ static void readPlayerData(MessageIn &msg, Net::Character *character);
};
} // namespace TmwAthena