/// <inheritdoc/> public bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (player.PlayerState.CurrentState != PlayerState.EnteredWorld) { return(false); } // Check Requirements if (!player.CompliesRequirements(item)) { return(false); } var skill = this.GetLearnableSkill(item, player.GameContext.Configuration); if (skill is null || player.SkillList !.ContainsSkill(skill.Number.ToUnsigned())) { return(false); } player.SkillList.AddLearnedSkill(skill); player.Inventory !.RemoveItem(item); player.PersistenceContext.Delete(item); return(true); }
/// <inheritdoc/> public override bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { player.ViewPlugIns.GetPlugIn <IDrinkAlcoholPlugIn>()?.DrinkAlcohol(); return(true); } return(false); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { player.ViewPlugIns.GetPlugIn <IUpdateCurrentManaPlugIn>()?.UpdateCurrentMana(); return(true); } return(false); }
/// <inheritdoc/> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { this.Recover(player); return(true); } return(false); }
/// <inheritdoc/> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { // maybe instead of calling UpdateCurrentHealth etc. provide a more general method where we pass this.CurrentAttribute. The view can then decide what to do with it. player.ViewPlugIns.GetPlugIn <IUpdateCurrentHealthPlugIn>()?.UpdateCurrentHealth(); return(true); } return(false); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { this.healthPotionConsumeHandler.Recover(player); this.shieldPotionConsumeHandler.Recover(player); return(true); } return(false); }
/// <inheritdoc/> public virtual bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (!this.CheckPreconditions(player, item)) { return(false); } this.ConsumeSourceItem(player, item); return(true); }
/// <inheritdoc/> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { var recabs = (player.Attributes[this.MaximumAttribute] * this.RecoverPercent / 100) + this.GetAdditionalRecover(player); player.Attributes[this.CurrentAttribute] = (uint)Math.Min(player.Attributes[this.MaximumAttribute], player.Attributes[this.CurrentAttribute] + recabs); return(true); } return(false); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { var targetMap = player.CurrentMap.Definition.SafezoneMap ?? player.SelectedCharacter.CharacterClass.HomeMap; var exitGate = targetMap.ExitGates.Where(g => g.IsSpawnGate).SelectRandom(); player.WarpTo(exitGate); return(true); } return(false); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { if (player.MagicEffectList.ActiveEffects.TryGetValue(PoisonEffectNumber, out var effect)) { effect.Dispose(); } return(true); } return(false); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (!this.CheckPreconditions(player, item)) { return(false); } var isAdding = fruitUsage != FruitUsage.RemovePoints; var statAttribute = this.GetStatAttribute(item); if (player.Level < 10 || item.Level > 4) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPrevented : FruitConsumptionResult.MinusPrevented, 0, statAttribute); return(false); } var statAttributeDefinition = player.SelectedCharacter !.CharacterClass?.StatAttributes.FirstOrDefault(a => a.IncreasableByPlayer && a.Attribute == statAttribute); if (statAttributeDefinition is null) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPrevented : FruitConsumptionResult.MinusPrevented, 0, statAttribute); return(false); } if (player.Inventory !.EquippedItems.Any()) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()?.ShowResponse(FruitConsumptionResult.PreventedByEquippedItems, 0, statAttribute); return(false); } var maximumRemainingPoints = player.SelectedCharacter.GetMaximumFruitPoints() - (isAdding ? player.SelectedCharacter.UsedFruitPoints : player.SelectedCharacter.UsedNegFruitPoints); if (maximumRemainingPoints <= 0) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPreventedByMaximum : FruitConsumptionResult.MinusPreventedByMaximum, 0, statAttribute); return(false); } if (!isAdding && player.Attributes ![statAttribute] <= statAttributeDefinition.BaseValue)
/// <inheritdoc/> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (player.PlayerState.CurrentState != PlayerState.EnteredWorld) { return(false); } if (targetItem is null) { return(false); } if (targetItem.ItemSlot <= InventoryConstants.LastEquippableItemSlotIndex) { // It shouldn't be possible to upgrade an equipped item. // The original server allowed this, however people managed to downgrade their maxed out weapons to +6 when some // visual bugs on the client occured :D Example: On the server side there is a jewel of bless on a certain slot, // but client shows a health potion. When the client then consumes the potion it would apply the bless to item slot 0. return(false); } if (!this.CheckPreconditions(player, item)) { return(false); } if (!this.ModifyItem(targetItem, player.PersistenceContext)) { return(false); } this.ConsumeSourceItem(player, item); player.ViewPlugIns.GetPlugIn <IItemUpgradedPlugIn>()?.ItemUpgraded(targetItem); return(true); }
/// <summary> /// Handles the consume request. /// </summary> /// <param name="player">The player.</param> /// <param name="inventorySlot">The inventory slot.</param> /// <param name="inventoryTargetSlot">The inventory target slot.</param> /// <param name="fruitUsage">The fruit usage.</param> public void HandleConsumeRequest(Player player, byte inventorySlot, byte inventoryTargetSlot, FruitUsage fruitUsage) { Item item = player.Inventory.GetItem(inventorySlot); if (item == null) { player.ViewPlugIns.GetPlugIn <IRequestedItemConsumptionFailedPlugIn>()?.RequestedItemConsumptionFailed(); return; } this.InitializeConsumeHandlersIfRequired(player.GameContext); if (!this.consumeHandlers.TryGetValue(item.Definition, out var consumeHandler)) { player.ViewPlugIns.GetPlugIn <IRequestedItemConsumptionFailedPlugIn>()?.RequestedItemConsumptionFailed(); return; } var targetItem = player.Inventory.GetItem(inventoryTargetSlot); if (player.GameContext.PlugInManager.GetPlugInPoint <IItemConsumingPlugIn>() is { } plugInPoint) { var eventArgs = new CancelEventArgs(); plugInPoint.ItemConsuming(player, item, targetItem, eventArgs); if (eventArgs.Cancel) { return; } } if (!consumeHandler.ConsumeItem(player, item, targetItem, fruitUsage)) { player.ViewPlugIns.GetPlugIn <IRequestedItemConsumptionFailedPlugIn>()?.RequestedItemConsumptionFailed(); return; } if (item.Durability == 0) { player.Inventory.RemoveItem(item); player.ViewPlugIns.GetPlugIn <Views.Inventory.IItemRemovedPlugIn>()?.RemoveItem(inventorySlot); } else { player.ViewPlugIns.GetPlugIn <IItemDurabilityChangedPlugIn>()?.ItemDurabilityChanged(item, true); } player.GameContext.PlugInManager.GetPlugInPoint <PlugIns.IItemConsumedPlugIn>()?.ItemConsumed(player, item, targetItem); if (item.Durability == 0) { player.GameContext.PlugInManager.GetPlugInPoint <IItemDestroyedPlugIn>()?.ItemDestroyed(item); } }
/// <inheritdoc /> public override async ValueTask <bool> ConsumeItemAsync(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (await base.ConsumeItemAsync(player, item, targetItem, fruitUsage).ConfigureAwait(false)) { this._healthPotionConsumeHandler.Recover(player); this._shieldPotionConsumeHandler.Recover(player); return(true); } return(false); }
/// <inheritdoc/> public override async ValueTask <bool> ConsumeItemAsync(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { var skill = this.GetLearnableSkill(item, player.GameContext.Configuration); if (skill is null || player.SkillList !.ContainsSkill(skill.Number.ToUnsigned())) { return(false); } if (!await base.ConsumeItemAsync(player, item, targetItem, fruitUsage)) { return(false); } await player.SkillList.AddLearnedSkillAsync(skill).ConfigureAwait(false); return(true); }
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { if (!this.CheckPreconditions(player, item, targetItem)) { return(false); } var isAdding = fruitUsage != FruitUsage.RemovePoints; var statAttribute = this.GetStatAttribute(item); if (player.Level < 10 || item.Level > 4) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPrevented : FruitConsumptionResult.MinusPrevented, 0, statAttribute); return(false); } var statAttributeDefinition = player.SelectedCharacter.CharacterClass.StatAttributes.FirstOrDefault(a => a.IncreasableByPlayer && a.Attribute == statAttribute); if (statAttributeDefinition is null) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPrevented : FruitConsumptionResult.MinusPrevented, 0, statAttribute); return(false); } if (player.Inventory.EquippedItems.Any()) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()?.ShowResponse(FruitConsumptionResult.PreventedByEquippedItems, 0, statAttribute); return(false); } var maximumRemainingPoints = player.SelectedCharacter.GetMaximumFruitPoints() - (isAdding ? player.SelectedCharacter.UsedFruitPoints : player.SelectedCharacter.UsedNegFruitPoints); if (maximumRemainingPoints <= 0) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusPreventedByMaximum : FruitConsumptionResult.MinusPreventedByMaximum, 0, statAttribute); return(false); } if (!isAdding && player.Attributes[statAttribute] <= statAttributeDefinition.BaseValue) { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(FruitConsumptionResult.MinusPreventedByDefault, 0, statAttribute); return(false); } var successPercentage = this.GetSuccessPercentage(player, isAdding); if (Rand.NextRandomBool(successPercentage)) { var randomPoints = (byte)Math.Min(maximumRemainingPoints, this.GetRandomPoints(isAdding)); if (isAdding) { player.Attributes[statAttribute] += randomPoints; player.SelectedCharacter.UsedFruitPoints += randomPoints; player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(FruitConsumptionResult.PlusSuccess, randomPoints, statAttribute); } else { player.Attributes[statAttribute] -= randomPoints; player.SelectedCharacter.UsedNegFruitPoints += randomPoints; player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(FruitConsumptionResult.MinusSuccess, randomPoints, statAttribute); } } else { player.ViewPlugIns.GetPlugIn <IFruitConsumptionResponsePlugIn>()? .ShowResponse(isAdding ? FruitConsumptionResult.PlusFailed : FruitConsumptionResult.MinusFailed, 0, statAttribute); } this.ConsumeSourceItem(player, item); return(true); }
/// <inheritdoc /> public override async ValueTask <bool> ConsumeItemAsync(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (await base.ConsumeItemAsync(player, item, targetItem, fruitUsage).ConfigureAwait(false)) { var targetMapDef = player.CurrentMap !.Definition.SafezoneMap ?? player.SelectedCharacter !.CharacterClass !.HomeMap; if (targetMapDef is { } &&
/// <inheritdoc /> public override bool ConsumeItem(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (base.ConsumeItem(player, item, targetItem, fruitUsage)) { var targetMapDef = player.CurrentMap !.Definition.SafezoneMap ?? player.SelectedCharacter !.CharacterClass !.HomeMap; if (targetMapDef is { } &&
/// <inheritdoc/> public virtual async ValueTask <bool> ConsumeItemAsync(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (!this.CheckPreconditions(player, item)) { return(false); } await this.ConsumeSourceItemAsync(player, item).ConfigureAwait(false); return(true); }
/// <inheritdoc/> public bool ConsumeItem(Player player, Item item, Item targetItem, FruitUsage fruitUsage) { player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage("Using this item is not implemented yet.", MessageType.BlueNormal); return(false); }
/// <inheritdoc /> public override async ValueTask <bool> ConsumeItemAsync(Player player, Item item, Item?targetItem, FruitUsage fruitUsage) { if (await base.ConsumeItemAsync(player, item, targetItem, fruitUsage).ConfigureAwait(false)) { if (player.MagicEffectList.ActiveEffects.TryGetValue(PoisonEffectNumber, out var effect)) { effect.Dispose(); } return(true); } return(false); }