summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/actormanager.cpp55
-rw-r--r--src/actormanager.h2
-rw-r--r--src/being/being.cpp8
-rw-r--r--src/being/being.h2
-rw-r--r--src/commands.cpp5
-rw-r--r--src/commands.h5
-rw-r--r--src/net/ea/beinghandler.cpp20
7 files changed, 76 insertions, 21 deletions
diff --git a/src/actormanager.cpp b/src/actormanager.cpp
index e5abcba0d..966653a99 100644
--- a/src/actormanager.cpp
+++ b/src/actormanager.cpp
@@ -35,19 +35,27 @@
#include "gui/widgets/tabs/chattab.h"
+#include "gui/windows/botcheckerwindow.h"
#include "gui/windows/chatwindow.h"
#include "gui/windows/equipmentwindow.h"
#include "gui/windows/socialwindow.h"
+#include "gui/windows/questswindow.h"
#include "input/inputmanager.h"
#include "utils/checkutils.h"
#include "utils/gettext.h"
+#include "net/beinghandler.h"
+#include "net/charserverhandler.h"
#include "net/net.h"
#include "net/packetlimiter.h"
#include "net/playerhandler.h"
+#include "resources/iteminfo.h"
+
+#include "resources/db/itemdb.h"
+
#include <algorithm>
#include <list>
@@ -236,6 +244,25 @@ Being *ActorManager::createBeing(const int id,
Being *const being = new Being(id, type, subtype, mMap);
mActors.insert(being);
+ if (type == ActorType::PLAYER || type == ActorType::NPC)
+ {
+ being->updateFromCache();
+ Net::getBeingHandler()->requestNameById(id);
+ if (localPlayer)
+ localPlayer->checkNewName(being);
+ }
+ if (type == ActorType::PLAYER)
+ {
+ if (botCheckerWindow)
+ botCheckerWindow->updateList();
+ if (socialWindow)
+ socialWindow->updateActiveList();
+ }
+ else if (type == ActorType::NPC)
+ {
+ if (questsWindow)
+ questsWindow->addEffect(being);
+ }
return being;
}
@@ -1694,3 +1721,31 @@ void ActorManager::updateEffects(const std::map<int, int> &addEffects,
being->addSpecialEffect((*idAdd).second);
}
}
+
+Being *ActorManager::cloneBeing(const Being *const srcBeing)
+{
+ Being *const dstBeing = actorManager->createBeing(srcBeing->getId() + 1,
+ ActorType::PLAYER,
+ srcBeing->getSubType());
+ if (!dstBeing)
+ return nullptr;
+ dstBeing->setGender(srcBeing->getGender());
+ dstBeing->setAction(srcBeing->getCurrentAction(), 0);
+ dstBeing->setTileCoords(srcBeing->getTileX(), srcBeing->getTileY());
+ dstBeing->setName(srcBeing->getName());
+ dstBeing->setDirection(srcBeing->getDirection());
+ const size_t sz = srcBeing->getSpritesCount();
+ for (size_t slot = 0; slot < sz; slot ++)
+ {
+ const int id = srcBeing->getSpriteID(slot);
+ const unsigned char color = srcBeing->getSpriteColor(slot);
+ dstBeing->setSprite(slot, id, "", color, false);
+ }
+ const int hairSlot = Net::getCharServerHandler()->hairSprite();
+ const int hairStyle = -srcBeing->getSpriteID(hairSlot);
+ const unsigned char hairColor = srcBeing->getHairColor();
+ dstBeing->setSprite(hairSlot, hairStyle * -1,
+ ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
+ dstBeing->setHairColor(hairColor);
+ return dstBeing;
+}
diff --git a/src/actormanager.h b/src/actormanager.h
index e30a7011b..d8ce22e33 100644
--- a/src/actormanager.h
+++ b/src/actormanager.h
@@ -65,6 +65,8 @@ class ActorManager final: public ConfigListener
const ActorType::Type type,
const uint16_t subtype) A_WARN_UNUSED;
+ Being *cloneBeing(const Being *const srcBeing);
+
/**
* Create a FloorItem and add it to the list of ActorSprites.
*/
diff --git a/src/being/being.cpp b/src/being/being.cpp
index f69a084c0..471adedf9 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -3062,6 +3062,14 @@ int Being::getSpriteID(const int slot) const
return mSpriteIDs[slot];
}
+unsigned char Being::getSpriteColor(const int slot) const
+{
+ if (slot < 0 || static_cast<unsigned>(slot) >= mSpriteColorsIds.size())
+ return 1;
+
+ return mSpriteColorsIds[slot];
+}
+
void Being::addAfkEffect()
{
addSpecialEffect(mAwayEffect);
diff --git a/src/being/being.h b/src/being/being.h
index c9d343659..fc7f27bb7 100644
--- a/src/being/being.h
+++ b/src/being/being.h
@@ -796,6 +796,8 @@ class Being notfinal : public ActorSprite,
int getSpriteID(const int slot) const A_WARN_UNUSED;
+ unsigned char getSpriteColor(const int slot) const A_WARN_UNUSED;
+
void setHairStyle(const unsigned int slot, const int id);
void setHairColor(const unsigned int slot,
diff --git a/src/commands.cpp b/src/commands.cpp
index cec8468e8..51ce93f85 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -1538,6 +1538,11 @@ impHandler0(dumpOGL)
#endif
}
+impHandler0(debugSpawn)
+{
+ Being *const being = actorManager->cloneBeing(localPlayer);
+}
+
void replaceVars(std::string &str)
{
if (!localPlayer || !actorManager)
diff --git a/src/commands.h b/src/commands.h
index bdf4f76c4..824ab089d 100644
--- a/src/commands.h
+++ b/src/commands.h
@@ -137,6 +137,7 @@ namespace Commands
decHandler(uploadServerConfig);
decHandler(uploadLog);
decHandler(gm);
+ decHandler(debugSpawn);
void replaceVars(std::string &str);
} // namespace Commands
@@ -240,6 +241,7 @@ enum
COMMAND_UPLOADLOG,
COMMAND_GM,
COMMAND_HACK,
+ COMMAND_DEBUGSPAWN,
END_COMMANDS
};
@@ -341,7 +343,8 @@ static const CommandInfo commands[] =
{"uploadserverconfig", &Commands::uploadServerConfig, -1, false},
{"uploadlog", &Commands::uploadLog, -1, false},
{"gm", &Commands::gm, -1, true},
- {"hack", &Commands::hack, -1, true}
+ {"hack", &Commands::hack, -1, true},
+ {"debugSpawn", &Commands::debugSpawn, -1, false}
};
#undef decHandler
diff --git a/src/net/ea/beinghandler.cpp b/src/net/ea/beinghandler.cpp
index 8750efcf0..65e14040e 100644
--- a/src/net/ea/beinghandler.cpp
+++ b/src/net/ea/beinghandler.cpp
@@ -82,26 +82,6 @@ Being *BeingHandler::createBeing(const int id, const int16_t job) const
type = ActorType::PORTAL;
Being *const being = actorManager->createBeing(id, type, job);
-
- if (type == ActorType::PLAYER || type == ActorType::NPC)
- {
- being->updateFromCache();
- requestNameById(id);
- if (localPlayer)
- localPlayer->checkNewName(being);
- }
- if (type == ActorType::PLAYER)
- {
- if (botCheckerWindow)
- botCheckerWindow->updateList();
- if (socialWindow)
- socialWindow->updateActiveList();
- }
- else if (type == ActorType::NPC)
- {
- if (questsWindow)
- questsWindow->addEffect(being);
- }
return being;
}