public void OnNPCGathered(IJob job, Pipliz.Vector3Int pos, List <ItemTypes.ItemTypeDrops> items)
        {
            if (job == null || job.NPC == null || job.NPC.Colony == null || items == null)
            {
                return;
            }

            ColonyStatistics stats = GetColonyStats(job.NPC.Colony);

            foreach (var item in items)
            {
                var itemStat = stats.GetTimedItemStats(item.Type);
                itemStat.Produce(item.Amount);
                itemStat.AddProducer(job.NPC.ID);
            }
        }
示例#2
0
        public override void OnRightClickWith(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
        {
            if (null == player)
            {
                return;
            }

            Pipliz.Vector3Int position = boxedData.item1.VoxelBuild;

            if (World.TryGetTypeAt(position, out ushort actualType) && actualType == BlockTypes.Builtin.BuiltinBlocks.Air)
            {
                FluidManager.Spread(position, fluid);

                Inventory inv = Inventory.GetInventory(player);

                inv.TryRemove(FluidManager._fluids[(int)fluid].bucket);
                if (!inv.TryAdd(EmptyBucket.typeEmptyBucket))
                {
                    Stockpile.GetStockPile(player).Add(EmptyBucket.typeEmptyBucket);
                }
            }
        }
        public TrainTransport(TransportSave transportSave)
        {
            if (transportSave.type == _trackCalculationType.name)
            {
                Position                  = transportSave.position;
                _prevPosition             = transportSave.prevPos;
                _trainId                  = transportSave.itemName;
                TrackPosition             = transportSave.trackPos;
                TrainType                 = Train.TrainTypes[transportSave.itemName];
                _animatedObject           = Train.TrainAnimations[transportSave.itemName];
                _meshedVehicleDescription = new MeshedVehicleDescription(new ClientMeshedObject(_animatedObject.ObjType, new MeshedObjectID(transportSave.meshid)), TrainType.TrainConfiguration.playerSeatOffset, TrainType.TrainConfiguration.AllowPlayerToEditBlocksWhileRiding);
                _idealHeightFromTrack     = TrainType.TrainConfiguration.IdealHeightFromTrack;
                _energy          = transportSave.energy;
                Delay            = TrainType.TrainConfiguration.MoveTimePerBlockMs;
                ManaCostPerBlock = TrainType.TrainConfiguration.EnergyCostPerBlock;

                if (!string.IsNullOrEmpty(transportSave.player))
                {
                    _player = Players.GetPlayer(NetworkID.Parse(transportSave.player));
                    MeshedObjectManager.Attach(_player, _meshedVehicleDescription);
                }
            }
        }
示例#4
0
        // Returns the Orientation <player> to
        /// <summary>
        /// Returns the relative orientation of the player to the target DIRECTION (vector)
        /// </summary>
        /// <param name="player"></param>
        /// <param name="TargetDirection"></param>
        /// <returns></returns>
        public static Orientation GetOrientationToDirectionFromPlayer(Players.Player player, Pipliz.Vector3Int TargetDirection)
        {
            int angle = GetAngle(TargetDirection, new Pipliz.Vector3Int(player.Forward));

            /*
             * Fuzzy Logic over the angle using angleDiff to define the ranges
             * angleDiff = 20 ~90/4 in this way each direction is ~45º
             *
             * [-20, 20] FORWARD
             * ]20, 70[ FORWARD + RIGHT
             * [70, 110] RIGHT
             * ]110, 160[ BACKWARD + RIGHT
             * [160, 180] & [-160, -180] BACKWARD
             * ]-160, -110[ BACKWARD + LEFT
             * [-110, -70] LEFT
             * ]-70, -20[ FORWARD + LEFT
             *
             * IMPORTANT: When sending Left / Right you have to send the opposite one that has been calculate.
             * If you are looking to the right you have to turn left. When looking back NOT TRANSFORM
             */

            if (angle >= -angleDiff && angle <= angleDiff)  // [-20,20] = FORWARD
            {
                return(Orientation.Forward);
            }

            if (angle > angles[0] + angleDiff && angle < angles[1] - angleDiff)         //]20, 70[ = FORWARD + RIGHT -> LEFT
            {
                return(Orientation.ForwardLeft);
            }

            if (angle >= angles[1] - angleDiff && angle <= angles[1] + angleDiff)       //[70, 110] = RIGHT -> LEFT
            {
                return(Orientation.Left);
            }

            if (angle > angles[1] + angleDiff && angle < angles[2] - angleDiff)         //]110, 160[ = BACKWARD + RIGHT
            {
                return(Orientation.BackwardRight);
            }

            if (angle >= angles[2] - angleDiff || angle <= -angles[2] + angleDiff)      //[160, 180] && [-180, -160] = BACKWARD
            {
                return(Orientation.Backward);
            }

            if (angle > -angles[2] + angleDiff && angle < -angles[1] - angleDiff)       //]-160, -110[ = BACKWARD + LEFT
            {
                return(Orientation.BackwardLeft);
            }

            if (angle >= -angles[1] - angleDiff && angle <= -angles[1] + angleDiff)     //[-110, -70] = LEFT -> RIGHT
            {
                return(Orientation.Right);
            }

            if (angle > -angles[1] + angleDiff && angle < angles[0] - angleDiff)        // ]-70, -20[ = FORWARD + LEFT -> RIGHT
            {
                return(Orientation.ForwardRight);
            }

            return(Orientation.ERROR);
        }
示例#5
0
 /// <summary>
 /// Return the angle (degrees º) between Target (Vector) and Source (Vector) WITHOUT considering the Y AXIS
 /// The result is between [-180, 180]
 /// Positive in a clockwise direction and negative in an anti-clockwise direction.
 /// </summary>
 /// <param name="TargetDirection"></param>
 /// <param name="SourceDirection"></param>
 /// <returns></returns>
 public static int GetAngle(Pipliz.Vector3Int TargetDirection, Pipliz.Vector3Int SourceDirection)
 {
     return((int)UnityEngine.Vector3.SignedAngle(new UnityEngine.Vector3(SourceDirection.x, SourceDirection.z), new UnityEngine.Vector3(TargetDirection.x, TargetDirection.z), Vector3.forward));
 }
示例#6
0
        public static readonly int angleDiff = 20;                       //Diff between angles ~90/4. Example of use: Forward = [-angleDiff, angleDiff]

        /// <summary>
        /// Returns the Direction(vector) between the TargetPosition and SourcePosition
        /// </summary>
        /// <param name="TargetPosition"></param>
        /// <param name="SourcePosition"></param>
        /// <returns></returns>
        public static Pipliz.Vector3Int GetDirection(Pipliz.Vector3Int TargetPosition, Pipliz.Vector3Int SourcePosition)
        {
            return(TargetPosition - SourcePosition);
        }
示例#7
0
        /// <summary>
        /// Returns the relative orientation of the player to the target POSITION (location)
        /// </summary>
        /// <param name="player"></param>
        /// <param name="TargetDirection"></param>
        /// <returns></returns>
        public static Orientation GetOrientationToPositionFromPlayer(Players.Player player, Pipliz.Vector3Int TargetPosition)
        {
            Pipliz.Vector3Int TargetDirection = GetDirection(TargetPosition, new Pipliz.Vector3Int(player.Position));

            return(GetOrientationToDirectionFromPlayer(player, TargetDirection));
        }
示例#8
0
        public TransportManager.ETransportUpdateResult Update()
        {
            if (_removed)
            {
                return(TransportManager.ETransportUpdateResult.Remove);
            }

            var currentPositionInt = new Pipliz.Vector3Int(Position);
            var heightFromTrack    = _idealHeightFromTrack;

            if (TrackPosition == Pipliz.Vector3Int.zero)
            {
                for (int i = -1; i > _idealHeightFromTrack * -1; i--)
                {
                    var trackPos = currentPositionInt.Add(0, i, 0);
                    if (World.TryGetTypeAt(trackPos, out ItemTypes.ItemType possibleTrack) &&
                        ConnectedBlockSystem.BlockLookup.TryGetValue(possibleTrack.Name, out var track) &&
                        track.ConnectedBlock.CalculationType == _trackCalculationType.name &&
                        TrainType.ConnectedBlock.BlockType == track.ConnectedBlock.BlockType)
                    {
                        heightFromTrack = i * -1;
                        TrackPosition   = trackPos;
                        break;
                    }
                }
            }

            if (heightFromTrack != _idealHeightFromTrack)
            {
                Position = currentPositionInt.Add(0, heightFromTrack, 0).Vector;
                _meshedVehicleDescription.Object.SendMoveToInterpolated(Position, Quaternion.identity, (float)GetDelayMillisecondsToNextUpdate() / 1000f, _animatedObject.ObjSettings);
            }
            else if (TrackPosition != Pipliz.Vector3Int.zero)
            {
                bool    moved        = false;
                ICSType trainStation = null;

                if (_trainMoveTime < TimeCycle.TotalHours)
                {
                    if (_minStopNextTime < TimeCycle.TotalHours)
                    {
                        foreach (var stationSide in _trackCalculationType.AvailableBlockSides)
                        {
                            var stationCheck = TrackPosition.GetBlockOffset(stationSide);

                            if (World.TryGetTypeAt(stationCheck, out ItemTypes.ItemType possibleStation) &&
                                ItemCache.CSItems.TryGetValue(possibleStation.Name, out var station) &&
                                station.TrainStationSettings != null &&
                                station.TrainStationSettings.BlockType == TrainType.ConnectedBlock.BlockType)
                            {
                                trainStation = station;

                                foreach (var kvp in RoamingJobManager.Objectives.Values)
                                {
                                    if (kvp.TryGetValue(trainStation.TrainStationSettings.ObjectiveCategory, out var locDic) &&
                                        locDic.TryGetValue(stationCheck, out var roamingJobState))
                                    {
                                        var manaNeeded = RoamingJobState.GetActionsMaxEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName, roamingJobState.Colony, TrainType.TrainConfiguration.RoamingJobCategory) - _energy;

                                        var  existing = roamingJobState.GetActionEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName);
                                        bool isWorked = true;

                                        try
                                        {
                                            if (roamingJobState.Colony.JobFinder.JobsData != null)
                                            {
                                                foreach (var job in roamingJobState.Colony.JobFinder.JobsData.OpenJobs)
                                                {
                                                    try
                                                    {
                                                        if (job != null && job.GetJobLocation() == stationCheck)
                                                        {
                                                            isWorked = false;
                                                            break;
                                                        }
                                                    }
                                                    catch { }
                                                }
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            if (roamingJobState.Colony.JobFinder == null)
                                            {
                                                APILogger.Log("roamingJobState.Colony.JobFinder == null");
                                            }

                                            if (roamingJobState.Colony.JobFinder.JobsData == null)
                                            {
                                                APILogger.Log("roamingJobState.Colony.JobFinder.JobsData == null");
                                            }

                                            if (roamingJobState.Colony.JobFinder.JobsData.OpenJobs == null)
                                            {
                                                APILogger.Log("roamingJobState.Colony.JobFinder.JobsData.OpenJobs == null");
                                            }

                                            APILogger.LogError(ex);
                                        }

                                        if (!isWorked)
                                        {
                                            Indicator.SendIconIndicatorNear(stationCheck.Add(0, 1, 0).Vector, new IndicatorState(10, "npcicon", true, false));
                                        }
                                        else if (existing > 0)
                                        {
                                            if (existing >= manaNeeded)
                                            {
                                                roamingJobState.SubtractFromActionEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName, manaNeeded);
                                                _energy = RoamingJobState.GetActionsMaxEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName, roamingJobState.Colony, TrainType.TrainConfiguration.RoamingJobCategory);
                                                roamingJobState.SubtractFromActionEnergy(TrainType.TrainConfiguration.DurabilityActionEnergyName, .01f);
                                            }
                                            else
                                            {
                                                roamingJobState.SubtractFromActionEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName, existing);
                                                _energy += existing;
                                                roamingJobState.SubtractFromActionEnergy(TrainType.TrainConfiguration.DurabilityActionEnergyName, .01f);
                                            }

                                            Indicator.SendIconIndicatorNear(stationCheck.Add(0, 1, 0).Vector, new IndicatorState(10, TrainType.TrainConfiguration.EnergyType));
                                            _minStopNextTime = TimeCycle.TotalHours + 2;
                                            _trainMoveTime   = TimeCycle.TotalHours + 1;
                                            existing         = roamingJobState.GetActionEnergy(TrainType.TrainConfiguration.EnergyActionEnergyName);
                                        }
                                        else
                                        {
                                            Indicator.SendIconIndicatorNear(stationCheck.Add(0, 1, 0).Vector, new IndicatorState(10, TrainType.TrainConfiguration.EnergyType, true, false));
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    if (trainStation == null && _energy > 0)
                    {
                        foreach (var side in _trackCalculationType.AvailableBlockSides)
                        {
                            var searchSide = TrackPosition.GetBlockOffset(side);
                            var proposePos = currentPositionInt.GetBlockOffset(side).Vector;

                            if (World.TryGetTypeAt(searchSide, out ItemTypes.ItemType possibleTrack) &&
                                ConnectedBlockSystem.BlockLookup.TryGetValue(possibleTrack.Name, out var track) &&
                                track.ConnectedBlock.CalculationType == _trackCalculationType.name &&
                                TrainType.ConnectedBlock.BlockType == track.ConnectedBlock.BlockType &&
                                proposePos != _prevPosition)
                            {
                                _prevPosition = Position;
                                TrackPosition = searchSide;
                                Position      = currentPositionInt.GetBlockOffset(side).Vector;
                                _meshedVehicleDescription.Object.SendMoveToInterpolated(Position, Quaternion.identity, (float)GetDelayMillisecondsToNextUpdate() / 1000f, _animatedObject.ObjSettings);
                                _energy -= ManaCostPerBlock;

                                if (_energy < 0)
                                {
                                    _energy = 0;
                                }

                                ChunkQueue.QueueBannerBox(TrackPosition.Add(-30, -30, -30).ToChunk(), TrackPosition.Add(30, 30, 30).ToChunk());

                                moved = true;
                                break;
                            }
                        }
                    }
                }

                if (!moved)
                {
                    _meshedVehicleDescription.Object.SendMoveToInterpolated(Position, Quaternion.identity, (float)GetDelayMillisecondsToNextUpdate() / 1000f, _animatedObject.ObjSettings);
                }

                if (!moved && _energy > 0)
                {
                    _prevPosition = Vector3.zero;
                }

                if (!moved && _energy <= 0)
                {
                    _trainMoveTime = 0;
                    Indicator.SendIconIndicatorNear(new Pipliz.Vector3Int(Position).Add(0, 2, 0).Vector, new IndicatorState((float)GetDelayMillisecondsToNextUpdate() / 1000f, TrainType.TrainConfiguration.EnergyType, true, false));
                }
            }

            return(TransportManager.ETransportUpdateResult.KeepUpdating);
        }
 public SerializableVector3(Pipliz.Vector3Int vector3)
 {
     x = vector3.x;
     y = vector3.y;
     z = vector3.z;
 }
示例#10
0
 /// <summary>
 /// When this type is removed from the world in the position {position} by the player {causedBy}
 /// </summary>
 /// <param name="position">Position of the block</param>
 /// <param name="newType">Ask ZUN</param>
 /// <param name="causedBy">Player who has removed the block</param>
 public virtual void RegisterOnRemove(Pipliz.Vector3Int position, ushort type, Players.Player causedBy)
 {
 }
示例#11
0
 /// <summary>
 /// When this type is added on the world in the position {position} by the player {causedBy}
 /// </summary>
 /// <param name="position">Position of the block</param>
 /// <param name="newType">Ask ZUN</param>
 /// <param name="causedBy">Player who has added the block</param>
 public virtual void RegisterOnAdd(Pipliz.Vector3Int position, ushort newType, Players.Player causedBy)
 {
 }
示例#12
0
 // Overridable onChange() function for events
 public virtual void onChangeAction(Pipliz.Vector3Int location, ushort fromtype, ushort totype, Players.Player causedBy)
 {
 }
示例#13
0
 // Overridable onAdd() function for events
 public virtual void onAddAction(Pipliz.Vector3Int location, ushort type, Players.Player causedBy)
 {
     //Utilities.WriteLog("Called virtual onAdd");
 }
示例#14
0
 // Overridable onRemove() function for events
 public virtual void onRemoveAction(Pipliz.Vector3Int location, ushort type, Players.Player causedBy)
 {
 }