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