RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Changing Hue based on skill

adlestuu

Wanderer
I'm trying to hue scrolls of transcendence based on their skill, each skill a different hue.

I'm not very good at C# however.

I know the change needs to go in ScrollofTranscendence.cs
Code:
        [Constructable]
        public ScrollofTranscendence( SkillName skill, double value ) : base( skill, value )
        {
            Name = "Transcendence Crystal";
            ItemID = 7961;
            {Code Here}
        }

I've try'd the following, which I thought was close:
Code:
        [Constructable]
        public ScrollofTranscendence( SkillName skill, double value ) : base( skill, value )
        {
            Name = "Transcendence Crystal";
            ItemID = 7961;
            if ( this.Skill = "Magery" )
                Hue = 1157;
        }

Which of course didn't work:
RunUO - [https://github.com/runuo/] Version 2.5.0.24991
Core: Running on .NET Framework Version 4.0.30319
Core: Optimizing for 4 64-bit processors
Core: Server garbage collection mode enabled
RandomImpl: CSPRandom (Software)
Scripts: Compiling C# scripts...failed (1 errors, 0 warnings)
Errors:
+ Items/Special/Special Scrolls/ScrollofTranscendence.cs:
CS0029: Line 37: Cannot implicitly convert type 'string' to 'Server.SkillNam
e'
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.

Any help would be appreciated!


Here is the whole ScrollofTranscendence.cs if that helps:
Code:
using System;
using Server;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;
using Server.Engines.Quests;
 
namespace Server.Items
{
    public class ScrollofTranscendence : SpecialScroll
    {
        public override int LabelNumber { get { return 1094934; } } // Scroll of Transcendence
       
        public override int Message { get { return 1094933; } } /*Using a Scroll of Transcendence for a given skill will permanently increase your current
                                                                *level in that skill by the amount of points displayed on the scroll.
                                                                *As you may not gain skills beyond your maximum skill cap, any excess points will be lost.*/
                                                               
        public override string DefaultTitle { get { return String.Format( "<basefont color=#FFFFFF>Scroll of Transcendence ({0} Skill):</basefont>", Value ); } }
               
        public static ScrollofTranscendence CreateRandom( int min, int max )
        {
            SkillName skill = (SkillName)Utility.Random( SkillInfo.Table.Length );
           
            //return new ScrollofTranscendence(skill, Utility.RandomMinMax(min, max) * 0.1);
            return new ScrollofTranscendence(skill, Utility.RandomMinMax(min, max));
        }
 
        public ScrollofTranscendence() : this( SkillName.Alchemy, 0.0 )
        {
        }
       
        [Constructable]
        public ScrollofTranscendence( SkillName skill, double value ) : base( skill, value )
        {
            Name = "Transcendence Crystal";
            ItemID = 7961;
        }
 
        public ScrollofTranscendence(Serial serial) : base(serial)
        {
        }
 
        public override void GetProperties( ObjectPropertyList list )
        {
            base.GetProperties(list);
 
            if ( Value == 1 )
                list.Add(1076759, "{0}\t{1}.0 Skill Points", GetName(), Value);
            else
                list.Add(1076759, "{0}\t{1} Skill Points", GetName(), Value);
        }
       
        public override bool CanUse( Mobile from )
        {
            if ( !base.CanUse( from ) )
                return false;
           
            PlayerMobile pm = from as PlayerMobile;
           
            if ( pm == null )
                return false;
           
            #region Mondain's Legacy
            /* to add when skillgain quests will be implemented
           
            for (int i = pm.Quests.Count - 1; i >= 0; i--)
            {
                BaseQuest quest = pm.Quests[i];
 
                for (int j = quest.Objectives.Count - 1; j >= 0; j--)
                {
                    BaseObjective objective = quest.Objectives[j];
 
                    if (objective is ApprenticeObjective)
                    {
                        from.SendMessage("You are already under the effect of an enhanced skillgain quest.");
                        return false;
                    }
                }
            }
           
            */
            #endregion
           
            #region Scroll of Alacrity
            if (pm.AcceleratedStart > DateTime.UtcNow)
            {
                from.SendLocalizedMessage(1077951); // You are already under the effect of an accelerated skillgain scroll.
                return false;
            }
            #endregion
           
            return true;
        }
 
        public override void Use( Mobile from )
        {
            if ( !CanUse( from ) )
                return;
           
            double tskill = from.Skills[Skill].Base; // value of skill without item bonuses etc
            double tcap = from.Skills[Skill].Cap; // maximum value permitted
            bool canGain = false;
           
            double newValue = Value;
 
            if ( ( tskill + newValue ) > tcap )
                newValue = tcap - tskill;
 
            if ( tskill < tcap && from.Skills[Skill].Lock == SkillLock.Up )
            {
                if ( ( from.SkillsTotal + newValue * 10 ) > from.SkillsCap )
                {
                    int ns = from.Skills.Length; // number of items in from.Skills[]
 
                    for ( int i = 0; i < ns; i++ )
                    {
                        // skill must point down and its value must be enough
                        if ( from.Skills[i].Lock == SkillLock.Down && from.Skills[i].Base >= newValue )
                        {
                            from.Skills[i].Base -= newValue;
                            canGain = true;
                            break;
                        }
                    }
                }
                else
                    canGain = true;
            }
           
            if ( !canGain )
            {
                from.SendLocalizedMessage( 1094935 );    /*You cannot increase this skill at this time. The skill may be locked or set to lower in your skill menu.
                                                        *If you are at your total skill cap, you must use a Powerscroll to increase your current skill cap.*/
                return;
            }
 
            from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~!
                   
            from.Skills[Skill].Base += newValue;
 
            Effects.PlaySound( from.Location, from.Map, 0x1F7 );
            Effects.SendTargetParticles( from, 0x373A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
            Effects.SendTargetParticles( from, 0x376A, 35, 45, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
 
            Delete();
        }
       
        public override void Serialize( GenericWriter writer )
        {
            base.Serialize(writer);
 
            writer.Write((int)0); // version
        }
 
        public override void Deserialize( GenericReader reader )
        {
            base.Deserialize(reader);
 
            int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion
 
            Insured = false;
 
            if (Hue == 0x7E)
                Hue = 0x490;
        }
    }
}
 

pooka01

Sorceror
Go in skillcheck.cs, there is a big list of skills, what you can do is such:

above in the class:
private static int[] skillHues = {1150, 1154, 1000, 256, 6594,485456456456whatever};

then in the constructor:
Hue = skillHues[skill.ID];

this is important that ou have hues for each skills, from 0 to the maximum skill ID.
For me it is 54 if i'm right, so i would need 54 skill hues listed in the array of hues.
 

adlestuu

Wanderer
I'm guessing I did something wrong
RunUO - [https://github.com/runuo/] Version 2.5.0.24991
Core: Running on .NET Framework Version 4.0.30319
Core: Optimizing for 4 64-bit processors
Core: Server garbage collection mode enabled
RandomImpl: CSPRandom (Software)
Scripts: Compiling C# scripts...failed (1 errors, 0 warnings)
Errors:
+ Items/Special/Special Scrolls/ScrollofTranscendence.cs:
CS1061: Line 96: 'Server.SkillName' does not contain a definition for 'ID' a
nd no extension method 'ID' accepting a first argument of type 'Server.SkillName
' could be found (are you missing a using directive or an assembly reference?)
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.

This is what I did:
Code:
private static int[] skillHues =
        {
            1157,    //Alchemy   
            1153,    //Anatomy   
            1164,    //AminlalLore   
            1158,    //ItemID   
            1158,    //ArmsLore   
            1153,    //Parry   
            2550,    //Begging   
            1157,    //BlackSmith   
            1157,    //Fletching   
            1910,    //Peacemaking   
            1158,    //Camping   
            1157,    //Carpentry   
            1157,    //Cartography   
            1157,    //Cooking   
            2550,    //DetectHidden   
            1910,    //Discordance   
            1161,    //EvalInt   
            1153,    //Healing   
            1160,    //Fishing   
            1158,    //Forensics   
            1164,    //Herding   
            2550,    //Hiding   
            1910,    //Provocation   
            1157,    //Inscribe   
            2550,    //LockPicking   
            1161,    //Magery   
            1161,    //MagicResist   
            1153,    //Tactics   
            2550,    //Snooping   
            1910,    //Musicianship   
            2550,    //Poisoning   
            1153,    //Archery   
            1161,    //SpirtSpeak   
            2550,    //Stealing   
            1157,    //Tailoring   
            1164,    //AnimalTaming   
            1158,    //TasteID   
            1157,    //Tinkering   
            2550,    //Tracking   
            1164,    //Veterinary   
            1153,    //Swords   
            1153,    //Macing   
            1153,    //Fencing   
            1153,    //Wrestling   
            1160,    //LumberJacking   
            1160,    //Mining   
            1161,    //Meditation   
            2550,    //Stealth   
            2550,    //RemoveTrap   
            1161,    //Necromancy   
            1153,    //Focus   
            1153,    //Chivalry   
            1153,    //Bushido   
            1153,    //Ninjitsu   
            1161    //SpellWeaving   
        };

And then this:
Code:
      [Constructable]
        public ScrollofTranscendence( SkillName skill, double value ) : base( skill, value )
        {
            Name = "Transcendence Crystal";
            ItemID = 7961;
            Hue = skillHues[skill.ID];
        }
 

adlestuu

Wanderer
Added the following as suggested:
Code:
using Server.Skills;
This is what I got:
RunUO - [https://github.com/runuo/] Version 2.5.0.24991
Core: Running on .NET Framework Version 4.0.30319
Core: Optimizing for 4 64-bit processors
Core: Server garbage collection mode enabled
RandomImpl: CSPRandom (Software)
Scripts: Compiling C# scripts...failed (1 errors, 0 warnings)
Errors:
+ Items/Special/Special Scrolls/ScrollofTranscendence.cs:
CS0138: Line 7: A using namespace directive can only be applied to namespace
s; 'Server.Skills' is a type not a namespace
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.
 

adlestuu

Wanderer
This is what I believe it needs to be:
Code:
Hue = skillHues[SkillID];

Close, but I'm still missing something:
RunUO - [https://github.com/runuo/] Version 2.5.0.24991
Core: Running on .NET Framework Version 4.0.30319
Core: Optimizing for 4 64-bit processors
Core: Server garbage collection mode enabled
RandomImpl: CSPRandom (Software)
Scripts: Compiling C# scripts...failed (1 errors, 0 warnings)
Errors:
+ Items/Special/Special Scrolls/ScrollofTranscendence.cs:
CS0103: Line 100: The name 'SkillID' does not exist in the current context
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.
 

pooka01

Sorceror
Just realise it uses SkillName and not Skill... sorry xD
There are some options available:
1) Enums: you can add values in enums, like, AnimalTraining = 1150, etc.
But this would require multiple enums, or work-arounds, or simple server as reference for an array: which would not be so ideal.

2) Array with Skill, color, Skill, color. Not so possible so forget about it.

3) 2 Arrays, one skills, one colors, then a simple
for (int i = 0; i < skillnames.length; ++i)
{
if (skillnames.Equals(skill))
{
Hue = skillHues;
break;
}
}

Option 3 would be better as it will mostly work (if it compiles xD), but it is not the best/fastest approach.
 
Top