Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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();
                }
            }
        }
Exemplo n.º 3
0
        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();
                }
            }
        }