Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zmiana sposobu naliczania bonusu dmg broni od surowca i od exp #204

Merged
merged 1 commit into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Scripts/Items/Skill Items/Tools/BaseRunicTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
107 changes: 32 additions & 75 deletions Scripts/Items/Weapons/BaseWeapon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using System.Collections.Generic;
using Server.Spells.Spellweaving;
using Nelderim.ExtraCraftResource;
using static Server.Items.ArtifactMonster;

namespace Server.Items
{
Expand All @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 )
{
Expand All @@ -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 )
{
Expand Down Expand Up @@ -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
}

Expand Down
2 changes: 1 addition & 1 deletion Scripts/Items/Weapons/Ranged/BaseRanged.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public static void Initialize()
{
EventSink.WorldSave += new WorldSaveEventHandler( Save );
Load( ModuleName );

BaseWeaponExt.InitializeWeaponDamageFix();
}

public static void Save( WorldSaveEventArgs args )
Expand Down
193 changes: 193 additions & 0 deletions Scripts/Nelderim/Items/Weapons/BaseWeaponExt.cs
Original file line number Diff line number Diff line change
@@ -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<BaseWeaponExtInfo>
{
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();
}
}
}
Loading