forked from mirror/openmw-tes3mp
Add preliminary implementation of PayFine, PayFineThief and GoToJail instructions
This commit is contained in:
parent
baf55df7a1
commit
6f9113fe88
10 changed files with 65 additions and 14 deletions
|
@ -431,11 +431,10 @@ namespace MWBase
|
|||
|
||||
virtual bool findInteriorPositionInWorldSpace(MWWorld::CellStore* cell, Ogre::Vector3& result) = 0;
|
||||
|
||||
/// Teleports \a ptr to the reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker)
|
||||
/// closest to \a worldPos.
|
||||
/// Teleports \a ptr to the closest reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker)
|
||||
/// @note id must be lower case
|
||||
virtual void teleportToClosestMarker (const MWWorld::Ptr& ptr,
|
||||
const std::string& id, Ogre::Vector3 worldPos) = 0;
|
||||
const std::string& id) = 0;
|
||||
|
||||
enum DetectionType
|
||||
{
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace MWGui
|
|||
|
||||
MessageBoxManager::MessageBoxManager ()
|
||||
{
|
||||
// TODO: fMessageTimePerChar
|
||||
mMessageBoxSpeed = 0.1;
|
||||
mInterMessageBoxe = NULL;
|
||||
mStaticMessageBox = NULL;
|
||||
|
|
|
@ -287,17 +287,13 @@ namespace MWMechanics
|
|||
if (!MWBase::Environment::get().getWorld()->isTeleportingEnabled())
|
||||
return;
|
||||
|
||||
Ogre::Vector3 worldPos;
|
||||
if (!MWBase::Environment::get().getWorld()->findInteriorPositionInWorldSpace(target.getCell(), worldPos))
|
||||
worldPos = MWBase::Environment::get().getWorld()->getPlayer().getLastKnownExteriorPosition();
|
||||
|
||||
if (effectId == ESM::MagicEffect::DivineIntervention)
|
||||
{
|
||||
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "divinemarker", worldPos);
|
||||
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "divinemarker");
|
||||
}
|
||||
else if (effectId == ESM::MagicEffect::AlmsiviIntervention)
|
||||
{
|
||||
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "templemarker", worldPos);
|
||||
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "templemarker");
|
||||
}
|
||||
|
||||
else if (effectId == ESM::MagicEffect::Mark)
|
||||
|
|
|
@ -228,6 +228,7 @@ namespace MWRender
|
|||
|
||||
void Camera::setSneakOffset()
|
||||
{
|
||||
// TODO: iFirstPersonSneakDelta
|
||||
if(mAnimation)
|
||||
mAnimation->addFirstPersonOffset(Ogre::Vector3(0.f, 0.f, -9.8f));
|
||||
}
|
||||
|
|
|
@ -372,5 +372,8 @@ op 0x2000231: GetSpellReadied
|
|||
op 0x2000232: GetSpellReadied, explicit
|
||||
op 0x2000233: GetPcJumping
|
||||
op 0x2000234: ShowRestMenu, explicit
|
||||
opcodes 0x2000235-0x3ffffff unused
|
||||
op 0x2000235: GoToJail
|
||||
op 0x2000236: PayFine
|
||||
op 0x2000237: PayFineThief
|
||||
opcodes 0x2000238-0x3ffffff unused
|
||||
|
||||
|
|
|
@ -762,6 +762,43 @@ namespace MWScript
|
|||
}
|
||||
};
|
||||
|
||||
class OpGoToJail : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
MWWorld::Ptr player = world->getPlayerPtr();
|
||||
world->teleportToClosestMarker(player, "prisonmarker");
|
||||
player.getClass().getNpcStats(player).setBounty(0);
|
||||
// TODO: pass time, change skills, show messagebox
|
||||
// TODO: move stolen items to closest evidence chest
|
||||
// iDaysinPrisonMod
|
||||
}
|
||||
};
|
||||
|
||||
class OpPayFine : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
virtual void execute(Interpreter::Runtime &runtime)
|
||||
{
|
||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
player.getClass().getNpcStats(player).setBounty(0);
|
||||
|
||||
// TODO: move stolen items to closest evidence chest
|
||||
}
|
||||
};
|
||||
|
||||
class OpPayFineThief : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
virtual void execute(Interpreter::Runtime &runtime)
|
||||
{
|
||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
player.getClass().getNpcStats(player).setBounty(0);
|
||||
}
|
||||
};
|
||||
|
||||
void installOpcodes (Interpreter::Interpreter& interpreter)
|
||||
{
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeXBox, new OpXBox);
|
||||
|
@ -785,6 +822,9 @@ namespace MWScript
|
|||
interpreter.installSegment5 (Compiler::Misc::opcodeGetPcJumping, new OpGetPcJumping);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeWakeUpPc, new OpWakeUpPc);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodePlayBink, new OpPlayBink);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodePayFine, new OpPayFine);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodePayFineThief, new OpPayFineThief);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGoToJail, new OpGoToJail);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGetLocked, new OpGetLocked<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGetLockedExplicit, new OpGetLocked<ExplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGetEffect, new OpGetEffect<ImplicitRef>);
|
||||
|
|
|
@ -2273,6 +2273,8 @@ namespace MWWorld
|
|||
|
||||
bool World::findInteriorPositionInWorldSpace(MWWorld::CellStore* cell, Ogre::Vector3& result)
|
||||
{
|
||||
if (cell->isExterior())
|
||||
return false;
|
||||
MWWorld::CellRefList<ESM::Door>& doors = cell->mDoors;
|
||||
CellRefList<ESM::Door>::List& refList = doors.mList;
|
||||
|
||||
|
@ -2293,8 +2295,12 @@ namespace MWWorld
|
|||
}
|
||||
|
||||
void World::teleportToClosestMarker (const MWWorld::Ptr& ptr,
|
||||
const std::string& id, Ogre::Vector3 worldPos)
|
||||
const std::string& id)
|
||||
{
|
||||
Ogre::Vector3 worldPos;
|
||||
if (!findInteriorPositionInWorldSpace(ptr.getCell(), worldPos))
|
||||
worldPos = mPlayer->getLastKnownExteriorPosition();
|
||||
|
||||
MWWorld::Ptr closestMarker;
|
||||
float closestDistance = FLT_MAX;
|
||||
|
||||
|
|
|
@ -522,11 +522,10 @@ namespace MWWorld
|
|||
|
||||
virtual bool findInteriorPositionInWorldSpace(MWWorld::CellStore* cell, Ogre::Vector3& result);
|
||||
|
||||
/// Teleports \a ptr to the reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker)
|
||||
/// closest to \a worldPos.
|
||||
/// Teleports \a ptr to the closest reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker)
|
||||
/// @note id must be lower case
|
||||
virtual void teleportToClosestMarker (const MWWorld::Ptr& ptr,
|
||||
const std::string& id, Ogre::Vector3 worldPos);
|
||||
const std::string& id);
|
||||
|
||||
/// List all references (filtered by \a type) detected by \a ptr. The range
|
||||
/// is determined by the current magnitude of the "Detect X" magic effect belonging to \a type.
|
||||
|
|
|
@ -244,6 +244,9 @@ namespace Compiler
|
|||
extensions.registerFunction ("getpcjumping", 'l', "", opcodeGetPcJumping);
|
||||
extensions.registerInstruction ("wakeuppc", "", opcodeWakeUpPc);
|
||||
extensions.registerInstruction ("playbink", "Sl", opcodePlayBink);
|
||||
extensions.registerInstruction ("payfine", "", opcodePayFine);
|
||||
extensions.registerInstruction ("payfinethief", "", opcodePayFineThief);
|
||||
extensions.registerInstruction ("gotojail", "", opcodeGoToJail);
|
||||
extensions.registerFunction ("getlocked", 'l', "", opcodeGetLocked, opcodeGetLockedExplicit);
|
||||
extensions.registerFunction ("geteffect", 'l', "S", opcodeGetEffect, opcodeGetEffectExplicit);
|
||||
extensions.registerInstruction ("addsoulgem", "cc", opcodeAddSoulGem, opcodeAddSoulGemExplicit);
|
||||
|
|
|
@ -223,6 +223,9 @@ namespace Compiler
|
|||
const int opcodeGetStandingActorExplicit = 0x200020f;
|
||||
const int opcodeGetWindSpeed = 0x2000212;
|
||||
const int opcodePlayBink = 0x20001f7;
|
||||
const int opcodeGoToJail = 0x2000235;
|
||||
const int opcodePayFine = 0x2000236;
|
||||
const int opcodePayFineThief = 0x2000237;
|
||||
const int opcodeHitOnMe = 0x2000213;
|
||||
const int opcodeHitOnMeExplicit = 0x2000214;
|
||||
const int opcodeDisableTeleporting = 0x2000215;
|
||||
|
|
Loading…
Reference in a new issue