Downloads containing mortar.mut

Downloads
Name Author Game Mode Rating
JJ2+ Only: Arcane WeaponsFeatured Download PurpleJazz Mutator 10 Download file

File preview

  1. #pragma name "Mortar Launcher"
  2. #pragma require "Mortar.j2a"
  3. #pragma require "f_gren4.wav"
  4.  
  5. bool gameIsActive() {
  6.         return jjGameState == GAME::STARTED || jjGameState == GAME::OVERTIME;
  7. }
  8.  
  9. void onLevelLoad() {
  10.         jjAnimSets[ANIM::CUSTOM[24]].load(0, "Mortar.j2a");
  11.         jjAnimations[jjAnimSets[ANIM::AMMO] + 34] = jjAnimations[jjAnimSets[ANIM::CUSTOM[24]] + 1];
  12.         jjAnimations[jjAnimSets[ANIM::AMMO] + 33] = jjAnimations[jjAnimSets[ANIM::CUSTOM[24]] + 3];
  13.        
  14.         jjObjectPresets[OBJECT::SEEKERBULLET].behavior = jjObjectPresets[OBJECT::SEEKERBULLETPU].behavior = Mortar();
  15.         jjObjectPresets[OBJECT::SEEKERBULLET].xSpeed = 7;
  16.         jjObjectPresets[OBJECT::SEEKERBULLET].ySpeed = -9;
  17.         jjObjectPresets[OBJECT::SEEKERBULLETPU].xSpeed = 7;
  18.         jjObjectPresets[OBJECT::SEEKERBULLETPU].ySpeed = -10;
  19.         jjObjectPresets[OBJECT::SEEKERBULLET].counterEnd = 90;
  20.         jjObjectPresets[OBJECT::SEEKERBULLETPU].counterEnd = 105;
  21.        
  22.         jjObjectPresets[OBJECT::SEEKERAMMO15].determineCurAnim(ANIM::CUSTOM[24], 4);
  23.         jjObjectPresets[OBJECT::SEEKERAMMO15].determineCurFrame();
  24.        
  25.         jjObjectPresets[OBJECT::SEEKERPOWERUP].determineCurAnim(ANIM::CUSTOM[24], 5);
  26.         jjObjectPresets[OBJECT::SEEKERPOWERUP].determineCurFrame();
  27.        
  28.         jjWeapons[WEAPON::SEEKER].defaultSample = false;
  29.        
  30.         jjSampleLoad(SOUND::P2_TONG, "f_gren4.wav");
  31. }
  32.  
  33. class Mortar : jjBEHAVIORINTERFACE {
  34.         void onBehave(jjOBJ@ obj) {
  35.                 obj.behave(obj.state == STATE::EXPLODE? BEHAVIOR::RFBULLET : BEHAVIOR::BULLET, false);
  36.                 jjPLAYER@ creator = jjPlayers[obj.creatorID];
  37.                 obj.var[0] = int(atan2(-obj.ySpeed, obj.xSpeed) * (512.f * 0.318309886142228f));
  38.                 obj.var[5] = obj.eventID == OBJECT::SEEKERBULLETPU? 2:1;
  39.                
  40.                 switch (obj.state) {
  41.                         case STATE::START:
  42.                                 obj.state = STATE::FLY;
  43.                                 obj.lightType = LIGHT::POINT;
  44.                                 obj.var[2] = 0;
  45.                         break;
  46.                        
  47.                         case STATE::FLY:
  48.                                 if (obj.counter == 1 && creator.isLocal) {
  49.                                         jjSample(creator.xPos, creator.yPos, SOUND::P2_TONG, 0, 0);
  50.                                 }
  51.                                
  52.                                 jjDrawRotatedSprite(obj.xPos, obj.yPos, ANIM::CUSTOM[24], obj.eventID == OBJECT::SEEKERBULLETPU? 2:0, jjGameTicks >> 2, obj.var[0], 0.75, 0.75, SPRITE::NORMAL);
  53.                                
  54.                                 if (obj.counter % 5 == 0 && !jjLowDetail) {
  55.                                         jjOBJ@ trail = jjObjects[jjAddObject(OBJECT::EXPLOSION, int(obj.xPos - jjCos(obj.var[0])), int(obj.yPos - jjSin(obj.var[0])))];
  56.                                         trail.determineCurAnim(ANIM::AMMO, 3);
  57.                                         trail.lightType = LIGHT::NONE;
  58.                                         trail.playerHandling = HANDLING::PARTICLE;
  59.                                         trail.bulletHandling = HANDLING::IGNOREBULLET;
  60.                                         trail.isBlastable = false;
  61.                                 }
  62.                                
  63.                                 switch (obj.direction) {
  64.                                         case 1: obj.xSpeed -= 0.275; obj.ySpeed += 0.225; break;
  65.                                         case -1: obj.xSpeed += 0.275; obj.ySpeed += 0.225; break;
  66.                                 }
  67.                                 if (obj.xSpeed == 0) obj.ySpeed += 0.3;
  68.                                 if (obj.ySpeed > 12) obj.ySpeed = 12;
  69.                         break;
  70.                        
  71.                         case STATE::EXPLODE:
  72.                                 jjDrawResizedSprite(obj.xPos, obj.yPos, ANIM::AMMO, 5, obj.curFrame + 5, 2, 2, SPRITE::NORMAL);
  73.                        
  74.                                 if (obj.var[2] == 0) {
  75.                                         Shockwave temp;
  76.                                         jjOBJ@ blast = jjObjects[jjAddObject(OBJECT::BULLET, obj.xPos, obj.yPos, obj.creatorID, CREATOR::PLAYER, jjVOIDFUNCOBJ(temp.onBehave))];
  77.                                         obj.var[2] = 1;
  78.                                         blast.var[2] = 1;
  79.                                         blast.var[5] = obj.var[5];
  80.                                 }
  81.                         break;
  82.                 }
  83.         }
  84. }
  85.  
  86. class Shockwave : jjBEHAVIORINTERFACE {
  87.         void onBehave(jjOBJ@ obj) {
  88.                 jjPLAYER@ creator = jjPlayers[obj.creatorID];
  89.                
  90.                 obj.playerHandling = HANDLING::PARTICLE;
  91.                 obj.bulletHandling = HANDLING::IGNOREBULLET;
  92.                 obj.animSpeed = 1;
  93.                
  94.                 if (obj.var[2] == 1) {
  95.                         obj.lightType = obj.var[2] == 1? LIGHT::RING2 : LIGHT::NONE;
  96.                         obj.var[1] = obj.var[1] + 1;
  97.                         obj.light += 2;
  98.                         obj.var[4] = obj.light * 4;
  99.                        
  100.                         for (int i = 1; i < jjObjectCount; i++) {
  101.                                 jjOBJ@ target = jjObjects[i];
  102.                                 float dx = target.xPos - obj.xPos, dy = target.yPos - obj.yPos;
  103.                                 if ((target.eventID == OBJECT::TNT || target.behavior == BEHAVIOR::MONITOR || target.behavior == BEHAVIOR::AMMO15 || target.eventID == OBJECT::GUNCRATE || target.eventID == OBJECT::GEMCRATE || target.eventID == OBJECT::CARROTCRATE || target.playerHandling == HANDLING::ENEMY || target.eventID == OBJECT::DESTRUCTSCENERY) && target.var[4] == 0) {
  104.                                         if (dx * dx + dy * dy < obj.var[4] * obj.var[4]) {
  105.                                                 if (target.eventID != OBJECT::TNT) {
  106.                                                         obj.objectHit(target, target.playerHandling == HANDLING::ENEMY? HANDLING::ENEMY : HANDLING::SPECIAL);
  107.                                                         if (target.playerHandling != HANDLING::ENEMY) target.state = STATE::KILL;
  108.                                                 }
  109.                                                 else target.state = STATE::EXPLODE;
  110.                                                 if (target.playerHandling != HANDLING::ENEMY) target.var[4] = 1;
  111.                                         }
  112.                                         else target.var[4] = 0;
  113.                                 }
  114.                                 else if ((target.behavior == BEHAVIOR::PICKUP || target.eventID == OBJECT::TNTAMMO3 || target.eventID == OBJECT::GUN9AMMO3) && target.state == STATE::FLOAT) {
  115.                                         if (dx * dx + dy * dy < obj.var[4] * obj.var[4])
  116.                                                 target.state = STATE::FLOATFALL;
  117.                                 }
  118.                         }
  119.                        
  120.                         float pdx = jjLocalPlayers[0].xPos - obj.xPos, pdy = jjLocalPlayers[0].yPos - obj.yPos;
  121.                         if ((pdx * pdx + pdy * pdy < 64 * 64) && obj.curFrame < 2105) {
  122.                                 jjLocalPlayers[0].xSpeed = jjLocalPlayers[0].xPos > obj.xPos? 8:-8;
  123.                                 jjLocalPlayers[0].ySpeed = jjLocalPlayers[0].yPos > obj.yPos? 8:-8;
  124.                         }
  125.                        
  126.                         if (jjIsServer && gameIsActive()) {
  127.                                 for (int i = 0; i < 32; i++) {
  128.                                         jjPLAYER@ player = jjPlayers[i];
  129.                                         if (
  130.                                                 player.isActive && player.isInGame && player.health > 0 && player !is creator && creator.blink == 0 &&
  131.                                                         (jjGameMode != GAME::CTF || jjFriendlyFire || player.team != creator.team)
  132.                                         ) {
  133.                                                 float dx = player.xPos - obj.xPos, dy = player.yPos - obj.yPos;
  134.                                                 if (dx * dx + dy * dy < obj.var[4] * obj.var[4]) {
  135.                                                         if (obj.var[8] & 1 << i == 0) {
  136.                                                                 player.hurt(obj.var[5], false, creator);
  137.                                                                 obj.var[8] = obj.var[8] | 1 << i;
  138.                                                         }
  139.                                                 }
  140.                                         }
  141.                                 }
  142.                         }
  143.                 }
  144.                
  145.                 if (obj.var[1] == 14) {
  146.                         obj.var[1] = 0;
  147.                         obj.var[2] = 0;
  148.                         obj.var[4] = 0;
  149.                         obj.delete();
  150.                 }
  151.         }
  152. }
  153.