00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponTeleport.h>
00022 #include <engine/ActionController.h>
00023 #include <landscapemap/LandscapeMaps.h>
00024 #include <landscapedef/LandscapeTex.h>
00025 #include <actions/Teleport.h>
00026 #include <common/Defines.h>
00027
00028 REGISTER_ACCESSORY_SOURCE(WeaponTeleport);
00029
00030 WeaponTeleport::WeaponTeleport() : groundOnly_(true)
00031 {
00032
00033 }
00034
00035 WeaponTeleport::~WeaponTeleport()
00036 {
00037
00038 }
00039
00040 bool WeaponTeleport::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00041 {
00042 if (!Weapon::parseXML(context, accessoryNode)) return false;
00043 if (!accessoryNode->getNamedChild("delay", delay_)) return false;
00044 if (!accessoryNode->getNamedChild("sound", sound_)) return false;
00045 accessoryNode->getNamedChild("groundonly", groundOnly_, false);
00046
00047 if (!S3D::checkDataFile(getSound())) return false;
00048
00049 return true;
00050 }
00051
00052 fixed WeaponTeleport::getDelay(ScorchedContext &context)
00053 {
00054 return delay_.getValue(context);
00055 }
00056
00057 void WeaponTeleport::fireWeapon(ScorchedContext &context,
00058 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00059 {
00060
00061 fixed allowedHeight = 0;
00062 LandscapeTex &tex = *context.getLandscapeMaps().getDefinitions().getTex();
00063 if (tex.border->getType() == LandscapeTexType::eWater)
00064 {
00065 LandscapeTexBorderWater *water =
00066 (LandscapeTexBorderWater *) tex.border;
00067
00068 allowedHeight = water->height;
00069 }
00070
00071 int arenaX = context.getLandscapeMaps().getGroundMaps().getArenaX();
00072 int arenaY = context.getLandscapeMaps().getGroundMaps().getArenaY();
00073 int arenaWidth = context.getLandscapeMaps().getGroundMaps().getArenaWidth();
00074 int arenaHeight = context.getLandscapeMaps().getGroundMaps().getArenaHeight();
00075
00076 if (position[0] > fixed(arenaX + 5) &&
00077 position[1] > fixed(arenaY + 5) &&
00078 position[0] < fixed(arenaX + arenaWidth - 5) &&
00079 position[1] < fixed(arenaY + arenaHeight - 5))
00080 {
00081 fixed landscapeHeight = context.getLandscapeMaps().getGroundMaps().getInterpHeight(
00082 position[0], position[1]);
00083 if (landscapeHeight >= allowedHeight - 1)
00084 {
00085 context.getActionController().addAction(
00086 new Teleport(position, weaponContext, this));
00087 }
00088 }
00089 }