Changeset 9995
- Timestamp:
- Mar 9, 2014, 9:01:44 PM (11 years ago)
- Location:
- code/branches/modularships
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/modularships/data/levels/emptyLevel.oxw
r9415 r9995 32 32 <SpawnPoint team=0 position="-200,0,0" lookat="0,0,0" spawnclass=SpaceShip pawndesign=spaceshipescort /> 33 33 34 <MovableEntity position="0,0,0" collisionType=dynamic scale=1 linearDamping=0.8 angularDamping=0 collisiondamage=0.005 enablecollisiondamage=true> 35 <attached> 36 <Model position="0,0,0" mesh="cube.mesh" scale3D="40,40,40" /> 37 <StaticEntity position="0,90,0" direction="0,0,0" collisionType=static mass=100 friction=0.01 > 38 <attached> 39 <Model position="0,0,0" mesh="cube.mesh" scale3D="30,30,30" /> 40 </attached> 41 <collisionShapes> 42 <BoxCollisionShape position="0,0,0" halfExtents="30,30,30" /> 43 </collisionShapes> 44 </StaticEntity> 45 </attached> 46 <collisionShapes> 47 <BoxCollisionShape position="0,0,0" halfExtents="40,40,40" /> 48 </collisionShapes> 49 </MovableEntity> 50 51 <Pawn health=30 position="0,-50,0" direction="0,-1,0" collisionType=dynamic mass=1000 name=box radarname = "Box 4" > 52 <attached> 53 <Model position="0,0,0" mesh="crate.mesh" scale3D="3,3,3" /> 54 </attached> 55 <collisionShapes> 56 <BoxCollisionShape position="0,0,0" halfExtents="15,15,15" /> 57 </collisionShapes> 58 </Pawn> 59 34 60 </Scene> 35 61 </Level> -
code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.cc
r9667 r9995 141 141 } 142 142 143 bool BasicProjectile::customProcessCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs) 144 { 145 if (!this->bDestroy_ && GameMode::isMaster()) 146 { 147 if (otherObject == this->getShooter()) // Prevents you from shooting yourself 148 return false; 149 150 this->bDestroy_ = true; // If something is hit, the object is destroyed and can't hit something else. 151 // The projectile is destroyed by its tick()-function (in the following tick). 152 153 Pawn* victim = orxonox_cast<Pawn*>(otherObject); // If otherObject isn't a Pawn, then victim is NULL 154 155 WorldEntity* entity = orxonox_cast<WorldEntity*>(this); 156 assert(entity); // The projectile must not be a WorldEntity. 157 158 // If visual effects after destruction cause problems, put this block below the effects code block 159 if (victim) 160 { 161 victim->customHit(this->getShooter(), contactPoint, cs, this->getDamage(), this->getHealthDamage(), this->getShieldDamage()); 162 victim->startReloadCountdown(); 163 } 164 165 // Visual effects for being hit, depending on whether the shield is hit or not 166 if (this->getShooter()) // If the owner does not exist (anymore?), no effects are displayed. 167 { 168 // Damping and explosion effect is only played if the victim is no Pawn (see cast above) 169 // or if the victim is a Pawn, has no shield left, is still alive and any damage goes to the health 170 if (!victim || (victim && !victim->hasShield() && victim->getHealth() > 0.0f && (this->getDamage() > 0.0f || this->getHealthDamage() > 0.0f))) 171 { 172 { 173 ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext()); 174 effect->setPosition(entity->getPosition()); 175 effect->setOrientation(entity->getOrientation()); 176 effect->setDestroyAfterLife(true); 177 effect->setSource("Orxonox/explosion3"); 178 effect->setLifetime(2.0f); 179 } 180 // Second effect with same condition 181 { 182 ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext()); 183 effect->setPosition(entity->getPosition()); 184 effect->setOrientation(entity->getOrientation()); 185 effect->setDestroyAfterLife(true); 186 effect->setSource("Orxonox/smoke4"); 187 effect->setLifetime(3.0f); 188 } 189 } 190 191 // victim->isAlive() is not false until the next tick, so getHealth() > 0 is used instead 192 if (victim && victim->hasShield() && (this->getDamage() > 0.0f || this->getShieldDamage() > 0.0f) && victim->getHealth() > 0.0f) 193 { 194 ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext()); 195 effect->setDestroyAfterLife(true); 196 effect->setSource("Orxonox/Shield"); 197 effect->setLifetime(0.5f); 198 victim->attach(effect); 199 } 200 } 201 return true; 202 } 203 return false; 204 } 205 143 206 /** 144 207 @brief -
code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.h
r9667 r9995 120 120 protected: 121 121 bool processCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint); 122 bool customProcessCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs); 122 123 void destroyCheck(void); 123 124 -
code/branches/modularships/src/modules/weapons/projectiles/Projectile.cc
r9667 r9995 93 93 } 94 94 95 bool Projectile::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint) 96 { 97 return this->customProcessCollision(otherObject, contactPoint, cs); 98 } 99 95 100 } -
code/branches/modularships/src/modules/weapons/projectiles/Projectile.h
r9667 r9995 65 65 virtual void tick(float dt); 66 66 virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint); 67 virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint); 67 68 68 69 private: -
code/branches/modularships/src/modules/weapons/projectiles/Rocket.cc
r9667 r9995 196 196 } 197 197 198 bool Rocket::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint) 199 { 200 return this->customProcessCollision(otherObject, contactPoint, cs); 201 } 202 198 203 /** 199 204 @brief -
code/branches/modularships/src/modules/weapons/projectiles/Rocket.h
r9667 r9995 65 65 66 66 virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint); 67 virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint); 67 68 virtual void destroyObject(void); 68 69 void destructionEffect(); -
code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.cc
r9667 r9995 177 177 } 178 178 179 bool SimpleRocket::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint) 180 { 181 return this->customProcessCollision(otherObject, contactPoint, cs); 182 } 183 179 184 /** 180 185 @brief -
code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.h
r9667 r9995 65 65 66 66 virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint); 67 virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint); 67 68 68 69 void disableFire(); //!< Method to disable the fire and stop all acceleration -
code/branches/modularships/src/orxonox/Scene.cc
r9667 r9995 201 201 // Note: This is a global variable which we assign a static function. 202 202 // TODO: Check whether this (or anything about Bullet) works with multiple physics engine instances. 203 gContactAddedCallback = &Scene::c ollisionCallback;203 gContactAddedCallback = &Scene::customCollisionCallback; 204 204 } 205 205 else if (!wantPhysics && hasPhysics()) … … 358 358 return modified; 359 359 } 360 361 /* ADDED static*/ bool Scene::customCollisionCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, 362 int index0, const btCollisionObject* colObj1, int partId1, int index1) 363 { 364 // get the WorldEntity pointers 365 SmartPtr<WorldEntity> object0 = static_cast<WorldEntity*>(colObj0->getUserPointer()); 366 SmartPtr<WorldEntity> object1 = static_cast<WorldEntity*>(colObj1->getUserPointer()); 367 368 // get the CollisionShape pointers 369 const btCollisionShape* cs0 = colObj0->getCollisionShape(); 370 const btCollisionShape* cs1 = colObj1->getCollisionShape(); 371 372 // false means that bullet will assume we didn't modify the contact 373 bool modified = false; 374 if (object0->isCollisionCallbackActive()) 375 modified |= object0->customCollidesAgainst(object1, cs0, cp); 376 if (object1->isCollisionCallbackActive()) 377 modified |= object1->customCollidesAgainst(object0, cs1, cp); 378 379 return modified; 380 } 360 381 } -
code/branches/modularships/src/orxonox/Scene.h
r9667 r9995 143 143 int index0, const btCollisionObject* colObj1, int partId1, int index1); 144 144 145 static bool customCollisionCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, 146 int index0, const btCollisionObject* colObj1, int partId1, int index1); 147 145 148 // Bullet objects 146 149 btDiscreteDynamicsWorld* physicalWorld_; -
code/branches/modularships/src/orxonox/worldentities/MovableEntity.cc
r9667 r9995 87 87 } 88 88 89 bool MovableEntity::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* ownCollisionShape, btManifoldPoint& contactPoint) 90 { 91 if (GameMode::isMaster() && enableCollisionDamage_) 92 { 93 Pawn* victim = orxonox_cast<Pawn*>(otherObject); 94 if (victim) 95 { 96 float damage = this->collisionDamage_ * (victim->getVelocity() - this->getVelocity()).length(); 97 victim->customHit(0, contactPoint, ownCollisionShape, damage); 98 } 99 } 100 101 return false; 102 } 103 89 104 90 105 void MovableEntity::registerVariables() -
code/branches/modularships/src/orxonox/worldentities/MovableEntity.h
r9667 r9995 48 48 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); 49 49 virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint); 50 virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint); 50 51 51 52 using WorldEntity::setPosition; -
code/branches/modularships/src/orxonox/worldentities/WorldEntity.h
r9667 r9995 375 375 */ 376 376 virtual inline bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint) 377 { return false; } /* With false, Bullet assumes no modification to the collision objects. */ 378 379 virtual inline bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* ownCollisionShape, btManifoldPoint& contactPoint) 377 380 { return false; } /* With false, Bullet assumes no modification to the collision objects. */ 378 381 -
code/branches/modularships/src/orxonox/worldentities/pawns/Pawn.cc
r9950 r9995 274 274 } 275 275 276 void Pawn::customDamage(float damage, float healthdamage, float shielddamage, Pawn* originator, const btCollisionShape* cs) 277 { 278 // Applies multiplier given by the DamageBoost Pickup. 279 if (originator) 280 damage *= originator->getDamageMultiplier(); 281 282 orxout() << "damage(): Custom collision detected on CS: " << cs << endl; 283 284 if (this->getGametype() && this->getGametype()->allowPawnDamage(this, originator)) 285 { 286 if (shielddamage >= this->getShieldHealth()) 287 { 288 this->setShieldHealth(0); 289 this->setHealth(this->health_ - (healthdamage + damage)); 290 } 291 else 292 { 293 this->setShieldHealth(this->shieldHealth_ - shielddamage); 294 295 // remove remaining shieldAbsorpton-Part of damage from shield 296 shielddamage = damage * this->shieldAbsorption_; 297 shielddamage = std::min(this->getShieldHealth(),shielddamage); 298 this->setShieldHealth(this->shieldHealth_ - shielddamage); 299 300 // set remaining damage to health 301 this->setHealth(this->health_ - (damage - shielddamage) - healthdamage); 302 } 303 304 this->lastHitOriginator_ = originator; 305 } 306 } 307 276 308 // TODO: Still valid? 277 309 /* HIT-Funktionen … … 288 320 } 289 321 322 void Pawn::customHit(Pawn* originator, const Vector3& force, const btCollisionShape* cs, float damage, float healthdamage, float shielddamage) 323 { 324 if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) ) 325 { 326 this->customDamage(damage, healthdamage, shielddamage, originator, cs); 327 this->setVelocity(this->getVelocity() + force); 328 } 329 } 290 330 291 331 void Pawn::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage) … … 294 334 { 295 335 this->damage(damage, healthdamage, shielddamage, originator); 336 337 if ( this->getController() ) 338 this->getController()->hit(originator, contactpoint, damage); // changed to damage, why shielddamage? 339 } 340 } 341 342 void Pawn::customHit(Pawn* originator, btManifoldPoint& contactpoint, const btCollisionShape* cs, float damage, float healthdamage, float shielddamage) 343 { 344 if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) ) 345 { 346 this->customDamage(damage, healthdamage, shielddamage, originator, cs); 296 347 297 348 if ( this->getController() ) -
code/branches/modularships/src/orxonox/worldentities/pawns/Pawn.h
r9948 r9995 127 127 //virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage); 128 128 virtual void hit(Pawn* originator, const Vector3& force, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f); 129 virtual void customHit(Pawn* originator, const Vector3& force, const btCollisionShape* cs, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f); 129 130 virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f); 131 virtual void customHit(Pawn* originator, btManifoldPoint& contactpoint, const btCollisionShape* cs, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f); 130 132 131 133 virtual void kill(); … … 197 199 //virtual void damage(float damage, Pawn* originator = 0); 198 200 virtual void damage(float damage, float healthdamage = 0.0f, float shielddamage = 0.0f, Pawn* originator = NULL); 201 virtual void customDamage(float damage, float healthdamage = 0.0f, float shielddamage = 0.0f, Pawn* originator = NULL, const btCollisionShape* cs = NULL); 199 202 200 203 bool bAlive_;
Note: See TracChangeset
for help on using the changeset viewer.