00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponScript.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <common/Defines.h>
00024 #include <lua/LUAScriptFactory.h>
00025 #include <lua/LUAScript.h>
00026
00027 REGISTER_ACCESSORY_SOURCE(WeaponScript);
00028
00029 WeaponScript::WeaponScript() :
00030 script_(0)
00031 {
00032
00033 }
00034
00035 WeaponScript::~WeaponScript()
00036 {
00037 delete script_;
00038 script_ = 0;
00039 }
00040
00041 bool WeaponScript::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00042 {
00043 if (!Weapon::parseXML(context, accessoryNode)) return false;
00044
00045 std::string filename;
00046 if (!accessoryNode->getNamedChild("filename", filename)) return false;
00047 if (!accessoryNode->getNamedChild("entrypoint", entrypoint_)) return false;
00048
00049 std::string luaErrorString;
00050 script_ = context.getScorchedContext().getLUAScriptFactory().createScript();
00051 script_->addWeaponFunctions();
00052 if (!script_->loadFromFile(S3D::getDataFile(filename), luaErrorString))
00053 {
00054 return accessoryNode->returnError(
00055 S3D::formatStringBuffer("Failed to load lua script %s : %s",
00056 filename.c_str(), luaErrorString.c_str()));
00057 }
00058 script_->setWeapon(this);
00059
00060 XMLNode *variable;
00061 while (accessoryNode->getNamedChild("variable", variable, false))
00062 {
00063 std::string name;
00064 fixed value;
00065 if (!variable->getNamedChild("name", name)) return false;
00066 if (!variable->getNamedChild("value", value)) return false;
00067
00068 script_->setGlobal(name, value);
00069 }
00070
00071 return accessoryNode->failChildren();
00072 }
00073
00074 void WeaponScript::fireWeapon(ScorchedContext &context,
00075 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00076 {
00077 fixed fPlayerId(true, weaponContext.getPlayerId());
00078
00079 script_->startFunction(entrypoint_);
00080 script_->addNumberParameter(fPlayerId);
00081 script_->addVectorParameter(position);
00082 script_->addVectorParameter(velocity);
00083 script_->endFunction(3);
00084 }