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); } }
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); } } }
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); } } }
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); } } } }
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 static void OnNPCHit(NPC.NPCBase npc, Pipliz.Box <float> box) { var inv = SettlerInventory.GetSettlerInventory(npc); DeductArmor(box, inv.Armor, npc.Colony.Owner, inv.SettlerName); }
public override void OnRightClickOn(Players.Player player, Pipliz.Box <Shared.PlayerClickedData> boxedData) { base.OnRightClickOn(player, boxedData); }
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(); } } }
/// <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) { }
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!"); } } } } } }
/// <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) { }
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); } } } }
/// <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); }
public static void OnPlayerHit(Players.Player player, Pipliz.Box <float> box) { var state = PlayerState.GetPlayerState(player); DeductArmor(box, state.Armor, player, "Your"); }