00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <actions/ShieldHit.h>
00022 #include <common/Defines.h>
00023 #include <engine/ScorchedContext.h>
00024 #include <weapons/Accessory.h>
00025 #include <weapons/Shield.h>
00026 #include <target/TargetContainer.h>
00027 #include <target/TargetShield.h>
00028 #include <target/TargetRenderer.h>
00029 #ifndef S3D_SERVER
00030 #include <sound/SoundUtils.h>
00031 #include <GLEXT/GLLenseFlare.h>
00032 #endif
00033
00034 ShieldHit::ShieldHit(unsigned int playerId,
00035 FixedVector &position,
00036 fixed hitPercentage) :
00037 ActionReferenced("ShieldHit"),
00038 totalTime_(0),
00039 firstTime_(true), playerId_(playerId),
00040 hitPercentage_(hitPercentage),
00041 position_(position)
00042 {
00043 }
00044
00045 ShieldHit::~ShieldHit()
00046 {
00047 }
00048
00049 void ShieldHit::init()
00050 {
00051 }
00052
00053 void ShieldHit::simulate(fixed frameTime, bool &remove)
00054 {
00055 if (firstTime_)
00056 {
00057 firstTime_ = false;
00058
00059 Target *target =
00060 context_->getTargetContainer().getTargetById(playerId_);
00061 if (target)
00062 {
00063 Accessory *accessory =
00064 target->getShield().getCurrentShield();
00065 if (accessory)
00066 {
00067 Shield *shield = (Shield *) accessory->getAction();
00068 #ifndef S3D_SERVER
00069 if (!context_->getServerMode())
00070 {
00071 SoundBuffer *shieldSound =
00072 Sound::instance()->fetchOrCreateBuffer(
00073 S3D::getDataFile(S3D::formatStringBuffer("data/wav/%s", shield->getCollisionSound())));
00074 SoundUtils::playAbsoluteSound(VirtualSoundPriority::eAction,
00075 shieldSound, position_.asVector());
00076
00077 TargetRenderer *renderer = target->getRenderer();
00078 if (renderer)
00079 {
00080 renderer->shieldHit();
00081 }
00082 }
00083 #endif // #ifndef S3D_SERVER
00084
00085 target->getShield().setShieldPower(
00086 target->getShield().getShieldPower() -
00087 shield->getHitRemovePower() * hitPercentage_);
00088 }
00089 }
00090 }
00091
00092 totalTime_ += frameTime;
00093 if (totalTime_ > fixed(true, 2000)) remove = true;
00094 Action::simulate(frameTime, remove);
00095 }
00096
00097 void ShieldHit::draw()
00098 {
00099 #ifndef S3D_SERVER
00100 if (!context_->getServerMode())
00101 {
00102 GLLenseFlare::instance()->draw(position_.asVector(), false, 0,
00103 1.0f, 1.0f);
00104 }
00105 #endif // #ifndef S3D_SERVER
00106 }