From 2f1aa97a0e783ee82f79b871be404219e0d8bd18 Mon Sep 17 00:00:00 2001 From: GajuszZOrod Date: Sat, 21 Sep 2024 21:56:24 +0200 Subject: [PATCH] Zmiana sposobu naliczania bonusu dmg broni od surowca i od exp --- .../Items/Skill Items/Tools/BaseRunicTool.cs | 2 +- Scripts/Items/Weapons/BaseWeapon.cs | 107 +++------- Scripts/Items/Weapons/Ranged/BaseRanged.cs | 2 +- .../ExtraCraftResource/ExtraCraftResource.cs | 2 + .../Nelderim/Items/Weapons/BaseWeaponExt.cs | 193 ++++++++++++++++++ 5 files changed, 229 insertions(+), 77 deletions(-) create mode 100644 Scripts/Nelderim/Items/Weapons/BaseWeaponExt.cs diff --git a/Scripts/Items/Skill Items/Tools/BaseRunicTool.cs b/Scripts/Items/Skill Items/Tools/BaseRunicTool.cs index 9c85258e..051bc2ee 100644 --- a/Scripts/Items/Skill Items/Tools/BaseRunicTool.cs +++ b/Scripts/Items/Skill Items/Tools/BaseRunicTool.cs @@ -382,7 +382,7 @@ public static void ApplyAttributesTo( BaseWeapon weapon, bool isRunicTool, int l break; } - case 3: ApplyAttribute( primary, min, max, draw, AosAttribute.WeaponDamage, 36, 50 ); break; + case 3: ApplyAttribute( primary, min, max, draw, AosAttribute.WeaponDamage, 1, 50 ); break; case 4: ApplyAttribute( primary, min, max, draw, AosAttribute.DefendChance, 1, 15 ); break; case 5: ApplyAttribute( primary, min, max, draw, AosAttribute.CastSpeed, 1, 1 ); break; case 6: ApplyAttribute( primary, min, max, draw, AosAttribute.AttackChance, 1, 15 ); break; diff --git a/Scripts/Items/Weapons/BaseWeapon.cs b/Scripts/Items/Weapons/BaseWeapon.cs index be0a8b24..6f3c091f 100644 --- a/Scripts/Items/Weapons/BaseWeapon.cs +++ b/Scripts/Items/Weapons/BaseWeapon.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using Server.Spells.Spellweaving; using Nelderim.ExtraCraftResource; +using static Server.Items.ArtifactMonster; namespace Server.Items { @@ -22,7 +23,7 @@ public interface ISlayer SlayerName Slayer2 { get; set; } } - public abstract class BaseWeapon : Item, IWeapon, IFactionItem, ICraftable, ISlayer, IDurability, IIdentifiable + public abstract partial class BaseWeapon : Item, IWeapon, IFactionItem, ICraftable, ISlayer, IDurability, IIdentifiable { private string m_EngravedText; @@ -2318,52 +2319,6 @@ public virtual int GetHitChanceBonus() return bonus; } - public virtual int GetDamageBonus() - { - int bonus = VirtualDamageBonus; - - switch (m_Quality) - { - case WeaponQuality.Low: bonus -= 20; break; - case WeaponQuality.Exceptional: bonus += 20; break; - } - - // zombie - 17-06-2012 - DI bonus z resourcow - CraftResourceInfo resInfo = CraftResources.GetInfo(m_Resource); - if (resInfo != null) - { - CraftAttributeInfo attrInfo = resInfo.AttributeInfo; - - if (attrInfo != null) - bonus += attrInfo.WeaponDamageIncrease; - } - - CraftResourceInfo resInfo2 = CraftResources.GetInfo(Resource2); - if (resInfo2 != null) - { - CraftAttributeInfo attrInfo2 = resInfo2.AttributeInfo; - - if (attrInfo2 != null) - bonus += attrInfo2.WeaponDamageIncrease; - } - - // cap 50% DI na broni (bez DamageLevel) - int maxBonus = 50 - m_AosAttributes.WeaponDamageId(m_Identified); - bonus = bonus > maxBonus ? maxBonus : bonus; - - switch (m_DamageLevel) - { - case WeaponDamageLevel.Ruin: bonus += 15; break; - case WeaponDamageLevel.Might: bonus += 20; break; - case WeaponDamageLevel.Force: bonus += 25; break; - case WeaponDamageLevel.Power: bonus += 30; break; - case WeaponDamageLevel.Vanq: bonus += 35; break; - } - - return bonus > 0 ? bonus : 0; - // zombie - } - public virtual void GetStatusDamage( Mobile from, out int min, out int max ) { int baseMin, baseMax; @@ -2438,7 +2393,7 @@ public virtual double ScaleDamageAOS( Mobile attacker, double damage, bool check damageBonus = 100; #endregion - double totalBonus = strengthBonus + anatomyBonus + tacticsBonus + lumberBonus + ((double)(GetDamageBonus() + damageBonus) / 100.0); + double totalBonus = strengthBonus + anatomyBonus + tacticsBonus + lumberBonus + (damageBonus / 100.0); return damage + (int)(damage * totalBonus); } @@ -3521,7 +3476,7 @@ public override void GetProperties( ObjectPropertyList list ) } ItemIdentification.AddNameProperty(AosWeaponAttribute.UseBestSkill, 1060400, m_AosWeaponAttributes.UseBestSkill, ref list, m_Identified); - ItemIdentification.AddNameProperty(AosAttribute.WeaponDamage, 1060401, GetDamageBonus() + m_AosAttributes.WeaponDamage, ref list, m_Identified); + ItemIdentification.AddNameProperty(AosAttribute.WeaponDamage, 1060401, m_AosAttributes.WeaponDamage, ref list, m_Identified); ItemIdentification.AddNameProperty(AosAttribute.DefendChance, 1060408, m_AosAttributes.DefendChance, ref list, m_Identified); ItemIdentification.AddNameProperty(AosAttribute.EnhancePotions, 1060411, m_AosAttributes.EnhancePotions, ref list, m_Identified); ItemIdentification.AddNameProperty(AosAttribute.CastRecovery, 1060412, m_AosAttributes.CastRecovery, ref list, m_Identified); @@ -3666,27 +3621,11 @@ public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craft PlayerConstructed = true; - Type resourceType = typeRes; - /* - if ( resourceType == null ) - resourceType = craftItem.Ressources.GetAt( 0 ).ItemType; - */ + Type resourceType = typeRes; Resource = CraftResources.GetFromType( resourceType ); - Type resourceType2 = typeRes2; - /* - if ( resourceType2 == null ) - { - if( craftItem.Ressources.Count >= 2 ) - { - resourceType2 = craftItem.Ressources.GetAt( 1 ).ItemType; - Resource2 = CraftResources.GetFromType( resourceType2 ); - } - else - Resource2 = CraftResource.None; - } - else */ - Resource2 = CraftResources.GetFromType( resourceType2 ); + Type resourceType2 = typeRes2; + Resource2 = CraftResources.GetFromType( resourceType2 ); if ( Core.AOS ) { @@ -3700,21 +3639,34 @@ public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craft if ( Quality == WeaponQuality.Exceptional ) { - if ( Attributes.WeaponDamage > 35 ) - Attributes.WeaponDamage -= 20; - else - Attributes.WeaponDamage = 15; + Attributes.WeaponDamage += DamageBonusFromExceptional(); if( Core.ML ) { Attributes.WeaponDamage += (int)(from.Skills.ArmsLore.Value / 20); - if ( Attributes.WeaponDamage > 50 ) - Attributes.WeaponDamage = 50; - from.CheckSkill( SkillName.ArmsLore, 0, 100 ); } } + + CraftResourceInfo resInfo = CraftResources.GetInfo(Resource); + if (resInfo != null) + { + CraftAttributeInfo attrInfo = resInfo.AttributeInfo; + if (attrInfo != null) + DistributeMaterialBonus(attrInfo); + } + + CraftResourceInfo resInfo2 = CraftResources.GetInfo(Resource2); + if (resInfo2 != null) + { + CraftAttributeInfo attrInfo2 = resInfo2.AttributeInfo; + if (attrInfo2 != null) + DistributeMaterialBonus(attrInfo2); + } + + if (Attributes.WeaponDamage > 50) + Attributes.WeaponDamage = 50; } else if ( tool is BaseRunicTool ) { @@ -3800,6 +3752,11 @@ public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craft return quality; } + public virtual void DistributeMaterialBonus(CraftAttributeInfo attrInfo) + { + m_AosAttributes.WeaponDamage += attrInfo.WeaponDamageIncrease; + } + #endregion } diff --git a/Scripts/Items/Weapons/Ranged/BaseRanged.cs b/Scripts/Items/Weapons/Ranged/BaseRanged.cs index 03223bdb..753fb425 100644 --- a/Scripts/Items/Weapons/Ranged/BaseRanged.cs +++ b/Scripts/Items/Weapons/Ranged/BaseRanged.cs @@ -6,7 +6,7 @@ namespace Server.Items { - public abstract class BaseRanged : BaseMeleeWeapon + public abstract partial class BaseRanged : BaseMeleeWeapon { public abstract int EffectID{ get; } public abstract Type AmmoType{ get; } diff --git a/Scripts/Nelderim/Engines/ExtraCraftResource/ExtraCraftResource.cs b/Scripts/Nelderim/Engines/ExtraCraftResource/ExtraCraftResource.cs index f0ff1e3a..504d9ada 100644 --- a/Scripts/Nelderim/Engines/ExtraCraftResource/ExtraCraftResource.cs +++ b/Scripts/Nelderim/Engines/ExtraCraftResource/ExtraCraftResource.cs @@ -15,6 +15,8 @@ public static void Initialize() { EventSink.WorldSave += new WorldSaveEventHandler( Save ); Load( ModuleName ); + + BaseWeaponExt.InitializeWeaponDamageFix(); } public static void Save( WorldSaveEventArgs args ) diff --git a/Scripts/Nelderim/Items/Weapons/BaseWeaponExt.cs b/Scripts/Nelderim/Items/Weapons/BaseWeaponExt.cs new file mode 100644 index 00000000..bf5fb77e --- /dev/null +++ b/Scripts/Nelderim/Items/Weapons/BaseWeaponExt.cs @@ -0,0 +1,193 @@ +using Server; +using System.IO; +using System; +using Nelderim; +using Nelderim.Speech; +using Server.Spells.Bushido; +using static Server.Items.ArtifactMonster; + +namespace Server.Items +{ + public abstract partial class BaseWeapon + { + [CommandProperty(AccessLevel.GameMaster)] + public int LegacyDamageAttr + { + get { return BaseWeaponExt.Get(this).LegacyDamageAttr; } + set + { + if (BaseWeaponExt.Get(this).LegacyDamageAttr == int.MinValue) // do not overwrite if already set + BaseWeaponExt.Get(this).LegacyDamageAttr = value; + } + } + + public virtual int DamageBonusFromExceptional() + { + return 35; + } + } + + public abstract partial class BaseRanged + { + public override int DamageBonusFromExceptional() + { + return 25; + } + } + + class BaseWeaponExt : NExtension + { + private static string moduleName = "BaseWeapon"; + private static bool WeaponsAlreadyFixed = true; + + public static void InitializeWeaponDamageFix() + { + Load(); + + EventSink.WorldSave += new WorldSaveEventHandler(SaveState); + + if (!WeaponsAlreadyFixed) + { + Console.WriteLine("Weapon damage fix: applying..."); + + FixAllWeaponsDamage(); + } + else + { + Console.WriteLine("Weapon damage fix: not required"); + } + } + + private static void FixAllWeaponsDamage() + { + foreach (var item in World.Items.Values) + { + if (item is BaseWeapon) + { + BaseWeapon weapon = (BaseWeapon)item; + + weapon.LegacyDamageAttr = weapon.Attributes.WeaponDamage; // backup original +DI value + + if (weapon.Quality == WeaponQuality.Exceptional) + weapon.Attributes.WeaponDamage += weapon.DamageBonusFromExceptional(); + + CraftResourceInfo resInfo = CraftResources.GetInfo(weapon.Resource); + if (resInfo != null) + { + CraftAttributeInfo attrInfo = resInfo.AttributeInfo; + + if (attrInfo != null) + weapon.Attributes.WeaponDamage += attrInfo.WeaponDamageIncrease; + } + CraftResourceInfo resInfo2 = CraftResources.GetInfo(weapon.Resource2); + if (resInfo2 != null) + { + CraftAttributeInfo attrInfo2 = resInfo2.AttributeInfo; + + if (attrInfo2 != null) + weapon.Attributes.WeaponDamage += attrInfo2.WeaponDamageIncrease; + } + + weapon.Attributes.WeaponDamage = Math.Min(weapon.Attributes.WeaponDamage, 50); + + weapon.InvalidateProperties(); + } + } + } + + private static void Load() + { + if (!File.Exists(@"Saves/Nelderim/" + moduleName + ".sav")) + moduleName = char.ToLower(moduleName[0]) + moduleName.Substring(1); // 1st letter lowercase + if (!File.Exists(@"Saves/Nelderim/" + moduleName + ".sav")) + { + WeaponsAlreadyFixed = false; + return; + } + + string pathNfile = @"Saves/Nelderim/" + moduleName + ".sav"; + + Console.WriteLine(moduleName + ": Wczytywanie..."); + using (FileStream m_FileStream = new FileStream(pathNfile, FileMode.Open, FileAccess.Read)) + { + BinaryReader m_BinaryReader = new BinaryReader(m_FileStream); + BinaryFileReader reader = new BinaryFileReader(m_BinaryReader); + + WeaponsAlreadyFixed = reader.ReadBool(); + + int count = reader.ReadInt(); + for (int i = 0; i < count; i++) + { + Serial serial = (Serial)reader.ReadInt(); + + BaseWeaponExtInfo info = new BaseWeaponExtInfo + { + Serial = serial, + }; + + info.Deserialize(reader); + } + } + } + + public static void SaveState(WorldSaveEventArgs args) + { + if (!Directory.Exists(Path.Combine(World.ServUOSave ? "Servuo" : "", "Saves/Nelderim"))) + Directory.CreateDirectory(Path.Combine(World.ServUOSave ? "Servuo" : "", "Saves/Nelderim")); + + string pathNfile = Path.Combine(World.ServUOSave ? "Servuo" : "", @"Saves/Nelderim/", moduleName + ".sav"); + + Console.WriteLine(moduleName + ": Zapisywanie..."); + try + { + using (FileStream m_FileStream = new FileStream(pathNfile, FileMode.OpenOrCreate, FileAccess.Write)) + { + BinaryFileWriter writer = new BinaryFileWriter(m_FileStream, true); + + writer.Write((bool)true); // weapons already fixed + + writer.Write((int)m_ExtensionInfo.Count); + foreach (BaseWeaponExtInfo info in m_ExtensionInfo.Values) + { + writer.Write(info.Serial); + info.Serialize(writer); + } + + writer.Close(); + m_FileStream.Close(); + } + } + catch (Exception err) + { + Console.WriteLine("Failed. Exception: " + err); + } + } + } + + + class BaseWeaponExtInfo : NExtensionInfo + { + private int m_LegacyDamageAttr; + + public int LegacyDamageAttr { get { return m_LegacyDamageAttr; } set { m_LegacyDamageAttr = value; } } + + public BaseWeaponExtInfo() + { + m_LegacyDamageAttr = int.MinValue; // mark as unset + } + + public override void Serialize(GenericWriter writer) + { + writer.Write((int)1); // version + + writer.Write((int)m_LegacyDamageAttr); + } + + public override void Deserialize(GenericReader reader) + { + int version = reader.ReadInt(); + + m_LegacyDamageAttr = reader.ReadInt(); + } + } +} \ No newline at end of file