00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponGiveLife.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <engine/ActionController.h>
00024 #include <tank/TankContainer.h>
00025 #include <target/TargetLife.h>
00026 #include <common/Defines.h>
00027 #include <common/ChannelManager.h>
00028 #include <lang/LangResource.h>
00029
00030 REGISTER_ACCESSORY_SOURCE(WeaponGiveLife);
00031
00032 WeaponGiveLife::WeaponGiveLife()
00033 {
00034
00035 }
00036
00037 WeaponGiveLife::~WeaponGiveLife()
00038 {
00039
00040 }
00041
00042 bool WeaponGiveLife::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00043 {
00044 if (!Weapon::parseXML(context, accessoryNode)) return false;
00045
00046 if (!accessoryNode->getNamedChild("life", life_)) return false;
00047 if (!accessoryNode->getNamedChild("exceedmax", exceedMax_)) return false;
00048
00049 return true;
00050 }
00051
00052 void WeaponGiveLife::fireWeapon(ScorchedContext &context,
00053 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00054 {
00055 context.getActionController().addAction(
00056 new CallbackWeapon("WeaponGiveLife", this, 0, 0,
00057 weaponContext, position, velocity));
00058 }
00059
00060 void WeaponGiveLife::weaponCallback(
00061 ScorchedContext &context,
00062 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity,
00063 unsigned int userData)
00064 {
00065 Tank *tank = context.getTankContainer().getTankById(weaponContext.getPlayerId());
00066 if (!tank) return;
00067
00068 fixed life = life_.getValue(context);
00069 if (life > 0)
00070 {
00071 if (life > tank->getLife().getMaxLife() &&
00072 exceedMax_)
00073 {
00074 tank->getLife().setMaxLife(life);
00075 }
00076 tank->getLife().setLife(
00077 tank->getLife().getLife() + life);
00078
00079 {
00080 ChannelText text("combat",
00081 LANG_RESOURCE_2("TANK_GET_LIFE",
00082 "[p:{0}] received {1} life",
00083 tank->getTargetName(),
00084 S3D::formatStringBuffer("%.0f", life.asFloat())));
00085 ChannelManager::showText(context, text);
00086 }
00087 }
00088 else
00089 {
00090 if (tank->getLife().getLife() + life <= 0)
00091 {
00092 tank->getLife().setLife(
00093 MIN(fixed(1), tank->getLife().getLife()));
00094 }
00095 else
00096 {
00097 tank->getLife().setLife(
00098 tank->getLife().getLife() + life);
00099 }
00100
00101 {
00102 ChannelText text("combat",
00103 LANG_RESOURCE_2("TANK_LOST_LIFE",
00104 "[p:{0}] lost {1} life",
00105 tank->getTargetName(),
00106 S3D::formatStringBuffer("%.0f", -life.asFloat())));
00107 ChannelManager::showText(context, text);
00108 }
00109 }
00110 }
00111