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