public static void OnMonsterHit(IMonster monster, Pipliz.Box <float> box)
        {
            var ps = PlayerState.GetPlayerState(monster.OriginalGoal);

            box.Set(box.item1 - (box.item1 * ps.Difficulty.MonsterDamageReduction));
            ServerManager.SendAudio(monster.Position, GameLoader.NAMESPACE + "ZombieAudio");
        }
 public static void OnPlayerHit(Players.Player player, Pipliz.Box <float> box)
 {
     if (box.item1 > 0)
     {
         var state = PlayerState.GetPlayerState(player);
         box.Set(box.item1 + state.Difficulty.MonsterDamage);
     }
 }
Example #3
0
        public static void OnPlayerClicked(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
        {
            var clickedData = boxedData.item1;

            if (clickedData.clickType == Shared.PlayerClickedData.ClickType.Left)
            {
                if (clickedData.rayCastHit.rayHitType == Shared.RayHitType.Block)
                {
                    DoorBlockTracker.ToggleDoor(clickedData.rayCastHit.voxelHit, player);
                }
            }
        }
Example #4
0
        private static void DeductArmor(Pipliz.Box <float> box, Dictionary <ArmorSlot, SettlerInventory.ArmorState> entityArmor, Players.Player player, string name)
        {
            if (box.item1 > 0)
            {
                float armor = 0;

                foreach (ArmorSlot armorSlot in ArmorSlotEnum)
                {
                    if (!entityArmor.ContainsKey(armorSlot))
                    {
                        entityArmor.Add(armorSlot, new SettlerInventory.ArmorState());
                    }

                    if (!entityArmor[armorSlot].IsEmpty())
                    {
                        armor += ArmorLookup[entityArmor[armorSlot].Id].ArmorRating;
                    }
                }

                if (armor != 0)
                {
                    box.Set(box.item1 - (box.item1 * armor));

                    var hitLocation = _rand.Next(1, 100);

                    var dic = _hitChance;

                    if (!entityArmor[ArmorSlot.Shield].IsEmpty())
                    {
                        dic = _hitChanceShield;
                    }

                    foreach (var loc in dic)
                    {
                        if (!entityArmor[loc.Key].IsEmpty() && loc.Value >= hitLocation)
                        {
                            entityArmor[loc.Key].Durability--;

                            if (entityArmor[loc.Key].Durability <= 0)
                            {
                                entityArmor[loc.Key].Durability = 0;
                                entityArmor[loc.Key].Id         = default(ushort);
                                PandaChat.Send(player, $"{name} {loc.Key} broke! If you have a spare one it will be automatically equipt within 30 seconds.", ChatColor.white);
                            }

                            break;
                        }
                    }
                }
            }
        }
        public static void Click(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
        {
            bool healed = false;

            if (!_coolDown.ContainsKey(player))
            {
                _coolDown.Add(player, 0);
            }

            if (boxedData.item1.clickType == Shared.PlayerClickedData.ClickType.Right &&
                boxedData.item1.typeSelected == Item.ItemIndex)
            {
                if (Pipliz.Time.MillisecondsSinceStart > _coolDown[player])
                {
                    var healing = new Entities.HealingOverTimePC(player, 50f, 70f, 5);
                    healed = true;
                }
            }
            else if (boxedData.item1.clickType == Shared.PlayerClickedData.ClickType.Left &&
                     boxedData.item1.typeSelected == Item.ItemIndex &&
                     boxedData.item1.rayCastHit.rayHitType == Shared.RayHitType.NPC)
            {
                if (NPC.NPCTracker.TryGetNPC(boxedData.item1.rayCastHit.hitNPCID, out var npc))
                {
                    if (Pipliz.Time.MillisecondsSinceStart > _coolDown[player])
                    {
                        var heal = new Entities.HealingOverTimeNPC(npc, 50f, 70f, 5);
                        healed = true;
                    }
                }
            }

            if (healed)
            {
                _coolDown[player]            = Pipliz.Time.MillisecondsSinceStart + COOLDOWN;
                boxedData.item1.consumedType = Shared.PlayerClickedData.ConsumedType.UsedByMod;
                ServerManager.SendAudio(player.Position, GameLoader.NAMESPACE + ".Bandage");

                if (Inventory.TryGetInventory(player, out var inv))
                {
                    inv.TryRemove(Item.ItemIndex);
                }
            }
        }
Example #6
0
        public static void OnPlayerClicked(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
        {
            if (Configuration.AllowHandPickingBerryBushes)
            {
                if (boxedData.item1.clickType == Shared.PlayerClickedData.ClickType.Right &&
                    boxedData.item1.rayCastHit.rayHitType == Shared.RayHitType.Block &&
                    World.TryGetTypeAt(boxedData.item1.rayCastHit.voxelHit, out var blockHit) &&
                    blockHit == BlockTypes.Builtin.BuiltinBlocks.BerryBush)
                {
                    Random random = new Random();

                    //To keep this from being OP we lower che chance of gettings berries with each pick
                    float chance = (float)random.NextDouble();
                    if (chance <= Configuration.ChanceOfBerriesPerPick)
                    {
                        var inv = Inventory.GetInventory(player);
                        inv.TryAdd(BuiltinBlocks.Berry, Configuration.NumberOfBerriesPerPick);
                    }
                }
            }
        }
Example #7
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);
                }
            }
        }
Example #8
0
        public static void OnNPCHit(NPC.NPCBase npc, Pipliz.Box <float> box)
        {
            var inv = SettlerInventory.GetSettlerInventory(npc);

            DeductArmor(box, inv.Armor, npc.Colony.Owner, inv.SettlerName);
        }
Example #9
0
 public override void OnRightClickOn(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
 {
     base.OnRightClickOn(player, boxedData);
 }
Example #10
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();
                }
            }
        }
Example #11
0
 /// <summary>
 /// Don't store the Box<>, it's re-used.
 /// See storage.Player for the owner of the recipe
 /// This callback is also called upon loading the settings from json - but only for non-default values (defaults aren't stored)
 /// No registered uses
 /// </summary>
 /// <param name="storage">the players' recipe settings storage</param>
 /// <param name="recipeSetting">the new setting for the recipe</param>
 public virtual void OnPlayerRecipeSettingChanged(RecipeStorage.PlayerRecipeStorage storage, Pipliz.Box <RecipeStorage.RecipeSetting> recipeSetting)
 {
 }
Example #12
0
        public static void ToolUse(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);

            ushort tool = click.typeSelected;

            if (Configuration.EnableMiningWithPick && ItemTypes.IndexLookup.TryGetIndex(Blocks.MOD_NAMESPACE + ".PlayerPick", out ushort toolindex) && tool == toolindex)
            {
                if (click.rayCastHit.rayHitType == Shared.RayHitType.Block && click.clickType == Shared.PlayerClickedData.ClickType.Left)
                {
                    long millisecondsSinceStart = Pipliz.Time.MillisecondsSinceStart;

                    if (Players.LastPunches.TryGetValue(player, out long num) &&
                        millisecondsSinceStart - num < (ItemTypes.GetType(boxedData.item1.typeHit).DestructionTime) * Configuration.PlayerPickCoolDownMultiplier)
                    {
                        return;
                    }

                    Players.LastPunches[player]  = millisecondsSinceStart;
                    boxedData.item1.consumedType = Shared.PlayerClickedData.ConsumedType.UsedByMod;

                    ushort             blockhit  = boxedData.item1.typeHit;
                    ItemTypes.ItemType itemMined = ItemTypes.GetType(blockhit);

                    if (itemMined != null && CanMineBlock(itemMined.ItemIndex))
                    {
                        List <ItemTypes.ItemTypeDrops> itemList = ItemTypes.GetType(itemMined.ItemIndex).OnRemoveItems;

                        bool itemadd = false;
                        for (int i = 0; i < itemList.Count; i++)
                        {
                            if (Pipliz.Random.NextDouble() <= itemList[i].chance)
                            {
                                if (Inventory.GetInventory(player).TryAdd(itemList[i].item.Type))
                                {
                                    itemadd = true;
                                }
                            }
                        }

                        PlayerState.GetPlayerState(player).PlayerPickDurability--;
                        if (PlayerState.GetPlayerState(player).PlayerPickDurability == 0)
                        {
                            if (Inventory.TryGetInventory(player, out Inventory inventory) && inventory.TryRemove(tool))
                            {
                                Chat.Send(player, "Pick has broken!", ChatColor.red);
                                PlayerState.GetPlayerState(player).PlayerPickDurability = Configuration.PlayerPickDuribilityDefault;
                            }
                            if (itemadd)
                            {
                                ServerManager.SendAudio(player.Position, GameLoader.NAMESPACE + ".MiningAudio");
                            }
                            else
                            {
                                Chat.Send(player, "Item could not be harvested!");
                            }
                        }
                    }
                }
            }
        }
Example #13
0
 /// <summary>
 /// Will be triggered when a player {player} makes left click on this type (the type must be in the world)
 /// </summary>
 /// <param name="player">Player who makes the action</param>
 /// <param name="boxedData">Ask ZUN</param>
 public virtual void OnLeftClickOn(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
 {
 }
Example #14
0
        public static void WeaponAttack(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 (ItemFactory.WeaponLookup.ContainsKey(click.typeSelected) &&
                click.rayCastHit.rayHitType == Shared.RayHitType.NPC &&
                click.clickType == Shared.PlayerClickedData.ClickType.Left)
            {
                long millisecondsSinceStart = Pipliz.Time.MillisecondsSinceStart;

                if (state.Weapon.IsEmpty() || state.Weapon.Id != click.typeSelected)
                {
                    state.Weapon = new SettlerInventory.ArmorState()
                    {
                        Id         = click.typeSelected,
                        Durability = WeaponLookup[click.typeSelected].Durability
                    }
                }
                ;

                if (Players.LastPunches.TryGetValue(player, out long num) && millisecondsSinceStart - num < Players.PlayerPunchCooldownMS)
                {
                    return;
                }

                Players.LastPunches[player]  = millisecondsSinceStart;
                boxedData.item1.consumedType = Shared.PlayerClickedData.ConsumedType.UsedByMod;

                if (ZombieID.IsZombieID(rayCastHit.hitNPCID))
                {
                    if (MonsterTracker.TryGetMonsterByID(rayCastHit.hitNPCID, out IMonster monster))
                    {
                        monster.OnHit(ItemFactory.WeaponLookup[click.typeSelected].Damage);
                        state.Weapon.Durability--;
                        ServerManager.SendAudio(monster.PositionToAimFor, "punch");
                    }
                }
                else if (NPCTracker.TryGetNPC(rayCastHit.hitNPCID, out NPCBase nPCBase))
                {
                    nPCBase.OnHit(WeaponLookup[click.typeSelected].Damage);
                    state.Weapon.Durability--;
                    ServerManager.SendAudio(nPCBase.Position.Vector, "punch");
                }

                if (state.Weapon.Durability <= 0)
                {
                    state.Weapon = new SettlerInventory.ArmorState();
                    player.TakeItemFromInventory(click.typeSelected);

                    PandaChat.Send(player, $"Your {WeaponLookup[click.typeSelected].Metal} {WeaponLookup[click.typeSelected].WeaponType} has broke!", ChatColor.orange);
                }
            }
        }
    }
Example #15
0
 /// <summary>
 /// Will be triggered when a player {player} makes right click while holding this type on hand
 /// </summary>
 /// <param name="player">Player who makes the action</param>
 /// <param name="boxedData">Ask ZUN</param>
 public virtual void OnRightClickWith(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData)
 {
 }
        public static void OnNPCHit(NPC.NPCBase npc, Pipliz.Box <float> box)
        {
            var state = PlayerState.GetPlayerState(npc.Colony.Owner);

            box.Set(box.item1 + state.Difficulty.MonsterDamage);
        }
Example #17
0
        public static void OnPlayerHit(Players.Player player, Pipliz.Box <float> box)
        {
            var state = PlayerState.GetPlayerState(player);

            DeductArmor(box, state.Armor, player, "Your");
        }