public override InteractResult OnActLeft(InteractionContext context) { if (context.HasBlock && context.Block.Is <Minable>()) { var user = context.Player.User; var item = context.Block is IRepresentsItem?Item.Get((IRepresentsItem)context.Block) : null; var totalDamageToTarget = user.BlockHitCache.MemorizeHit(context.Block.GetType(), context.BlockPosition.Value, this.Tier.GetCurrentValue(context.Player.User) * this.Damage); if (context.Block.Get <Minable>().Hardness <= totalDamageToTarget) { var result = AtomicActions.DeleteBlockNow(this.CreateMultiblockContext(context), spawnRubble: false); //Spawn the rubble if needed if (result.Success) { var forced = context.Player.User.Talentset.HasTalent(typeof(MiningLuckyBreakTalent)) ? 4 : -1; if (RubbleObject.TrySpawnFromBlock(context.Player, context.Block.GetType(), context.BlockPosition.Value, forced)) { var addition = item != null ? " " + item.UILink() : string.Empty; this.AddExperience(user, 1f, new LocString(Localizer.Format("mining") + addition)); user.UserUI.OnCreateRubble.Invoke(item.DisplayName.NotTranslated); user.BlockHitCache.ForgetHit(context.BlockPosition.Value); } } return((InteractResult)result); } else { return((InteractResult)AtomicActions.UseToolNow(this.CreateMultiblockContext(context))); } } else if (context.Target is RubbleObject) { var rubble = (RubbleObject)context.Target; if (rubble.IsBreakable) { using var pack = new GameActionPack(); pack.UseTool(this.CreateMultiblockContext(context)); pack.AddPostEffect(() => rubble.Breakup(context.Player)); return((InteractResult)pack.TryPerform(false)); } return(InteractResult.NoOp); } if (context.Target is WorldObject) { return(this.BasicToolOnWorldObjectCheck(context)); } return(base.OnActLeft(context)); }
public override InteractResult OnActLeft(InteractionContext context) { if (context.HasBlock) { var prospectResult = AtomicActions.UseToolNow(this.CreateMultiblockContext(context)); if (prospectResult.Success) { context.Player.OpenUI(this.GetProspectData(context), "ProspectingUI"); } return((InteractResult)prospectResult); } return(base.OnActLeft(context)); }
public int FireArrow(Player player, Vector3 position, Vector3 velocity) { if (player.User.Inventory.TryRemoveItem <ArrowItem>(player.User)) { if (AtomicActions.UseToolNow(this.CreateMultiblockContext(player))) { var arrow = new ArrowEntity { Damage = this.Damage.GetCurrentValue(player.User), Controller = player, Position = position, Velocity = velocity, BowItem = this }; arrow.SetActiveAndCreate(); return(arrow.ID); } } return(-1); }