00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponInvokeWeapon.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <common/Defines.h>
00024
00025 std::set<Weapon *> WeaponInvokeWeapon::weaponStack_;
00026
00027 REGISTER_ACCESSORY_SOURCE(WeaponInvokeWeapon);
00028
00029 WeaponInvokeWeapon::WeaponInvokeWeapon() :
00030 invokeWeapon_(0)
00031 {
00032
00033 }
00034
00035 WeaponInvokeWeapon::~WeaponInvokeWeapon()
00036 {
00037
00038 }
00039
00040 bool WeaponInvokeWeapon::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00041 {
00042 if (!Weapon::parseXML(context, accessoryNode)) return false;
00043
00044 std::string invoke;
00045 if (!accessoryNode->getNamedChild("invoke", invoke)) return false;
00046 Accessory *accessory = context.getAccessoryStore().
00047 findByPrimaryAccessoryName(invoke.c_str());
00048 if (!accessory)
00049 {
00050 return accessoryNode->returnError(
00051 S3D::formatStringBuffer("Failed to find accessory named %s",
00052 invoke.c_str()));
00053 }
00054
00055 AccessoryPart *accessoryPart = accessory->getAction();
00056 if (!accessoryPart || accessoryPart->getType() != AccessoryPart::AccessoryWeapon)
00057 {
00058 return accessoryNode->returnError("Failed to find sub weapon, not a weapon");
00059 }
00060 invokeWeapon_ = (Weapon*) accessoryPart;
00061
00062 return accessoryNode->failChildren();
00063 }
00064
00065 void WeaponInvokeWeapon::fireWeapon(ScorchedContext &context,
00066 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00067 {
00068 if (weaponStack_.find(invokeWeapon_) != weaponStack_.end())
00069 {
00070 S3D::dialogExit("Scorched3D", S3D::formatStringBuffer(
00071 "WeaponInvokeWeapon recursive called for weapon %s",
00072 invokeWeapon_->getParent()->getName()));
00073 }
00074
00075 weaponStack_.insert(invokeWeapon_);
00076 invokeWeapon_->fireWeapon(context, weaponContext, position, velocity);
00077 weaponStack_.erase(invokeWeapon_);
00078 }