ok so i just went ahead and jumped on in here... however i would like to note you should release some kind of runuo test server package for people who want to script. it was very hard to find runuo 1.0 to begin with and it was lacking basic stuff needed like even the uose specials. i was going to give force arrow the armor peice ability but i didnt have the code to use or the skill to do it from scratch... so it got armor ignore. below is a list of the changes made.
the next issue i faced was making the infectious strike work on the elven composite bow ie making it poisonable.
as i do not have the script files for the bow this line needs to be added to it so that it passed the second check in poisoning
public override WeaponType { get{ return WeaponType.Piercing; } }
the first check in poisoning can be fixed by changing this in line 69 of poisoning.cs
startTimer = ( weapon.PrimaryAbility == WeaponAbility.InfectiousStrike || weapon.SecondaryAbility == WeaponAbility.InfectiousStrike || weapon.SecondaryAbility == WeaponAbility.SerpentArrow );
however doing that on my runuo1.0 server i have will make it not boot because it is not defined in WeaponAbility.cs in my distro which is also missing the se stuff so i could try to add it myself but since it most likely wouldnt match the one your using youd have to redo it to the servers specs and well thats a waste of time so thats that with that.
force of nature to crushing blow
wild staff
serpent arrow - infectious strike
elven composite bow
psychic attack - concussion blow
magical shortbow
elven spellblade
lightning arrow - double strike
magical shortbow
force arrow - armor pierce(armor ignore because i didnt have ap script)
elven composite longbow
bladeweave - armor ignore
war cleaver
rune blade
radiant scimitar
elven machete
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// This special move allows the skilled warrior to bypass his target's physical resistance, for one shot only.
/// The Armor Ignore shot does slightly less damage than normal.
/// Against a heavily armored opponent, this ability is a big win, but when used against a very lightly armored foe, it might be better to use a standard strike!
/// </summary>
public class Bladeweave : WeaponAbility
{
public Bladeweave()
{
}
public override int BaseMana{ get{ return 30; } }
public override double DamageScalar{ get{ return 0.9; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) || !CheckMana( attacker, true ) )
return;
ClearCurrentAbility( attacker );
attacker.SendLocalizedMessage( 1060076 ); // Your attack penetrates their armor!
defender.SendLocalizedMessage( 1060077 ); // The blow penetrated your armor!
defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
}
}
}
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// This special move allows the skilled warrior to bypass his target's physical resistance, for one shot only.
/// The Armor Ignore shot does slightly less damage than normal.
/// Against a heavily armored opponent, this ability is a big win, but when used against a very lightly armored foe, it might be better to use a standard strike!
/// </summary>
public class ForceArrow : WeaponAbility
{
public ForceArrow()
{
}
public override int BaseMana{ get{ return 30; } }
public override double DamageScalar{ get{ return 0.9; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) || !CheckMana( attacker, true ) )
return;
ClearCurrentAbility( attacker );
attacker.SendLocalizedMessage( 1060076 ); // Your attack penetrates their armor!
defender.SendLocalizedMessage( 1060077 ); // The blow penetrated your armor!
defender.PlaySound( 0x56 );
defender.FixedParticles( 0x3728, 200, 25, 9942, EffectLayer.Waist );
}
}
}
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// The highly skilled warrior can use this special attack to make two quick swings in succession.
/// Landing both blows would be devastating!
/// </summary>
public class LightningArrow : WeaponAbility
{
public LightningArrow()
{
}
public override int BaseMana{ get{ return 30; } }
public override double DamageScalar{ get{ return 0.9; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) || !CheckMana( attacker, true ) )
return;
ClearCurrentAbility( attacker );
attacker.SendLocalizedMessage( 1060084 ); // You attack with lightning speed!
defender.SendLocalizedMessage( 1060085 ); // Your attacker strikes with lightning speed!
defender.PlaySound( 0x3BB );
defender.FixedEffect( 0x37B9, 244, 25 );
// Swing again:
// If no combatant, wrong map, one of us is a ghost, or cannot see, or deleted, then stop combat
if ( defender == null || defender.Deleted || attacker.Deleted || defender.Map != attacker.Map || !defender.Alive || !attacker.Alive || !attacker.CanSee( defender ) )
{
attacker.Combatant = null;
return;
}
IWeapon weapon = attacker.Weapon;
if ( weapon == null )
return;
if ( !attacker.InRange( defender, weapon.MaxRange ) )
return;
if ( attacker.InLOS( defender ) )
{
BaseWeapon.InDoubleStrike = true;
attacker.RevealingAction();
attacker.NextCombatTime = DateTime.Now + weapon.OnSwing( attacker, defender );
BaseWeapon.InDoubleStrike = false;
}
}
}
}
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// This devastating strike is most effective against those who are in good health and whose reserves of mana are low, or vice versa.
/// </summary>
public class PsyhicAttack : WeaponAbility
{
public PsyhicAttack()
{
}
public override int BaseMana{ get{ return 25; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) || !CheckMana( attacker, true ) )
return;
ClearCurrentAbility( attacker );
attacker.SendLocalizedMessage( 1060165 ); // You have delivered a concussion!
defender.SendLocalizedMessage( 1060166 ); // You feel disoriented!
defender.PlaySound( 0x213 );
defender.FixedParticles( 0x377A, 1, 32, 9949, 1153, 0, EffectLayer.Head );
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( defender.X, defender.Y, defender.Z + 10 ), defender.Map ), new Entity( Serial.Zero, new Point3D( defender.X, defender.Y, defender.Z + 20 ), defender.Map ), 0x36FE, 1, 0, false, false, 1133, 3, 9501, 1, 0, EffectLayer.Waist, 0x100 );
AOS.Damage( defender, attacker, Utility.RandomMinMax( 10, 40 ), 100, 0, 0, 0, 0 );
}
}
}
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// This special move represents a significant change to the use of poisons in Age of Shadows.
/// Now, only certain weapon types — those that have Infectious Strike as an available special move — will be able to be poisoned.
/// Targets will no longer be poisoned at random when hit by poisoned weapons.
/// Instead, the wielder must use this ability to deliver the venom.
/// While no skill in Poisoning is directly required to use this ability, being knowledgeable in the application and use of toxins
/// will allow a character to use Infectious Strike at reduced mana cost and with a chance to inflict more deadly poison on his victim.
/// With this change, weapons will no longer be corroded by poison.
/// Level 5 poison will be possible when using this special move.
/// </summary>
public class SerpentArrow : WeaponAbility
{
public SerpentArrow()
{
}
public override int BaseMana{ get{ return 15; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) )
return;
ClearCurrentAbility( attacker );
BaseWeapon weapon = attacker.Weapon as BaseWeapon;
if ( weapon == null )
return;
Poison p = weapon.Poison;
if ( p == null || weapon.PoisonCharges <= 0 )
{
attacker.SendLocalizedMessage( 1061141 ); // Your weapon must have a dose of poison to perform an infectious strike!
return;
}
if ( !CheckMana( attacker, true ) )
return;
--weapon.PoisonCharges;
// Infectious strike special move now uses poisoning skill to help determine potency
int maxLevel = attacker.Skills[SkillName.Poisoning].Fixed / 200;
if ( maxLevel < 0 ) maxLevel = 0;
if ( p.Level > maxLevel ) p = Poison.GetPoison( maxLevel );
if ( (attacker.Skills[SkillName.Poisoning].Value / 100.0) > Utility.RandomDouble() )
{
int level = p.Level + 1;
Poison newPoison = Poison.GetPoison( level );
if ( newPoison != null )
{
p = newPoison;
attacker.SendLocalizedMessage( 1060080 ); // Your precise strike has increased the level of the poison by 1
defender.SendLocalizedMessage( 1060081 ); // The poison seems extra effective!
}
}
defender.PlaySound( 0xDD );
defender.FixedParticles( 0x3728, 244, 25, 9941, 1266, 0, EffectLayer.Waist );
if ( defender.ApplyPoison( attacker, p ) != ApplyPoisonResult.Immune )
{
attacker.SendLocalizedMessage( 1008096, true, defender.Name ); // You have poisoned your target :
defender.SendLocalizedMessage( 1008097, false, attacker.Name ); // : poisoned you!
}
}
}
}
Code: Select all
using System;
namespace Server.Items
{
/// <summary>
/// Also known as the Haymaker, this attack dramatically increases the damage done by a weapon reaching its mark.
/// </summary>
public class ForceOfNature : WeaponAbility
{
public ForceOfNature()
{
}
public override int BaseMana{ get{ return 25; } }
public override double DamageScalar{ get{ return 1.5; } }
public override void OnHit( Mobile attacker, Mobile defender, int damage )
{
if ( !Validate( attacker ) || !CheckMana( attacker, true ) )
return;
ClearCurrentAbility( attacker );
attacker.SendLocalizedMessage( 1060090 ); // You have delivered a crushing blow!
defender.SendLocalizedMessage( 1060091 ); // You take extra damage from the crushing attack!
defender.PlaySound( 0x1E1 );
defender.FixedParticles( 0, 1, 0, 9946, EffectLayer.Head );
Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( defender.X, defender.Y, defender.Z + 50 ), defender.Map ), new Entity( Serial.Zero, new Point3D( defender.X, defender.Y, defender.Z + 20 ), defender.Map ), 0xFB4, 1, 0, false, false, 0, 3, 9501, 1, 0, EffectLayer.Head, 0x100 );
}
}
}