Advertisement
Meridius_IX

Gravity Cannon Drone

Sep 2nd, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.64 KB | None | 0 0
  1. //Meridius_IX's Pirate AI Systems
  2.  
  3. double player_detect_range = 25000; //If player is further than this value from drone, it will not execute any behavioral scripting.
  4.  
  5. bool use_raycast_ranged_weapons = true;
  6. bool use_raycast_close_weapons = false;
  7.  
  8. //////////////////////////////////////////////////////
  9. //Do Not Touch Anything Below Here
  10. //////////////////////////////////////////////////////
  11.  
  12. double player_drone_distance = 0;
  13. double player_origin_distance = 0;
  14. double drone_origin_distance = 0;
  15.  
  16. //Raycast Scan Data
  17. MyDetectedEntityInfo scanned_target;
  18. bool valid_scanned_target = false;
  19. bool fire_pmw = false;
  20. double scanned_target_distance = 0;
  21. Vector3D scanned_target_coords = new Vector3D(0,0,0);
  22.  
  23. IMyRemoteControl remote_control;
  24.  
  25. void Main(string argument){
  26.    
  27.     Vector3D world_center = new Vector3D(0,0,0);
  28.     Vector3D player_coords = new Vector3D(0,0,0);
  29.     Vector3D drone_coords = new Vector3D(0,0,0);
  30.     Vector3D origin_coords = new Vector3D(0,0,0);
  31.    
  32.     //Find Remote Control Block(s)
  33.     List<IMyTerminalBlock> remote_control_list = new List<IMyTerminalBlock>();
  34.     GridTerminalSystem.GetBlocksOfType<IMyRemoteControl>(remote_control_list);
  35.    
  36.     if(remote_control_list.Count != 0){
  37.        
  38.         for(int i = 0; i < remote_control_list.Count; i++){
  39.            
  40.             if(remote_control_list[i].IsFunctional == true){
  41.                
  42.                 remote_control = remote_control_list[i] as IMyRemoteControl;
  43.                 break;
  44.                
  45.             }
  46.            
  47.         }
  48.        
  49.     }else{
  50.        
  51.         Echo("No Remote Control Block Found. Script Cannot Execute.");
  52.         return;
  53.        
  54.     }
  55.    
  56.     //Check If Drone is NPC Owned
  57.     remote_control.GetNearestPlayer(out player_coords);
  58.    
  59.     if(player_coords == world_center){
  60.        
  61.         Echo("Drone is not owned by Hostile NPC. Script Cannot Continue.");
  62.         return;
  63.        
  64.     }
  65.    
  66.     drone_coords = remote_control.GetPosition();
  67.     valid_scanned_target = RaycastScan();
  68.    
  69.     //Get & Set Origin Coords
  70.     if(this.Storage == null || this.Storage == ""){
  71.        
  72.         this.Storage = drone_coords.ToString();
  73.         origin_coords = drone_coords;
  74.        
  75.     }else{
  76.        
  77.         Vector3D.TryParse(this.Storage, out origin_coords);
  78.        
  79.     }
  80.    
  81.     //Calculate Distances
  82.     player_drone_distance = MeasureDistance(player_coords, drone_coords);
  83.     player_origin_distance = MeasureDistance(player_coords, origin_coords);
  84.     drone_origin_distance = MeasureDistance(drone_coords, origin_coords);
  85.     scanned_target_distance = MeasureDistance(drone_coords, scanned_target_coords);
  86.    
  87.     if(player_drone_distance > player_detect_range){
  88.        
  89.         Echo("No players nearby. Aborting Script Execution");
  90.         return;
  91.        
  92.     }
  93.        
  94.     //////////////////////////////////////////////////////
  95.     //Pirate Behavior Start
  96.     //////////////////////////////////////////////////////
  97.    
  98.     IMyCargoContainer payload = GridTerminalSystem.GetBlockWithName("Payload Container") as IMyCargoContainer;
  99.  
  100.     List<IMyTerminalBlock> gravity_generator_list = new List<IMyTerminalBlock>();
  101.     IMyGravityGenerator gravity_generator;
  102.     GridTerminalSystem.GetBlocksOfType<IMyGravityGenerator>(gravity_generator_list);
  103.    
  104.     remote_control.ClearWaypoints();
  105.     remote_control.AddWaypoint(player_coords, "Player");
  106.     remote_control.SetValueFloat("SpeedLimit", 0.1f);
  107.    
  108.     if(fire_pmw == true && payload != null){
  109.        
  110.         WeaponActivation("Ranged", "None");
  111.         remote_control.CustomData = "5";
  112.         if(gravity_generator_list.Count != 0){
  113.            
  114.             for(int i = 0; i < gravity_generator_list.Count; i++){
  115.                
  116.                 gravity_generator = gravity_generator_list[i] as IMyGravityGenerator;
  117.                 gravity_generator.ApplyAction("OnOff_On");
  118.                
  119.             }
  120.            
  121.         }
  122.        
  123.                
  124.        
  125.     }else{
  126.        
  127.         if(remote_control.CustomData == "" || remote_control.CustomData == "0"){
  128.            
  129.             remote_control.SetValueFloat("SpeedLimit", 100);
  130.             remote_control.SetAutoPilotEnabled(true);
  131.            
  132.             if(gravity_generator_list.Count != 0){
  133.                
  134.                 for(int i = 0; i < gravity_generator_list.Count; i++){
  135.                    
  136.                     gravity_generator = gravity_generator_list[i] as IMyGravityGenerator;
  137.                     gravity_generator.ApplyAction("OnOff_Off");
  138.                    
  139.                 }
  140.            
  141.             }
  142.            
  143.         }else{
  144.            
  145.             int fire_timer = 0;
  146.             Int32.TryParse(remote_control.CustomData, out fire_timer);
  147.             fire_timer += -1;
  148.             remote_control.CustomData = fire_timer.ToString();
  149.            
  150.         }
  151.        
  152.        
  153.        
  154.     }
  155.    
  156.     //////////////////////////////////////////////////////
  157.     //Pirate Behavior End
  158.     //////////////////////////////////////////////////////
  159.    
  160. }
  161.  
  162. bool RaycastScan(){
  163.    
  164.     List<IMyTerminalBlock> camera_list = new List<IMyTerminalBlock>();
  165.     GridTerminalSystem.GetBlocksOfType<IMyCameraBlock>(camera_list);
  166.    
  167.     if(camera_list.Count != 0){
  168.        
  169.         for(int i = 0; i < camera_list.Count; i++){
  170.            
  171.             IMyCameraBlock camera = camera_list[i] as IMyCameraBlock;
  172.            
  173.             if(camera.IsFunctional == true){
  174.                
  175.                 int successful_scans = 3;
  176.                 if(camera.CustomData == ""){
  177.                    
  178.                     camera.CustomData = "3";
  179.                    
  180.                 }else{
  181.                    
  182.                     Int32.TryParse(camera.CustomData, out successful_scans);
  183.                    
  184.                 }
  185.                
  186.                 camera.EnableRaycast = true;
  187.                 float scan_to_player = (float)player_drone_distance + 100;
  188.                
  189.                 if(camera.CanScan(scan_to_player)){
  190.                    
  191.                     scanned_target = camera.Raycast(scan_to_player, 0, 0);
  192.                    
  193.                     if(scanned_target.Relationship.ToString() != "Owner" || scanned_target.Relationship.ToString() != "FactionShare"){
  194.                        
  195.                         if(scanned_target.Type.ToString() == "LargeGrid" || scanned_target.Type.ToString() == "SmallGrid" || scanned_target.Type.ToString() == "CharacterHuman"){
  196.                            
  197.                             successful_scans += -1;
  198.                             camera.CustomData = successful_scans.ToString();
  199.                            
  200.                             if(successful_scans <= 0){
  201.                                
  202.                                 fire_pmw = true;
  203.                                
  204.                             }
  205.                            
  206.                             scanned_target_coords = scanned_target.Position;
  207.                             return true;
  208.                            
  209.                         }
  210.                        
  211.                     }
  212.                    
  213.                     successful_scans = 3;
  214.                     camera.CustomData = successful_scans.ToString();
  215.                    
  216.                    
  217.                 }
  218.                
  219.             }
  220.            
  221.         }
  222.        
  223.     }else{
  224.    
  225.         Echo("No Camera Block Found. Cannot Do Raycast Scan.");
  226.         return false;
  227.        
  228.     }
  229.    
  230.     return false;
  231.    
  232. }
  233.  
  234. void WeaponActivation(string weapon_type, string weapon_action){
  235.    
  236.     List<IMyTerminalBlock> ranged_weapons_list = new List<IMyTerminalBlock>();
  237.     List<IMyTerminalBlock> grinders_list = new List<IMyTerminalBlock>();
  238.     List<IMyTerminalBlock> turrets_list = new List<IMyTerminalBlock>();
  239.    
  240.     GridTerminalSystem.GetBlocksOfType<IMyUserControllableGun>(ranged_weapons_list);
  241.     GridTerminalSystem.GetBlocksOfType<IMyShipGrinder>(grinders_list);
  242.     GridTerminalSystem.GetBlocksOfType<IMyLargeMissileTurret>(turrets_list);
  243.     GridTerminalSystem.GetBlocksOfType<IMyLargeGatlingTurret>(turrets_list);
  244.     GridTerminalSystem.GetBlocksOfType<IMyLargeInteriorTurret>(turrets_list);
  245.    
  246.     //Ranged Weapons
  247.     if(weapon_type == "Ranged"){
  248.        
  249.         for(int i = 0; i < ranged_weapons_list.Count; i++){
  250.        
  251.             IMyUserControllableGun weapon = ranged_weapons_list[i] as IMyUserControllableGun;
  252.             if(valid_scanned_target == true && use_raycast_ranged_weapons == true){
  253.                
  254.                 weapon.ApplyAction("Shoot_On");
  255.                
  256.             }else{
  257.                
  258.                 weapon.ApplyAction("Shoot_Off");
  259.                
  260.             }
  261.        
  262.         }
  263.        
  264.     }
  265.    
  266.     //Grinder
  267.     if(weapon_type == "Grinder"){
  268.        
  269.         for(int i = 0; i < grinders_list.Count; i++){
  270.        
  271.             if(scanned_target_distance <= 100 && valid_scanned_target == true && use_raycast_close_weapons == true){
  272.                
  273.                 grinders_list[i].ApplyAction("OnOff_On");
  274.                
  275.             }else{
  276.                
  277.                 grinders_list[i].ApplyAction("OnOff_Off");
  278.                
  279.             }
  280.        
  281.         }
  282.        
  283.     }
  284.    
  285.     //Turrets
  286.     if(weapon_type == "Turret"){
  287.        
  288.         for(int i = 0; i < turrets_list.Count; i++){
  289.            
  290.             turrets_list[i].ApplyAction(weapon_action);
  291.        
  292.         }
  293.        
  294.     }
  295.    
  296. }
  297.  
  298. double MeasureDistance(Vector3D point_a, Vector3D point_b){
  299.    
  300.     double result = Math.Round( Vector3D.Distance( point_a, point_b ), 2 );
  301.     return result;
  302.    
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement