Example #1
0
 public Inserter(string data)
 {
     pd         = default;
     inserter   = default;
     isInserter = true;
     type       = EDataType.Inserter;
     string[] s = data.Split(',');
     if (s.Length > 20)
     {
         pd.protoId            = short.Parse(s[0]);
         pd.modelIndex         = short.Parse(s[1]);
         pd.pos                = new Vector3(float.Parse(s[2]), float.Parse(s[3]), float.Parse(s[4]));
         pd.rot                = new Quaternion(float.Parse(s[5]), float.Parse(s[6]), float.Parse(s[7]), float.Parse(s[8]));
         pd.pos2               = new Vector3(float.Parse(s[9]), float.Parse(s[10]), float.Parse(s[11]));
         pd.rot2               = new Quaternion(float.Parse(s[12]), float.Parse(s[13]), float.Parse(s[14]), float.Parse(s[15]));
         pd.filterId           = int.Parse(s[16]);
         inserter.pickTarget   = int.Parse(s[17]);
         inserter.insertTarget = int.Parse(s[18]);
         inserter.stt          = int.Parse(s[19]);
         inserter.delay        = int.Parse(s[20]);
         if (s.Length > 22)
         {
             outConn = int.Parse(s[21]);
             inConn  = int.Parse(s[22]);
         }
         if (s.Length > 23)
         {
             oldEId = int.Parse(s[23]);
         }
     }
 }
Example #2
0
 public Inserter(PrebuildData prebuild, InserterComponent inserter, int Out, int In)
 {
     pd            = prebuild;
     isInserter    = true;
     type          = EDataType.Inserter;
     this.inserter = inserter;
     outConn       = Out;
     inConn        = In;
 }
    static PrebuildData GetPreDate(InserterComponent ic, EntityData ed)
    {
        PrebuildData prebuild = default(PrebuildData);

        prebuild.protoId      = (short)ed.protoId;
        prebuild.modelIndex   = (short)ed.modelIndex;
        prebuild.pos          = ed.pos;
        prebuild.pos2         = ic.pos2;
        prebuild.rot          = ed.rot;
        prebuild.rot2         = ic.rot2;
        prebuild.filterId     = ic.filter;
        prebuild.insertOffset = ic.insertOffset;
        prebuild.pickOffset   = ic.pickOffset;
        return(prebuild);
    }
Example #4
0
        public static InserterCopy CopyInserter(EntityData sourceEntity, EntityData referenceEntity)
        {
            PlanetFactory      factory     = GameMain.data.localPlanet.factory;
            PlayerAction_Build actionBuild = GameMain.data.mainPlayer.controller.actionBuild;

            if (sourceEntity.inserterId == 0)
            {
                return(null);
            }

            InserterComponent inserter = factory.factorySystem.inserterPool[sourceEntity.inserterId];

            if (data.copiedInserters.FindIndex(x => x.originalId == inserter.entityId) != -1)
            {
                return(null);
            }

            int pickTarget   = inserter.pickTarget;
            int insertTarget = inserter.insertTarget;

            ItemProto itemProto = LDB.items.Select(sourceEntity.protoId);

            bool incoming = insertTarget == referenceEntity.id;
            int  otherId  = incoming ? pickTarget : insertTarget;


            Vector2 referenceSprPos = referenceEntity.pos.ToSpherical();
            Vector2 sourceSprPos    = sourceEntity.pos.ToSpherical();
            Vector2 sourceSprPos2   = inserter.pos2.ToSpherical();

            // The belt or other building this inserter is attached to
            Vector2   otherSprPos;
            ItemProto otherProto;

            if (otherId > 0)
            {
                otherProto  = LDB.items.Select(factory.entityPool[otherId].protoId);
                otherSprPos = factory.entityPool[otherId].pos.ToSpherical();
            }
            else if (otherId < 0)
            {
                otherProto  = LDB.items.Select(factory.prebuildPool[-otherId].protoId);
                otherSprPos = factory.prebuildPool[-otherId].pos.ToSpherical();
            }
            else
            {
                otherSprPos = sourceSprPos2;
                otherProto  = null;
            }

            bool otherIsBelt = otherProto == null || otherProto.prefabDesc.isBelt;


            // Cache info for this inserter
            InserterCopy copiedInserter = new InserterCopy
            {
                itemProto  = itemProto,
                protoId    = itemProto.ID,
                originalId = inserter.entityId,

                pickTarget   = pickTarget,
                insertTarget = insertTarget,

                referenceBuildingId = referenceEntity.id,

                incoming = incoming,

                // rotations + deltas relative to the source building's rotation
                rot       = Quaternion.Inverse(referenceEntity.rot) * sourceEntity.rot,
                rot2      = Quaternion.Inverse(referenceEntity.rot) * inserter.rot2,
                posDelta  = sourceSprPos - referenceSprPos,  // Delta from copied building to inserter pos
                pos2Delta = sourceSprPos2 - referenceSprPos, // Delta from copied building to inserter pos2

                posDeltaCount  = sourceSprPos.GetSegmentsCount(),
                pos2DeltaCount = sourceSprPos2.GetSegmentsCount(),

                otherPosDelta      = otherSprPos - referenceSprPos,
                otherPosDeltaCount = otherSprPos.GetSegmentsCount(),

                // not important?
                pickOffset   = inserter.pickOffset,
                insertOffset = inserter.insertOffset,

                filterId = inserter.filter,


                startSlot = -1,
                endSlot   = -1,

                otherIsBelt = otherIsBelt
            };

            InserterPoses.CalculatePose(actionBuild, pickTarget, insertTarget);

            if (actionBuild.posePairs.Count > 0)
            {
                float minDistance = 1000f;
                for (int j = 0; j < actionBuild.posePairs.Count; ++j)
                {
                    var   posePair      = actionBuild.posePairs[j];
                    float startDistance = Vector3.Distance(posePair.startPose.position, sourceEntity.pos);
                    float endDistance   = Vector3.Distance(posePair.endPose.position, inserter.pos2);
                    float poseDistance  = startDistance + endDistance;

                    if (poseDistance < minDistance)
                    {
                        minDistance = poseDistance;
                        copiedInserter.startSlot = posePair.startSlot;
                        copiedInserter.endSlot   = posePair.endSlot;

                        copiedInserter.pickOffset   = (short)posePair.startOffset;
                        copiedInserter.insertOffset = (short)posePair.endOffset;
                    }
                }
            }


            /*        factory.ReadObjectConn(sourceEntity.id, 1, out bool isOutput, out int connectedId, out int connectedSlot);
             *
             *          if (connectedId != 0)
             *          {
             *              copiedInserter.startSlot = connectedSlot;
             *          }
             *
             *
             *          factory.ReadObjectConn(sourceEntity.id, 0, out _, out connectedId, out connectedSlot);
             *          if (connectedId != 0)
             *          {
             *              copiedInserter.endSlot = connectedSlot;
             *          }
             */

            data.copiedInserters.Add(copiedInserter);

            return(copiedInserter);
        }
    public void CopyBuildData(PlanetFactory factory, int i)
    {
        var fSystem = factory.factorySystem;
        var ed      = factory.entityPool[i];


        if (ed.protoId > 0)
        {
            if (ed.labId > 0 && ed.storageId > 0 || ed.tankId > 0)
            {
                return;
            }
            MyPreBuildData temp = null;

            if (ed.splitterId > 0)
            {
                var ap = factory.cargoTraffic.splitterPool[ed.splitterId];
                int c0 = factory.entityConnPool[16 * ap.entityId];
                int c1 = factory.entityConnPool[16 * ap.entityId + 1];
                int c2 = factory.entityConnPool[16 * ap.entityId + 2];
                int c3 = factory.entityConnPool[16 * ap.entityId + 3];
                temp = new Splitter(GetPreDate(ed), c0, c1, c2, c3);
            }
            else if (ed.stationId > 0)
            {
                var ap = factory.transport.stationPool[ed.stationId];
                if (ap != null)
                {
                    temp = new Station(GetPreDate(ed), ap);
                }
            }
            else if (ed.inserterId > 0)
            {
                var ip = fSystem.inserterPool[ed.inserterId];
                InserterComponent tempp = ip;
                int outConn             = factory.entityConnPool[i * 16];
                int inConn = factory.entityConnPool[i * 16 + 1];
                temp = new Inserter(GetPreDate(tempp, ed), ip, outConn, inConn);
            }
            else if (ed.beltId > 0)
            {
                var  ap = factory.cargoTraffic.beltPool[ed.beltId];
                bool flag2;
                int  slot;
                factory.ReadObjectConn(i, 0, out flag2, out int out1, out slot);
                factory.ReadObjectConn(i, 1, out flag2, out int in1, out slot);
                factory.ReadObjectConn(i, 2, out flag2, out int in2, out slot);
                factory.ReadObjectConn(i, 3, out flag2, out int in3, out slot);
                temp = new Belt(GetPreDate(ap, ed), ap, out1, in1, in2, in3);
                Belt tBelt = (Belt)temp;
                if (out1 == 0)
                {
                    CheckBeltData.Add(i, tBelt);
                }

                tBelt.beltOut = EIdIsBeltId(out1);
                tBelt.beltIn1 = EIdIsBeltId(in1);
                tBelt.beltIn2 = EIdIsBeltId(in2);
                tBelt.beltIn3 = EIdIsBeltId(in3);
            }
            else if (ed.fractionateId > 0)
            {
                var ap = factory.factorySystem.fractionatePool[ed.fractionateId];
                int c0 = factory.entityConnPool[i * 16];
                int c1 = factory.entityConnPool[i * 16 + 1];
                int c2 = factory.entityConnPool[i * 16 + 2];
                temp = new Fractionate(GetPreDate(ed), c0, c1, c2);
            }
            else if (ed.powerExcId > 0)
            {
                var ap = factory.powerSystem.excPool[ed.powerExcId];
                int c0 = factory.entityConnPool[i * 16];
                int c1 = factory.entityConnPool[i * 16 + 1];
                int c2 = factory.entityConnPool[i * 16 + 2];
                int c3 = factory.entityConnPool[i * 16 + 3];
                temp = new PowerExchanger(GetPreDate(ed), c0, c1, c2, c3, ap.targetState);
            }
            else if (ed.assemblerId > 0)
            {
                var ap = fSystem.assemblerPool[ed.assemblerId];
                temp = new Assembler(GetPreDate(ap, ed));
            }
            else if (ed.ejectorId > 0)
            {
                var ap = fSystem.ejectorPool[ed.ejectorId];
                temp = new Assembler(GetPreDate(ed));
            }
            else if (ed.siloId > 0)
            {
                var ap = fSystem.siloPool[ed.siloId];
                temp = new Assembler(GetPreDate(ed));
            }
            else if (ed.powerGenId > 0)
            {
                var ap = factory.powerSystem.genPool[ed.powerGenId];
                if (ap.gamma)
                {
                    int c0 = factory.entityConnPool[16 * ap.entityId];
                    int c1 = factory.entityConnPool[16 * ap.entityId + 1];
                    temp = new Gamm(GetPreDate(ed), ap.productId, c0, c1);
                }
                else
                {
                    temp      = new Assembler(GetPreDate(ed));
                    temp.type = EDataType.PowGen;
                }
            }
            else if (ed.powerNodeId > 0)
            {
                var ap = factory.powerSystem.nodePool[ed.powerNodeId];
                temp = new Assembler(GetPreDate(ed));
            }
            //else if (ed.storageId > 0)
            //{
            //	var ap = factory.factoryStorage.storagePool[ed.storageId];
            //    if (ap.next == 0)
            //    {
            //		temp = new Assembler(GetPreDate(ed));
            //    }
            //}

            if (temp != null)
            {
                temp.oldEId = i;
                AllData.Add(temp);
                AddItemCount(ed.protoId);
            }
        }
    }