summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/eathena/beingrecv.cpp256
1 files changed, 110 insertions, 146 deletions
diff --git a/src/net/eathena/beingrecv.cpp b/src/net/eathena/beingrecv.cpp
index 8d986797b..a39c65122 100644
--- a/src/net/eathena/beingrecv.cpp
+++ b/src/net/eathena/beingrecv.cpp
@@ -73,6 +73,83 @@ extern OkDialog *deathNotice;
namespace EAthena
{
+static void setBasicFields(Being *restrict const dstBeing,
+ const uint8_t gender,
+ const int hairStyle,
+ const ItemColor hairColor,
+ const uint32_t weapon,
+ const uint16_t headBottom,
+ const uint16_t headMid,
+ const uint16_t headTop,
+ const uint16_t shoes,
+ const uint16_t gloves,
+ const bool notMove) A_NONNULL(1);
+static void setBasicFields(Being *restrict const dstBeing,
+ const uint8_t gender,
+ const int hairStyle,
+ const ItemColor hairColor,
+ const uint32_t weapon,
+ const uint16_t headBottom,
+ const uint16_t headMid,
+ const uint16_t headTop,
+ const uint16_t shoes,
+ const uint16_t gloves,
+ const bool updateSlots)
+{
+ const ActorTypeT actorType = dstBeing->getType();
+ switch (actorType)
+ {
+ case ActorType::Player:
+ dstBeing->setGender(Being::intToGender(gender));
+ dstBeing->setHairColor(hairColor);
+ // Set these after the gender, as the sprites may be gender-specific
+ if (hairStyle == 0)
+ {
+ dstBeing->updateSprite(SPRITE_HAIR_COLOR,
+ 0,
+ std::string());
+ }
+ else
+ {
+ dstBeing->updateSprite(SPRITE_HAIR_COLOR,
+ hairStyle * -1,
+ ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
+ }
+ if (updateSlots)
+ {
+ dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
+ dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
+ dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop);
+ dstBeing->updateSprite(SPRITE_HAIR, shoes);
+ dstBeing->updateSprite(SPRITE_SHOES, gloves);
+ dstBeing->updateSprite(SPRITE_BODY, weapon);
+ dstBeing->setWeaponId(weapon);
+ }
+ break;
+ case ActorType::Npc:
+ if (serverFeatures->haveNpcGender())
+ {
+ dstBeing->setGender(Being::intToGender(gender));
+ }
+ break;
+ default:
+ case ActorType::Monster:
+ case ActorType::Portal:
+ case ActorType::Pet:
+ case ActorType::Mercenary:
+ case ActorType::Homunculus:
+ case ActorType::SkillUnit:
+ case ActorType::Elemental:
+ break;
+ case ActorType::FloorItem:
+ case ActorType::Avatar:
+ case ActorType::Unknown:
+ reportAlways("Wrong being type detected: %d",
+ CAST_S32(actorType));
+ break;
+ }
+}
+
void BeingRecv::processBeingChangeLook2(Net::MessageIn &msg)
{
if (actorManager == nullptr)
@@ -407,55 +484,17 @@ void BeingRecv::processBeingVisible(Net::MessageIn &msg)
dstBeing->setKarma(msg.readUInt8("karma"));
const uint8_t gender = CAST_U8(msg.readUInt8("gender") & 3);
- const ActorTypeT actorType = dstBeing->getType();
- switch (actorType)
- {
- case ActorType::Player:
- dstBeing->setGender(Being::intToGender(gender));
- dstBeing->setHairColor(hairColor);
- // Set these after the gender, as the sprites may be gender-specific
- if (hairStyle == 0)
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR,
- 0,
- std::string());
- }
- else
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR,
- hairStyle * -1,
- ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
- }
- dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
- dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
- dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop);
- dstBeing->updateSprite(SPRITE_HAIR, shoes);
- dstBeing->updateSprite(SPRITE_SHOES, gloves);
- dstBeing->updateSprite(SPRITE_BODY, weapon);
- dstBeing->setWeaponId(weapon);
- break;
- case ActorType::Npc:
- if (serverFeatures->haveNpcGender())
- {
- dstBeing->setGender(Being::intToGender(gender));
- }
- break;
- default:
- case ActorType::Monster:
- case ActorType::Portal:
- case ActorType::Pet:
- case ActorType::Mercenary:
- case ActorType::Homunculus:
- case ActorType::SkillUnit:
- case ActorType::Elemental:
- break;
- case ActorType::FloorItem:
- case ActorType::Avatar:
- case ActorType::Unknown:
- reportAlways("Wrong being type detected: %d",
- CAST_S32(actorType));
- break;
- }
+ setBasicFields(dstBeing,
+ gender,
+ hairStyle,
+ hairColor,
+ weapon,
+ headBottom,
+ headMid,
+ headTop,
+ shoes,
+ gloves,
+ true);
uint8_t dir;
uint16_t x, y;
@@ -635,56 +674,17 @@ void BeingRecv::processBeingMove(Net::MessageIn &msg)
dstBeing->setKarma(msg.readUInt8("karma"));
const uint8_t gender = CAST_U8(msg.readUInt8("gender") & 3);
- const ActorTypeT actorType = dstBeing->getType();
- switch (actorType)
- {
- case ActorType::Player:
- dstBeing->setGender(Being::intToGender(gender));
- dstBeing->setHairColor(hairColor);
- // Set these after the gender, as the sprites may be gender-specific
- if (hairStyle == 0)
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR, 0);
- }
- else
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR,
- hairStyle * -1,
- ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
- }
- if (!serverFeatures->haveMove3())
- {
- dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
- dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
- dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop);
- dstBeing->updateSprite(SPRITE_HAIR, shoes);
- dstBeing->updateSprite(SPRITE_SHOES, gloves);
- dstBeing->updateSprite(SPRITE_BODY, weapon);
- dstBeing->setWeaponId(weapon);
- }
- break;
- case ActorType::Npc:
- if (serverFeatures->haveNpcGender())
- {
- dstBeing->setGender(Being::intToGender(gender));
- }
- break;
- default:
- case ActorType::Monster:
- case ActorType::Portal:
- case ActorType::Pet:
- case ActorType::Mercenary:
- case ActorType::Homunculus:
- case ActorType::SkillUnit:
- case ActorType::Elemental:
- break;
- case ActorType::FloorItem:
- case ActorType::Avatar:
- case ActorType::Unknown:
- reportAlways("Wrong being type detected: %d",
- CAST_S32(actorType));
- break;
- }
+ setBasicFields(dstBeing,
+ gender,
+ hairStyle,
+ hairColor,
+ weapon,
+ headBottom,
+ headMid,
+ headTop,
+ shoes,
+ gloves,
+ !serverFeatures->haveMove3());
uint16_t srcX, srcY, dstX, dstY;
msg.readCoordinatePair(srcX, srcY, dstX, dstY, "move path");
@@ -867,53 +867,17 @@ void BeingRecv::processBeingSpawn(Net::MessageIn &msg)
dstBeing->setKarma(msg.readUInt8("karma"));
const uint8_t gender = CAST_U8(msg.readUInt8("gender") & 3);
- const ActorTypeT actorType = dstBeing->getType();
- switch (actorType)
- {
- case ActorType::Player:
- dstBeing->setGender(Being::intToGender(gender));
- dstBeing->setHairColor(hairColor);
- // Set these after the gender, as the sprites may be gender-specific
- if (hairStyle == 0)
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR, 0);
- }
- else
- {
- dstBeing->updateSprite(SPRITE_HAIR_COLOR,
- hairStyle * -1,
- ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
- }
- dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
- dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
- dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop);
- dstBeing->updateSprite(SPRITE_HAIR, shoes);
- dstBeing->updateSprite(SPRITE_SHOES, gloves);
- dstBeing->updateSprite(SPRITE_BODY, weapon);
- dstBeing->setWeaponId(weapon);
- break;
- case ActorType::Npc:
- if (serverFeatures->haveNpcGender())
- {
- dstBeing->setGender(Being::intToGender(gender));
- }
- break;
- default:
- case ActorType::Monster:
- case ActorType::Portal:
- case ActorType::Pet:
- case ActorType::Mercenary:
- case ActorType::Homunculus:
- case ActorType::SkillUnit:
- case ActorType::Elemental:
- break;
- case ActorType::FloorItem:
- case ActorType::Avatar:
- case ActorType::Unknown:
- reportAlways("Wrong being type detected: %d",
- CAST_S32(actorType));
- break;
- }
+ setBasicFields(dstBeing,
+ gender,
+ hairStyle,
+ hairColor,
+ weapon,
+ headBottom,
+ headMid,
+ headTop,
+ shoes,
+ gloves,
+ true);
uint8_t dir;
uint16_t x, y;