Advertisement
Guest User

BarMagnet Mod

a guest
Sep 3rd, 2016
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.80 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using spaar.ModLoader;
  4. using TheGuysYouDespise;
  5. using UnityEngine;
  6.  
  7. namespace Blocks {
  8.     public class BarMagnetLoader : BlockMod {
  9.         public override string Name { get { return "BarMagnet"; } }
  10.         public override string DisplayName { get { return "BarMagnet"; } }
  11.         public override string Author { get { return "ITR"; } }
  12.         public override Version Version { get { return new Version(1,0); } }
  13.  
  14.         protected Block block = new Block()
  15.             .ID(0xC7)
  16.             .BlockName("Bar Magnet")
  17.             .Obj(new List<Obj> { new Obj("BarMagnet.obj","BarMagnet.png",
  18.             new VisualOffset(Vector3.one,Vector3.zero,Vector3.zero))})
  19.             .IconOffset(new Icon(new Vector3(1,1f,0), new Vector3(0,-0.25f,0), Vector3.zero))
  20.             .Components(new Type[] { typeof(BarMagnet),})
  21.             .Properties(new BlockProperties().SearchKeywords(new string[] {
  22.                 "Magnet","Electric","Modded","Magic","Force"}))
  23.             .Mass(0.5f)
  24.             .ShowCollider(false)
  25.             .CompoundCollider(new List<ColliderComposite> { new ColliderComposite(
  26.                 new Vector3(0.9f, 0.9f, 1.8f), new Vector3(0f, 0f, 1.05f), new Vector3(0f, 0f, 0f)) })
  27.             .IgnoreIntersectionForBase()
  28.             .NeededResources(new List<NeededResource>())
  29.             .AddingPoints(new List<AddingPoint> {
  30.                 new BasePoint(true, true).Motionable(false,false,false).SetStickyRadius(0.5f),
  31.                 new AddingPoint(new Vector3(0f, 0f, 1.5f), new Vector3(-90f, 0f, 0f),true).SetStickyRadius(0.3f),
  32.             });
  33.  
  34.         public override void OnLoad() {
  35.             Game.OnSimulationToggle += ResetList;
  36.             spaar.Commands.RegisterHelpMessage("BarMagnet commands:\n   MaxDistance [int]\n MagnetForce [float]");
  37.             spaar.Commands.RegisterCommand("MaxDistance",(args,namedArgs) => {
  38.                 try {
  39.                     BarMagnet.maxDistance = float.Parse(args[0]);
  40.                 }
  41.                 catch {
  42.                     return "MaxDistance is "+BarMagnet.maxDistance.ToString();
  43.                 }
  44.                 return "MaxDistance was set to "+BarMagnet.maxDistance.ToString();
  45.             },"Changes the MaxDistance of the magnets (lower numbers make it less laggy)");
  46.  
  47.             spaar.Commands.RegisterCommand("MagnetForce",(args,namedArgs) => {
  48.                 try {
  49.                     BarMagnet.force = float.Parse(args[0]);
  50.                 }
  51.                 catch {
  52.                     return "MagnetForce is "+BarMagnet.force.ToString();
  53.                 }
  54.                 return "MagnetForce was set to "+BarMagnet.force.ToString();
  55.             },"Changes the default force of the magnets (force slider set to 1)");
  56.             LoadBlock(block);
  57.         }
  58.  
  59.         public override void OnUnload() { }
  60.  
  61.         public static List<BarMagnet> barMagnetList = new List<BarMagnet>();
  62.  
  63.         public static void ResetList(bool isSimulating) {
  64.             if(!isSimulating)
  65.                 barMagnetList = new List<BarMagnet>();
  66.         }
  67.  
  68.         public static int AddToList(BarMagnet barMagnet) {
  69.             int ret = barMagnetList.Count;
  70.             barMagnetList.Add(barMagnet);
  71.             return ret;
  72.         }
  73.  
  74.     }
  75.  
  76.     public class BarMagnet : GenericBlock {
  77.         int myID = -1;
  78.         MToggle inverted;
  79.         MSlider forceMult;
  80.         public static float maxDistance = 100f;
  81.         public static float force = 200;
  82.         public Vector3 pos1;
  83.         public Vector3 pos2;
  84.         public Rigidbody rigidBody;
  85.         public Joint[] joints;
  86.    
  87.         protected void Awake() {
  88.             inverted=AddToggle("Invert", "inverted", false);
  89.             forceMult=AddSlider("ForceMult", "forceMult", 1, -5, 5);
  90.             if(StatMaster.isSimulating) {
  91.                 myID=BarMagnetLoader.AddToList(this);
  92.                 rigidBody=GetComponent<Rigidbody>();
  93.                 rigidBody.centerOfMass=Vector3.forward;
  94.                 joints=new Joint[myID];
  95.             }
  96.         }
  97.        
  98.         public void FixedUpdate() {
  99.             if(StatMaster.isSimulating) {
  100.                 if(inverted.IsActive) {
  101.                     pos1=transform.position+transform.forward*transform.localScale.z*1.5f;
  102.                     pos2=transform.position+transform.forward*transform.localScale.z/2;
  103.                 } else {
  104.                     pos2=transform.position+transform.forward*transform.localScale.z*1.5f;
  105.                     pos1=transform.position+transform.forward*transform.localScale.z/2;
  106.                 }
  107.                 if(myID!=-1) {
  108.                     for(int i = 0; i<myID; i++) {
  109.                         CalculateForce(BarMagnetLoader.barMagnetList[i]);
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.  
  115.         public void CalculateForce(BarMagnet barMagnet) {
  116.             if(joints[barMagnet.myID]!=null&&joints[barMagnet.myID].connectedBody!=null) {
  117.                 return;
  118.             }
  119.             if(Vector3.Distance(transform.position+transform.forward,barMagnet.transform.position+barMagnet.transform.forward)>maxDistance)
  120.                 return;
  121.             if(pos1==barMagnet.pos2||pos2==barMagnet.pos1) {
  122.                 return;
  123.             }
  124.             if(Vector3.Distance(pos1,barMagnet.pos2)<0.3f) {
  125.                 barMagnet.rigidBody.AddForceAtPosition((pos1-barMagnet.pos2).normalized,barMagnet.pos2);
  126.                 rigidBody.AddForceAtPosition((barMagnet.pos2-pos1).normalized,pos1);
  127.                 return;
  128.             }
  129.             if(Vector3.Distance(pos2,barMagnet.pos1)<0.3f) {
  130.                 barMagnet.rigidBody.AddForce((pos2-barMagnet.pos1).normalized);
  131.                 rigidBody.AddForce((barMagnet.pos1-pos2).normalized);
  132.                 return;
  133.             }
  134.             var lForce = force*(forceMult.Value+barMagnet.forceMult.Value);
  135.  
  136.             Vector3 Pp, Pn, Np, Nn;
  137.             float mag;
  138.             Pn = barMagnet.pos2-pos1;
  139.             Np = barMagnet.pos1-pos2;
  140.             if((Pn-Np).sqrMagnitude<=0.0025) {
  141.                 mag=Pn.magnitude;
  142.                 var l = transform.InverseTransformVector(Np);
  143.                 if(l.x>=-0.95f&&l.x<=0.95f&&l.y>=-0.95f&&l.y<=0.95f&&l.z>=-0.95f&&l.z<=0.95f) {
  144.                     var joint = joints[barMagnet.myID];
  145.                     if(joint==null) {
  146.                         joint = gameObject.AddComponent<FixedJoint>();
  147.                         joint.connectedBody=barMagnet.rigidBody;
  148.                         joint.breakForce=lForce*2;
  149.                         joint.breakTorque=lForce*2;
  150.                         joints[barMagnet.myID]=joint;
  151.                     }else if(joint.connectedBody==null) {
  152.                         joint.connectedBody=barMagnet.rigidBody;
  153.                         joint.breakForce=lForce*2;
  154.                         joint.breakTorque=lForce*2;
  155.                     }
  156.                     return;
  157.                 }
  158.  
  159.                 if(mag>100) {
  160.                     Pn*=100/mag;
  161.                 }
  162.                 Pn=Pn.normalized/(Vector3.SqrMagnitude(Pn));
  163.                 barMagnet.rigidBody.AddForceAtPosition(lForce*-2*Pn, (barMagnet.pos1+barMagnet.pos2)/2);
  164.                 rigidBody.AddForceAtPosition(lForce*2*Pn, (pos1+pos2)/2);
  165.                 return;
  166.             }
  167.  
  168.             Pp = barMagnet.pos1-pos1;
  169.             Nn = barMagnet.pos2-pos2;
  170.             Pp = Pp.normalized/(Vector3.SqrMagnitude(Pp));
  171.             Pn = Pn.normalized/(Vector3.SqrMagnitude(Pn));
  172.             Np = Np.normalized/(Vector3.SqrMagnitude(Np));
  173.             Nn = Nn.normalized/(Vector3.SqrMagnitude(Nn));
  174.  
  175.             mag = Pp.magnitude;
  176.             if(mag>100) {
  177.                 Pp*=100/mag;
  178.             }
  179.             mag=Pn.magnitude;
  180.             if(mag>100) {
  181.                 Pn*=100/mag;
  182.             }
  183.             mag=Np.magnitude;
  184.             if(mag>100) {
  185.                 Np*=100/mag;
  186.             }
  187.             mag=Nn.magnitude;
  188.             if(mag>100) {
  189.                 Nn*=100/mag;
  190.             }
  191.            
  192.             barMagnet.rigidBody.AddForceAtPosition((Pp-Np)*lForce, barMagnet.pos1);
  193.             barMagnet.rigidBody.AddForceAtPosition((Nn-Pn)*lForce, barMagnet.pos2);
  194.             rigidBody.AddForceAtPosition((Pn-Pp)*lForce, pos1);
  195.             rigidBody.AddForceAtPosition((Np-Nn)*lForce, pos2);
  196.         }
  197.  
  198.         public override void OnLoad(XDataHolder stream) {
  199.             base.OnLoad(stream);
  200.             this.LoadMapperValues(stream);
  201.         }
  202.  
  203.         public override void OnSave(XDataHolder stream) {
  204.             base.OnSave(stream);
  205.             this.SaveMapperValues(stream);
  206.         }
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement