Tomasm21

Sticky Bomb stuck action

May 1st, 2021 (edited)
35
30 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #library "SW"
  2. #include "zcommon.acs"
  3. #include "zdaemon.acs"
  4. Script 1053 (int num)
  5. {
  6. //.....
  7.     else if (num == 3)//Sticky Bomb (Stuck Bomb) sticks onto enemy or wall or ground
  8.     {
  9.         wait = 122; //88; 122;
  10.         setactorproperty(0,APROP_Alpha,1.0);
  11.         s_bomb = 21000+Various_tags[5];
  12.         thing_changetid(0,s_bomb); //Activator is Stuck Bomb
  13.         Various_tags[5] = Various_tags[5] + 1;
  14.         if (Various_tags[5] >= 999) Various_tags[5] = 0;
  15.         setactivatortotarget(0);
  16.         fem_war = activatorTID();//Female Warrior (sticky bomb Thrower) TID
  17.         setactivatortotarget(0);
  18.         target_tid = activatorTID();//Female warrior's target
  19.         //setactivator(fem_war);
  20.         int bombStuck = 0;
  21.         //Stuck bomb tries to attach to any closest actor and remains attached to it "wait" tics:
  22.         while (wait > 0)
  23.         {
  24.             stuckBombX = getactorx(s_bomb);
  25.             stuckBombY = getactory(s_bomb);
  26.             stuckBombZ = getactorz(s_bomb);
  27.                    
  28.             if(((getactorz(s_bomb) - getactorfloorz(s_bomb)) > 0)&&(bombStuck == 0))
  29.             {
  30.                 //Current target detection:
  31.                 targetx = getactorx(0);
  32.                 targety = getactory(0);
  33.                 targetz = getactorz(0);
  34.                 if(checkactorclass(0,"MageBoss") ||
  35.                    checkactorclass(0,"Wraith")) speed = 160.0;
  36.                 else speed = 96.0;
  37.                 if ((targetx < stuckBombX+speed)&&(targetx > stuckBombX-speed)&&
  38.                     (targety < stuckBombY+speed)&&(targety > stuckBombY-speed)&&
  39.                     (targetz < stuckBombZ+speed)&&(targetz > stuckBombZ-speed)&&
  40.                     (target_tid != fem_war)&&(bombStuck == 0))
  41.                 {
  42.                     bombStuck = 1;
  43.                     //target_tid = 0;
  44.                     target_half_height = getactorproperty(target_tid,APROP_Height)/2;
  45.                     //Log(s:"Sticky bomb ", d: s_bomb, s:" detects current FemWars target ", d:target_tid );
  46.                     //break;
  47.                 }
  48.                 //Player detection:
  49.                 if(bombStuck == 0)
  50.                 {
  51.                     for (forLoop = 12000; forLoop <= 12000+totalPlayers; forLoop++)
  52.                     {
  53.                         targetx = getactorx(forLoop);
  54.                         targety = getactory(forLoop);
  55.                         targetz = getactorz(forLoop);
  56.                         if ((targetx < stuckBombX+108.0)&&(targetx > stuckBombX-108.0)&&
  57.                             (targety < stuckBombY+108.0)&&(targety > stuckBombY-108.0)&&
  58.                             (targetz < stuckBombZ+108.0)&&(targetz > stuckBombZ-108.0)&&
  59.                             (bombStuck == 0))
  60.                         {
  61.                             bombStuck = 1;
  62.                             target_tid = forLoop; //12000+forLoop;
  63.                             target_half_height = getactorproperty(target_tid,APROP_Height)/2;
  64.                             //Log(s:"Sticky bomb ", d: s_bomb, s:" detects ", d:target_tid );
  65.                             break;
  66.                         }
  67.                     }
  68.                     //Custom tagged monster detection:
  69.                     for (forLoop = 60000; forLoop <= 60000+totalMonsters; forLoop++)
  70.                     {
  71.                         targetx = getactorx(forLoop);
  72.                         targety = getactory(forLoop);
  73.                         targetz = getactorz(forLoop);
  74.                         if(checkactorclass(forLoop,"MageBoss") ||
  75.                            checkactorclass(forLoop,"Wraith") ||
  76.                            checkactorclass(target_tid,"CentaurLeader")) speed = 160.0;
  77.                         else speed = 96.0;
  78.                         if ((targetx < stuckBombX+speed)&&(targetx > stuckBombX-speed)&&
  79.                             (targety < stuckBombY+speed)&&(targety > stuckBombY-speed)&&
  80.                             (targetz < stuckBombZ+speed)&&(targetz > stuckBombZ-speed)&&
  81.                             (forLoop != fem_war)&&(bombStuck == 0))
  82.                         {
  83.                             bombStuck = 1;
  84.                             target_tid = forLoop;
  85.                             target_half_height = getactorproperty(target_tid,APROP_Height)/2;
  86.                             //Log(s:"Sticky bomb ", d: s_bomb, s:" detects ", d:target_tid );
  87.                             break;
  88.                         }
  89.                     }
  90.                 }
  91.             }
  92.             if (bombStuck == 1)
  93.             {
  94.                 //log(s:"Trying to stick");
  95.                 if(getactorproperty(target_tid,APROP_HEALTH) > 0)
  96.                 {
  97.                     setactorposition(s_bomb, getactorx(target_tid) - cos(GetActorAngle(target_tid)) * 8,
  98.                                              getactory(target_tid) - sin(GetActorAngle(target_tid)) * 8,
  99.                                              getactorz(target_tid) + target_half_height, 0);
  100.                     //if(wait % 30 == 0)Log(s:"Sticky bomb ", d: s_bomb, s:" sticked to ", d:target_tid );                   
  101.                 }
  102.                 else if (getactorproperty(target_tid,APROP_HEALTH) <= 0)
  103.                 {
  104.                     //log(s:"No joy to stick on: ", d:target_tid);
  105.                     wait = 0;
  106.                 }
  107.             }
  108.             wait = wait - 1;
  109.             delay(1);
  110.         }
  111.         //After the time when sticky bomb was carried onto body it will explode or it will remain onto floor till any player approach:
  112.         wait = 7;
  113.         if(bombStuck == 1)
  114.         {
  115.             // needs code for cyberdemon or other NORADIUSDAMAGE monsters damage thing to be spawned
  116.             if ((checkactorclass(target_tid, "Cyberdemon") || checkactorclass(target_tid, "SpiderMastermind") ||
  117.                 checkactorclass(target_tid, "CentaurLeader") || checkactorclass(target_tid, "MageBoss") ||
  118.                 checkactorclass(target_tid, "Wraith")) && getactorproperty(fem_war, APROP_HEALTH) > 0)
  119.             {
  120.                 spawnprojectile(fem_war,"ZPoisonShroom",0,1,0,0,21000+Various_tags[5]);
  121. setactorposition(21000+Various_tags[5],getactorx(target_tid),getactory(target_tid),getactorz(target_tid)+getactorproperty(target_tid,APROP_Height)/2,0);
  122.                 //Log(s:"ZPoisonShroom ", d: 21000+Various_tags[5], s:" set on ", d:target_tid);
  123.                 Various_tags[5] = Various_tags[5] + 1;
  124.                 if (Various_tags[5] >= 999) Various_tags[5] = 0;
  125.             }
  126.             //Log(s:"Sticky bomb ", d: s_bomb, s:" detonate , bombstuck = ", d:bombStuck);
  127.             setactorproperty(s_bomb,APROP_Health,0);
  128.         }
  129.         else if(bombStuck == 0)
  130.         {
  131.             SetActivator(s_bomb);
  132.             while (thingcount(0, s_bomb) > 0)
  133.             {
  134.                 stuckBombX = getactorx(s_bomb);
  135.                 stuckBombY = getactory(s_bomb);
  136.                 stuckBombZ = getactorz(s_bomb);
  137.                 for (forLoop = 12000; forLoop <= 12000+totalPlayers; forLoop++)
  138.                 {
  139.                     targetx = getactorx(forLoop);
  140.                     targety = getactory(forLoop);
  141.                     targetz = getactorz(forLoop);
  142.                     //Sticky Bomb Spherical Detonation Radius Is 150
  143.                     if ((targetx < stuckBombX+150.0)&&(targetx > stuckBombX-150.0)&&
  144.                         (targety < stuckBombY+150.0)&&(targety > stuckBombY-150.0)&&
  145.                         (targetz < stuckBombZ+150.0)&&(targetz > stuckBombZ-150.0)&&
  146.                         (checksight(s_bomb,forLoop,0)))
  147.                         {
  148.                             setactorproperty(s_bomb,APROP_Health,0);
  149.                             //Log(s:"Sticky bomb ", d: s_bomb, s:" detonate on ", d:forLoop, s:" approach");
  150.                             break;
  151.                         }
  152.                 }
  153.                 if (wait <= 0)
  154.                 {
  155.                     activatorsound("STKYBEEP",255);
  156.                     wait = 7;
  157.                 }
  158.                 wait--;
  159.                 delay(20); //1
  160.             }
  161.         }
  162.     }
  163. //....
  164. }
RAW Paste Data