summaryrefslogtreecommitdiff
path: root/src/game-server/npc.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2013-04-15 22:15:31 +0200
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2013-04-15 22:15:31 +0200
commitc53bc90dbaa876a86f762a3d864b1f920e2b8071 (patch)
tree1a8174f4d1745a4799210db970aa2230df622d34 /src/game-server/npc.cpp
parentb89e404f85358f2e3ff87d7731376dbeacdf9778 (diff)
parent81be8dc99ba7558c8915310eed095df43e3bdbf7 (diff)
downloadmanaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.gz
manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.bz2
manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.tar.xz
manaserv-c53bc90dbaa876a86f762a3d864b1f920e2b8071.zip
Merge branch 'master' into lpc2012
Conflicts: src/account-server/accounthandler.cpp src/game-server/character.cpp
Diffstat (limited to 'src/game-server/npc.cpp')
-rw-r--r--src/game-server/npc.cpp128
1 files changed, 57 insertions, 71 deletions
diff --git a/src/game-server/npc.cpp b/src/game-server/npc.cpp
index 2eb73031..980358da 100644
--- a/src/game-server/npc.cpp
+++ b/src/game-server/npc.cpp
@@ -1,6 +1,7 @@
/*
* The Mana Server
* Copyright (C) 2007-2010 The Mana World Development Team
+ * Copyright (C) 2012 The Mana Developers
*
* This file is part of The Mana Server.
*
@@ -18,127 +19,112 @@
* along with The Mana Server. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "game-server/npc.h"
+
#include "game-server/character.h"
#include "game-server/gamehandler.h"
#include "game-server/map.h"
-#include "game-server/npc.h"
#include "net/messageout.h"
#include "scripting/script.h"
#include "scripting/scriptmanager.h"
-NPC::NPC(const std::string &name, int id):
- Being(OBJECT_NPC),
- mID(id),
+NpcComponent::NpcComponent(int npcId):
+ mNpcId(npcId),
mEnabled(true)
{
- setWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_MONSTER |
- Map::BLOCKMASK_CHARACTER);
- setName(name);
}
-NPC::~NPC()
+NpcComponent::~NpcComponent()
{
Script *script = ScriptManager::currentState();
script->unref(mTalkCallback);
script->unref(mUpdateCallback);
}
-void NPC::setEnabled(bool enabled)
+void NpcComponent::setEnabled(bool enabled)
{
mEnabled = enabled;
}
-void NPC::update()
+void NpcComponent::update(Entity &entity)
{
if (!mEnabled || !mUpdateCallback.isValid())
return;
Script *script = ScriptManager::currentState();
script->prepare(mUpdateCallback);
- script->push(this);
- script->execute(getMap());
+ script->push(&entity);
+ script->execute(entity.getMap());
}
-void NPC::prompt(Character *ch, bool restart)
+void NpcComponent::setTalkCallback(Script::Ref function)
{
- if (!mEnabled || !mTalkCallback.isValid())
- return;
+ ScriptManager::currentState()->unref(mTalkCallback);
+ mTalkCallback = function;
+}
- Script *script = ScriptManager::currentState();
+void NpcComponent::setUpdateCallback(Script::Ref function)
+{
+ ScriptManager::currentState()->unref(mUpdateCallback);
+ mUpdateCallback = function;
+}
- if (restart)
- {
- Script::Thread *thread = script->newThread();
- thread->getContext().map = getMap();
- script->prepare(mTalkCallback);
- script->push(this);
- script->push(ch);
- ch->startNpcThread(thread, getPublicID());
- }
- else
- {
- Script::Thread *thread = ch->getNpcThread();
- if (!thread || thread->mState != Script::ThreadPaused)
- return;
- script->prepareResume(thread);
- ch->resumeNpcThread();
- }
-}
-void NPC::select(Character *ch, int index)
+static Script *prepareResume(Entity *ch, Script::ThreadState expectedState)
{
- if (!mEnabled)
- return;
-
- Script::Thread *thread = ch->getNpcThread();
- if (!thread || thread->mState != Script::ThreadExpectingNumber)
- return;
+ Script::Thread *thread =
+ ch->getComponent<CharacterComponent>()->getNpcThread();
+ if (!thread || thread->mState != expectedState)
+ return 0;
Script *script = ScriptManager::currentState();
script->prepareResume(thread);
- script->push(index);
- ch->resumeNpcThread();
+ return script;
}
-void NPC::integerReceived(Character *ch, int value)
+void Npc::start(Entity *npc, Entity *ch)
{
- if (!mEnabled)
- return;
-
- Script::Thread *thread = ch->getNpcThread();
- if (!thread || thread->mState != Script::ThreadExpectingNumber)
- return;
+ NpcComponent *npcComponent = npc->getComponent<NpcComponent>();
Script *script = ScriptManager::currentState();
- script->prepareResume(thread);
- script->push(value);
- ch->resumeNpcThread();
+ Script::Ref talkCallback = npcComponent->getTalkCallback();
+
+ if (npcComponent->isEnabled() && talkCallback.isValid())
+ {
+ Script::Thread *thread = script->newThread();
+ thread->getContext().map = npc->getMap();
+ thread->getContext().npc = npc;
+ thread->getContext().character = ch;
+ script->prepare(talkCallback);
+ script->push(npc);
+ script->push(ch);
+ auto *actorComponent = npc->getComponent<ActorComponent>();
+ ch->getComponent<CharacterComponent>()->startNpcThread(
+ thread, actorComponent->getPublicID());
+ }
}
-void NPC::stringReceived(Character *ch, const std::string &value)
+void Npc::resume(Entity *ch)
{
- if (!mEnabled)
- return;
-
- Script::Thread *thread = ch->getNpcThread();
- if (!thread || thread->mState != Script::ThreadExpectingString)
- return;
-
- Script *script = ScriptManager::currentState();
- script->prepareResume(thread);
- script->push(value);
- ch->resumeNpcThread();
+ if (prepareResume(ch, Script::ThreadPaused))
+ ch->getComponent<CharacterComponent>()->resumeNpcThread();
}
-void NPC::setTalkCallback(Script::Ref function)
+void Npc::integerReceived(Entity *ch, int value)
{
- ScriptManager::currentState()->unref(mTalkCallback);
- mTalkCallback = function;
+ if (Script *script = prepareResume(ch, Script::ThreadExpectingNumber))
+ {
+ script->push(value);
+ ch->getComponent<CharacterComponent>()->resumeNpcThread();
+ }
}
-void NPC::setUpdateCallback(Script::Ref function)
+void Npc::stringReceived(Entity *ch, const std::string &value)
{
- ScriptManager::currentState()->unref(mUpdateCallback);
- mUpdateCallback = function;
+ if (Script *script = prepareResume(ch, Script::ThreadExpectingString))
+ {
+ script->push(value);
+ ch->getComponent<CharacterComponent>()->resumeNpcThread();
+ }
}