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); } } } }
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!"); } } } } } }
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(); } } }