Example #1
0
        public static void Postfix(AssetImporterAssetImport __instance, AssetImporterAssetImport.VehicleSubMeshImportCallbackHandler callback)
        {
            VehicleInfo vehicleInfo = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;

            if (vehicleInfo)
            {
                TrolleybusAI        trolleybusAI         = vehicleInfo.m_vehicleAI as TrolleybusAI;
                TrolleybusTrailerAI trolleybusTrailerAi  = vehicleInfo.m_vehicleAI as TrolleybusTrailerAI;
                FieldInfo           isPolePanelFieldInfo = typeof(AssetImporterAssetImport).GetField("m_isPolePanel", BindingFlags.Instance | BindingFlags.NonPublic);
                UIPanel             panel = (UIPanel)isPolePanelFieldInfo.GetValue(__instance);
                panel.isVisible = trolleybusAI || trolleybusTrailerAi;
            }
        }
 public static bool Prefix(TrolleybusAI __instance,
                           ushort vehicleID,
                           ref Vehicle vehicleData,
                           PathUnit.Position nextPosition,
                           PathUnit.Position position,
                           uint laneID,
                           byte offset,
                           PathUnit.Position prevPos,
                           uint prevLaneID,
                           byte prevOffset,
                           int index,
                           out Vector3 pos,
                           out Vector3 dir,
                           out float maxSpeed)
 {
     ushort         prevSourceNodeId;
     ushort         prevTargetNodeId;
     ref NetSegment currentPositionSegment = ref position.m_segment.ToSegment();
Example #3
0
        public static bool Prefix(TrolleybusAI __instance,
                                  ushort vehicleID,
                                  ref Vehicle vehicleData,
                                  PathUnit.Position nextPosition,
                                  PathUnit.Position position,
                                  uint laneID,
                                  byte offset,
                                  PathUnit.Position prevPos,
                                  uint prevLaneID,
                                  byte prevOffset,
                                  int index,
                                  out Vector3 pos,
                                  out Vector3 dir,
                                  out float maxSpeed)
        {
            NetManager netManager = Singleton <NetManager> .instance;
            ushort     prevSourceNodeId;
            ushort     prevTargetNodeId;

            NetSegment[] segBuffer = netManager.m_segments.m_buffer;

            if (offset < position.m_offset)
            {
                prevSourceNodeId = segBuffer[position.m_segment].m_startNode;
                prevTargetNodeId = segBuffer[position.m_segment].m_endNode;
            }
            else
            {
                prevSourceNodeId = segBuffer[position.m_segment].m_endNode;
                prevTargetNodeId = segBuffer[position.m_segment].m_startNode;
            }

            ushort refTargetNodeId = prevOffset == 0
                                         ? segBuffer[prevPos.m_segment].m_startNode
                                         : segBuffer[prevPos.m_segment].m_endNode;

            Vehicle.Frame lastFrameData = vehicleData.GetLastFrameData();
            float         sqrVelocity   = lastFrameData.m_velocity.sqrMagnitude;

            netManager.m_lanes.m_buffer[laneID].CalculatePositionAndDirection(
                Constants.ByteToFloat(offset),
                out pos,
                out dir);
            Vector3 b = netManager.m_lanes.m_buffer[prevLaneID].CalculatePosition(
                Constants.ByteToFloat(prevOffset));
            Vector3 a  = lastFrameData.m_position;
            Vector3 a2 = lastFrameData.m_position;
            Vector3 b2 = lastFrameData.m_rotation * new Vector3(
                0f,
                0f,
                __instance.m_info.m_generatedInfo.m_wheelBase * 0.5f);

            a  += b2;
            a2 -= b2;
            float crazyValue = 0.5f * sqrVelocity / __instance.m_info.m_braking;
            float a3         = Vector3.Distance(a, b);
            float b3         = Vector3.Distance(a2, b);

            if (Mathf.Min(a3, b3) >= crazyValue - 1f)
            {
                if (prevSourceNodeId == refTargetNodeId)
                {
                    if (!VehicleBehaviorManager.Instance.MayChangeSegment(
                            vehicleID,
                            ref vehicleData,
                            sqrVelocity,
                            ref prevPos,
                            ref segBuffer[prevPos.m_segment],
                            refTargetNodeId,
                            prevLaneID,
                            ref position,
                            prevSourceNodeId,
                            ref netManager.m_nodes.m_buffer[
                                prevSourceNodeId],
                            laneID,
                            ref nextPosition,
                            prevTargetNodeId,
                            out maxSpeed))
                    {
                        maxSpeed = 0;
                        return(false);
                    }

                    ExtVehicleManager.Instance.UpdateVehiclePosition(
                        vehicleID,
                        ref vehicleData);
                }
            }

            NetInfo info = segBuffer[position.m_segment].Info;

            VehicleAICommons.CustomCalculateTargetSpeed(
                __instance,
                vehicleID,
                ref vehicleData,
                position,
                laneID,
                info,
                out maxSpeed);
            // NON-STOCK CODE END
            return(false);
        }