mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-21 13:53:51 +00:00
added RemoveItem
This commit is contained in:
parent
db24a55e36
commit
aa637cb9d4
2 changed files with 106 additions and 1 deletions
|
@ -147,16 +147,117 @@ namespace MWScript
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class OpRemoveItem : public Interpreter::Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Interpreter::Runtime& runtime)
|
||||||
|
{
|
||||||
|
MWScript::InterpreterContext& context
|
||||||
|
= static_cast<MWScript::InterpreterContext&> (runtime.getContext());
|
||||||
|
|
||||||
|
std::string item = runtime.getStringLiteral (runtime[0].mInteger);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
Interpreter::Type_Integer count = runtime[0].mInteger;
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
if (count<0)
|
||||||
|
throw std::runtime_error ("second argument for RemoveItem must be non-negative");
|
||||||
|
|
||||||
|
MWWorld::Ptr ptr = context.getReference();
|
||||||
|
|
||||||
|
std::vector<MWWorld::Ptr> list;
|
||||||
|
|
||||||
|
MWWorld::listItemsInContainer (item,
|
||||||
|
MWWorld::Class::get (ptr).getContainerStore (ptr),
|
||||||
|
context.getWorld().getStore(), list);
|
||||||
|
|
||||||
|
for (std::vector<MWWorld::Ptr>::iterator iter (list.begin());
|
||||||
|
iter!=list.end() && count;
|
||||||
|
++iter)
|
||||||
|
{
|
||||||
|
if (iter->getRefData().getCount()<=count)
|
||||||
|
{
|
||||||
|
count -= iter->getRefData().getCount();
|
||||||
|
iter->getRefData().setCount (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iter->getRefData().setCount (iter->getRefData().getCount()-count);
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// To be fully compatible with original Morrowind, we would need to check if
|
||||||
|
// count is >= 0 here and throw an exception. But let's be tollerant instead.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpRemoveItemExplicit : public Interpreter::Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Interpreter::Runtime& runtime)
|
||||||
|
{
|
||||||
|
MWScript::InterpreterContext& context
|
||||||
|
= static_cast<MWScript::InterpreterContext&> (runtime.getContext());
|
||||||
|
|
||||||
|
std::string id = runtime.getStringLiteral (runtime[0].mInteger);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
std::string item = runtime.getStringLiteral (runtime[0].mInteger);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
Interpreter::Type_Integer count = runtime[0].mInteger;
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
if (count<0)
|
||||||
|
throw std::runtime_error ("second argument for RemoveItem must be non-negative");
|
||||||
|
|
||||||
|
MWWorld::Ptr ptr = context.getWorld().getPtr (id, false);
|
||||||
|
|
||||||
|
std::vector<MWWorld::Ptr> list;
|
||||||
|
|
||||||
|
MWWorld::listItemsInContainer (item,
|
||||||
|
MWWorld::Class::get (ptr).getContainerStore (ptr),
|
||||||
|
context.getWorld().getStore(), list);
|
||||||
|
|
||||||
|
for (std::vector<MWWorld::Ptr>::iterator iter (list.begin());
|
||||||
|
iter!=list.end() && count;
|
||||||
|
++iter)
|
||||||
|
{
|
||||||
|
if (iter->getRefData().getCount()<=count)
|
||||||
|
{
|
||||||
|
count -= iter->getRefData().getCount();
|
||||||
|
iter->getRefData().setCount (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iter->getRefData().setCount (iter->getRefData().getCount()-count);
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// To be fully compatible with original Morrowind, we would need to check if
|
||||||
|
// count is >= 0 here and throw an exception. But let's be tollerant instead.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const int opcodeAddItem = 0x2000076;
|
const int opcodeAddItem = 0x2000076;
|
||||||
const int opcodeAddItemExplicit = 0x2000077;
|
const int opcodeAddItemExplicit = 0x2000077;
|
||||||
const int opcodeGetItemCount = 0x2000078;
|
const int opcodeGetItemCount = 0x2000078;
|
||||||
const int opcodeGetItemCountExplicit = 0x2000079;
|
const int opcodeGetItemCountExplicit = 0x2000079;
|
||||||
|
const int opcodeRemoveItem = 0x200007a;
|
||||||
|
const int opcodeRemoveItemExplicit = 0x200007b;
|
||||||
|
|
||||||
void registerExtensions (Compiler::Extensions& extensions)
|
void registerExtensions (Compiler::Extensions& extensions)
|
||||||
{
|
{
|
||||||
extensions.registerInstruction ("additem", "cl", opcodeAddItem, opcodeAddItemExplicit);
|
extensions.registerInstruction ("additem", "cl", opcodeAddItem, opcodeAddItemExplicit);
|
||||||
extensions.registerFunction ("getitemcount", 'l', "c", opcodeGetItemCount,
|
extensions.registerFunction ("getitemcount", 'l', "c", opcodeGetItemCount,
|
||||||
opcodeGetItemCountExplicit);
|
opcodeGetItemCountExplicit);
|
||||||
|
extensions.registerInstruction ("removeitem", "cl", opcodeRemoveItem,
|
||||||
|
opcodeRemoveItemExplicit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void installOpcodes (Interpreter::Interpreter& interpreter)
|
void installOpcodes (Interpreter::Interpreter& interpreter)
|
||||||
|
@ -165,6 +266,8 @@ namespace MWScript
|
||||||
interpreter.installSegment5 (opcodeAddItemExplicit, new OpAddItemExplicit);
|
interpreter.installSegment5 (opcodeAddItemExplicit, new OpAddItemExplicit);
|
||||||
interpreter.installSegment5 (opcodeGetItemCount, new OpGetItemCount);
|
interpreter.installSegment5 (opcodeGetItemCount, new OpGetItemCount);
|
||||||
interpreter.installSegment5 (opcodeGetItemCountExplicit, new OpGetItemCountExplicit);
|
interpreter.installSegment5 (opcodeGetItemCountExplicit, new OpGetItemCountExplicit);
|
||||||
|
interpreter.installSegment5 (opcodeRemoveItem, new OpRemoveItem);
|
||||||
|
interpreter.installSegment5 (opcodeRemoveItemExplicit, new OpRemoveItemExplicit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,4 +81,6 @@ op 0x2000076: AddItem
|
||||||
op 0x2000077: AddItem, explicit reference
|
op 0x2000077: AddItem, explicit reference
|
||||||
op 0x2000078: GetItemCount
|
op 0x2000078: GetItemCount
|
||||||
op 0x2000079: GetItemCount, explicit reference
|
op 0x2000079: GetItemCount, explicit reference
|
||||||
opcodes 0x200007a-0x3ffffff unused
|
op 0x200007a: RemoveItem
|
||||||
|
op 0x200007b: RemoveItem, explicit reference
|
||||||
|
opcodes 0x200007c-0x3ffffff unused
|
||||||
|
|
Loading…
Reference in a new issue