summaryrefslogtreecommitdiff
path: root/src/game-server/charactercomponent.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/charactercomponent.h')
-rw-r--r--src/game-server/charactercomponent.h382
1 files changed, 382 insertions, 0 deletions
diff --git a/src/game-server/charactercomponent.h b/src/game-server/charactercomponent.h
new file mode 100644
index 00000000..57e9d44c
--- /dev/null
+++ b/src/game-server/charactercomponent.h
@@ -0,0 +1,382 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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.
+ *
+ * The Mana Server 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 The Mana Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CHARACTER_H
+#define CHARACTER_H
+
+#include "common/defines.h"
+#include "common/inventorydata.h"
+#include "common/manaserv_protocol.h"
+
+#include "game-server/abilitycomponent.h"
+#include "game-server/being.h"
+#include "game-server/mapcomposite.h"
+#include "game-server/mapmanager.h"
+#include "game-server/abilitymanager.h"
+
+#include "scripting/script.h"
+
+#include "utils/logger.h"
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+class BuySell;
+class GameClient;
+class MessageIn;
+class MessageOut;
+class Point;
+class Trade;
+
+/**
+ * The representation of a player's character in the game world.
+ */
+class CharacterComponent : public Component
+{
+ public:
+ static const ComponentType type = CT_Character;
+
+ /**
+ * Utility constructor for creating a Character from a received
+ * characterdata message.
+ */
+ CharacterComponent(Entity &entity, MessageIn &msg);
+
+ ~CharacterComponent();
+
+ /**
+ * calls Being::update and handles special recharges and status effects
+ */
+ void update(Entity &entity);
+
+ /**
+ * Executes the global die script
+ */
+ virtual void characterDied(Entity *);
+
+ /**
+ * makes the character respawn
+ */
+ void respawn(Entity &entity);
+
+ /**
+ * Gets client computer.
+ */
+ GameClient *getClient() const
+ { return mClient; }
+
+ /**
+ * Sets client computer.
+ */
+ void setClient(GameClient *c)
+ { mClient = c; }
+
+ /**
+ * Gets a reference to the possessions.
+ */
+ const Possessions &getPossessions() const
+ { return mPossessions; }
+
+ /**
+ * Gets a reference to the possessions.
+ */
+ Possessions &getPossessions()
+ { return mPossessions; }
+
+ /**
+ * Gets the Trade object the character is involved in.
+ */
+ Trade *getTrading() const;
+
+ /**
+ * Sets the Trade object the character is involved in.
+ * Cancels other transactions.
+ */
+ void setTrading(Trade *t);
+
+ /**
+ * Gets the BuySell object the character is involved in.
+ */
+ BuySell *getBuySell() const;
+
+ /**
+ * Sets the trade object the character is involved in.
+ * Cancels other transactions.
+ */
+ void setBuySell(BuySell *t);
+
+ /**
+ * Cancels current transaction.
+ */
+ void cancelTransaction();
+
+ /**
+ * Gets transaction status of the character.
+ */
+ bool isBusy() const
+ { return mTransaction != TRANS_NONE; }
+
+ /*
+ * Character data:
+ * Get and set methods
+ * Most of this should be accessed directly as a friend
+ */
+
+ int getDatabaseID() const { return mDatabaseID; }
+ void setDatabaseID(int id) { mDatabaseID = id; }
+
+ int getHairStyle() const { return mHairStyle; }
+ void setHairStyle(int style) { mHairStyle = style; }
+
+ int getHairColor() const { return mHairColor; }
+ void setHairColor(int color) { mHairColor = color; }
+
+ int getAccountLevel() const { return mAccountLevel; }
+ void setAccountLevel(int l) { mAccountLevel = l; }
+
+ /** Gets the party id of the character */
+ int getParty() const
+ { return mParty; }
+
+ /** Sets the party id of the character */
+ void setParty(int party)
+ { mParty = party; }
+
+ /**
+ * Sends a message that informs the client about attribute
+ * modified since last call.
+ */
+ void sendStatus(Entity &entity);
+
+ /**
+ * Marks all attributes as being modified.
+ */
+ void modifiedAllAttributes(Entity &entity);
+
+ /**
+ * Signal handler for attribute changed event
+ * Flags the attribute as modified.
+ * @param being th being of which the attribute was changed
+ * @param attributeId the changed id
+ */
+ void attributeChanged(Entity *being, AttributeInfo *);
+
+ /**
+ * Calls all the "disconnected" listener.
+ */
+ void disconnected(Entity &entity);
+
+ /**
+ * Associative array containing all the quest variables known by the
+ * server.
+ */
+ std::map< std::string, std::string > questCache;
+
+ /**
+ * Used to serialize kill count.
+ */
+ int getKillCountSize() const
+ { return mKillCount.size(); }
+
+ const std::map<int, int>::const_iterator getKillCountBegin() const
+ { return mKillCount.begin(); }
+
+ const std::map<int, int>::const_iterator getKillCountEnd() const
+ { return mKillCount.end(); }
+
+ void setKillCount(int monsterId, int kills)
+ { mKillCount[monsterId] = kills; }
+
+ /**
+ * Adds one kill of the monster type to the characters kill count.
+ */
+ void incrementKillCount(int monsterType);
+
+ /**
+ * Gets the number of monsters the character killed of a given type.
+ */
+ int getKillCount(int monsterType) const;
+
+ /**
+ * Tries to use a character point to increase a
+ * basic attribute
+ */
+ AttribmodResponseCode useCharacterPoint(Entity &entity,
+ AttributeInfo *);
+
+ /**
+ * Tries to use a correction point to reduce a
+ * basic attribute and regain a character point
+ */
+ AttribmodResponseCode useCorrectionPoint(Entity &entity,
+ AttributeInfo *);
+
+ void setAttributePoints(int points);
+ int getAttributePoints() const;
+
+ void setCorrectionPoints(int points);
+ int getCorrectionPoints() const;
+
+
+ /**
+ * Starts the given NPC thread.
+ *
+ * Should be called immediately after creating the thread and pushing
+ * the NPC function and its parameters.
+ */
+ void startNpcThread(Script::Thread *thread, int npcId);
+
+ /**
+ * Resumes the given NPC thread of this character and sends the NPC
+ * close message to the player when the script is done.
+ *
+ * Should be called after preparing the current Script instance for
+ * resuming the thread and pushing the parameters the script expects.
+ */
+ void resumeNpcThread();
+
+ /**
+ * Returns the NPC thread in use by this character, if any.
+ */
+ Script::Thread *getNpcThread() const
+ { return mNpcThread; }
+
+ /** Makes it impossible to chat for a while */
+ void mute(int seconds)
+ { mMuteTimeout.set(seconds * 10); }
+
+ bool isMuted() const
+ { return !mMuteTimeout.expired(); }
+
+ bool isConnected() const
+ { return mConnected; }
+
+ static void setDeathCallback(Script *script)
+ { script->assignCallback(mDeathCallback); }
+
+ static void setDeathAcceptedCallback(Script *script)
+ { script->assignCallback(mDeathAcceptedCallback); }
+
+ static void setLoginCallback(Script *script)
+ { script->assignCallback(mLoginCallback); }
+
+ void triggerLoginCallback(Entity &entity);
+
+ sigc::signal<void, Entity &> signal_disconnected;
+
+ void serialize(Entity &entity, MessageOut &msg);
+
+ private:
+ void deserialize(Entity &entity, MessageIn &msg);
+
+ double getAttrBase(AttributeMap::const_iterator it) const
+ { return it->second.getBase(); }
+ double getAttrMod(AttributeMap::const_iterator it) const
+ { return it->second.getModifiedAttribute(); }
+
+ CharacterComponent(const CharacterComponent &);
+ CharacterComponent &operator=(const CharacterComponent &);
+
+ void abilityStatusChanged(int id);
+ void abilityCooldownActivated();
+
+ void sendAbilityUpdate(Entity &entity);
+ void sendAbilityCooldownUpdate(Entity &entity);
+ void sendAttributePointsStatus(Entity &entity);
+
+ enum TransactionType
+ { TRANS_NONE, TRANS_TRADE, TRANS_BUYSELL };
+
+ GameClient *mClient; /**< Client computer. */
+
+ /**
+ * Tells whether the character client is connected.
+ * Useful when dealing with enqueued events.
+ */
+ bool mConnected;
+
+ /** Handler of the transaction the character is involved in. */
+ void *mTransactionHandler;
+
+ Possessions mPossessions; /**< Possesssions of the character. */
+
+ /** Attributes modified since last update. */
+ std::set<AttributeInfo *> mModifiedAttributes;
+
+ std::set<unsigned> mModifiedAbilities;
+
+ int mDatabaseID; /**< Character's database ID. */
+ unsigned char mHairStyle; /**< Hair Style of the character. */
+ unsigned char mHairColor; /**< Hair Color of the character. */
+
+ bool mSendAttributePointsStatus;
+ int mAttributePoints; /**< Unused attribute points that can be distributed */
+ int mCorrectionPoints; /**< Unused attribute correction points */
+
+ bool mSendAbilityCooldown;
+ unsigned char mAccountLevel; /**< Account level of the user. */
+ int mParty; /**< Party id of the character */
+ TransactionType mTransaction; /**< Trade/buy/sell action the character is involved in. */
+ std::map<int, int> mKillCount; /**< How many monsters the character has slain of each type */
+
+ int mTalkNpcId; /**< Public ID of NPC the character is talking to, if any */
+ Script::Thread *mNpcThread; /**< Script thread executing NPC interaction, if any */
+
+ Timeout mMuteTimeout; /**< Time until the character is no longer muted */
+
+ Entity *mBaseEntity; /**< The entity this component is part of
+ this is ONLY required to allow using
+ the serialization routine without many
+ changes (we cannot pass the entity as
+ argument there). DO NOT USE THIS IF IT
+ IS AVOIDABLE in order to allow
+ refactoring this easier later! */
+
+ static Script::Ref mDeathCallback;
+ static Script::Ref mDeathAcceptedCallback;
+ static Script::Ref mLoginCallback;
+};
+
+
+inline void CharacterComponent::setAttributePoints(int points)
+{
+ mSendAttributePointsStatus = true;
+ mAttributePoints = points;
+}
+
+inline int CharacterComponent::getAttributePoints() const
+{
+ return mAttributePoints;
+}
+
+inline void CharacterComponent::setCorrectionPoints(int points)
+{
+ mSendAttributePointsStatus = true;
+ mCorrectionPoints = points;
+}
+
+inline int CharacterComponent::getCorrectionPoints() const
+{
+ return mCorrectionPoints;
+}
+
+#endif // CHARACTER_H