Go to the documentation of this file.
41 m_protocolVersion = 0;
42 m_clientCustomOs = -1;
45 m_denyBotCall =
false;
51 m_canReportBugs =
false;
66 m_protocolGame =
nullptr;
69 void Game::resetGameStates()
72 m_denyBotCall =
false;
77 m_canReportBugs =
false;
82 m_followingCreature =
nullptr;
83 m_attackingCreature =
nullptr;
84 m_localPlayer =
nullptr;
89 for(
auto& it : m_containers) {
97 m_pingEvent =
nullptr;
102 m_walkEvent =
nullptr;
105 if(m_checkConnectionEvent) {
106 m_checkConnectionEvent->
cancel();
107 m_checkConnectionEvent =
nullptr;
110 m_containers.clear();
121 if(ec != asio::error::eof)
135 m_protocolGame =
nullptr;
202 g_lua.callGlobalField(
"g_game",
"onConnectionFailing", true);
203 m_connectionFailWarned = true;
205 g_lua.callGlobalField(
"g_game",
"onConnectionFailing", false);
206 m_connectionFailWarned = false;
216 if(m_connectionFailWarned) {
218 m_connectionFailWarned =
false;
225 m_characterName =
"";
241 m_gmActions = actions;
252 m_fightMode = fightMode;
253 m_chaseMode = chaseMode;
254 m_safeFight = safeMode;
275 if(m_pingReceived == m_pingSent)
297 void Game::processOpenContainer(
int containerId,
const ItemPtr& containerItem,
const std::string& name,
int capacity,
bool hasParent,
const std::vector<ItemPtr>& items,
bool isUnlocked,
bool hasPages,
int containerSize,
int firstIndex)
301 m_containers[containerId] = container;
302 container->onAddItems(items);
306 container->onOpen(previousContainer);
309 if(previousContainer)
310 previousContainer->onClose();
320 m_containers[containerId] =
nullptr;
321 container->onClose();
331 container->onAddItem(item, slot);
341 container->onUpdateItem(slot, item);
351 container->onRemoveItem(slot, lastItem);
409 m_vips[id] =
Vip(name, status, description, iconId, notifyLogin);
410 g_lua.
callGlobalField(
"g_game",
"onAddVip",
id, name, status, description, iconId, notifyLogin);
415 std::get<1>(m_vips[
id]) = status;
435 const std::vector<std::tuple<int, std::string> >& mountList)
441 Outfit outfit = currentOutfit;
443 virtualOutfitCreature->
setOutfit(outfit);
453 mountOutfit.
setId(0);
459 virtualMountCreature->
setOutfit(mountOutfit);
462 g_lua.
callGlobalField(
"g_game",
"onOpenOutfitWindow", virtualOutfitCreature, outfitList, virtualMountCreature, mountList);
495 void Game::processEditText(
uint id,
int itemId,
int maxLength,
const std::string& text,
const std::string& writer,
const std::string& date)
516 & buttonList,
int enterButton,
int escapeButton,
const std::vector<std::tuple<int, std::string> >
517 & choiceList,
bool priority)
519 g_lua.
callGlobalField(
"g_game",
"onModalDialog",
id, title, message, buttonList, enterButton, escapeButton, choiceList, priority);
533 void Game::loginWorld(
const std::string& account,
const std::string& password,
const std::string& worldName,
const std::string& worldHost,
int worldPort,
const std::string& characterName,
const std::string& authenticatorToken,
const std::string& sessionKey)
538 if(m_protocolVersion == 0)
545 m_localPlayer->
setName(characterName);
548 m_protocolGame->
login(account, password, worldHost,
static_cast<uint16>(worldPort), characterName, authenticatorToken, sessionKey);
549 m_characterName = characterName;
550 m_worldName = worldName;
597 if(!m_localPlayer->
canWalk(direction)) {
598 if(m_lastWalkDir != direction) {
602 m_walkEvent =
nullptr;
616 m_localPlayer->
preWalk(direction);
619 auto canChangeFloorDown = [&]() ->
bool {
633 auto canChangeFloorUp = [&]() ->
bool {
649 if(!(canChangeFloorDown() || canChangeFloorUp() || !toTile || toTile->
isEmpty()))
661 m_lastWalkDir = direction;
672 if(dirs.size() > 127) {
673 g_logger.
error(
"Auto walk path too great, the maximum number of directions is 127");
684 const auto it = dirs.begin();
686 if(!m_localPlayer->
canWalk(direction))
691 m_localPlayer->
preWalk(direction);
780 if(thing->isCreature() && isBattleList && m_protocolVersion >= 961)
783 m_protocolGame->
sendLook(thing->getPosition(), thing->getId(), thing->getStackPos());
794 uint id = thing->getId();
795 if(thing->isCreature()) {
800 m_protocolGame->
sendMove(thing->getPosition(), id, thing->getStackPos(), toPos, count);
808 const Position position = thing->getPosition();
817 m_protocolGame->
sendRotateItem(thing->getPosition(), thing->getId(), thing->getStackPos());
825 Position pos = thing->getPosition();
853 if(toThing->isCreature())
866 if(toThing->isCreature())
869 m_protocolGame->
sendUseItemWith(pos, itemId, 0, toThing->getPosition(), toThing->getId(), toThing->getStackPos());
874 for(
auto& it : m_containers) {
878 ItemPtr item = container->findItemById(itemId, subType);
925 if(creature && creature == m_attackingCreature)
931 setAttackingCreature(creature);
934 if(m_protocolVersion >= 963) {
936 m_seq = creature->
getId();
951 if(creature && creature == m_followingCreature)
957 setFollowingCreature(creature);
960 if(m_protocolVersion >= 963) {
962 m_seq = creature->
getId();
975 setFollowingCreature(
nullptr);
977 setAttackingCreature(
nullptr);
997 m_protocolGame->
sendTalk(mode, channelId,
"", message);
1004 m_protocolGame->
sendTalk(mode, 0, receiver, message);
1131 const auto it = m_vips.find(playerId);
1132 if(it == m_vips.end())
1138 void Game::editVip(
int playerId,
const std::string& description,
int iconId,
bool notifyLogin)
1143 const auto it = m_vips.find(playerId);
1144 if(it == m_vips.end())
1147 std::get<2>(m_vips[playerId]) = description;
1148 std::get<3>(m_vips[playerId]) = iconId;
1149 std::get<4>(m_vips[playerId]) = notifyLogin;
1152 m_protocolGame->
sendEditVip(playerId, description, iconId, notifyLogin);
1159 if(m_chaseMode == chaseMode)
1161 m_chaseMode = chaseMode;
1170 if(m_fightMode == fightMode)
1172 m_fightMode = fightMode;
1181 if(m_safeFight == on)
1194 if(m_pvpMode == pvpMode)
1196 m_pvpMode = pvpMode;
1207 if(m_unjustifiedPoints == unjustifiedPoints)
1210 m_unjustifiedPoints = unjustifiedPoints;
1218 if(m_openPvpSituations == openPvpSituations)
1221 m_openPvpSituations = openPvpSituations;
1324 void Game::reportRuleViolation(
const std::string& target,
int reason,
int action,
const std::string& comment,
const std::string& statement,
int statementId,
bool ipBanishment)
1328 m_protocolGame->
sendRuleViolation(target, reason, action, comment, statement, statementId, ipBanishment);
1331 void Game::debugReport(
const std::string& a,
const std::string& b,
const std::string& c,
const std::string& d)
1436 if(!m_protocolGame || !m_protocolGame->
isConnected())
1439 if(m_pingReceived != m_pingSent)
1442 m_denyBotCall =
false;
1444 m_denyBotCall =
true;
1459 #ifdef BOT_PROTECTION
1484 if(m_protocolVersion == version)
1490 if(version != 0 && (version < 740 || version > 1099))
1493 m_protocolVersion = version;
1502 if(m_clientVersion == version)
1508 if(version != 0 && (version < 740 || version > 1099))
1514 if(version >= 770) {
1520 if(version >= 780) {
1529 if(version >= 790) {
1533 if(version >= 840) {
1539 if(version >= 841) {
1544 if(version >= 854) {
1548 if(version >= 860) {
1552 if(version >= 862) {
1556 if(version >= 870) {
1562 if(version >= 910) {
1572 if(version >= 940) {
1576 if(version >= 953) {
1581 if(version >= 960) {
1586 if(version >= 963) {
1590 if(version >= 980) {
1595 if(version >= 981) {
1600 if(version >= 984) {
1605 if(version >= 1000) {
1610 if(version >= 1035) {
1615 if(version >= 1036) {
1620 if(version >= 1038) {
1624 if(version >= 1050) {
1628 if(version >= 1053) {
1632 if(version >= 1054) {
1636 if(version >= 1055) {
1640 if(version >= 1057) {
1644 if(version >= 1061) {
1648 if(version >= 1071) {
1652 if(version >= 1072) {
1656 if(version >= 1074) {
1660 if(version >= 1080) {
1664 if(version >= 1092) {
1668 if(version >= 1093) {
1672 if(version >= 1094) {
1676 m_clientVersion = version;
1681 void Game::setAttackingCreature(
const CreaturePtr& creature)
1683 if(creature != m_attackingCreature) {
1684 const CreaturePtr oldCreature = m_attackingCreature;
1685 m_attackingCreature = creature;
1691 void Game::setFollowingCreature(
const CreaturePtr& creature)
1693 const CreaturePtr oldCreature = m_followingCreature;
1694 m_followingCreature = creature;
1701 std::string formatedName = name;
1704 for(
char& i : formatedName) {
1715 return formatedName;
1721 while(m_containers[++
id] !=
nullptr);
1728 if(m_clientCustomOs >= 0)
1729 return m_clientCustomOs;
void openRuleViolation(const std::string &reporter)
int findEmptyContainerId()
Position translatedToDirection(Otc::Direction direction)
void editList(uint id, int doorId, const std::string &text)
void sendChangeMapAwareRange(int xrange, int yrange)
void look(const ThingPtr &thing, bool isBattleList=false)
void loginWorld(const std::string &account, const std::string &password, const std::string &worldName, const std::string &worldHost, int worldPort, const std::string &characterName, const std::string &authenticatorToken, const std::string &sessionKey)
void cancelRuleViolation()
void sendCancelAttackAndFollow()
void requestDrawing(const Position &pos, const Otc::RequestDrawFlags reDrawFlags, const bool force=false, const bool isLocalPlayer=false)
void close(const ContainerPtr &container)
static void processQuestLine(int questId, const std::vector< std::tuple< std::string, std::string > > &questMissions)
void processWalkCancel(Otc::Direction direction)
void leaveChannel(int channelId)
void cancelWalk(Otc::Direction direction=Otc::InvalidDirection)
static void processOpenChannel(int channelId, const std::string &name)
bool canWalk(Otc::Direction direction)
static void processTextMessage(Otc::MessageMode mode, const std::string &text)
void browseField(const Position &position)
void sendExcludeFromOwnChannel(const std::string &name)
void processOpenOutfitWindow(const Outfit ¤tOutfit, const std::vector< std::tuple< int, std::string, int > > &outfitList, const std::vector< std::tuple< int, std::string > > &mountList)
const TilePtr & getTile()
void sendBugReport(const std::string &comment)
void closeRuleViolation(const std::string &reporter)
static void processLogin()
void inspectNpcTrade(const ItemPtr &item)
void processDeath(int deathType, int penality)
void sendJoinChannel(int channelId)
static void processEditList(uint id, int doorId, const std::string &text)
void sendCloseNpcChannel()
void sendLeaveChannel(int channelId)
static void processQuestLog(const std::vector< std::tuple< int, std::string, bool > > &questList)
void inviteToOwnChannel(const std::string &name)
void setClientVersion(int version)
void lockWalk(int millis=250)
static void processRuleViolationChannel(int channelId)
void setProtocolVersion(int version)
void sendCancelRuleViolation()
void requestItemInfo(const ItemPtr &item, int index)
EventDispatcher g_dispatcher
bool isWalkable(bool ignoreCreatures=false)
void move(const ThingPtr &thing, const Position &toPos, int count)
void setDirection(Otc::Direction direction)
void processInventoryChange(int slot, const ItemPtr &item)
void sendSeekInContainer(int cid, int index)
static void processTutorialHint(int id)
void sendOpenOwnChannel()
void sendUseOnCreature(const Position &pos, int thingId, int stackpos, uint creatureId)
void callGlobalField(const std::string &global, const std::string &field, const T &... args)
static void processPlayerGoods(int money, const std::vector< std::tuple< ItemPtr, int > > &goods)
static void processEditText(uint id, int itemId, int maxLength, const std::string &text, const std::string &writer, const std::string &date)
@ GameLoginPacketEncryption
void openParent(const ContainerPtr &container)
void sendBuyItem(int itemId, int subType, int amount, bool ignoreCapacity, bool buyWithBackpack)
void processGMActions(const std::vector< uint8 > &actions)
void setPVPMode(Otc::PVPModes pvpMode)
static void processLoginToken(bool unknown)
void error(const std::string &what)
void openPrivateChannel(const std::string &receiver)
static void processAddAutomapFlag(const Position &pos, int icon, const std::string &message)
void setFightMode(Otc::FightModes fightMode)
void turn(Otc::Direction direction)
void useInventoryItem(int itemId)
void useWith(const ItemPtr &item, const ThingPtr &toThing)
const TilePtr & getTile(const Position &pos)
void sendMove(const Position &fromPos, int thingId, int stackpos, const Position &toPos, int count)
static void processCloseTrade()
static void processLoginAdvice(const std::string &message)
void setInventoryItem(Otc::InventorySlot inventory, const ItemPtr &item)
static void processOpenOwnPrivateChannel(int channelId, const std::string &name)
void equipItem(const ItemPtr &item)
static void processLoginError(const std::string &error)
void sendPassLeadership(uint creatureId)
void sendRotateItem(const Position &pos, int thingId, int stackpos)
void partyInvite(int creatureId)
void sendAnswerModalDialog(uint32 dialog, int button, int choice)
stdext::shared_object_ptr< Creature > CreaturePtr
static void processCloseNpcTrade()
void sendAddVip(const std::string &name)
void sendDebugReport(const std::string &a, const std::string &b, const std::string &c, const std::string &d)
std::string traceback(const std::string &errorMessage="", int level=0)
void sendInviteToOwnChannel(const std::string &name)
void processPendingGame()
ItemPtr findItemInContainers(uint itemId, int subType)
void sendRuleViolation(const std::string &target, int reason, int action, const std::string &comment, const std::string &statement, int statementId, bool ipBanishment)
static void processRemoveAutomapFlag(const Position &pos, int icon, const std::string &message)
void sendFollow(uint creatureId, uint seq)
void requestStoreOffers(const std::string &categoryName, int serviceType=0)
void buildMessageModesMap(int version)
int open(const ItemPtr &item, const ContainerPtr &previousContainer)
void preWalk(Otc::Direction direction)
@ GameForceFirstAutoWalkStep
void partyShareExperience(bool active)
void partyJoin(int creatureId)
void requestTrade(const ItemPtr &item, const CreaturePtr &creature)
void sendOpenTransactionHistory(int entriesPerPage)
void sendBuyStoreOffer(int offerId, int productType, const std::string &name)
void requestQuestLine(int questId)
void processContainerRemoveItem(int containerId, int slot, const ItemPtr &lastItem)
void sendCloseContainer(int containerId)
void sendSellItem(int itemId, int subType, int amount, bool ignoreEquipped)
void sendShareExperience(bool active)
void sendRequestItemInfo(int itemId, int subType, int index)
void sendEditVip(uint playerId, const std::string &description, int iconId, bool notifyLogin)
void sendRequestStoreOffers(const std::string &categoryName, int serviceType)
void buyItem(const ItemPtr &item, int amount, bool ignoreCapacity, bool buyWithBackpack)
void sendChangeFightModes(Otc::FightModes fightMode, Otc::ChaseModes chaseMode, bool safeFight, Otc::PVPModes pvpMode)
ScheduledEventPtr cycleEvent(const std::function< void()> &callback, int delay)
void sendInspectNpcTrade(int itemId, int count)
void use(const ThingPtr &thing)
void sendLookCreature(uint creatureId)
void answerModalDialog(uint32 dialog, int button, int choice)
void setUnjustifiedPoints(UnjustifiedPoints unjustifiedPoints)
void sendEditList(uint id, int doorId, const std::string &text)
void sendAutoWalk(const std::vector< Otc::Direction > &path)
void sendRemoveVip(uint playerId)
void processOpenContainer(int containerId, const ItemPtr &containerItem, const std::string &name, int capacity, bool hasParent, const std::vector< ItemPtr > &items, bool isUnlocked, bool hasPages, int containerSize, int firstIndex)
@ GamePlayerRegenerationTime
void sendCloseRuleViolation(const std::string &reporter)
void setChaseMode(Otc::ChaseModes chaseMode)
@ GameContainerPagination
void inspectTrade(bool counterOffer, int index)
void sendRequestQuestLog()
void setName(const std::string &name)
void follow(CreaturePtr creature)
void sendRequestTrade(const Position &pos, int thingId, int stackpos, uint creatureId)
void talkPrivate(Otc::MessageMode mode, const std::string &receiver, const std::string &message)
void sendInviteToParty(uint creatureId)
void processCloseContainer(int containerId)
void forceWalk(Otc::Direction direction)
static void processModalDialog(uint32 id, const std::string &title, const std::string &message, const std::vector< std::tuple< int, std::string > > &buttonList, int enterButton, int escapeButton, const std::vector< std::tuple< int, std::string > > &choiceList, bool priority)
bool getFeature(Otc::GameFeature feature)
void sendAttack(uint creatureId, uint seq)
bool hasElevation(int elevation=1)
void talkChannel(Otc::MessageMode mode, int channelId, const std::string &message)
void sendOpenRuleViolation(const std::string &reporter)
@ GameIngameStoreServiceType
void processConnectionError(const boost::system::error_code &ec)
void sendTalk(Otc::MessageMode mode, int channelId, const std::string &receiver, const std::string &message)
void sendInspectTrade(bool counterOffer, int index)
void openStore(int serviceType=0, const std::string &category="")
void throw_exception(const std::string &what)
Throws a generic exception.
void editVip(int playerId, const std::string &description, int iconId, bool notifyLogin)
void sendEquipItem(int itemId, int countOrSubType)
static void processRuleViolationLock()
void processContainerAddItem(int containerId, const ItemPtr &item, int slot)
void sellItem(const ItemPtr &item, int amount, bool ignoreEquipped)
void sendLook(const Position &position, int thingId, int stackpos)
@ GameOfflineTrainingTime
void excludeFromOwnChannel(const std::string &name)
void processVipAdd(uint id, const std::string &name, uint status, const std::string &description, int iconId, bool notifyLogin)
void sendRevokeInvitation(uint creatureId)
void sendMountStatus(bool mount)
void refreshContainer(const ContainerPtr &container)
void enableFeature(Otc::GameFeature feature)
void partyRevokeInvitation(int creatureId)
static void processOpenPrivateChannel(const std::string &name)
void talk(const std::string &message)
static void processChannelList(const std::vector< std::tuple< int, std::string > > &channelList)
stdext::shared_object_ptr< Container > ContainerPtr
void setOpenPvpSituations(int openPvpSituations)
void changeMapAwareRange(int xrange, int yrange)
void transferCoins(const std::string &recipient, int amount)
static void processRuleViolationRemove(const std::string &name)
@ GameIngameStoreHighlights
std::string formatCreatureName(const std::string &name)
void sendBrowseField(const Position &position)
void sendUseItemWith(const Position &fromPos, int itemId, int fromStackPos, const Position &toPos, int toThingId, int toStackPos)
void sendTransferCoins(const std::string &recipient, int amount)
void sendJoinParty(uint creatureId)
void processContainerUpdateItem(int containerId, int slot, const ItemPtr &item)
void setSafeFight(bool on)
void sendOpenPrivateChannel(const std::string &receiver)
void sendRequestTransactionHistory(int page, int entriesPerPage)
void buyStoreOffer(int offerId, int productType, const std::string &name="")
static void processCounterTrade(const std::string &name, const std::vector< ItemPtr > &items)
void sendEditText(uint id, const std::string &text)
std::tuple< std::string, uint, std::string, int, bool > Vip
void processVipStateChange(uint id, uint status)
void openTransactionHistory(int entriesPerPage)
void reportBug(const std::string &comment)
static void processRuleViolationCancel(const std::string &name)
void changeOutfit(const Outfit &outfit)
void setPosition(const Position &position)
void sendRequestQuestLine(int questId)
stdext::shared_object_ptr< LocalPlayer > LocalPlayerPtr
void removeVip(int playerId)
void sendChangeOutfit(const Outfit &outfit)
ContainerPtr getContainer(int index)
static void processTalk(const std::string &name, int level, Otc::MessageMode mode, const std::string &text, int channelId, const Position &pos)
bool canPerformGameAction()
static void processUpdateNeeded(const std::string &signature)
void cancelAttackAndFollow()
void sendOpenStore(int serviceType, const std::string &category)
void processAttackCancel(uint seq)
void seekInContainer(int cid, int index)
ScheduledEventPtr scheduleEvent(const std::function< void()> &callback, int delay)
void setOutfit(const Outfit &outfit)
void joinChannel(int channelId)
void login(const std::string &accountName, const std::string &accountPassword, const std::string &host, uint16 port, const std::string &characterName, const std::string &authenticatorToken, const std::string &sessionKey)
stdext::shared_object_ptr< ProtocolGame > ProtocolGamePtr
void sendUseItem(const Position &position, int itemId, int stackpos, int index)
void requestTransactionHistory(int page, int entriesPerPage)
void rotate(const ThingPtr &thing)
void editText(uint id, const std::string &text)
void sendRequestChannels()
bool checkBotProtection()
static void processLoginWait(const std::string &message, int time)
void moveToParentContainer(const ThingPtr &thing, int count)
void attack(CreaturePtr creature)
ThingTypeManager g_things
void reportRuleViolation(const std::string &target, int reason, int action, const std::string &comment, const std::string &statement, int statementId, bool ipBanishment)
static void processPlayerHelpers(int helpers)
void useInventoryItemWith(int itemId, const ThingPtr &toThing)
bool walk(Otc::Direction direction)
static void processOwnTrade(const std::string &name, const std::vector< ItemPtr > &items)
void debugReport(const std::string &a, const std::string &b, const std::string &c, const std::string &d)
void autoWalk(std::vector< Otc::Direction > dirs)
static void processOpenNpcTrade(const std::vector< std::tuple< ItemPtr, std::string, int, int, int > > &items)
void cleanDynamicThings()
void addVip(const std::string &name)
void setPendingGame(bool pending)
static void processCloseChannel(int channelId)
void processPlayerModes(Otc::FightModes fightMode, Otc::ChaseModes chaseMode, bool safeMode, Otc::PVPModes pvpMode)
void sendUpContainer(int containerId)
bool isValidDatId(uint16 id, ThingCategory category)
void partyPassLeadership(int creatureId)
void sendRefreshContainer(int containerId)