[8375] | 1 | #include "ShrinkPickup.h" |
---|
| 2 | |
---|
| 3 | #include <sstream> |
---|
| 4 | #include "core/CoreIncludes.h" |
---|
| 5 | #include "core/XMLPort.h" |
---|
| 6 | |
---|
| 7 | #include "pickup/PickupIdentifier.h" |
---|
| 8 | #include "worldentities/pawns/Pawn.h" |
---|
| 9 | |
---|
[8381] | 10 | #include "weaponsystem/WeaponSlot.h" |
---|
| 11 | #include "weaponsystem/Weapon.h" |
---|
| 12 | |
---|
[8375] | 13 | namespace orxonox |
---|
| 14 | { |
---|
| 15 | CreateFactory(ShrinkPickup); |
---|
| 16 | |
---|
[8433] | 17 | ShrinkPickup::ShrinkPickup(BaseObject* creator) : Pickup(creator) |
---|
[8375] | 18 | { |
---|
| 19 | RegisterObject(ShrinkPickup); |
---|
| 20 | |
---|
| 21 | this->initialize(); |
---|
[8433] | 22 | shrinkFactor_ = 5.0; |
---|
| 23 | duration_ = 5.0; |
---|
| 24 | shrinkDelay_ = 1.0; |
---|
| 25 | isActive_ = false; |
---|
[8375] | 26 | } |
---|
| 27 | |
---|
| 28 | ShrinkPickup::~ShrinkPickup() |
---|
| 29 | { |
---|
| 30 | |
---|
| 31 | } |
---|
| 32 | |
---|
| 33 | void ShrinkPickup::initialize(void) |
---|
| 34 | { |
---|
| 35 | this->addTarget(ClassIdentifier<Pawn>::getIdentifier()); |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | void ShrinkPickup::changedUsed(void) |
---|
| 39 | { |
---|
[8433] | 40 | int i; |
---|
| 41 | |
---|
[8375] | 42 | SUPER(ShrinkPickup, changedUsed); |
---|
| 43 | |
---|
| 44 | if(this->isUsed()) |
---|
| 45 | { |
---|
| 46 | this->pawn = this->carrierToPawnHelper(); |
---|
| 47 | if(pawn == NULL) // If the PickupCarrier is no Pawn, then this pickup is useless and therefore is destroyed. |
---|
| 48 | this->Pickupable::destroy(); |
---|
| 49 | |
---|
| 50 | COUT(0) << "shrinking..." << endl; |
---|
[8381] | 51 | //this->pawn->setScale3D(this->pawn->getScale3D() / 2.0); |
---|
[8375] | 52 | std::set<WorldEntity*> set = this->pawn->getAttachedObjects(); |
---|
[8433] | 53 | |
---|
| 54 | i = 0; |
---|
[8375] | 55 | for(std::set<WorldEntity*>::iterator it = set.begin(); it != set.end(); it++) |
---|
| 56 | { |
---|
[8433] | 57 | defaultScales_.push_back((*it)->getScale()); |
---|
| 58 | actualScales_.push_back((*it)->getScale()); |
---|
| 59 | defaultPositions_.push_back((*it)->getPosition()); |
---|
| 60 | actualPositions_.push_back((*it)->getPosition()); |
---|
| 61 | //(*it)->setScale((*it)->getScale() / 5.0); |
---|
| 62 | //(*it)->setPosition((*it)->getPosition() / 5.0); |
---|
[8375] | 63 | } |
---|
[8433] | 64 | size_ = defaultScales_.size(); |
---|
| 65 | for(i = 0; i < size_; i++) |
---|
| 66 | { |
---|
| 67 | smallScales_.push_back(defaultScales_.at(i) / shrinkFactor_); |
---|
| 68 | } |
---|
| 69 | isActive_ = true; |
---|
[8375] | 70 | durationTimer.setTimer(10, false, createExecutor(createFunctor(&ShrinkPickup::terminate, this))); |
---|
| 71 | } |
---|
| 72 | else |
---|
| 73 | { |
---|
| 74 | this->Pickupable::destroy(); |
---|
| 75 | } |
---|
| 76 | } |
---|
| 77 | |
---|
[8433] | 78 | void ShrinkPickup::tick(float dt) |
---|
| 79 | { |
---|
| 80 | double temp; |
---|
| 81 | int i; |
---|
| 82 | double k = dt / shrinkDelay_; |
---|
| 83 | if(isActive_) |
---|
| 84 | { |
---|
| 85 | for(i = 0; i < size_; i++) |
---|
| 86 | { |
---|
| 87 | temp = actualScales_.at(i); |
---|
| 88 | if(temp > smallScales_.at(i)) |
---|
| 89 | { |
---|
| 90 | actualScales_.erase(i) |
---|
| 91 | actualScales_.insert(i, temp - (temp - smallScales_.at(i)) * k); |
---|
| 92 | } |
---|
| 93 | /*temp = actual; |
---|
| 94 | if(temp > smallScales[i]) |
---|
| 95 | { |
---|
| 96 | actualScales[i] -= (actualScales[i] - smallScales[i]) * k; |
---|
| 97 | }*/ |
---|
| 98 | |
---|
| 99 | } |
---|
| 100 | |
---|
| 101 | i = 0; |
---|
| 102 | |
---|
| 103 | std::set<WorldEntity*> set = this->pawn->getAttachedObjects(); |
---|
| 104 | for(std::set<WorldEntity*>::iterator it = set.begin(); it != set.end(); it++) |
---|
| 105 | { |
---|
| 106 | //defaultScales.push_back((*it)->getScale()); |
---|
| 107 | //actualScales.push_back((*it)->getScale()); |
---|
| 108 | //defaultPositions.push_back((*it)->getPosition()); |
---|
| 109 | //actualPositions.push_back((*it)->getPosition()); |
---|
| 110 | //(*it)->setScale((*it)->getScale() *0.99); |
---|
| 111 | (*it)->setScale(actualScales_.at(i)); |
---|
| 112 | //(*it)->setPosition((*it)->getPosition() / 5.0); |
---|
| 113 | } |
---|
| 114 | } |
---|
| 115 | } |
---|
| 116 | |
---|
[8375] | 117 | void ShrinkPickup::terminate(void) |
---|
| 118 | { |
---|
[8381] | 119 | //this->pawn->setScale3D(this->pawn->getScale3D() * 5.0); |
---|
| 120 | |
---|
[8375] | 121 | std::set<WorldEntity*> set = this->pawn->getAttachedObjects(); |
---|
| 122 | for(std::set<WorldEntity*>::iterator it = set.begin(); it != set.end(); it++) |
---|
| 123 | { |
---|
| 124 | (*it)->setScale((*it)->getScale() * 5.0); |
---|
| 125 | } |
---|
| 126 | setUsed(false); |
---|
| 127 | } |
---|
| 128 | |
---|
| 129 | Pawn* ShrinkPickup::carrierToPawnHelper(void) |
---|
| 130 | { |
---|
| 131 | PickupCarrier* carrier = this->getCarrier(); |
---|
| 132 | Pawn* pawn = dynamic_cast<Pawn*>(carrier); |
---|
| 133 | |
---|
| 134 | if(pawn == NULL) |
---|
| 135 | { |
---|
| 136 | COUT(1) << "Invalid PickupCarrier in ShrinkPickup." << std::endl; |
---|
| 137 | } |
---|
| 138 | |
---|
| 139 | return pawn; |
---|
| 140 | } |
---|
| 141 | |
---|
| 142 | /** |
---|
| 143 | @brief |
---|
| 144 | Creates a duplicate of the input OrxonoxClass. |
---|
| 145 | @param item |
---|
| 146 | A pointer to the Orxonox class. |
---|
| 147 | */ |
---|
| 148 | void ShrinkPickup::clone(OrxonoxClass*& item) |
---|
| 149 | { |
---|
| 150 | if(item == NULL) |
---|
| 151 | item = new ShrinkPickup(this); |
---|
| 152 | |
---|
| 153 | SUPER(ShrinkPickup, clone, item); |
---|
| 154 | } |
---|
| 155 | } |
---|