public override IAtomicAction CreateLevelUpAction(Player player) { if (this.Level != 0 || this.HasGivenItems) { return(base.CreateLevelUpAction(player)); } InventoryChangeSet changeSet = InventoryChangeSet.New(player.User.Inventory, player.User); foreach (Tuple <Type, int> tuple in ItemsGiven) { changeSet.AddItems(tuple.Item1, tuple.Item2); } SimpleAtomicAction setHasGivenItems = new SimpleAtomicAction(() => this.HasGivenItems = true); return(new DecoratedResultAtomicAction(new MultiAtomicAction(changeSet, setHasGivenItems), (result) => { if (result.Success) { return result; } else { return Skill.CantCarry(ItemDescriptions()); } })); }
public override void OnUsed(Player player, ItemStack itemStack) { if (player.User.Skillset.HasSkill(this.SkillType)) { player.SendTemporaryErrorLoc(string.Format("You already know {0}.", this.Skill)); } else { using (var changes = InventoryChangeSet.New(new Inventory[] { player.User.Inventory, itemStack.Parent }.Distinct(), player.User)) { changes.ModifyStack(itemStack, -1); if (changes.TryApply()) { if (!this.Skill.IsDiscovered()) { ChatManager.ServerMessageToAllLoc(string.Format("{0} discovered {1}!", player.User.UILink(), this.Skill.UILink()), false, DefaultChatTags.Skills); } player.User.Skillset.LearnSkill(this.Skill.GetType()); player.SendTemporaryMessageLoc(string.Format("You have learned a new skill {0}!", this.Skill.UILink()), ChatCategory.Info); } else { player.SendTemporaryErrorLoc(string.Format("Could not learn {0}: more inventory space required.", this.Skill)); } } } }