You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
12 KiB
C++
276 lines
12 KiB
C++
#include "controlextensions.hpp"
|
|
|
|
#include <components/compiler/opcodes.hpp>
|
|
|
|
#include <components/interpreter/interpreter.hpp>
|
|
#include <components/interpreter/runtime.hpp>
|
|
#include <components/interpreter/opcodes.hpp>
|
|
|
|
/*
|
|
Start of tes3mp addition
|
|
|
|
Include additional headers for multiplayer purposes
|
|
*/
|
|
#include "../mwmp/Main.hpp"
|
|
#include "../mwmp/LocalPlayer.hpp"
|
|
/*
|
|
End of tes3mp addition
|
|
*/
|
|
|
|
#include "../mwbase/environment.hpp"
|
|
#include "../mwbase/inputmanager.hpp"
|
|
#include "../mwbase/mechanicsmanager.hpp"
|
|
#include "../mwbase/world.hpp"
|
|
|
|
#include "../mwworld/class.hpp"
|
|
#include "../mwworld/ptr.hpp"
|
|
|
|
#include "interpretercontext.hpp"
|
|
#include "ref.hpp"
|
|
|
|
namespace MWScript
|
|
{
|
|
namespace Control
|
|
{
|
|
class OpSetControl : public Interpreter::Opcode0
|
|
{
|
|
std::string mControl;
|
|
bool mEnable;
|
|
|
|
public:
|
|
|
|
OpSetControl (const std::string& control, bool enable)
|
|
: mControl (control), mEnable (enable)
|
|
{}
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWBase::Environment::get()
|
|
.getInputManager()
|
|
->toggleControlSwitch(mControl, mEnable);
|
|
}
|
|
};
|
|
|
|
class OpGetDisabled : public Interpreter::Opcode0
|
|
{
|
|
std::string mControl;
|
|
|
|
public:
|
|
|
|
OpGetDisabled (const std::string& control)
|
|
: mControl (control)
|
|
{}
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
runtime.push(!MWBase::Environment::get().getInputManager()->getControlSwitch (mControl));
|
|
}
|
|
};
|
|
|
|
class OpToggleCollision : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
bool enabled = MWBase::Environment::get().getWorld()->toggleCollisionMode();
|
|
|
|
/*
|
|
Start of tes3mp addition
|
|
|
|
Update the LocalPlayer's tclState so it gets sent to the server
|
|
*/
|
|
mwmp::Main::get().getLocalPlayer()->hasTcl = !enabled;
|
|
/*
|
|
End of tes3mp addition
|
|
*/
|
|
|
|
runtime.getContext().report (enabled ? "Collision -> On" : "Collision -> Off");
|
|
}
|
|
};
|
|
|
|
template<class R>
|
|
class OpClearMovementFlag : public Interpreter::Opcode0
|
|
{
|
|
MWMechanics::CreatureStats::Flag mFlag;
|
|
|
|
public:
|
|
|
|
OpClearMovementFlag (MWMechanics::CreatureStats::Flag flag) : mFlag (flag) {}
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
ptr.getClass().getCreatureStats(ptr).setMovementFlag (mFlag, false);
|
|
}
|
|
};
|
|
|
|
template<class R>
|
|
class OpSetMovementFlag : public Interpreter::Opcode0
|
|
{
|
|
MWMechanics::CreatureStats::Flag mFlag;
|
|
|
|
public:
|
|
|
|
OpSetMovementFlag (MWMechanics::CreatureStats::Flag flag) : mFlag (flag) {}
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
ptr.getClass().getCreatureStats(ptr).setMovementFlag (mFlag, true);
|
|
}
|
|
};
|
|
|
|
template <class R>
|
|
class OpGetForceRun : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr);
|
|
runtime.push (stats.getMovementFlag (MWMechanics::CreatureStats::Flag_ForceRun));
|
|
}
|
|
};
|
|
|
|
template <class R>
|
|
class OpGetForceJump : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr);
|
|
runtime.push (stats.getMovementFlag (MWMechanics::CreatureStats::Flag_ForceJump));
|
|
}
|
|
};
|
|
|
|
template <class R>
|
|
class OpGetForceMoveJump : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr);
|
|
runtime.push (stats.getMovementFlag (MWMechanics::CreatureStats::Flag_ForceMoveJump));
|
|
}
|
|
};
|
|
|
|
template <class R>
|
|
class OpGetForceSneak : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = R()(runtime);
|
|
|
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
|
runtime.push (stats.getMovementFlag (MWMechanics::CreatureStats::Flag_ForceSneak));
|
|
}
|
|
};
|
|
|
|
class OpGetPcRunning : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
|
MWBase::World* world = MWBase::Environment::get().getWorld();
|
|
|
|
bool stanceOn = stats.getStance(MWMechanics::CreatureStats::Stance_Run);
|
|
bool running = MWBase::Environment::get().getMechanicsManager()->isRunning(ptr);
|
|
bool inair = !world->isOnGround(ptr) && !world->isSwimming(ptr) && !world->isFlying(ptr);
|
|
|
|
runtime.push(stanceOn && (running || inair));
|
|
}
|
|
};
|
|
|
|
class OpGetPcSneaking : public Interpreter::Opcode0
|
|
{
|
|
public:
|
|
|
|
void execute (Interpreter::Runtime& runtime) override
|
|
{
|
|
MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
runtime.push(MWBase::Environment::get().getMechanicsManager()->isSneaking(ptr));
|
|
}
|
|
};
|
|
|
|
|
|
void installOpcodes (Interpreter::Interpreter& interpreter)
|
|
{
|
|
for (int i=0; i<Compiler::Control::numberOfControls; ++i)
|
|
{
|
|
interpreter.installSegment5 (Compiler::Control::opcodeEnable+i, new OpSetControl (Compiler::Control::controls[i], true));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeDisable+i, new OpSetControl (Compiler::Control::controls[i], false));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetDisabled+i, new OpGetDisabled (Compiler::Control::controls[i]));
|
|
}
|
|
|
|
interpreter.installSegment5 (Compiler::Control::opcodeToggleCollision, new OpToggleCollision);
|
|
|
|
//Force Run
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceRun,
|
|
new OpClearMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceRun));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceRunExplicit,
|
|
new OpClearMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceRun));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceRun,
|
|
new OpSetMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceRun));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceRunExplicit,
|
|
new OpSetMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceRun));
|
|
|
|
//Force Jump
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceJump,
|
|
new OpClearMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceJumpExplicit,
|
|
new OpClearMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceJump,
|
|
new OpSetMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceJumpExplicit,
|
|
new OpSetMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceJump));
|
|
|
|
//Force MoveJump
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceMoveJump,
|
|
new OpClearMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceMoveJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceMoveJumpExplicit,
|
|
new OpClearMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceMoveJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceMoveJump,
|
|
new OpSetMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceMoveJump));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceMoveJumpExplicit,
|
|
new OpSetMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceMoveJump));
|
|
|
|
//Force Sneak
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceSneak,
|
|
new OpClearMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceSneak));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeClearForceSneakExplicit,
|
|
new OpClearMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceSneak));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceSneak,
|
|
new OpSetMovementFlag<ImplicitRef> (MWMechanics::CreatureStats::Flag_ForceSneak));
|
|
interpreter.installSegment5 (Compiler::Control::opcodeForceSneakExplicit,
|
|
new OpSetMovementFlag<ExplicitRef> (MWMechanics::CreatureStats::Flag_ForceSneak));
|
|
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetPcRunning, new OpGetPcRunning);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetPcSneaking, new OpGetPcSneaking);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceRun, new OpGetForceRun<ImplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceRunExplicit, new OpGetForceRun<ExplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceJump, new OpGetForceJump<ImplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceJumpExplicit, new OpGetForceJump<ExplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceMoveJump, new OpGetForceMoveJump<ImplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceMoveJumpExplicit, new OpGetForceMoveJump<ExplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceSneak, new OpGetForceSneak<ImplicitRef>);
|
|
interpreter.installSegment5 (Compiler::Control::opcodeGetForceSneakExplicit, new OpGetForceSneak<ExplicitRef>);
|
|
}
|
|
}
|
|
}
|