idiotonastic

zeb

Mar 2nd, 2021 (edited)
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.07 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Collections.Specialized;
  5.  
  6. using Sandbox.Game;
  7. using Sandbox.Game.Entities;
  8. using Sandbox.ModAPI;
  9. using VRage.Game;
  10. using VRage.Game.Components;
  11. using VRage.Game.ModAPI;
  12. using VRageMath;
  13. using VRage.Utils;
  14. using VRage.ModAPI;
  15. using VRage.ObjectBuilders;
  16. using VRage.Game.Entity;
  17. /* #----------------------------------------------------------------------------#
  18.  * |              Zebedee  Copyright (C) 2021  Colin ELcock                     |
  19.  * #----------------------------------------------------------------------------#
  20.  * | This mod is designed to fix the rover falling through the planet issue.    |
  21.  * | We take the planet check if there is a rover inside it                     |
  22.  * | and then place the rover back on the planet surface.                       |
  23.  * |                                                                            |
  24.  * | Initialy designed for use on the Sigma Draconis Impossible Server          |
  25.  * #----------------------------------------------------------------------------#
  26.  * | Author: Idiotonastic                                                       |
  27.  * | Contact: idiotonastic@hotmail.com                                          |
  28.  * | License: GNU GENERAL PUBLIC LICENSE                                        |
  29.  * #----------------------------------------------------------------------------#
  30.  */
  31. namespace Zebedee
  32. {
  33.     [MySessionComponentDescriptor(MyUpdateOrder.AfterSimulation)]
  34.     public class Zebedee : MySessionComponentBase
  35.     {
  36.         private int timer = 0;
  37.         private List<MyEntity> all_dynamic_entitys = new List<MyEntity>();
  38.         private readonly List<BoundingSphereD> spheres = new List<BoundingSphereD>();
  39.         private readonly Boolean debug = false;
  40.         private List<MyPlanet> mplan = new List<MyPlanet>();
  41.         private List<IMySlimBlock> blocks = new List<IMySlimBlock>();
  42.  
  43.         /*
  44.          * Function | Init
  45.          * runs on initiliazation, overidden to include OnEntityAdd
  46.          */
  47.         public override void Init(MyObjectBuilder_SessionComponent sessionComponent)
  48.         {
  49.             MyAPIGateway.Entities.OnEntityAdd += OnEntityAdd;
  50.         }
  51.  
  52.         /*
  53.          * Function | LoadData
  54.          * runs on Data Load, overidden to include OnEntityAdd
  55.          */
  56.         public override void LoadData()
  57.         {
  58.             MyAPIGateway.Entities.OnEntityAdd += OnEntityAdd;
  59.             base.LoadData();
  60.         }
  61.  
  62.         /*
  63.          * Function | OnEntityAdd
  64.          * gets entity checks if it's a planet and adds it to list of planets: mplan
  65.          * calls addSphere
  66.          */
  67.         private void OnEntityAdd(IMyEntity obj)
  68.         {
  69.             MyPlanet check_planet = obj as MyPlanet;
  70.  
  71.             if (check_planet != null)
  72.             {
  73.                 if (!mplan.Contains(check_planet))
  74.                 {
  75.                     mplan.Add(check_planet);
  76.                     addSphere(check_planet);
  77.                 }
  78.                
  79.             }
  80.         }
  81.         /*
  82.          * Function | addSphere
  83.          * checks is sphere exists, if not adds it to list: spheres
  84.          */
  85.         private void addSphere(MyPlanet P)
  86.         {
  87.             BoundingSphereD Nsphere = new BoundingSphereD
  88.             {
  89.                 Radius = P.MinimumRadius - 500,
  90.                 Center = P.WorldMatrix.Translation
  91.             };
  92.  
  93.             if (!spheres.Contains(Nsphere))
  94.             {
  95.                 spheres.Add(Nsphere);
  96.             }
  97.             if (debug)
  98.             {
  99.                 MyAPIGateway.Utilities.ShowMessage("Zebedee", "Planets Loaded: " + mplan.Count);
  100.                 MyAPIGateway.Utilities.ShowMessage("Zebedee", "Spheres Loaded: " + spheres.Count);
  101.             }
  102.  
  103.         }
  104.         private static Vector3D GetOrientationToPlanet(ref Vector3D lPos, ref Vector3 gravVect)
  105.         {
  106.  
  107.             if (Vector3.IsZero(gravVect))
  108.             {
  109.                 gravVect = Vector3.Up;
  110.             }
  111.             Vector3D value = Vector3D.Normalize(gravVect);
  112.             Vector3D value2 = -value;
  113.             Vector3D result = lPos + value2 * 1;
  114.             return result;
  115.         }
  116.         public override void UpdateAfterSimulation()
  117.         {
  118.             try
  119.             {
  120.                 if (MyAPIGateway.Session == null || !MyAPIGateway.Session.IsServer)
  121.                 {
  122.                     MyLog.Default.WriteLine("Invalid Session");  //if invalid session stop working
  123.                     return;
  124.                 }
  125.  
  126.                 if (timer % 120 == 0)
  127.                 {
  128.                     foreach (BoundingSphereD BdnS in spheres) //itterate through spheres
  129.                     {
  130.                         BoundingSphereD Current = BdnS;
  131.                         all_dynamic_entitys.Clear();  //puge previous entity data
  132.                         MyGamePruningStructure.GetAllTopMostEntitiesInSphere(ref Current, all_dynamic_entitys, MyEntityQueryType.Dynamic); //get all dynamic entities within current sphere
  133.  
  134.                            
  135.                         foreach (MyEntity ent in all_dynamic_entitys)
  136.                         {
  137.                             if (ent != null)
  138.                             {
  139.                                 if (ent is IMyFloatingObject)  //if the entity is floating object delete
  140.                                 {
  141.                                     ent.Close();
  142.                                     if (debug)
  143.                                     {
  144.                                         MyAPIGateway.Utilities.ShowMessage("Zebedee", "floatObj ");
  145.                                     }
  146.                                 }
  147.                                 else
  148.                                 if(ent is IMyCharacter) //if the entity is a player put on surface
  149.                                 {
  150.                                     if (debug)
  151.                                     {
  152.                                         MyAPIGateway.Utilities.ShowMessage("Zebedee", "player");
  153.                                     }
  154.                                     var check_character = ent as IMyCharacter;
  155.                                     MyPlanet NearbyPlanet = null;
  156.                                     NearbyPlanet = MyGamePruningStructure.GetClosestPlanet(check_character.WorldAABB.Center); //get rearby planet
  157.                                     if (NearbyPlanet != null)
  158.                                     {
  159.                                         check_character.SetPosition(NearbyPlanet.GetClosestSurfacePointGlobal(check_character.WorldAABB.Center) + (-1 * Vector3D.Normalize(check_character.Physics.Gravity)) * 3); //place about 3m above planet using gr\avity to detrimine dist above
  160.                                     }
  161.                                 }
  162.                                 else
  163.                                 if (ent is IMyCubeGrid) //if the entity is a grid put on surface
  164.                                 {
  165.                                     if (debug)
  166.                                     {
  167.                                         MyAPIGateway.Utilities.ShowMessage("Zebedee", "rover");
  168.  
  169.                                     }
  170.                                     IMyCubeGrid roverGrid = ent as IMyCubeGrid;
  171.                                     MyPlanet NearbyPlanet = null;
  172.                                     NearbyPlanet = MyGamePruningStructure.GetClosestPlanet(roverGrid.WorldMatrix.Translation);
  173.                                     roverGrid.GetBlocks(blocks);
  174.                                     BoundingSphere roversphere = BoundingSphere.CreateFromBoundingBox((BoundingBox)roverGrid.WorldAABB);
  175.                                     if (blocks != null && blocks.Count >= 10) {
  176.                                         if (NearbyPlanet != null)
  177.                                         {
  178.                                             roverGrid.Physics.ClearSpeed();
  179.                                             roverGrid.GetBlocks(blocks);
  180.                                              
  181.                                              Vector3D pos = (NearbyPlanet.GetClosestSurfacePointGlobal(roverGrid.WorldAABB.Center) + (-1 * Vector3D.Normalize(roverGrid.Physics.Gravity)) * (roversphere.Radius + 10));
  182.                                             Vector3 grav = roverGrid.Physics.Gravity;
  183.                                             Vector3 up;
  184.                                             up = GetOrientationToPlanet(ref pos, ref grav);
  185.                                             MatrixD m = new MatrixD
  186.                                             {
  187.                                                 Translation = pos,
  188.                                                 Up = up
  189.                                             };
  190.                                            
  191.                                             roverGrid.Teleport(m); //place about 40m above planet using gravity to detrimine dist above
  192.                                             MyAPIGateway.Utilities.ShowMessage("Zebedee", "Boing!");
  193.                                         }
  194.                                         else
  195.                                         {
  196.                                             if (debug)
  197.                                                 MyAPIGateway.Utilities.ShowMessage("Zebedee", "No Planet");
  198.                                         }
  199.                                     }
  200.                                 }
  201.                                 else
  202.                                 {
  203.                                     if (debug)
  204.                                         MyAPIGateway.Utilities.ShowMessage("Zebedee", "No Grid");
  205.                                 }
  206.                             }
  207.                             else
  208.                             {
  209.                                 if (debug)
  210.                                     MyAPIGateway.Utilities.ShowMessage("Zebedee", "No Rover");
  211.                             }
  212.                         }
  213.                     }
  214.  
  215.                 }
  216.                 timer += 1;
  217.  
  218.             }
  219.             catch (Exception e)
  220.             {
  221.                 MyLog.Default.WriteLine("BOING: " + e);
  222.             }
  223.         }
  224.  
  225.         protected override void UnloadData()
  226.         {
  227.         }
  228.     }
  229. }
  230. /*
  231.     This mod has bee designed by Colin Elcock to fix the rover falling through the planet issue.
  232.     Copyright (C) 2021  Colin Elcock
  233.  
  234.     This program is free software: you can redistribute it and/or modify
  235.     it under the terms of the GNU General Public License as published by
  236.     the Free Software Foundation, either version 3 of the License, or
  237.     (at your option) any later version.
  238.  
  239.     This program is distributed in the hope that it will be useful,
  240.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  241.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  242.     GNU General Public License for more details.
  243.  
  244.     You should have received a copy of the GNU General Public License
  245.     along with this program.  If not, see <https://www.gnu.org/licenses/>.
  246. */
  247.  
Add Comment
Please, Sign In to add comment