Advertisement
SinTrenton

VICEBasic

Jan 15th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. string HUDtext="";
  2. vector HUDcolor;
  3.  
  4. key auto_fire_sound="cec6d960-d580-9162-2d8d-88124ae4d9f8";  // in auto-fire mode
  5. key single_fire_sound="e9a17118-0fc2-e3c9-cf60-7d58d16b76c1"; // in single-shot mode
  6. key not_loaded_sound="4724cd06-8705-58a3-ec96-a93503bf3a2e";  // for when you're not firing
  7. key reload_sound="e5de9fb0-c4d5-4830-aa19-a57d864104c5"; // for reloading..
  8. key knife_sound="8c642cd3-b74e-0611-099e-40f4bfd681d6"; // when using the knife
  9.  
  10. // recovery time in seconds after we stab, before we cna stab again or shoot a bullet
  11. float STAB_RECOVERY_TIME=1.25;  
  12. // recovery time in seconds after we fire a bullet (in semi- or full-auto modes), before we can stab or start  shooting again
  13. float SHOOT_RECOVERY_TIME=0.11; // recovery time in seconds after we fire a bullet (in semi- or full-auto modes), before we can stab or start shooting again.  The system limits 0.1s, so let's go with 0.11 as a safety measure (to prevent lost link messages...)
  14. float recovery_time=SHOOT_RECOVERY_TIME;  
  15.  
  16. integer team;
  17. integer vice_hp;
  18. integer max_vice_hp=1;
  19. integer vice_hits;
  20. integer vice_kills;
  21. integer vice_deaths;
  22. integer dead=FALSE;
  23. integer firing_mode;
  24. integer reload_state; // 0=ammo depleted; 1=nonzero ammo, ready to fire; 2=in the process of reloading
  25. integer grenade_ready;
  26. integer auto_firing=FALSE;  // if we are currently firing in full-auto mode
  27. integer last_attack_was_auto=FALSE;  // whether our most recent bullet fire or melee attack was in full auto mode (for trigger timing limits)
  28. // interface Stuff
  29. integer dialog_channel_handle;
  30. integer dialog_channel;
  31. integer set_private_channel_number;
  32. integer set_private_channel_handle;
  33. list teams=["No Team","Team 1","Team 2", "Team 3", "Team 4"];
  34.  
  35. init()
  36. {
  37.     firing_mode=0; //automatic by default
  38.     reload_state=1;  // weapon loaded
  39.     grenade_ready=FALSE;
  40.     dead=FALSE;
  41.     llSetText("", ZERO_VECTOR, 0.0);
  42.     llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
  43.     if(llGetAttached()!=ATTACH_RHAND)
  44.     {
  45.     }
  46.     llOwnerSay("Basic VICE Sten Mk.III");
  47.     llSleep(0.1);
  48.     llMessageLinked(LINK_SET,TRUE,"seated",llGetOwner());
  49.     llSleep(0.1);
  50.     if(team>0) llMessageLinked(LINK_SET,team,"vice team","");
  51.     llMessageLinked(LINK_SET,TRUE,"vice ctrl",""); // enable combat
  52.     //llMessageLinked(LINK_SET,0,"vice team","");  // reset to no team
  53.     llListenRemove(dialog_channel_handle);
  54.     dialog_channel=8;
  55.     dialog_channel_handle=llListen(dialog_channel,"",llGetOwner(),"");
  56.     llListenRemove(set_private_channel_handle);
  57.     set_private_channel_handle=0;
  58.     llMessageLinked(LINK_SET,reload_state,"reload","");  // reloading should be automatic, but just in case...
  59.     llPlaySound(reload_sound,1.0); // reloading...
  60.     refreshHUD();
  61. }
  62.  
  63. refreshHUD()
  64. {
  65.     HUDtext="";
  66.     HUDcolor=<0.0,1.0,0.0>;  // green if healthy
  67.     if(!dead)
  68.     {
  69.         HUDtext+="VICE";
  70.         if(team>0) HUDtext+=" - Team "+(string)team;
  71.         HUDtext+="\nHP: "+(string)vice_hp+" Damage Dealt: "+(string)vice_hits
  72.             +"\nKills: "+(string)vice_kills+" Deaths: "+(string)vice_deaths;
  73.         if(firing_mode==0) HUDtext+="\nSemi-Auto";
  74.         else if(firing_mode==1) HUDtext+="\nFull-Auto";
  75.         if(reload_state==0) HUDtext+=" / Ammo Depleted!";
  76.         else if(reload_state==2) HUDtext+=" / Reloading";
  77.         if(vice_hp<=max_vice_hp/2) HUDcolor=<1.0,0.0,0.0>;  // red if damaged
  78.     }
  79.     else
  80.     {
  81.         HUDcolor=<1.0,0.0,0.0>;  // red if dead
  82.         HUDtext="Dead!";
  83.     }
  84.     llSetText(HUDtext+"\n \n \n \n ", HUDcolor, 1.0);
  85. }
  86.  
  87. default
  88. {
  89.     state_entry()
  90.     {
  91.         init();
  92.     }
  93.    
  94.     attach(key id)
  95.     {
  96.         if(id==NULL_KEY)
  97.         {
  98.             llStopAnimation("dead");
  99.             llStopAnimation("hold_r_rifle");
  100.         }
  101.         else init();
  102.     }
  103.    
  104.     changed(integer change)
  105.     {
  106.         if(change&CHANGED_OWNER)
  107.         {
  108.             llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
  109.             team=0;
  110.             refreshHUD();
  111.         }
  112.     }
  113.     run_time_permissions(integer perm)
  114.     {
  115.         if(perm & PERMISSION_TRIGGER_ANIMATION) llStartAnimation("hold_r_rifle");
  116.         if(perm & PERMISSION_TAKE_CONTROLS) llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
  117.     }
  118.    
  119.     control(key id, integer level, integer edge)
  120.     {
  121.         if(!dead)
  122.         {
  123.             if(reload_state==1)
  124.             {
  125.                 // full-auto mode:
  126.                 if(firing_mode==1 && (edge || level^auto_firing) )
  127.                 {
  128.                    
  129.                     if(level)
  130.                     {
  131.                         //llOwnerSay("fire "+(string)llGetTime()+" (recovery "+(string)recovery_time+")");  // for debugging the trigger timings
  132.                         if(last_attack_was_auto || llGetTime()>recovery_time)
  133.                         {
  134.                             llMessageLinked(LINK_SET, level, "gun ctrl", "");
  135.                             llLoopSound(auto_fire_sound,1.0);
  136.                             recovery_time=SHOOT_RECOVERY_TIME;
  137.                             last_attack_was_auto=TRUE;
  138.                             auto_firing=level;
  139.                         }
  140.                     }
  141.                     else if(auto_firing)
  142.                     {
  143.                         llResetTime();  // reset the time that we last fired a bullet or stabbed
  144.                         llMessageLinked(LINK_SET, level, "gun ctrl", "");                  
  145.                         llStopSound();
  146.                         auto_firing=FALSE;
  147.                     }
  148.                 }
  149.                 // single-shot mode:
  150.                 else if(firing_mode==0 && level && edge && llGetTime()>recovery_time)
  151.                 {
  152.                     // if we wanted a custom rez offset for the bullet, we'd put something like "<-0.9,-0.0,0.3>,<0.0,0.0,0.0,1.0>" in the key field of the link message
  153.                     llMessageLinked(LINK_SET, level, "gun ctrl", "");
  154.                     llTriggerSound(single_fire_sound,1.0);
  155.                     llResetTime(); // reset the time that we last fired a bullet or stabbed
  156.                     last_attack_was_auto=FALSE;
  157.                     recovery_time=SHOOT_RECOVERY_TIME;
  158.                 }
  159.             }
  160.             else if(level & edge & CONTROL_ML_LBUTTON) llTriggerSound(not_loaded_sound,1.0);  // we are either out of ammo or in the process reloading now
  161.         }
  162.         if(reload_state==0)
  163.         {
  164.             reload_state=2;
  165.             refreshHUD();
  166.             llStartAnimation("Reload");
  167.             llPlaySound(reload_sound,1.0);
  168.             llMessageLinked(LINK_SET,reload_state,"reload","");
  169.         }
  170.     }
  171.    
  172.     link_message(integer src, integer number, string msg, key id)
  173.     {
  174.         if(msg=="vice stats")
  175.         {
  176.             vice_kills=(number>>26)&63;
  177.             vice_deaths=(number>>20)&63;
  178.             vice_hits=(number>>8)&4095;
  179.             vice_hp=number&255;
  180.             if(vice_hp>max_vice_hp) max_vice_hp=vice_hp;
  181.             refreshHUD();        
  182.         }
  183.         else if( msg == "reload")
  184.         {
  185.             if(reload_state!=number)
  186.             {
  187.                 reload_state=number;
  188.                 if(reload_state==0)
  189.                 {
  190.                     llPlaySound(not_loaded_sound,1.0);
  191.                     if(auto_firing)
  192.                     {
  193.                         auto_firing=FALSE;
  194.                         llResetTime();
  195.                     }
  196.                 }
  197.                 refreshHUD();
  198.             }
  199.             //llOwnerSay("reload"+(string)number);
  200.         }
  201.         else if(msg == "bomb" && number==-1) grenade_ready=TRUE;
  202.         else if(msg=="crash")  
  203.         {
  204.             dead=number;
  205.             if(dead) // crashing ( number==0 for uncrashing)
  206.             {
  207.                 llStopSound();
  208.                 llStopAnimation("hold_r_rifle");
  209.                 llStartAnimation("dead");
  210.                 refreshHUD();
  211.                 llTakeControls(-1, TRUE, FALSE);
  212.             }
  213.             else
  214.             {
  215.                 llStopAnimation("dead");
  216.                 llStartAnimation("hold_r_rifle");
  217.                 refreshHUD();
  218.                 llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
  219.             }
  220.         }
  221.     }
  222.    
  223.     touch_start(integer detected)
  224.     {
  225.         if(llDetectedKey(0)==llGetOwner())
  226.         {
  227.             llDialog(llGetOwner(), "\nSet/Reset Ch: select a combat channel\nTeam *: Select a team\nFire Mode: Select semi/auto firing mode\nReload: reload the gun\n/"+(string)dialog_channel+" ",["Team 2","Team 3","Team 4","Reset Ch","No Team","Team 1","Set Ch","Fire Mode","Reload"],dialog_channel);
  228.         }
  229.     }
  230.    
  231.     listen(integer channel, string sender_name, key sender_id, string message)
  232.     {
  233.         if(sender_id==llGetOwner())
  234.         {    
  235.             if(channel==dialog_channel)
  236.             {
  237.                 if(message=="bomb")
  238.                 {
  239.                     if(!dead && grenade_ready)
  240.                     {
  241.                         llStartAnimation("grenadeleft");
  242.                         llSleep(0.8);
  243.                         llMessageLinked(LINK_SET,0,"bomb","");
  244.                         grenade_ready=FALSE;
  245.                     }
  246.                 }
  247.                 else if(message=="stab")
  248.                 {
  249.                     if(!dead && llGetTime()>recovery_time && !auto_firing)
  250.                     {
  251.                         llMessageLinked(LINK_ALL_CHILDREN,0,"stab","");
  252.                         llResetTime();  // reset the time that we last fired a bullet or stabbed
  253.                         llStartAnimation("punch_r");
  254.                         llPlaySound(knife_sound,1.0);
  255.                         last_attack_was_auto=FALSE;
  256.                         recovery_time=STAB_RECOVERY_TIME+0.03;  // time to recover from a stab + a 30ms tolerance
  257.                     }
  258.                 }
  259.                 else if(llListFindList(teams,[message])!=-1)
  260.                 {
  261.                     team=llListFindList(teams,[message]);
  262.                     llMessageLinked(LINK_SET,team,"vice team","");
  263.                     refreshHUD();
  264.                 }
  265.                 else if(message=="Reset Ch") llMessageLinked(LINK_SET,0,"channel","");
  266.                 else if(message=="Set Ch")
  267.                 {
  268.                     llListenRemove(set_private_channel_handle);
  269.                     set_private_channel_number=100+(integer)llFrand(900.0);
  270.                     llOwnerSay("Choose a combat channel by chat: /"+(string)set_private_channel_number+" <password>");
  271.                     set_private_channel_handle=llListen(set_private_channel_number,"",llGetOwner(),"");
  272.                     llSensorRepeat("",llGetKey(),AGENT,1.0,PI,30.0);  // for listen timeout
  273.                 }
  274.                 else if(message=="Fire Mode") // Originally Fire Mode changed to mode
  275.                 {
  276.                     firing_mode=!firing_mode;
  277.                     llMessageLinked(LINK_SET,firing_mode,"bullet type","");
  278.                     llStopSound();
  279.                     auto_firing=FALSE;
  280.                     refreshHUD();
  281.                 }
  282.                 else if(message=="Reload")  // Originally Reload
  283.                 {
  284.                     if(reload_state!=2)
  285.                     {
  286.                         reload_state=2;
  287.                         if(auto_firing)
  288.                         {
  289.                             llResetTime();
  290.                             auto_firing=FALSE;
  291.                         }
  292.                         llStartAnimation("Reload");
  293.                         llPlaySound(reload_sound,1.0);
  294.                         refreshHUD();
  295.                     }
  296.                     // not inside the if() statement incase the trigger script is confused about its reloading status:        
  297.                     llMessageLinked(LINK_SET,reload_state,"reload","");
  298.                 }
  299.                // else
  300.                // {
  301.                     // limit the death message to 30 characters (the sensor will truncate it anyway...
  302.                   //  llMessageLinked(LINK_SET,0,"death message",llGetSubString(llStringTrim(message,STRING_TRIM),0,29));                
  303.                // }
  304.             }
  305.             else if(channel==set_private_channel_number)  // a secret channel for choosing a game
  306.             // 0 by default, so this if statement shouldn't happen unless the person is trying to pick a password
  307.             {
  308.                 message=llStringTrim(message,STRING_TRIM);
  309.                 if(message) //  don't pass a null password
  310.                 {
  311.                     llListenRemove(set_private_channel_handle);
  312.                     llMessageLinked(LINK_ROOT,1,"channel",message);
  313.                     set_private_channel_number=0;  // reset this so that we know the timer isn't currently going
  314.                     llSensorRemove();
  315.                 }
  316.             }
  317.         }
  318.     }
  319.    
  320.     no_sensor()
  321.     {
  322.         llOwnerSay("Timeout; Closing listen for combat channel selection");
  323.         llListenRemove(set_private_channel_handle);
  324.         llSensorRemove();
  325.     }
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement