00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <client/ScorchedClient.h>
00022 #include <client/ClientDefenseHandler.h>
00023 #include <tank/TankContainer.h>
00024 #include <tank/TankState.h>
00025 #include <tank/TankPosition.h>
00026 #include <tank/TankAccessories.h>
00027 #include <target/TargetLife.h>
00028 #include <target/TargetShield.h>
00029 #include <target/TargetParachute.h>
00030 #include <coms/ComsDefenseMessage.h>
00031 #include <common/Defines.h>
00032 #include <sound/SoundUtils.h>
00033 #include <weapons/AccessoryStore.h>
00034
00035 ClientDefenseHandler *ClientDefenseHandler::instance_ = 0;
00036
00037 ClientDefenseHandler *ClientDefenseHandler::instance()
00038 {
00039 if (!instance_)
00040 {
00041 instance_ = new ClientDefenseHandler;
00042 }
00043 return instance_;
00044 }
00045
00046 ClientDefenseHandler::ClientDefenseHandler()
00047 {
00048 ScorchedClient::instance()->getComsMessageHandler().addHandler(
00049 "ComsDefenseMessage",
00050 this);
00051 }
00052
00053 ClientDefenseHandler::~ClientDefenseHandler()
00054 {
00055 }
00056
00057 bool ClientDefenseHandler::processMessage(
00058 NetMessage &netMessage,
00059 const char *messageType,
00060 NetBufferReader &reader)
00061 {
00062
00063 ComsDefenseMessage message;
00064 if (!message.readMessage(reader)) return false;
00065
00066
00067 Tank *tank = ScorchedClient::instance()->getTankContainer().getTankById(message.getPlayerId());
00068 if (!tank || tank->getState().getState() != TankState::sNormal)
00069 {
00070 return true;
00071 }
00072
00073
00074 switch (message.getChange())
00075 {
00076 case ComsDefenseMessage::eBatteryUse:
00077 {
00078 Accessory *battery =
00079 ScorchedClient::instance()->getAccessoryStore().
00080 findByAccessoryId(message.getInfoId());
00081 if (battery)
00082 {
00083 if (battery->getActivationSound() &&
00084 0 != strcmp("none", battery->getActivationSound()))
00085 {
00086 SoundBuffer *batSound =
00087 Sound::instance()->fetchOrCreateBuffer(
00088 S3D::getDataFile(S3D::formatStringBuffer("data/wav/%s", battery->getActivationSound())));
00089 SoundUtils::playAbsoluteSound(VirtualSoundPriority::eAction,
00090 batSound, tank->getPosition().getTankPosition().asVector());
00091 }
00092
00093 if (tank->getDestinationId() !=
00094 ScorchedClient::instance()->getTankContainer().getCurrentDestinationId())
00095 {
00096 tank->getAccessories().add(battery, 1);
00097 }
00098
00099 tank->getLife().setLife(tank->getLife().getLife() + 10);
00100 tank->getAccessories().rm(battery, 1);
00101 }
00102 }
00103 break;
00104 case ComsDefenseMessage::eShieldUp:
00105 {
00106 Accessory *accessory =
00107 ScorchedClient::instance()->getAccessoryStore().
00108 findByAccessoryId(message.getInfoId());
00109 if (accessory->getType() == AccessoryPart::AccessoryShield)
00110 {
00111 if (accessory->getActivationSound() &&
00112 0 != strcmp("none", accessory->getActivationSound()))
00113 {
00114 SoundBuffer *activateSound =
00115 Sound::instance()->fetchOrCreateBuffer(
00116 S3D::getDataFile(S3D::formatStringBuffer("data/wav/%s", accessory->getActivationSound())));
00117 SoundUtils::playAbsoluteSound(VirtualSoundPriority::eAction,
00118 activateSound, tank->getPosition().getTankPosition().asVector());
00119 }
00120
00121 if (tank->getDestinationId() !=
00122 ScorchedClient::instance()->getTankContainer().getCurrentDestinationId())
00123 {
00124
00125 tank->getAccessories().add(accessory, 1);
00126 }
00127 tank->getAccessories().rm(accessory, 1);
00128 tank->getShield().setCurrentShield(accessory);
00129 }
00130 }
00131 break;
00132 case ComsDefenseMessage::eShieldDown:
00133 {
00134 tank->getShield().setCurrentShield(0);
00135 }
00136 break;
00137 case ComsDefenseMessage::eParachutesUp:
00138 {
00139 Accessory *parachute =
00140 ScorchedClient::instance()->getAccessoryStore().
00141 findByAccessoryId(message.getInfoId());
00142 if (parachute)
00143 {
00144 if (parachute->getActivationSound() &&
00145 0 != strcmp("none", parachute->getActivationSound()))
00146 {
00147 SoundBuffer *paraSound =
00148 Sound::instance()->fetchOrCreateBuffer(
00149 S3D::getDataFile(S3D::formatStringBuffer("data/wav/%s", parachute->getActivationSound())));
00150 SoundUtils::playAbsoluteSound(VirtualSoundPriority::eAction,
00151 paraSound, tank->getPosition().getTankPosition().asVector());
00152 }
00153 }
00154
00155 tank->getParachute().setCurrentParachute(parachute);
00156 }
00157 break;
00158 case ComsDefenseMessage::eParachutesDown:
00159 {
00160 tank->getParachute().setCurrentParachute(0);
00161 }
00162 break;
00163 }
00164
00165 return true;
00166 }