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); } }
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); } } }
// 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); }
/// <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)); }
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); }
/// <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)); }
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; }
/// <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) { }
/// <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) { }
// Overridable onChange() function for events public virtual void onChangeAction(Pipliz.Vector3Int location, ushort fromtype, ushort totype, Players.Player causedBy) { }
// Overridable onAdd() function for events public virtual void onAddAction(Pipliz.Vector3Int location, ushort type, Players.Player causedBy) { //Utilities.WriteLog("Called virtual onAdd"); }
// Overridable onRemove() function for events public virtual void onRemoveAction(Pipliz.Vector3Int location, ushort type, Players.Player causedBy) { }