/* * The ManaPlus Client * Copyright (C) 2004-2009 The Mana World Development Team * Copyright (C) 2009-2010 The Mana Developers * Copyright (C) 2011-2015 The ManaPlus Developers * * This file is part of The ManaPlus Client. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "net/eathena/beinghandler.h" #include "actormanager.h" #include "effectmanager.h" #include "game.h" #include "itemcolormanager.h" #include "notifymanager.h" #include "party.h" #include "being/mercenaryinfo.h" #include "enums/resources/notifytypes.h" #include "particle/particle.h" #include "input/keyboardconfig.h" #include "gui/windows/skilldialog.h" #include "gui/windows/socialwindow.h" #include "gui/windows/outfitwindow.h" #include "net/serverfeatures.h" #include "net/ea/eaprotocol.h" #include "net/charserverhandler.h" #include "net/character.h" #include "net/ea/beingrecv.h" #include "net/eathena/beingrecv.h" #include "net/eathena/maptypeproperty2.h" #include "net/eathena/messageout.h" #include "net/eathena/protocol.h" #include "net/eathena/sprite.h" #include "resources/iteminfo.h" #include "resources/db/itemdb.h" #include "resources/map/map.h" #include "utils/timer.h" #include "debug.h" extern Net::BeingHandler *beingHandler; extern int serverVersion; namespace EAthena { BeingHandler::BeingHandler(const bool enableSync) : MessageHandler(), Ea::BeingHandler(enableSync) { static const uint16_t _messages[] = { SMSG_BEING_VISIBLE, SMSG_BEING_MOVE, SMSG_BEING_MOVE2, SMSG_BEING_REMOVE, SMSG_BEING_REMOVE_SKILL, SMSG_SKILL_DAMAGE, SMSG_BEING_ACTION, SMSG_BEING_ACTION2, SMSG_BEING_SELFEFFECT, SMSG_BEING_SPECIAL_EFFECT, SMSG_BEING_SPECIAL_EFFECT_NUM, SMSG_BEING_SOUND_EFFECT, SMSG_BEING_EMOTION, SMSG_BEING_CHANGE_LOOKS2, SMSG_BEING_CHANGE_LOOKS_CARDS, SMSG_BEING_NAME_RESPONSE, SMSG_BEING_NAME_RESPONSE2, SMSG_PLAYER_GUILD_PARTY_INFO, SMSG_BEING_CHANGE_DIRECTION, SMSG_PLAYER_STOP, SMSG_PLAYER_MOVE_TO_ATTACK, SMSG_PLAYER_STATUS_CHANGE, SMSG_PLAYER_STATUS_CHANGE2, SMSG_PLAYER_STATUS_CHANGE_NO_TICK, SMSG_BEING_STATUS_CHANGE, SMSG_BEING_STATUS_CHANGE2, SMSG_BEING_RESURRECT, SMSG_SOLVE_CHAR_NAME, SMSG_BEING_SPAWN, SMSG_SKILL_CASTING, SMSG_SKILL_CAST_CANCEL, SMSG_SKILL_NO_DAMAGE, SMSG_SKILL_GROUND_NO_DAMAGE, SMSG_SKILL_ENTRY, SMSG_PVP_MAP_MODE, SMSG_PVP_SET, SMSG_MAP_TYPE_PROPERTY2, SMSG_MAP_TYPE, SMSG_MONSTER_HP, SMSG_PLAYER_HP, SMSG_SKILL_AUTO_CAST, SMSG_RANKS_LIST, SMSG_BEING_FAKE_NAME, SMSG_BEING_STAT_UPDATE_1, SMSG_MOB_INFO, SMSG_BEING_MOVE3, SMSG_BEING_ATTRS, SMSG_MONSTER_INFO, SMSG_CLASS_CHANGE, SMSG_SPIRIT_BALLS, SMSG_SPIRIT_BALL_SINGLE, SMSG_BLADE_STOP, SMSG_COMBO_DELAY, SMSG_WEDDING_EFFECT, SMSG_BEING_SLIDE, SMSG_STARS_KILL, SMSG_BLACKSMITH_RANKS_LIST, SMSG_ALCHEMIST_RANKS_LIST, SMSG_TAEKWON_RANKS_LIST, SMSG_PK_RANKS_LIST, SMSG_GLADIATOR_FEEL_REQUEST, SMSG_BOSS_MAP_INFO, SMSG_BEING_FONT, SMSG_BEING_MILLENIUM_SHIELD, SMSG_BEING_CHARM, SMSG_BEING_VIEW_EQUIPMENT, 0 }; handledMessages = _messages; beingHandler = this; } void BeingHandler::requestNameById(const BeingId id) const { createOutPacket(CMSG_NAME_REQUEST); outMsg.writeBeingId(id, "being id"); } void BeingHandler::handleMessage(Net::MessageIn &msg) { switch (msg.getId()) { case SMSG_BEING_VISIBLE: BeingRecv::processBeingVisible(msg); break; case SMSG_BEING_MOVE: BeingRecv::processBeingMove(msg); break; case SMSG_BEING_SPAWN: BeingRecv::processBeingSpawn(msg); break; case SMSG_BEING_MOVE2: BeingRecv::processBeingMove2(msg); break; case SMSG_BEING_REMOVE: Ea::BeingRecv::processBeingRemove(msg); break; case SMSG_BEING_REMOVE_SKILL: BeingRecv::processBeingRemoveSkil(msg); break; case SMSG_BEING_RESURRECT: BeingRecv::processBeingResurrect(msg); break; case SMSG_SKILL_DAMAGE: Ea::BeingRecv::processSkillDamage(msg); break; case SMSG_SKILL_AUTO_CAST: BeingRecv::processSkillAutoCast(msg); break; case SMSG_BEING_ACTION: Ea::BeingRecv::processBeingAction(msg); break; case SMSG_BEING_ACTION2: BeingRecv::processBeingAction2(msg); break; case SMSG_BEING_SELFEFFECT: BeingRecv::processBeingSelfEffect(msg); break; case SMSG_BEING_SPECIAL_EFFECT: BeingRecv::processBeingSpecialEffect(msg); break; case SMSG_BEING_SPECIAL_EFFECT_NUM: BeingRecv::processBeingSpecialEffectNum(msg); break; case SMSG_BEING_SOUND_EFFECT: BeingRecv::processBeingSoundEffect(msg); break; case SMSG_BEING_EMOTION: Ea::BeingRecv::processBeingEmotion(msg); break; case SMSG_BEING_CHANGE_LOOKS2: BeingRecv::processBeingChangeLook2(msg); break; case SMSG_BEING_CHANGE_LOOKS_CARDS: BeingRecv::processBeingChangeLookCards(msg); break; case SMSG_BEING_NAME_RESPONSE: Ea::BeingRecv::processNameResponse(msg); break; case SMSG_BEING_NAME_RESPONSE2: BeingRecv::processNameResponse2(msg); break; case SMSG_SOLVE_CHAR_NAME: break; case SMSG_PLAYER_GUILD_PARTY_INFO: BeingRecv::processPlayerGuilPartyInfo(msg); break; case SMSG_BEING_CHANGE_DIRECTION: BeingRecv::processBeingChangeDirection(msg); break; case SMSG_PLAYER_STOP: Ea::BeingRecv::processPlayerStop(msg); break; case SMSG_PLAYER_MOVE_TO_ATTACK: Ea::BeingRecv::processPlayerMoveToAttack(msg); break; case SMSG_PLAYER_STATUS_CHANGE: BeingRecv::processPlaterStatusChange(msg); break; case SMSG_PLAYER_STATUS_CHANGE2: BeingRecv::processPlaterStatusChange2(msg); break; case SMSG_PLAYER_STATUS_CHANGE_NO_TICK: BeingRecv::processPlaterStatusChangeNoTick(msg); break; case SMSG_BEING_STATUS_CHANGE: BeingRecv::processBeingStatusChange(msg); break; case SMSG_BEING_STATUS_CHANGE2: BeingRecv::processBeingStatusChange2(msg); break; case SMSG_SKILL_CASTING: BeingRecv::processSkillCasting(msg); break; case SMSG_SKILL_CAST_CANCEL: msg.readInt32("id?"); break; case SMSG_SKILL_NO_DAMAGE: Ea::BeingRecv::processSkillNoDamage(msg); break; case SMSG_SKILL_GROUND_NO_DAMAGE: BeingRecv::processSkillGroundNoDamage(msg); break; case SMSG_SKILL_ENTRY: BeingRecv::processSkillEntry(msg); break; case SMSG_PVP_MAP_MODE: Ea::BeingRecv::processPvpMapMode(msg); break; case SMSG_PVP_SET: BeingRecv::processPvpSet(msg); break; case SMSG_MAP_TYPE_PROPERTY2: BeingRecv::processMapTypeProperty(msg); break; case SMSG_MAP_TYPE: BeingRecv::processMapType(msg); break; case SMSG_MONSTER_HP: case SMSG_PLAYER_HP: BeingRecv::processMonsterHp(msg); break; case SMSG_RANKS_LIST: BeingRecv::processRanksList(msg); break; case SMSG_BEING_FAKE_NAME: BeingRecv::processBeingFakeName(msg); break; case SMSG_BEING_STAT_UPDATE_1: BeingRecv::processBeingStatUpdate1(msg); break; case SMSG_MOB_INFO: BeingRecv::processMobInfo(msg); break; case SMSG_BEING_MOVE3: Ea::BeingRecv::processBeingMove3(msg); break; case SMSG_BEING_ATTRS: BeingRecv::processBeingAttrs(msg); break; case SMSG_MONSTER_INFO: BeingRecv::processMonsterInfo(msg); break; case SMSG_CLASS_CHANGE: BeingRecv::processClassChange(msg); break; case SMSG_SPIRIT_BALLS: BeingRecv::processSpiritBalls(msg); break; case SMSG_SPIRIT_BALL_SINGLE: BeingRecv::processSpiritBallSingle(msg); break; case SMSG_BLADE_STOP: BeingRecv::processBladeStop(msg); break; case SMSG_COMBO_DELAY: BeingRecv::processComboDelay(msg); break; case SMSG_WEDDING_EFFECT: BeingRecv::processWddingEffect(msg); break; case SMSG_BEING_SLIDE: BeingRecv::processBeingSlide(msg); break; case SMSG_STARS_KILL: BeingRecv::processStarsKill(msg); break; case SMSG_BLACKSMITH_RANKS_LIST: BeingRecv::processBlacksmithRanksList(msg); break; case SMSG_ALCHEMIST_RANKS_LIST: BeingRecv::processAlchemistRanksList(msg); break; case SMSG_TAEKWON_RANKS_LIST: BeingRecv::processTaekwonRanksList(msg); break; case SMSG_PK_RANKS_LIST: BeingRecv::processPkRanksList(msg); break; case SMSG_GLADIATOR_FEEL_REQUEST: BeingRecv::processGladiatorFeelRequest(msg); break; case SMSG_BOSS_MAP_INFO: BeingRecv::processBossMapInfo(msg); break; case SMSG_BEING_FONT: BeingRecv::processBeingFont(msg); break; case SMSG_BEING_MILLENIUM_SHIELD: BeingRecv::processBeingMilleniumShield(msg); break; case SMSG_BEING_CHARM: BeingRecv::processBeingCharm(msg); break; case SMSG_BEING_VIEW_EQUIPMENT: BeingRecv::processBeingViewEquipment(msg); break; default: break; } } void BeingHandler::undress(Being *const being) const { if (!being) return; being->setSprite(SPRITE_WEAPON, 0); being->setSprite(SPRITE_HEAD_BOTTOM, 0); being->setSprite(SPRITE_CLOTHES_COLOR, 0); being->setSprite(SPRITE_HAIR, 0); being->setSprite(SPRITE_SHOES, 0); // being->setSprite(SPRITE_BODY, 0, "", true); } void BeingHandler::requestRanks(const RankT rank) const { createOutPacket(CMSG_REQUEST_RANKS); outMsg.writeInt16(static_cast(rank), "type"); } void BeingHandler::viewPlayerEquipment(const Being *const being) { if (!being) return; createOutPacket(CMSG_PLAYER_VIEW_EQUIPMENT); outMsg.writeBeingId(being->getId(), "account id"); } } // namespace EAthena