00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponTypeAction.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <engine/ActionController.h>
00024 #include <tank/TankContainer.h>
00025 #include <tank/TankModelContainer.h>
00026
00027 REGISTER_ACCESSORY_SOURCE(WeaponTypeAction);
00028
00029 WeaponTypeAction::WeaponTypeAction()
00030 {
00031 }
00032
00033 WeaponTypeAction::~WeaponTypeAction()
00034 {
00035 }
00036
00037 bool WeaponTypeAction::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00038 {
00039 if (!Weapon::parseXML(context, accessoryNode)) return false;
00040
00041 std::list<XMLNode *> children = accessoryNode->getChildren();
00042 std::list<XMLNode *>::iterator itor;
00043 for (itor = children.begin();
00044 itor != children.end();
00045 itor++)
00046 {
00047 XMLNode *node = (*itor);
00048
00049 XMLNode *tmpNode = 0;
00050 accessoryNode->getNamedChild(node->getName(), tmpNode);
00051
00052
00053 AccessoryPart *accessory = context.getAccessoryStore().
00054 createAccessoryPart(context, parent_, node);
00055 if (!accessory || accessory->getType() != AccessoryPart::AccessoryWeapon)
00056 {
00057 return node->returnError("Failed to find sub weapon, not a weapon");
00058 }
00059 actions_[node->getName()] = (Weapon*) accessory;
00060 }
00061
00062 if (actions_.empty())
00063 {
00064 return accessoryNode->returnError("No actions defined");
00065 }
00066
00067 return true;
00068 }
00069
00070 void WeaponTypeAction::fireWeapon(ScorchedContext &context,
00071 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00072 {
00073 context.getActionController().addAction(
00074 new CallbackWeapon("WeaponTypeAction", this, 0, 0,
00075 weaponContext, position, velocity));
00076 }
00077
00078 void WeaponTypeAction::weaponCallback(
00079 ScorchedContext &context,
00080 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity,
00081 unsigned int userData)
00082 {
00083 Tank *tank = context.getTankContainer().getTankById(weaponContext.getPlayerId());
00084 if (!tank) return;
00085
00086 std::map<std::string, Weapon *>::iterator itor =
00087 actions_.find(tank->getModelContainer().getTankTypeName());
00088 if (itor == actions_.end()) return;
00089
00090 Weapon *action = (*itor).second;
00091 if (action)
00092 {
00093 action->fireWeapon(context, weaponContext, position, velocity);
00094 }
00095 }
00096