Downloads containing ab22btl08.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: Anniversary Bash 22 levels Jazz2Online Multiple N/A Download file

File preview

  1. const bool MLLESetupSuccessful = MLLE::Setup(array<MLLEWeaponApply@> = {null, null, BubbleGun::Weapon(), null, null, null, null, null, null}); ///@MLLE-Generated
  2. #include "MLLE-Include-1.5w.asc" ///@MLLE-Generated
  3. #pragma require "ab22btl08-MLLE-Data-1.j2l" ///@MLLE-Generated
  4. #pragma require "ab22btl08.j2l" ///@MLLE-Generated
  5. #include "BubbleGun.asc" ///@MLLE-Generated
  6. #pragma require "BubbleGun.asc" ///@MLLE-Generated
  7. #include "invisibilitycarrot.asc"
  8. #pragma require "caveambience3.wav"
  9. #pragma require "fan_sm4.wav"
  10. #pragma require "mloop2.wav"
  11. #pragma require "amb_puls.wav"
  12.  
  13. int sample = 0;
  14.  
  15. bool createFish = true;
  16.  
  17. array<OBJECT::Object> fishObjects = {
  18.         OBJECT::APPLE, //0,
  19.         OBJECT::BANANA, //1
  20.         OBJECT::BURGER, //2
  21.         OBJECT::CAKE, //3
  22.         OBJECT::CANDY, //4
  23.         OBJECT::CHERRY, //5
  24.         OBJECT::CUPCAKE, //6
  25.         OBJECT::DONUT, //7
  26.         OBJECT::FRIES, //8
  27.         OBJECT::GRAPES, //9
  28.         OBJECT::HAM, //10
  29.         OBJECT::THING //11
  30. };
  31.  
  32. array<uint> fishToSpawn = {
  33.         2,3,4,1,2,2,1,7,3,1,2,1
  34. };
  35.  
  36. void onLevelLoad() {
  37.         jjWaterLayer = 8;
  38.         jjSetWaterGradient(0, 15, 45, 0, 15, 45);
  39.         jjWaterLighting = WATERLIGHT::GLOBAL;
  40.        
  41.         jjTexturedBGTexture = TEXTURE::XARGON;
  42.        
  43.         jjUseLayer8Speeds = true;
  44.         jjTexturedBGFadePositionY = 0.65;
  45.  
  46.         for (uint i = 0; i < fishObjects.length(); i++) {
  47.                 jjObjectPresets[fishObjects[i]].behavior = AmbientFish();
  48.                 jjObjectPresets[fishObjects[i]].special = i;
  49.         }
  50.         jjAnimSets[ANIM::FISH].load();
  51.         jjObjectPresets[OBJECT::WEENIE].behavior = AmbientFish();
  52.        
  53.         jjObjectPresets[OBJECT::LEMON].behavior = FishSpawner();
  54.         jjObjectPresets[OBJECT::LEMON].playerHandling = HANDLING::PARTICLE;
  55.         jjObjectPresets[OBJECT::LEMON].bulletHandling = HANDLING::IGNOREBULLET;
  56.         jjObjectPresets[OBJECT::LEMON].isBlastable = false;
  57.        
  58.         jjObjectPresets[OBJECT::CRAB].behavior = AmbientCrab();
  59.         jjAnimSets[ANIM::UTERUS].load();
  60.        
  61.         InvisibilityCarrot::loadPresets(OBJECT::FASTFEET);
  62.         InvisibilityCarrot::invisibilityTime = 30*70;
  63.        
  64.         jjObjectPresets[OBJECT::BLASTERPOWERUP].direction = 0;
  65.         jjObjectPresets[OBJECT::BOUNCERPOWERUP].direction = jjObjectPresets[OBJECT::ICEPOWERUP].direction = -1;
  66.        
  67.         jjSampleLoad(SOUND::WIND_WIND2A, "fan_sm4.wav");
  68.         jjSampleLoad(SOUND::SCIENCE_PLOPKAOS, "caveambience3.wav");
  69.         jjSampleLoad(SOUND::COMMON_DRINKSPAZZ1, "amb_puls.wav");
  70.         jjSampleLoad(SOUND::COMMON_DRINKSPAZZ3, "mloop2.wav");
  71.        
  72.         generateCustomSpringSprites(jjAnimSets[ANIM::CUSTOM[0]], array<uint> = {40, 88, 48});
  73.        
  74.         generateFishSprites(jjAnimSets[ANIM::CUSTOM[1]]);
  75.         colorFishSprites(0, array<uint> = {32, 80, 48});
  76.         colorFishSprites(1, array<uint> = {16, 40, 88});
  77.         colorFishSprites(2, array<uint> = {24, 72, 40});
  78.         colorFishSprites(3, array<uint> = {31, 56, 80});
  79.         colorFishSprites(4, array<uint> = {40, 32, 48});
  80.         colorFishSprites(5, array<uint> = {88, 32, 16});
  81.         colorFishSprites(6, array<uint> = {72, 24, 40});
  82.         colorFishSprites(7, array<uint> = {71, 64, 48});
  83.         colorFishSprites(8, array<uint> = {48, 32, 88});
  84.         colorFishSprites(10, array<uint> = {80, 16, 56});
  85.         colorFishSprites(11, array<uint> = {56, 56, 56});
  86.        
  87.         turnIntoCustomSpring(jjObjectPresets[OBJECT::FROZENSPRING], 0, 19.75f, false);
  88.        
  89.         jjObjectPresets[OBJECT::REDSPRING].ySpeed = jjObjectPresets[OBJECT::REDSPRING].ySpeed - 0.5;
  90.        
  91.         jjWeapons[WEAPON::GUN8].comesFromGunCrates =
  92.         jjWeapons[WEAPON::GUN9].comesFromGunCrates = true;
  93.        
  94.         jjWeapons[WEAPON::SEEKER].comesFromGunCrates = false;
  95.        
  96.         jjWeapons[WEAPON::ICE].gradualAim = true;
  97.        
  98.         jjObjectPresets[OBJECT::AMBIENTSOUND].behavior = AmbientSound();
  99. }
  100.  
  101. void onLevelBegin() {
  102.         uint a, b, c, d;
  103.         jjLocalPlayers[0].furGet(a, b, c, d);
  104.         switch (jjLocalPlayers[0].charCurr) {
  105.                 case CHAR::JAZZ:
  106.                         colorFishSprites(9, array<uint> = {a, b, d});
  107.                         break;
  108.                 case CHAR::SPAZ:
  109.                         colorFishSprites(9, array<uint> = {b, d, c});
  110.                         break;
  111.                 case CHAR::LORI:
  112.                         colorFishSprites(9, array<uint> = {d, a, c});
  113.                         break;
  114.                 default:
  115.                         colorFishSprites(9, array<uint> = {a, b, c});
  116.                         break;
  117.         }
  118.        
  119.         jjANIMATION@ animDopefish = jjAnimations[jjObjectPresets[OBJECT::WEENIE].curAnim];
  120.         animDopefish.frameCount = 1;
  121.         jjANIMFRAME@ frameDopefish = jjAnimFrames[animDopefish.firstFrame];
  122.         jjPIXELMAP dopefish(114*32, 95*32, 32, 32, 4);
  123.         dopefish.save(frameDopefish);
  124.         frameDopefish.hotSpotX = -frameDopefish.width / 2;
  125.         frameDopefish.hotSpotY = -frameDopefish.height / 2;
  126. }
  127.  
  128. jjANIMSET@ customSpringSprite;
  129. array<int> fastCustomSpringSpeeds(jjLocalPlayerCount);
  130. bool generateCustomSpringSprites(jjANIMSET@ anim, const array<uint> &in colors) {
  131.         int length = colors.length();
  132.         bool success = (@customSpringSprite = anim).allocate(array<uint>(length * 3, 5)) !is null;
  133.         if (success) {
  134.                 uint srcSet = jjAnimSets[ANIM::SPRING];
  135.                 for (int i = 0; i < length; i++) {
  136.                         uint color = colors[i];
  137.                         uint destAnimOffset = anim + i * 3;
  138.                         for (int j = 0; j < 3; j++) {
  139.                                 uint srcAnim = jjAnimations[srcSet + j];
  140.                                 uint destAnim = jjAnimations[destAnimOffset + j];
  141.                                 for (int k = 0; k < 5; k++) {
  142.                                         jjPIXELMAP image(jjAnimFrames[destAnim + k] = jjAnimFrames[srcAnim + k]);
  143.                                         int width = image.width;
  144.                                         int height = image.height;
  145.                                         for (int l = 0; l < height; l++) {
  146.                                                 for (int m = 0; m < width; m++) {
  147.                                                         int pixel = image[m, l];
  148.                                                         if (pixel >= 32 && pixel < 40)
  149.                                                                 image[m, l] = color + (pixel & 7);
  150.                                                 }
  151.                                         }
  152.                                         if (!image.save(jjAnimFrames[destAnim + k]))
  153.                                                 return false;
  154.                                 }
  155.                         }
  156.                 }
  157.         }
  158.         return success;
  159. }
  160. void initializeCustomSpring(jjOBJ@ obj) {
  161.         int anim = obj.curAnim;
  162.         obj.behave(obj.behavior = BEHAVIOR::SPRING, false);
  163.         if (obj.curAnim != anim) {
  164.                 obj.curAnim = anim + 2;
  165.                 obj.determineCurFrame();
  166.         }
  167.         obj.draw();
  168. }
  169. void turnIntoCustomSpring(jjOBJ@ obj, uint color, float power, bool horizontal) {
  170.         if (horizontal) {
  171.                 obj.xSpeed = power;
  172.                 obj.ySpeed = 0.f;
  173.         } else {
  174.                 obj.xSpeed = 0.f;
  175.                 obj.ySpeed = -power;
  176.                 if (obj.state == STATE::START && obj.creatorType == CREATOR::LEVEL) {
  177.                         int x = int(obj.xPos) >> 5;
  178.                         int y = int(obj.yPos) >> 5;
  179.                         if (jjParameterGet(x, y, 0, 1) != 0) {
  180.                                 jjParameterSet(x, y, 0, 1, 0);
  181.                                 obj.yPos -= 4.f;
  182.                                 obj.ySpeed = power;
  183.                         }
  184.                 }
  185.         }
  186.         obj.behavior = initializeCustomSpring;
  187.         obj.curAnim = customSpringSprite + color * 3 + (horizontal ? 1 : 0);
  188.         obj.energy = obj.frameID = obj.freeze = obj.justHit = obj.light = obj.points = 0;
  189.         obj.isBlastable = obj.isTarget = obj.scriptedCollisions = obj.triggersTNT = false;
  190.         obj.deactivates = obj.isFreezable = true;
  191.         obj.bulletHandling = HANDLING::IGNOREBULLET;
  192.         obj.playerHandling = HANDLING::SPECIAL;
  193.         obj.lightType = LIGHT::NORMAL;
  194.         obj.determineCurFrame();
  195. }
  196.  
  197. class AmbientSound : jjBEHAVIORINTERFACE {
  198.         void onBehave(jjOBJ@ sound) {
  199.                 sound.behave(jjLowDetail && jjGameTicks >= 2? BEHAVIOR::INACTIVE : BEHAVIOR::AMBIENTSOUND, false);
  200.         }
  201. }
  202.  
  203. bool inView(const jjOBJ@ obj) {
  204.         for (int i = 0; i < jjLocalPlayerCount; i++) {
  205.                 const jjPLAYER@ play = jjLocalPlayers[i];
  206.                 if (obj.xPos > play.cameraX - 512 && obj.yPos > play.cameraY - 256 && obj.xPos < play.cameraX + jjSubscreenWidth + 512 && obj.yPos < play.cameraY + jjSubscreenHeight + 256)
  207.                         return true;
  208.         }
  209.         return false;
  210. }
  211.  
  212. void generateFishSprites(jjANIMSET@ anim) {    
  213.         uint srcSet = jjAnimSets[ANIM::FISH];
  214.         anim.allocate(array<uint>(fishObjects.length(), 6));
  215.         for (uint i = 0; i < fishObjects.length(); i++) {
  216.                 uint srcAnim = jjAnimations[srcSet + 1];
  217.                 uint destAnim = jjAnimations[anim + i];
  218.                 for (int j = 0; j < 6; j++) {
  219.                         jjPIXELMAP image(jjAnimFrames[destAnim + j] = jjAnimFrames[srcAnim + j]);
  220.                         image.save(jjAnimFrames[destAnim + j]);
  221.                 }
  222.         }
  223. }
  224.  
  225. void colorFishSprites(uint src, const array<uint> &in colors) {
  226.     int length = colors.length();
  227.         jjANIMATION@ anim = jjAnimations[jjAnimSets[ANIM::CUSTOM[1]] + src];
  228.     for (int i = 0; i < 6; i++) {
  229.         jjPIXELMAP image(jjAnimFrames[anim + i]);
  230.         int width = image.width;
  231.         int height = image.height;
  232.         for (int y = 0; y < height; y++) {
  233.             for (int x = 0; x < width; x++) {
  234.                 int pixel = image[x, y];
  235.                 if (pixel >= 32 && pixel < 40) {
  236.                                         image[x, y] = colors[0] + (pixel & 7);
  237.                                 }
  238.                                 if (pixel >= 80 && pixel < 88) {
  239.                     image[x, y] = colors[1] + (pixel & 7);
  240.                                 }
  241.                                 if (pixel >= 48 && pixel < 56) {
  242.                     image[x, y] = colors[2] + (pixel & 7);
  243.                 }
  244.             }
  245.                         image.save(jjAnimFrames[anim + i]);
  246.         }
  247.     }
  248. }
  249.  
  250. class AmbientFish : jjBEHAVIORINTERFACE {
  251.         float size, xOffset, yOffset;
  252.         bool cosine;
  253.        
  254.         void onBehave(jjOBJ@ obj) {
  255.                 switch (obj.eventID) {
  256.                         case OBJECT::APPLE:
  257.                                 obj.xSpeed = 1;
  258.                                 obj.ySpeed = 60;
  259.                                 size = 1;
  260.                                 xOffset = 48;
  261.                                 yOffset = 24;
  262.                                 cosine = true;
  263.                                 break;
  264.                         case OBJECT::BANANA:
  265.                                 obj.xSpeed = 1.25;
  266.                                 obj.ySpeed = 80;
  267.                                 size = 0.85;
  268.                                 xOffset = 24;
  269.                                 yOffset = 16;
  270.                                 cosine = false;
  271.                                 break;
  272.                         case OBJECT::BURGER:
  273.                                 obj.xSpeed = 1.5;
  274.                                 obj.ySpeed = 15;
  275.                                 size = 0.75;
  276.                                 xOffset = 48;
  277.                                 yOffset = 24;
  278.                                 cosine = true;
  279.                                 break;
  280.                         case OBJECT::CAKE:
  281.                                 obj.xSpeed = 0.75;
  282.                                 obj.ySpeed = 25;
  283.                                 size = 2;
  284.                                 xOffset = 48;
  285.                                 yOffset = 24;
  286.                                 cosine = false;
  287.                                 break;
  288.                         case OBJECT::CANDY:
  289.                                 obj.xSpeed = 1.2;
  290.                                 obj.ySpeed = 100;
  291.                                 size = 1.5;
  292.                                 xOffset = 48;
  293.                                 yOffset = 24;
  294.                                 cosine = true;
  295.                                 break;
  296.                         case OBJECT::CHERRY:
  297.                                 obj.xSpeed = 1.25;
  298.                                 obj.ySpeed = 70;
  299.                                 size = 1.33;
  300.                                 xOffset = 48;
  301.                                 yOffset = 24;
  302.                                 cosine = false;
  303.                                 break;
  304.                         case OBJECT::CUPCAKE:
  305.                                 obj.xSpeed = 0.45;
  306.                                 obj.ySpeed = 15;
  307.                                 size = 2.25;
  308.                                 xOffset = 88;
  309.                                 yOffset = 64;
  310.                                 cosine = true;
  311.                                 break;
  312.                         case OBJECT::DONUT:
  313.                                 obj.xSpeed = 2.5;
  314.                                 obj.ySpeed = 140;
  315.                                 size = 0.5;
  316.                                 xOffset = 16;
  317.                                 yOffset = 8;
  318.                                 cosine = true;
  319.                                 break;
  320.                         case OBJECT::FRIES:
  321.                                 obj.xSpeed = 0.9;
  322.                                 obj.ySpeed = 75;
  323.                                 size = 1;
  324.                                 xOffset = 48;
  325.                                 yOffset = 24;
  326.                                 cosine = true;
  327.                                 break;
  328.                         case OBJECT::GRAPES:
  329.                                 obj.xSpeed = 1;
  330.                                 obj.ySpeed = 60;
  331.                                 size = 1;
  332.                                 xOffset = 48;
  333.                                 yOffset = 24;
  334.                                 cosine = false;
  335.                                 break;
  336.                         case OBJECT::HAM:
  337.                                 obj.xSpeed = 0.9;
  338.                                 obj.ySpeed = 50;
  339.                                 size = 1.2;
  340.                                 xOffset = 56;
  341.                                 yOffset = 32;
  342.                                 cosine = true;
  343.                                 break;
  344.                         case OBJECT::THING:
  345.                                 obj.xSpeed = 0.5;
  346.                                 obj.ySpeed = 10;
  347.                                 size = 2;
  348.                                 xOffset = 0;
  349.                                 yOffset = 0;
  350.                                 cosine = false;
  351.                                 obj.lightType = LIGHT::LASER;
  352.                                 obj.light = 15;
  353.                                 break;
  354.                         case OBJECT::WEENIE:
  355.                                 obj.xSpeed = 0.5;
  356.                                 obj.ySpeed = 30;
  357.                                 size = 1;
  358.                                 xOffset = 0;
  359.                                 yOffset = 0;
  360.                                 cosine = false;
  361.                                 break;
  362.                 }
  363.                
  364.                 if (jjEventGet(int(obj.xPos/32), int(obj.yPos/32)) == AREA::PATH) {
  365.                         obj.direction *= -1;
  366.                 }
  367.                
  368.                 if (obj.counter == 0) {
  369.                         obj.xPos = obj.xPos + (jjRandom()%2 == 0? xOffset:-xOffset);
  370.                         obj.yPos = obj.yPos + (jjRandom()%2 == 0? yOffset:-yOffset);
  371.                         if (jjEventGet(int(obj.xPos/32), int(obj.yPos/32)) == AREA::PATH) {
  372.                                 obj.delete();
  373.                         }
  374.                         obj.direction = jjRandom()%2 == 0? 1:-1;
  375.                         obj.age = jjRandom()%6;
  376.                         obj.counter = 1;
  377.                 }
  378.                
  379.                 obj.xPos = obj.xPos + (obj.age * 0.15 * obj.direction) + (obj.xSpeed * obj.direction);
  380.                
  381.                 obj.bulletHandling = HANDLING::IGNOREBULLET;
  382.                 obj.playerHandling = HANDLING::PARTICLE;
  383.                 obj.deactivates = obj.triggersTNT = obj.isTarget = obj.isBlastable = obj.isFreezable = false;
  384.                
  385.                 if (!inView(obj) || !createFish) {
  386.                         obj.delete();
  387.                 }
  388.         }
  389.  
  390.         void onDraw(jjOBJ@ obj) {
  391.                 if (!jjLowDetail && createFish && inView(obj)) {
  392.                         jjDrawResizedSprite(
  393.                                 int(obj.xPos),
  394.                                 int(obj.yPos + (cosine? jjCos(jjGameTicks) * obj.ySpeed : jjSin(jjGameTicks) * obj.ySpeed)),
  395.                                 obj.eventID == OBJECT::WEENIE? ANIM::PICKUPS : ANIM::CUSTOM[1],
  396.                                 obj.eventID == OBJECT::WEENIE? 91 : obj.special,
  397.                                 jjGameTicks / 10 % 6,
  398.                                 size * obj.direction * (obj.eventID == OBJECT::WEENIE? -1:1),
  399.                                 size,
  400.                                 obj.eventID == OBJECT::THING || obj.eventID == OBJECT::WEENIE || jjColorDepth == 8? SPRITE::NORMAL : SPRITE::TINTED,
  401.                                 152,
  402.                                 10,
  403.                                 10
  404.                         );
  405.                 }
  406.         }
  407. }
  408.  
  409. class FishSpawner : jjBEHAVIORINTERFACE {
  410.         void onBehave(jjOBJ@ obj) {
  411.                 if (obj.state == STATE::START && inView(obj) && createFish) {
  412.                         if (jjRandom()%500 == 0) {
  413.                                 spawnFish(obj, (jjRandom()%4 == 0? OBJECT::WEENIE : OBJECT::THING), 1);
  414.                         } else {
  415.                                 uint rand = jjRandom()%(fishObjects.length() - 1);
  416.                                 if (rand == 6) {
  417.                                         if (jjRandom()% 2 == 0) spawnFish(obj, fishObjects[rand], fishToSpawn[rand]);
  418.                                 } else {
  419.                                         spawnFish(obj, fishObjects[rand], fishToSpawn[rand]);
  420.                                 }
  421.                                 obj.state = STATE::DONE;
  422.                         }
  423.                 }
  424.                 if (!inView(obj) || !createFish) {
  425.                         obj.state = STATE::START;
  426.                 }
  427.         }
  428.         void spawnFish(jjOBJ@ obj, OBJECT::Object fishEvent, uint num) {
  429.                 for (uint i = 0; i < num; i++) {
  430.                         uint randX = int(obj.xPos - 192) + ((jjRandom()%32)*12);
  431.                         uint randY = int(obj.yPos - 64 + ((jjRandom()%32)*4));
  432.                         if (jjEventGet((randX/32), (randY/32)) != AREA::PATH) {
  433.                                 jjOBJ@ fish = jjObjects[jjAddObject(fishEvent, randX, randY, obj.creatorID, CREATOR::OBJECT)];
  434.                         }
  435.                 }
  436.         }
  437. }
  438.  
  439. class AmbientCrab : jjBEHAVIORINTERFACE {
  440.         void onBehave(jjOBJ@ obj) {
  441.                 obj.behave(BEHAVIOR::WALKINGENEMY, false);
  442.                 obj.bulletHandling = HANDLING::IGNOREBULLET;
  443.                 obj.playerHandling = HANDLING::PARTICLE;
  444.                 if (!jjLowDetail && createFish && inView(obj)) {
  445.                         jjDrawResizedSpriteFromCurFrame(obj.xPos, int(obj.yPos + 8), obj.curFrame, 1 * obj.direction, 1, SPRITE::SINGLECOLOR, 152, 10, 10);
  446.                         jjDrawResizedSpriteFromCurFrame(obj.xPos, int(obj.yPos + 8), obj.curFrame, 1 * obj.direction, 1, SPRITE::TRANSLUCENTSINGLEHUE, 72, 10, 10);
  447.                 }
  448.         }
  449. }
  450.  
  451. void onDrawLayer4(jjPLAYER@, jjCANVAS@ canvas) {
  452.         jjSetWaterLevel(16000, true);
  453.         InvisibilityCarrot::drawPlayers();
  454. }
  455.  
  456. void onDrawLayer5(jjPLAYER@ play, jjCANVAS@ canvas) {
  457.         jjSetWaterLevel(-32, true);
  458. }
  459.  
  460. void onPlayer(jjPLAYER@ play) {
  461.         if (!jjLowDetail) {
  462.                 if (jjGameTicks > 7) {
  463.                         sample = jjSampleLooped(play.xPos, play.yPos, SOUND::SCIENCE_PLOPKAOS, sample, 40, 0);
  464.                 }
  465.         }
  466.        
  467.         InvisibilityCarrot::playerSettings(play);
  468.        
  469.         play.lighting = jjColorDepth == 8? 110:100;
  470.         jjEnforceLighting = jjColorDepth == 8? LIGHT::COMPLETE : LIGHT::OPTIONAL;
  471. }
  472.  
  473. void onMain() {
  474.         for (int i = 1; i < jjObjectCount; i++) {
  475.         jjOBJ@ obj = jjObjects[i];
  476.         if (obj.eventID == OBJECT::ICEBULLETPU && obj.xSpeed > -0.5 && obj.xSpeed < 0.5) {
  477.             obj.xSpeed = 0;
  478.         }
  479.     }
  480.        
  481.         array<jjLAYER@> layers = jjLayerOrderGet();
  482.         layers[6].hasTiles = jjColorDepth == 8? true:false;
  483.        
  484.         jjWaterLayer = jjColorDepth == 16? 9:99;
  485.         jjTexturedBGFadePositionY = jjLowDetail? 0.5 : jjColorDepth == 16? 0.65:0.9;
  486. }
  487.  
  488. bool onLocalChat(string &in text, CHAT::Type type) {
  489.         if (type == CHAT::NORMAL && text == "!fish on") {
  490.                 if (!createFish) createFish = true;
  491.                 jjAlert("|||Fish have been |||||ENABLED");
  492.                 return true;
  493.         }
  494.         else if (type == CHAT::NORMAL && text == "!fish off") {
  495.                 if (createFish) createFish = false;
  496.                 jjAlert("|||Fish have been ||||||DISABLED");
  497.                 return true;
  498.         }
  499.         else return false;
  500. }
  501.  
  502. bool onDrawAmmo(jjPLAYER@ player, jjCANVAS@ canvas) {
  503.         return MLLE::WeaponHook.drawAmmo(player, canvas);
  504. }
  505.  
  506. bool onDrawPlayerTimer(jjPLAYER@ play, jjCANVAS@ canvas) {
  507.         InvisibilityCarrot::drawTimer(play, canvas);
  508.         return true;
  509. }