public static bool OnTryChangeBlockUser(ModLoader.OnTryChangeBlockUserData d) { if (d.typeTillNow == PatrolFlag.ItemIndex) { Knight toRemove = default(Knight); var state = PlayerState.GetPlayerState(d.requestedBy); var stockpile = Stockpile.GetStockPile(d.requestedBy); if (!Knight.Knights.ContainsKey(d.requestedBy)) { Knight.Knights.Add(d.requestedBy, new List <Knight>()); } foreach (var knight in Knight.Knights[d.requestedBy]) { try { if (knight.PatrolPoints.Contains(d.voxelHit)) { knight.OnRemove(); foreach (var flagPoint in knight.PatrolPoints) { if (flagPoint != d.voxelHit) { if (World.TryGetTypeAt(flagPoint, out var objType) && objType == PatrolFlag.ItemIndex) { ServerManager.TryChangeBlock(flagPoint, BuiltinBlocks.Air); stockpile.Add(PatrolFlag.ItemIndex); } } } break; } } catch (Exception ex) { PandaLogger.LogError(ex); } } if (toRemove != default(Knight)) { PandaChat.Send(d.requestedBy, $"Patrol with {toRemove.PatrolPoints.Count} patrol points no longer active.", ChatColor.orange); Knight.Knights[d.requestedBy].Remove(toRemove); if (((JobTracker.JobFinder)JobTracker.GetOrCreateJobFinder(d.requestedBy)).openJobs.Contains(toRemove)) { ((JobTracker.JobFinder)JobTracker.GetOrCreateJobFinder(d.requestedBy)).openJobs.Remove(toRemove); } JobTracker.Update(); } if (state.FlagsPlaced.Contains(d.voxelHit)) { state.FlagsPlaced.Remove(d.voxelHit); ServerManager.TryChangeBlock(d.voxelHit, BuiltinBlocks.Air); } stockpile.Add(PatrolFlag.ItemIndex); } return(true); }
public static void PlacePatrol(Players.Player player, PlayerClickedData playerClickData) { if (playerClickData.IsConsumed || player.ActiveColony == null || playerClickData.HitType != PlayerClickedData.EHitType.Block) { return; } var click = playerClickData; var state = PlayerState.GetPlayerState(player); var rayCastHit = click.GetVoxelHit(); if (click.TypeSelected == Item.ItemIndex) { if (rayCastHit.TypeHit != PatrolFlag.ItemIndex) { var flagPoint = rayCastHit.BlockHit.Add(0, 1, 0); if (click.ClickType == PlayerClickedData.EClickType.Left) { var hasFlags = player.TakeItemFromInventory(PatrolFlag.ItemIndex); if (!hasFlags) { if (player.ActiveColony.Stockpile.Contains(PatrolFlag.ItemIndex)) { hasFlags = true; player.ActiveColony.Stockpile.TryRemove(PatrolFlag.ItemIndex); } } if (!hasFlags) { PandaChat.Send(player, _localizationHelper, "NoFlags", ChatColor.orange); } else { state.FlagsPlaced.Add(flagPoint); ServerManager.TryChangeBlock(flagPoint, PatrolFlag.ItemIndex); PandaChat.Send(player, _localizationHelper, "CreateJob", ChatColor.orange, state.FlagsPlaced.Count.ToString()); } } } else { foreach (var knight in Knight.Knights[player.ActiveColony]) { if (knight.PatrolPoints.Contains(rayCastHit.BlockHit)) { var patrol = string.Empty; if (knight.PatrolType == PatrolType.RoundRobin) { patrol = "RoundRobinDescription"; knight.PatrolType = PatrolType.WaitRoundRobin; } if (knight.PatrolType == PatrolType.WaitRoundRobin) { patrol = "ZipperDescription"; knight.PatrolType = PatrolType.Zipper; } if (knight.PatrolType == PatrolType.Zipper) { patrol = "WaitRoundRobinDescription"; knight.PatrolType = PatrolType.WaitZipper; } else { patrol = "WaitZipperDescription"; knight.PatrolType = PatrolType.RoundRobin; } PandaChat.Send(player, _localizationHelper, "PatrolTypeSet", ChatColor.orange, knight.PatrolType.ToString()); PandaChat.Send(player, _localizationHelper, patrol, ChatColor.orange); break; } } } } if (click.TypeSelected == Item.ItemIndex && click.ClickType == PlayerClickedData.EClickType.Right) { if (state.FlagsPlaced.Count == 0) { PandaChat.Send(player, _localizationHelper, "MustPlaceFlag", ChatColor.orange); } else { var knight = new Knight(new List <Vector3Int>(state.FlagsPlaced), player.ActiveColony); state.FlagsPlaced.Clear(); player.ActiveColony.JobFinder.RegisterJobAdded(knight); PandaChat.Send(player, _localizationHelper, "Active", ChatColor.orange); player.ActiveColony.JobFinder.Update(); player.ActiveColony.SendCommonData(); } } }
public static void PlacePatrol(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData) { if (boxedData.item1.IsConsumed) { return; } var click = boxedData.item1; Shared.VoxelRayCastHit rayCastHit = click.rayCastHit; var state = PlayerState.GetPlayerState(player); if (rayCastHit.rayHitType == Shared.RayHitType.Block && click.typeSelected == Item.ItemIndex) { var stockpile = Stockpile.GetStockPile(player); if (click.typeHit != PatrolFlag.ItemIndex) { var flagPoint = rayCastHit.voxelHit.Add(0, 1, 0); if (click.clickType == Shared.PlayerClickedData.ClickType.Left) { bool hasFlags = player.TakeItemFromInventory(PatrolFlag.ItemIndex); if (!hasFlags) { var playerStock = Stockpile.GetStockPile(player); if (playerStock.Contains(PatrolFlag.ItemIndex)) { hasFlags = true; playerStock.TryRemove(PatrolFlag.ItemIndex); } } if (!hasFlags) { PandaChat.Send(player, "You have no patrol flags in your stockpile or inventory.", ChatColor.orange); } else { state.FlagsPlaced.Add(flagPoint); ServerManager.TryChangeBlock(flagPoint, PatrolFlag.ItemIndex); PandaChat.Send(player, $"Patrol Point number {state.FlagsPlaced.Count} Registered! Right click to create Job.", ChatColor.orange); } } } else { foreach (var knight in Knight.Knights[player]) { if (knight.PatrolPoints.Contains(rayCastHit.voxelHit)) { string patrol = string.Empty; if (knight.PatrolType == PatrolType.RoundRobin) { patrol = "The knight will patrol from the first to last point, then, work its way backwords to the first. Good for patrolling a secion of a wall"; knight.PatrolType = PatrolType.Zipper; } else { patrol = "The knight will patrol from the first to last point, start over at the first point. Good for circles"; knight.PatrolType = PatrolType.RoundRobin; } PandaChat.Send(player, $"Patrol type set to {knight.PatrolType}!", ChatColor.orange); PandaChat.Send(player, patrol, ChatColor.orange); break; } } } } if (click.typeSelected == Item.ItemIndex && click.clickType == Shared.PlayerClickedData.ClickType.Right) { if (state.FlagsPlaced.Count == 0) { PandaChat.Send(player, "You must place patrol flags using left click before setting the patrol.", ChatColor.orange); } else { var knight = new Knight(new List <Pipliz.Vector3Int>(state.FlagsPlaced), player); state.FlagsPlaced.Clear(); JobTracker.Add(knight); PandaChat.Send(player, "Patrol Active! To stop the patrol pick up any of the patrol flags in the patrol.", ChatColor.orange); JobTracker.Update(); } } }