home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / exploder.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  18.3 KB  |  749 lines

  1. //    Exploding chunk system created by Mackey McCandlish.
  2. //    
  3. //    Before level waittill prespawn "exec global/exploder.scr".
  4. //    
  5. //    Used in levels where stuff blows up.
  6. //    
  7. //    Create a script_object that is a "undestroyed" version of the thing that is supposed to blow up and targetname it "exploder"
  8. //
  9. //    Create a script_object that is a "destroyed" version of the thing that is supposed to blow up and targetname it
  10. //    "explodersmashed". They occupy the same physical space.
  11. //
  12. //    Create script_object chunks of geometry that are going to fly out of the destroyable object/building and place them in the
  13. //    places they're supposed to fly from. Make them near but not touching the geometry of the explodersmashed. Targetname them
  14. //    "exploderchunk".
  15. //    
  16. //    Create one script_origin for each exploderchunk and make the chunk target the origin the same way a jump pad would target
  17. //    the jump pad destination in Quake3.
  18. //    
  19. //    Create script_models with targetname "exploderfire" and the "model" value of the tiki you want to use. These will be tiki
  20. //    explosions that will go off.
  21. //
  22. //    Give all the chunks, smasheds, fires, and exploders the same #set value. Note you can have any number of smasheds, chunks, 
  23. //    fires, or exploders, but typically you only have one smashed and one exploder. The reason you would want multiple of any 
  24. //    of these is that you can give any of them a #pause value, and that will make it delay that long before occuring, so you 
  25. //    could create a multistage explosion.
  26. //    
  27. //    You can create an explodertrigger (with the same #set), or just do "thread global/exploder.scr::explode #" (# being the 
  28. //    #set value of the exploder in question).
  29. //    
  30.  
  31.  
  32. main:
  33. //end
  34.  
  35. level.exploderrepeat = 0
  36.  
  37.  
  38.     if (level.debug == NIL)
  39.         level.debug = 0
  40.  
  41.     if ($explodersmashed == NULL)
  42.         level.explodersmasheds = 0
  43.         else
  44.         level.explodersmasheds = $explodersmashed.size
  45.  
  46.     if (level.explodersmasheds > 0)
  47.     {
  48.         level.explodersmashed = exec global/makearray.scr $explodersmashed
  49.  
  50.         for (local.i=1;local.i<level.explodersmasheds+1;local.i++)
  51.         {
  52.             level.explodersmashed[local.i] hide
  53.             level.explodersmashed[local.i] notsolid
  54.  
  55.             if (level.explodersmashed[local.i].set == NIL)
  56.                 exec global/error.scr ("Error, ExploderSmashed at " + level.explodersmashed[local.i].origin + " has no #set") 1
  57.                 else
  58.                 println ("Spawned ExploderSmashed " + local.i)
  59.  
  60.         }
  61.     }
  62.  
  63.     if ($exploderchunk == NULL)
  64.         level.exploderchunks = 0
  65.         else
  66.         level.exploderchunks = $exploderchunk.size
  67.  
  68.     if (level.exploderchunks > 0)
  69.     {
  70.         level.exploderchunks = $exploderchunk.size
  71.         level.exploderchunk = exec global/makearray.scr $exploderchunk
  72.  
  73.         for (local.i=1;local.i<level.exploderchunks+1;local.i++)
  74.         {
  75.             if (level.exploderchunk[local.i].target == NIL)
  76.                 println "Error, ExploderChunk has no Target!!!"
  77.  
  78.             level.exploderchunk[local.i] hide
  79.             level.exploderchunk[local.i] notsolid
  80.             level.exploderchunk[local.i].org = level.exploderchunk[local.i].origin
  81.             level.exploderchunk[local.i].ang = level.exploderchunk[local.i].angles
  82.  
  83.             if (level.exploderchunk[local.i].set == NIL)
  84.                 exec global/error.scr ("Error, ExploderChunk at " + level.exploderchunk[local.i].origin + " has no #set") 1
  85.                 else
  86.                 println ("Spawned ExploderChunk " + local.i)
  87.  
  88.             if (!(level.exploderchunk[local.i].target) || (level.exploderchunk[local.i].target == NIL))
  89.                 exec global/error.scr ("Error, ExploderChunk at " + level.exploderchunk[local.i].origin + " has no target") 1
  90.  
  91.  
  92.  
  93.         }
  94.     }
  95.  
  96.     
  97.     if ($exploderfire == NULL)
  98.         level.exploderfires = 0
  99.         else
  100.         level.exploderfires = $exploderfire.size
  101.  
  102.     if (level.exploderfires > 0)
  103.     {
  104.         level.exploderfires = $exploderfire.size
  105.         level.exploderfire = exec global/makearray.scr $exploderfire
  106.  
  107.  
  108.         for (local.i=1;local.i<level.exploderfires+1;local.i++)
  109.         {
  110.  
  111.             if (level.exploderfire[local.i].model == NIL)
  112.                 exec global/error.scr ("Error, ExploderFire at " + level.exploderfire[local.i].origin + " has no model") 1
  113.             else
  114.             if (getcvar(debug) == "1")
  115.                 println ("ExploderFire has model " + level.exploderfire[local.i].model)
  116.  
  117.             level.exploderfire[local.i].mdl = level.exploderfire[local.i].model
  118.             level.exploderfire[local.i].model = "fx/dummy.tik"
  119.             level.exploderfire[local.i] notsolid
  120.  
  121.     /*
  122.             level.exploderfire[local.i].mdl = level.exploderfire[local.i].model
  123.             local.ent = spawn script_model
  124.             local.ent2 = level.exploderfire[local.i]
  125.             local.ent.origin = local.ent2.origin
  126.             local.ent.set = local.ent2.set
  127.             local.ent.mdl = local.ent2.mdl
  128.             local.ent.pause = local.ent2.pause
  129.             level.exploderfire[local.i] = local.ent
  130.             local.ent2 delete
  131.     */
  132. //            level.exploderfire[local.i].model = "fx/dummy.tik"
  133.  
  134.             
  135.              // "set" level.exploderfire[local.i].set
  136.  
  137.             if (level.exploderfire[local.i].set == NIL)
  138.                 exec global/error.scr ("Error, ExploderFire at " + level.exploderfire[local.i].origin + " has no #set") 1
  139.                 else
  140.                 println ("Spawned ExploderFire " + local.i)
  141.  
  142.         }
  143.     }
  144.  
  145.     if ($exploder == NULL)
  146.         level.exploders = 0
  147.         else
  148.         level.exploders = $exploder.size
  149.  
  150.     if (level.exploders > 0)
  151.     {
  152.         level.exploders = $exploder.size
  153.         level.exploder = exec global/makearray.scr $exploder
  154.  
  155.         for (local.i=1;local.i<level.exploders+1;local.i++)
  156.         {
  157.             
  158.             if (level.exploder[local.i].walkable == NIL)
  159.             {
  160.                 level.exploder[local.i] notsolid
  161.                 level.exploder[local.i] thread solidify
  162.             }
  163.  
  164.             thread fireinit level.exploder[local.i].set
  165. //            thread fireoff level.exploder[local.i].set
  166.  
  167.             if (level.exploder[local.i].set == NIL)
  168.                 exec global/error.scr ("Error, Exploder at " + level.exploder[local.i].origin + " has no #set") 1
  169.                 else
  170.                 println ("Spawned Exploder " + local.i)
  171.  
  172.         }
  173.     }
  174.  
  175.  
  176.     if ($explodertrigger == NULL)
  177.         level.explodertriggers = 0
  178.         else
  179.         level.explodertriggers = $explodertrigger.size
  180.  
  181.     if (level.explodertriggers > 0)
  182.     {
  183.         level.explodertriggers = $explodertrigger.size
  184.         level.explodertrigger = exec global/makearray.scr $explodertrigger
  185.  
  186.         for (local.i=1;local.i<level.explodertriggers+1;local.i++)
  187.         {
  188.             level.explodertrigger[local.i] thread explodetrigger
  189.  
  190.             if (level.explodertrigger[local.i].set == NIL)
  191.                 exec global/error.scr ("Error, ExploderTrigger at " + level.explodertrigger[local.i].origin + " has no #set") 1
  192.                 else
  193.                 println ("Spawned ExploderTrigger " + local.i)
  194.  
  195.         }
  196.     }
  197.  
  198.     if (getcvar(exploders) == "0")
  199.         thread killexploders
  200.  
  201. end
  202.  
  203. killexploders:
  204.  
  205.     wait 3
  206.  
  207.     for (local.i=1;local.i<level.explodertriggers+1;local.i++)
  208.         level.explodertrigger[local.i] delete
  209.  
  210.     for (local.i=1;local.i<level.exploderchunks+1;local.i++)
  211.         level.exploderchunk[local.i] delete
  212.  
  213.     for (local.i=1;local.i<level.exploders+1;local.i++)
  214.         level.exploder[local.i] delete
  215.  
  216.     for (local.i=1;local.i<level.exploderfires+1;local.i++)
  217.         level.exploderfire[local.i] delete
  218.     
  219.  
  220. end
  221.  
  222.  
  223. solidify:
  224.     level waittill spawn
  225.     self solid
  226.     self disconnect_paths
  227.  
  228. end
  229.  
  230.  
  231. repeat:
  232. wait 2
  233. level.exploderrepeat = 0
  234. end
  235.  
  236.  
  237. explodetrigger:
  238.     level.explodertimer[self.set] = level.time
  239.     self waittill trigger
  240.     
  241.     if (level.time > level.explodertimer[self.set])
  242.     {
  243.         level.explodertimer[self.set] = level.time + 6
  244.         thread explode self.set
  245.     }
  246.     
  247.     if (level.exploderrepeat == 1)
  248.     {
  249.         wait 5
  250.         goto explodetrigger
  251.     }
  252. end
  253.  
  254. delayplaysound local.delay local.sound:
  255. wait local.delay
  256. self playsound (local.sound) 0 1 512
  257. end
  258.  
  259. firelight:
  260.     if (self.fire == NIL)
  261.     end
  262.  
  263.     local.r = 0.5 + randomfloat (0.8)
  264.     local.g = 0.4 + randomfloat (0.6)
  265.     
  266.     self lightRed (local.r)
  267.     self lightGreen (local.g)
  268.  
  269.     wait 0.2
  270.     goto firelight
  271. end
  272.  
  273.  
  274.  
  275. fireoff local.i:
  276. //            level.exploderfire[local.i] hide
  277. //            level.exploderfire[local.i] anim stop
  278. //            level.exploderfire[local.i] model "fx/dummy.tik"
  279.  
  280.  
  281.             if (level.exploderfire[local.i].fire != NIL)
  282.             {
  283.                 level.exploderfire[local.i] lightOff
  284.                 level.exploderfire[local.i] stoploopsound
  285.                 level.exploderfire[local.i].thread delete
  286.             }
  287. end
  288.  
  289.  
  290. fireoff2 local.name:
  291.  
  292.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  293.     {
  294.         if (level.exploderfire[local.i].set == local.name)
  295.         {
  296.             level.exploderfire[local.i] hide
  297.             level.exploderfire[local.i] model "fx/dummy.tik"
  298.  
  299.             if (level.exploderfire[local.i].fire != NIL)
  300.             {
  301.                 level.exploderfire[local.i] lightOff
  302.                 level.exploderfire[local.i] stoploopsound
  303.                 level.exploderfire[local.i].thread delete
  304.             }
  305.         }
  306.     }
  307.  
  308. end
  309.  
  310.  
  311. fireon local.i:
  312.             if (level.exploderfire[local.i].pause != NIL)
  313.                 wait level.exploderfire[local.i].pause
  314.  
  315.             if (level.exploderfire[local.i].damageradius != NIL)
  316.                 local.damageradius = level.exploderfire[local.i].damageradius
  317.             else
  318.                 local.damageradius = 512
  319.  
  320.             if (level.exploderfire[local.i].damage != NIL)
  321.                 radiusdamage level.exploderfire[local.i].origin level.exploderfire[local.i].damage local.damageradius
  322.  
  323.             if (getcvar(debug) == "1")
  324.                 println ("Model is " + level.exploderfire[local.i].mdl)
  325.  
  326. //            level.exploderfire[local.i] model level.exploderfire[local.i].mdl
  327. //            level.exploderfire[local.i] show
  328. //            level.exploderfire[local.i] rendereffects "+dontdraw"
  329. //            level.exploderfire[local.i] notsolid
  330.  
  331. //            level.exploderfire[local.i] anim start
  332.  
  333.             exec global/model.scr level.exploderfire[local.i].origin level.exploderfire[local.i].mdl
  334.             if (level.exploderfire[local.i].fire != NIL)
  335.             {
  336.                 level.exploderfire[local.i] lightOn    
  337.  
  338.                 if (randomint(100) > 50)
  339.                     level.exploderfire[local.i] loopsound "sound/environment/fire_small.wav" 1.5 256
  340.                 else
  341.                     level.exploderfire[local.i] loopsound "sound/environment/fire_big.wav" 1.5 256    
  342.  
  343.                 level.exploderfire[local.i] thread firelight
  344.                 level.exploderfire[local.i].thread = parm.previousthread
  345.             }
  346.  
  347. end
  348.  
  349. fireinit local.name:
  350.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  351.     {
  352.         if (level.exploderfire[local.i].set == local.name)
  353.         if (level.exploderfire[local.i].fire != NIL)
  354.         {
  355.             level.exploderfire[local.i] light (1.0 0.8 0.0)
  356.         }
  357.     }
  358.  
  359. end
  360.  
  361. explodersmashedON local.i:
  362.     if (level.explodersmashed[local.i].pause != NIL)
  363.         wait level.explodersmashed[local.i].pause
  364.  
  365.     if ( (level.explodersmashed[local.i].silent == NIL) || (level.explodersmashed[local.i].silent != 1 ) )
  366.         level.explodersmashed[local.i] playsound ("stonecrash0" + (randomint(3) + 1))
  367.     level.explodersmashed[local.i] show
  368.     level.explodersmashed[local.i] solid
  369.     waitframe
  370.     waitframe
  371.     level.explodersmashed[local.i] disconnect_paths
  372. end
  373.  
  374.  
  375. exploderchunkONN local.i:
  376.     if (level.exploderchunk[local.i].pause != NIL)
  377.         wait level.exploderchunk[local.i].pause
  378.         level.exploderchunk[local.i] show
  379.  
  380. end
  381.  
  382.  
  383. exploderOFF local.i:
  384.     if (level.exploder[local.i].pause != NIL)
  385.     wait level.exploder[local.i].pause
  386.  
  387.  
  388.     if (level.exploder[local.i].sound != NIL)
  389.         level.exploder[local.i] playsound level.exploder[local.i].sound
  390.  
  391.  
  392. //    println ("Hid exploder " + local.i)
  393.     level.exploder[local.i] hide
  394.     level.exploder[local.i] notsolid
  395.     level.exploder[local.i] connect_paths
  396.     if (level.exploder[local.i].exlodethread != NIL)
  397.     {
  398.         println ("****Running explode thread for exploder: " + level.exploder[local.i].set)
  399.         thread level.script::level.exploder[local.i].exlodethread
  400.     }
  401. end
  402.  
  403.  
  404.  
  405. explode local.name:
  406.  
  407.     if (getcvar(exploders) == "0")
  408.         end
  409.  
  410.     if (getcvar(debug) == "1")
  411.         println ("** Set off explosion with set #: " + local.name)
  412.  
  413. //    println ("explode " + local.name)
  414.         level.explodertimer[local.name] = level.time + 6
  415.  
  416.  
  417.     for (local.i=1;local.i<level.explodersmasheds+1;local.i++)
  418.     {
  419.         if (local.name == level.explodersmashed[local.i].set)
  420.         {
  421.             thread explodersmashedON local.i
  422.         }
  423.     }
  424.  
  425.     /*
  426.     for (local.i=1;local.i<level.exploderchunks+1;local.i++)
  427.     {
  428.         if (local.name == level.exploderchunk[local.i].set)
  429.         {
  430.             thread exploderchunkON local.i
  431.         }
  432.     }
  433.     */
  434.  
  435.     for (local.i=1;local.i<level.exploders+1;local.i++)
  436.     {
  437.         if (local.name == level.exploder[local.i].set)
  438.         {
  439.             thread exploderOFF local.i
  440.         }
  441.     }
  442.  
  443.  
  444.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  445.     {
  446.         if (level.exploderfire[local.i].set == local.name)
  447.         {
  448.             level.exploderfire[local.i] thread fireon local.i
  449.         }
  450.     }
  451.  
  452.  
  453.  
  454.  
  455.     for (local.i=1;local.i<level.exploderchunks+1;local.i++)
  456.     {
  457.         if (level.exploderchunk[local.i])
  458.         if (local.name == level.exploderchunk[local.i].set)
  459.         {
  460.             level.exploderchunk[local.i] thread explodechunk
  461.         }
  462.     }
  463.  
  464.     for (local.i=1;local.i<level.exploderfires+1;local.i++)
  465.     {
  466.         if (local.name == level.exploderfire[local.i].set)
  467.             level.exploderfire[local.i] thread fireoff local.i
  468.  
  469. //            level.exploderfire[local.i] thread fireoff level.exploderfire[local.i].set
  470.     }
  471.  
  472.  
  473.     if (level.exploderrepeat != 1)
  474.         end
  475.  
  476.     for (local.i=1;local.i<level.exploderchunks+1;local.i++)
  477.     {
  478.         if (local.name == level.exploderchunk[local.i].set)
  479.         {
  480.             level.exploderchunk[local.i] physics_off
  481.             level.exploderchunk[local.i].velocity = (0 0 0)
  482.             level.exploderchunk[local.i] hide
  483.             level.exploderchunk[local.i].origin = level.exploderchunk[local.i].org
  484.             level.exploderchunk[local.i].angles = level.exploderchunk[local.i].ang
  485.         }
  486.     }
  487.  
  488.  
  489.     wait 6
  490.  
  491.     for (local.i=1;local.i<level.exploders+1;local.i++)
  492.     {
  493.         if (local.name == level.exploder[local.i].set)
  494.         {
  495.             level.exploder[local.i] show
  496.             level.exploder[local.i] solid
  497.         }
  498.     }
  499.  
  500.     for (local.i=1;local.i<level.explodersmasheds+1;local.i++)
  501.         if (local.name == level.explodersmashed[local.i].set)
  502.         {
  503.             level.explodersmashed[local.i] hide
  504.             level.explodersmashed[local.i] notsolid
  505.         }
  506.  
  507.  
  508.     for (local.i=1;local.i<level.exploderfires+1;local.i++)
  509.     {
  510.         if (local.name == level.exploderfire[local.i].set)
  511.             level.exploderfire[local.i] thread fireoff local.i
  512.  
  513. //            level.exploderfire[local.i] thread fireoff level.exploderfire[local.i].set
  514.     }
  515.  
  516. end
  517.  
  518. phyvel local.vec:
  519.     self physics_velocity ( local.vec )
  520.     wait 0.2
  521.     self physics_on 1
  522.     self physics_velocity ( local.vec )
  523.  
  524. end
  525.  
  526. rocksound:
  527.  
  528.     if ( (self.silent == NIL) || (self.silent != 1 ) )
  529.     {
  530.         wait (1 + randomfloat(4))
  531.         self playsound ("stonesmall0" + (randomint(5) + 1))
  532.     }
  533.  
  534. end
  535.  
  536. moveitout local.num:
  537.  
  538.     local.num = local.num / 15
  539.     if ( local.num < -5 )
  540.        local.num = -5
  541.     if ( local.num > 5 )
  542.        local.num = 5
  543.     local.number = 1
  544.     while (local.number < 20)
  545.     {
  546.         local.number = local.number + 0.4
  547.         local.o = self.origin
  548.         if (local.num > 0)
  549.         local.o[2] = local.o[2] - local.num
  550.         else
  551.         local.o[2] = local.o[2] + local.num
  552.  
  553.         self.origin = local.o
  554.         waitframe
  555.     }
  556.  
  557. end
  558.  
  559.  
  560. explodetouch:
  561. self waittill touch
  562.  
  563. // if (parm.other == $world)
  564.     if (self != NULL)
  565.         thread moveitout self.velocity[2]
  566. //    self hide
  567. end
  568.  
  569.  
  570. explodechunk:
  571.     if (self.pause != NIL)
  572.     wait self.pause
  573.  
  574.     self show
  575.     self notsolid
  576.     local.vec = (self.origin - self.target.origin)
  577.     local.veclength = vector_length (local.vec)
  578.     local.vec = vector_normalize (local.vec)
  579.     local.vecscale = local.veclength * -1
  580.     local.vec[0] = local.vec[0] * local.vecscale
  581.     local.vec[1] = local.vec[1] * local.vecscale
  582.     local.vec[2] = local.vec[2] * (local.vecscale * 1.5)
  583.  
  584.     thread phyvel local.vec
  585.  
  586.     self thread explodetouch
  587.     self thread rocksound
  588.  
  589.     if (self.anglex == NIL)
  590.     self.anglex = 0
  591.  
  592.     if (self.angley == NIL)
  593.     self.angley = 0
  594.  
  595.     if (self.anglez == NIL)
  596.     self.anglez = 0
  597.  
  598.     if ((self.anglex == 0) && (self.angley == 0) && (self.anglez == 0))
  599.     {
  600.         if (self.origin[0] > self.target.origin[0])
  601.         local.xnum = self.origin[0] - self.target.origin[0]
  602.         else
  603.         local.xnum = self.target.origin[0] - self.origin[0]
  604.  
  605.         if (self.origin[1] > self.target.origin[1])
  606.         local.ynum = self.origin[1] - self.target.origin[1]
  607.         else
  608.         local.ynum = self.target.origin[1] - self.origin[1]
  609.  
  610.  
  611.         self.anglex = randomfloat(local.veclength / 3) * (randomint(3) - 1)
  612.         self.angley = randomfloat(local.veclength / 3) * (randomint(3) - 1)
  613.         self.anglez = randomfloat(local.veclength / 3) * (randomint(3) - 1)
  614.         
  615.         if (local.xnum > local.ynum)
  616.         { // was 1.5s
  617.             if (self.origin[0] > self.target.origin[0])
  618.                 self.anglex = local.veclength * -0.5 - (randomfloat(0.5))
  619.             else
  620.                 self.anglex = local.veclength * 0.5 + (randomfloat(0.5))
  621.         }
  622.         else
  623.         {
  624.             if (self.origin[1] > self.target.origin[1])
  625.                 self.anglez = local.veclength * 0.5  + (randomfloat(0.5))
  626.             else
  627.                 self.anglez = local.veclength * -0.5 - (randomfloat(0.5))
  628.         }
  629.  
  630.     }
  631.  
  632.         local.vec[0] = self.anglex
  633.         local.vec[1] = self.angley
  634.         local.vec[2] = self.anglez
  635.  
  636.         self rotatex local.vec[0]
  637.         self rotatey local.vec[1]
  638.         self rotatez local.vec[2]
  639.  
  640.     local.break = 0
  641.     local.breaker = 1.2
  642.  
  643. //    self thread removetouch
  644.  
  645.  
  646.     wait 0.5
  647.     local.inc = 10.0 + (randomint(15))
  648.     local.x = local.vec[0] / local.inc
  649.     local.y = local.vec[1] / local.inc
  650.     local.z = local.vec[2] / local.inc
  651.  
  652. //    thread moveitdown
  653.     
  654.     for (local.i = 0; local.i < local.inc; local.i++)
  655.     {
  656.         if (local.vec[0] > 0)
  657.         local.vec[0] = local.vec[0] - local.x
  658.         else
  659.         local.vec[0] = local.vec[0] - local.x
  660.  
  661.         if (local.vec[1] > 0)
  662.         local.vec[1] = local.vec[1] - local.y
  663.         else
  664.         local.vec[1] = local.vec[1] - local.y
  665.  
  666.         if (local.vec[2] > 0)
  667.         local.vec[2] = local.vec[2] - local.z
  668.         else
  669.         local.vec[2] = local.vec[2] - local.z
  670.  
  671.         self rotatex local.vec[0]
  672.         self rotatey local.vec[1]
  673.         self rotatez local.vec[2]
  674.  
  675.         waitframe
  676.     }
  677.     wait 10
  678.     
  679.     if (self != NULL)
  680.         self delete
  681.  
  682.     
  683. end
  684.  
  685. removetouch:
  686.     local.lastvelocity = self.velocity
  687.     local.lastvelocity2 = self.velocity
  688.  
  689.     local.break = 0
  690.     local.amount = 50
  691.     while (local.break == 0)
  692.     {
  693.         local.v = self.velocity
  694.         local.count = 0
  695.         for (local.i=0;local.i<3;local.i++)
  696.         {
  697.             if ((local.v[local.i] > local.amount * -1) && (local.v[local.i] < local.amount))
  698.                 local.count++
  699.         }
  700.         if (local.count > 2)
  701.             local.break = 1
  702.  
  703.         if (self.velocity == ( 0 0 0))
  704.             println "NO VELOCITY"
  705.  
  706.         local.lastvelocity2 = local.lastvelocity
  707.         local.lastvelocity = self.velocity
  708. //        println self.velocity
  709.         waitframe
  710.     }
  711.     self delete
  712.  
  713. end
  714.  
  715.  
  716. moveitdown:
  717.  
  718.     wait (2 + randomfloat(1.5))
  719.     local.number = 1
  720.     while (local.number < 20)
  721.     {
  722.         local.number = local.number + 0.4
  723.         local.o = self.origin
  724.         local.o[2] = local.o[2] - local.number
  725.         self.origin = local.o
  726.         waitframe
  727.     }
  728.  
  729. end
  730.  
  731.  
  732.  
  733.  
  734.  
  735. waitplaysound local.waiter local.sound local.chan local.vol local.range:
  736.     wait local.waiter
  737.     self playsound local.sound local.chan local.vol local.range
  738.     
  739. end
  740.  
  741.  
  742. /*
  743.     models/emitters/mortar_higgins
  744.     models/emitters/explosion_mine.tik
  745.     models/emitters/explosion_tank.tik
  746.     models/emitters/explosion_bombdirt.tik
  747.  
  748. */
  749.