00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponVelocity.h>
00022 #include <weapons/AccessoryStore.h>
00023
00024 REGISTER_ACCESSORY_SOURCE(WeaponVelocity);
00025
00026 WeaponVelocity::WeaponVelocity() :
00027 velocityChange_(0), abs_(false)
00028 {
00029
00030 }
00031
00032 WeaponVelocity::~WeaponVelocity()
00033 {
00034
00035 }
00036
00037 bool WeaponVelocity::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00038 {
00039 if (!Weapon::parseXML(context, accessoryNode)) return false;
00040
00041
00042 XMLNode *subNode = 0;
00043 if (!accessoryNode->getNamedChild("aimedweapon", subNode)) return false;
00044
00045
00046 AccessoryPart *accessory = context.getAccessoryStore().
00047 createAccessoryPart(context, parent_, subNode);
00048 if (!accessory || accessory->getType() != AccessoryPart::AccessoryWeapon)
00049 {
00050 return subNode->returnError("Failed to find sub weapon, not a weapon");
00051 }
00052 aimedWeapon_ = (Weapon*) accessory;
00053
00054 if (!accessoryNode->getNamedChild("velocitychange", velocityChange_)) return false;
00055
00056 accessoryNode->getNamedChild("abs", abs_, false);
00057
00058 return true;
00059 }
00060
00061 void WeaponVelocity::fireWeapon(ScorchedContext &context,
00062 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00063 {
00064
00065
00066 FixedVector newVelocity;
00067 if (abs_)
00068 {
00069 newVelocity = velocity.Normalize() * 50 * velocityChange_.getValue(context);
00070 aimedWeapon_->fireWeapon(context, weaponContext, position, newVelocity);
00071 }
00072 else
00073 {
00074
00075 newVelocity = velocity * velocityChange_.getValue(context);
00076 aimedWeapon_->fireWeapon(context, weaponContext, position, newVelocity);
00077 }
00078
00079 }
00080