├── .gitignore ├── .idea └── .idea.RazorScripts │ └── .idea │ ├── .gitignore │ ├── encodings.xml │ ├── indexLayout.xml │ └── vcs.xml ├── README.md ├── RazorScripts.sln ├── RazorScripts.sln.DotSettings.user └── RazorScripts ├── AnimalReleaser.cs ├── App.config ├── BagTransfer.cs ├── Butcher.cs ├── CasterTrain.cs ├── ChestBreaker.cs ├── CottonPicker.cs ├── Debugger.cs ├── FindAndUseTool.cs ├── GuardMe.cs ├── HealMaster.cs ├── Hiding.cs ├── Honoring.cs ├── IdocScanner.cs ├── Lootmaster.cs ├── LootmasterClearCurrentConfig.cs ├── LootmasterDirectContainer.cs ├── LootmasterOld.cs ├── LootmasterReconfigure.cs ├── MineNode.cs ├── MountUp.cs ├── MoveBoards.cs ├── MultiQuestmark.cs ├── Properties └── AssemblyInfo.cs ├── Ranger.cs ├── RaritySorter.cs ├── RazorScripts.csproj ├── ReleaseAll.cs ├── Reloader.cs ├── Repeater.cs ├── RuneBookFinder.cs ├── RuneMaster.cs ├── SampMaster.cs ├── ScriptMonitor.cs ├── Shadowguard.cs ├── SlayerBar.cs ├── SummonMaster.cs ├── TargetAllOfType.cs ├── Targeting.cs ├── TeleTalk.cs ├── TheRanger.cs ├── WeaponMaster.cs ├── WeedPuller.cs └── packages.config /.gitignore: -------------------------------------------------------------------------------- 1 | packages/ 2 | Crypt/Debug/ 3 | Crypt/Release/ 4 | Debug/ 5 | FastColoredTextBox/bin/ 6 | FastColoredTextBox/obj/ 7 | Loader/Debug/ 8 | Loader/Release/ 9 | Razor/obj/ 10 | Razor/bin/ 11 | Release/ 12 | UltimaSDK/bin/ 13 | UltimaSDK/obj/ 14 | /.vs/ 15 | 16 | *~ 17 | 18 | *.htm 19 | 20 | 21 | 22 | # JetBrains Rider 23 | .idea/ 24 | *.sln.iml -------------------------------------------------------------------------------- /.idea/.idea.RazorScripts/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /contentModel.xml 6 | /.idea.RazorScripts.iml 7 | /projectSettingsUpdater.xml 8 | /modules.xml 9 | # Editor-based HTTP Client requests 10 | /httpRequests/ 11 | # Datasource local storage ignored files 12 | /dataSources/ 13 | /dataSources.local.xml 14 | -------------------------------------------------------------------------------- /.idea/.idea.RazorScripts/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.RazorScripts/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.RazorScripts/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RazorEnhancedScripts 2 | 3 | This is my bundle of script for Razor Enhanced, Some are useful, some not so much, as they are designed for a very specific purpose upon request from someone. 4 | 5 | I would mainly recomend you look at 6 | Lootmaster and SlayerBar 7 | 8 | They are the ones that would benefit most people. 9 | 10 | If you have feature requests to any of my scripts or you find a bug, please report them as issues, adding an appropriate Label would be helpful 11 | 12 | ## Lootmaster 13 | 14 | This is an autolooter that uses a set of rules, each rule has it's own settings, and each characters has his or hers own ruleset 15 | More info on how this works can be found here 16 | https://gamebible.net/wiki/doku.php?id=lootmaster 17 | 18 | ## SlayerBar 19 | 20 | This is a hotbar script. it will look though your skills to find your primary damage skill, 21 | then check your enventory for a bag that contains slayers on weapons that matches that skill. 22 | 23 | It will then generate a bar with buttons, clicking hese buttons will swap to the corresponding slayer, and return your current weapon to the previously designated slayer bag. 24 | 25 | It's highly recomended to put all your players in a designated bag, rather than having them loose in your backpack, The backpack works, 26 | but if you might have multiple slayers of the same type and thus the script would list both. 27 | -------------------------------------------------------------------------------- /RazorScripts.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RazorScripts", "RazorScripts\RazorScripts.csproj", "{06B26608-0E38-411D-98A9-4A8C9EC66030}" 4 | EndProject 5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Razor", "..\RazorEnhanced\Razor\Razor.csproj", "{B24E4FB1-4936-4544-9E88-F3FF9B04FDBA}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug|Any CPU = Debug|Any CPU 10 | Release|Any CPU = Release|Any CPU 11 | EndGlobalSection 12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 13 | {06B26608-0E38-411D-98A9-4A8C9EC66030}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 14 | {06B26608-0E38-411D-98A9-4A8C9EC66030}.Debug|Any CPU.Build.0 = Debug|Any CPU 15 | {06B26608-0E38-411D-98A9-4A8C9EC66030}.Release|Any CPU.ActiveCfg = Release|Any CPU 16 | {06B26608-0E38-411D-98A9-4A8C9EC66030}.Release|Any CPU.Build.0 = Release|Any CPU 17 | {B24E4FB1-4936-4544-9E88-F3FF9B04FDBA}.Debug|Any CPU.ActiveCfg = Debug|x86 18 | {B24E4FB1-4936-4544-9E88-F3FF9B04FDBA}.Debug|Any CPU.Build.0 = Debug|x86 19 | {B24E4FB1-4936-4544-9E88-F3FF9B04FDBA}.Release|Any CPU.ActiveCfg = Release|x86 20 | {B24E4FB1-4936-4544-9E88-F3FF9B04FDBA}.Release|Any CPU.Build.0 = Release|x86 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /RazorScripts.sln.DotSettings.user: -------------------------------------------------------------------------------- 1 |  2 | <AssemblyExplorer> 3 | <Assembly Path="C:\Source\RazorEnhanced\bin\Win32\Debug\Ultima.dll" /> 4 | </AssemblyExplorer> -------------------------------------------------------------------------------- /RazorScripts/AnimalReleaser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Xml; 6 | using RazorEnhanced; 7 | 8 | namespace RazorScripts 9 | { 10 | public class AnimalReleaser 11 | { 12 | public void Run() 13 | { 14 | List _friendlies = Mobiles.ApplyFilter(new Mobiles.Filter 15 | { 16 | RangeMax = 100, 17 | RangeMin = 0, 18 | Notorieties = new List { 1,2}, 19 | }).Select(m => m.Serial).ToList(); 20 | 21 | while (true) 22 | { 23 | var friends = Mobiles.ApplyFilter(new Mobiles.Filter 24 | { 25 | RangeMax = 100, 26 | RangeMin = 0, 27 | Notorieties = new List { 1,2}, 28 | }); 29 | 30 | friends.ForEach(f => Mobiles.WaitForProps(f, 3000)); 31 | var pets = friends.Where(f => f.Properties.Any(p => p.Number == 502006)); 32 | var newFriendsList = new List(); 33 | // check if any pet.Setial is ot in the _friendlies list 34 | foreach (var pet in pets) 35 | { 36 | if (!_friendlies.Contains(pet.Serial)) 37 | { 38 | Misc.WaitForContext(pet, 500); 39 | Misc.PetRename(pet, "Tamed"); 40 | Misc.Pause(100); 41 | Misc.ContextReply(pet, 9); 42 | var ids = Gumps.AllGumpIDs(); 43 | var foundGunp = 0; 44 | while(foundGunp == 0) 45 | { 46 | var newIds = Gumps.AllGumpIDs(); 47 | //get Id's not earlier existing 48 | var diff = newIds.Except(ids).ToList(); 49 | 50 | foreach (var gid in diff) 51 | { 52 | var lines = Gumps.GetLineList(gid); 53 | if (lines.Any(l => l.Contains("release your pet"))) 54 | { 55 | foundGunp = (int)gid; 56 | break; 57 | } 58 | } 59 | Misc.Pause(50); 60 | } 61 | Gumps.SendAction((uint)foundGunp,2); 62 | Misc.Pause(200); 63 | } 64 | newFriendsList.Add(pet.Serial); 65 | } 66 | 67 | _friendlies = newFriendsList; 68 | Misc.Pause(1000); 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /RazorScripts/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /RazorScripts/BagTransfer.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using RazorEnhanced; 3 | 4 | namespace RazorScripts 5 | { 6 | public class BagTransfer 7 | { 8 | public void Run() 9 | { 10 | var tar = new Target(); 11 | var sourceSerial = tar.PromptTarget("Select Source bag"); 12 | var sourceBag = Items.FindBySerial(sourceSerial); 13 | var targetSerial = tar.PromptTarget("Select Target bag"); 14 | var targetBag = Items.FindBySerial(targetSerial); 15 | Items.WaitForContents(sourceBag,3000); 16 | Misc.Pause(200); 17 | while (sourceBag.Contains.Any(i => i.IsLootable && i.Container == sourceBag.Serial)) 18 | { 19 | foreach (var item in sourceBag.Contains.Where(i => i.IsLootable)) 20 | { 21 | Items.Move(item.Serial, targetBag, item.Amount); 22 | Misc.Pause(250); 23 | } 24 | Misc.Pause(2000); 25 | Items.WaitForContents(sourceBag, 3000); 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /RazorScripts/Butcher.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using RazorEnhanced; 4 | using System.Linq; 5 | 6 | namespace Razorscripts 7 | { 8 | public class Butcher 9 | { 10 | private readonly bool TakeLeather = false; //should we keep leather 11 | private readonly bool TakeMeat = false; //should we keep meats 12 | private readonly bool TakeFeathers = false; //should we keep feathers 13 | private readonly bool TakeWool = false; //should we keep feathers 14 | private readonly bool TakeScales = true; //should we keep scales 15 | private readonly bool TakeBlood = true; //should we keep scales 16 | 17 | private int _leather = 0x1081; 18 | private int _hide = 0x1079; 19 | private int _meat = 0x09F1; 20 | private int _rotwormMeat = 0x2DB9; 21 | private int _pultry = 0x09B9; 22 | private int _feathers = 0x1BD1; 23 | private int _wool = 0x0DF8; 24 | private int _lambLeg = 0x1609; 25 | private int _dragonscale = 0x26B4; 26 | private int _dragonblood = 0x4077; 27 | 28 | private readonly List _daggers = 29 | new[] 30 | { 31 | 0x2D20, //Harvesters Blade 32 | 0x0F52, //Dagger 33 | 0x0EC4, //Skinning Knife 34 | 0x0EC3, //Butchers Cleaver 35 | 0x13F6, //Butchers Knife 36 | 0x13B6, //Butchers Knife 37 | }.ToList(); 38 | 39 | public void Run() 40 | { 41 | Item dagger = null; 42 | 43 | foreach (var dagId in _daggers) 44 | { 45 | dagger = DigDeep(Player.Backpack, dagId); 46 | if (dagger != null) 47 | { 48 | break; 49 | } 50 | } 51 | 52 | 53 | if (dagger == null || dagger.ItemID != _daggers.First()) //we didn't find dagger in pack, or the dagger was not Harvester 54 | { 55 | var rHand = Player.GetItemOnLayer("RightHand"); 56 | var lHand = Player.GetItemOnLayer("LeftHand"); 57 | 58 | foreach (var dag in _daggers) 59 | { 60 | if (rHand?.ItemID == dag) 61 | { 62 | dagger = rHand; 63 | break; 64 | } 65 | 66 | if (lHand?.ItemID == dag) 67 | { 68 | dagger = lHand; 69 | break; 70 | } 71 | } 72 | } 73 | 74 | if (dagger == null) 75 | { 76 | Misc.SendMessage("Unable to locate preset dagger", 201); 77 | return; 78 | } 79 | 80 | var isHarvestersBlade = dagger.Name == "Harvester's Blade"; 81 | 82 | var corpses = Items.ApplyFilter(new Items.Filter 83 | { 84 | IsCorpse = 1, 85 | RangeMax = 2, 86 | RangeMin = 0 87 | }); 88 | 89 | if (corpses == null || !corpses.Any()) 90 | { 91 | return; 92 | } 93 | 94 | foreach (var corpse in corpses) 95 | { 96 | Items.UseItem(dagger); 97 | Target.WaitForTarget(2000); 98 | Target.TargetExecute(corpse); 99 | Misc.Pause(500); 100 | 101 | if (isHarvestersBlade) continue; 102 | if (TakeFeathers) 103 | { 104 | LootItems(corpse, _feathers); 105 | } 106 | 107 | if (TakeMeat) 108 | { 109 | LootItems(corpse, _meat); 110 | LootItems(corpse, _rotwormMeat); 111 | LootItems(corpse, _pultry); 112 | LootItems(corpse, _lambLeg); 113 | } 114 | 115 | if (TakeLeather) 116 | { 117 | LootItems(corpse, _hide); 118 | } 119 | 120 | if (TakeWool) 121 | { 122 | LootItems(corpse, _wool); 123 | } 124 | 125 | if (TakeScales) 126 | { 127 | LootItems(corpse, _dragonscale); 128 | } 129 | 130 | if (TakeBlood) 131 | { 132 | LootItems(corpse, _dragonblood, "Dragon's Blood"); 133 | } 134 | } 135 | 136 | if (isHarvestersBlade) 137 | { 138 | var dumperCorpse = corpses.First(); 139 | 140 | if (!TakeFeathers) 141 | { 142 | DumpItem(dumperCorpse, _feathers); 143 | Misc.Pause(200); 144 | } 145 | 146 | if (!TakeLeather) 147 | { 148 | DumpItem(dumperCorpse, _leather); 149 | Misc.Pause(200); 150 | } 151 | 152 | if (!TakeMeat) 153 | { 154 | DumpItem(dumperCorpse, _meat); 155 | Misc.Pause(200); 156 | DumpItem(dumperCorpse, _pultry); 157 | Misc.Pause(200); 158 | DumpItem(dumperCorpse, _lambLeg); 159 | Misc.Pause(200); 160 | DumpItem(dumperCorpse, _rotwormMeat); 161 | Misc.Pause(200); 162 | } 163 | 164 | if (!TakeWool) 165 | { 166 | DumpItem(dumperCorpse, _wool); 167 | Misc.Pause(200); 168 | } 169 | 170 | if (!TakeScales) 171 | { 172 | DumpItem(dumperCorpse, _dragonscale); 173 | Misc.Pause(200); 174 | } 175 | 176 | if (!TakeBlood) 177 | { 178 | DumpItem(dumperCorpse, _dragonblood, "Dragon's Blood"); 179 | Misc.Pause(200); 180 | } 181 | } 182 | } 183 | 184 | private Item DigDeep(Item container, int itemId) 185 | { 186 | var found = container.Contains.FirstOrDefault(i => i.ItemID == itemId); 187 | if (found != null) 188 | { 189 | return found; 190 | } 191 | 192 | var subContainers = container.Contains.Where(c => c.IsContainer && c.Contains.Any() && c.Contains.First().Name != " (0000)").ToList(); 193 | foreach (var subcont in subContainers) 194 | { 195 | return DigDeep(subcont, itemId); 196 | } 197 | 198 | return null; 199 | } 200 | 201 | private void LootItems(Item corpse, int itemId, string name = null) 202 | { 203 | var stack = corpse.Contains.Where(i => i.ItemID == itemId && (string.IsNullOrEmpty(name) || i.Name.Contains(name))).ToList(); 204 | foreach (var feather in stack) 205 | { 206 | Items.Move(feather, Player.Backpack.Serial, feather?.Amount ?? int.MaxValue); 207 | Misc.Pause(100); 208 | } 209 | } 210 | 211 | private void DumpItem(Item corpse, int itemId, string name = null) 212 | { 213 | 214 | var dumpThese = Player.Backpack.Contains.Where(i => i.ItemID == itemId && (string.IsNullOrEmpty(name) || i.Name.Contains(name))).ToList(); 215 | foreach (var dump in dumpThese) 216 | { 217 | 218 | Items.Move(dump, corpse, dump?.Amount ?? int.MaxValue); 219 | } 220 | } 221 | } 222 | } 223 | -------------------------------------------------------------------------------- /RazorScripts/CasterTrain.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Xml.Schema; 6 | using RazorEnhanced; 7 | 8 | namespace RazorScripts 9 | { 10 | public class CasterTrain 11 | { 12 | private Mobile _player; 13 | 14 | private Dictionary _spellSchools = new Dictionary 15 | { 16 | {"Magery", 0}, 17 | {"Necromancy", 0}, 18 | {"Chivalry", 0}, 19 | {"Mysticism", 0}, 20 | {"Spellweaving", 0} 21 | }; 22 | private uint _gumpId = 1239862396; 23 | private bool _running = false; 24 | private Item _targetWeapon = null; 25 | 26 | 27 | private Dictionary> _castHolder = new Dictionary>(); 28 | 29 | public void Run() 30 | { 31 | try 32 | { 33 | UpdateGump(""); 34 | 35 | if (_spellSchools.Any(sc => sc.Value > 0)) 36 | { 37 | _running = true; 38 | } 39 | 40 | while (!_running) 41 | { 42 | var reply = Gumps.GetGumpData(_gumpId); 43 | if (reply.buttonid == 1) 44 | { 45 | var changes = new Dictionary(); 46 | var index = 0; 47 | foreach (var sc in _spellSchools) 48 | { 49 | var valueString = reply.text[index]; 50 | if (int.TryParse(valueString, out var value)) 51 | { 52 | changes[sc.Key] = value; 53 | } 54 | 55 | index++; 56 | } 57 | 58 | foreach (var change in changes) 59 | { 60 | _spellSchools[change.Key] = change.Value; 61 | } 62 | 63 | UpdateGump(""); 64 | reply.buttonid = -1; 65 | _running = true; 66 | } 67 | 68 | Misc.Pause(500); 69 | } 70 | 71 | 72 | Setup(); 73 | 74 | if(_spellSchools["Chivalry"] > 0) 75 | { 76 | var currentSkill = Player.GetSkillValue("Chivalry"); 77 | if (currentSkill < 45) 78 | { 79 | Misc.SendMessage("You need to have a weapon to train Chivalry, please target one in your backpack", 0x22); 80 | var tar = new Target(); 81 | int tarSerial = 0; 82 | while (tarSerial == 0) 83 | { 84 | tarSerial = tar.PromptTarget("Select Weapon"); 85 | } 86 | var tarItem = Items.FindBySerial(tarSerial); 87 | 88 | _targetWeapon = tarItem; 89 | } 90 | } 91 | if(_spellSchools["Spellweaving"] > 20 && _targetWeapon == null) 92 | { 93 | var currentSkill = Player.GetSkillValue("Spellweaving"); 94 | if (currentSkill < 44) 95 | { 96 | Misc.SendMessage("You need to have a weapon to train Spellweaving, please target one in your backpack", 0x22); 97 | var tar = new Target(); 98 | int tarSerial = 0; 99 | while (tarSerial == 0) 100 | { 101 | tarSerial = tar.PromptTarget("Select Weapon"); 102 | } 103 | var tarItem = Items.FindBySerial(tarSerial); 104 | 105 | _targetWeapon = tarItem; 106 | } 107 | } 108 | 109 | foreach (var caster in _castHolder) 110 | { 111 | var needsWeapon = true; 112 | if(caster.Key == "Spellweaving") 113 | { 114 | if(Player.GetSkillValue("Spellweaving") >= 44) 115 | { 116 | needsWeapon = false; 117 | } 118 | if (needsWeapon) 119 | { 120 | Player.EquipItem(_targetWeapon); 121 | Misc.Pause(500); 122 | } 123 | } 124 | if(caster.Key == "Chivalry") 125 | { 126 | if(Player.GetSkillValue("Chivalry") >= 45) 127 | { 128 | needsWeapon = false; 129 | } 130 | if (needsWeapon) 131 | { 132 | Player.EquipItem(_targetWeapon); 133 | Misc.Pause(500); 134 | } 135 | } 136 | 137 | TrainSkill(caster.Key); 138 | UpdateGump(""); 139 | } 140 | } 141 | catch (ThreadAbortException) 142 | { 143 | Gumps.CloseGump(_gumpId); 144 | } 145 | catch (Exception e) 146 | { 147 | Misc.SendMessage(e); 148 | throw; 149 | } 150 | } 151 | 152 | private Action GetCastFunction(string casterKey) 153 | { 154 | switch (casterKey) 155 | { 156 | case "Magery": 157 | return Spells.CastMagery; 158 | case "Necromancy": 159 | return Spells.CastNecro; 160 | case "Chivalry": 161 | return Spells.CastChivalry; 162 | case "Mysticism": 163 | return Spells.CastMysticism; 164 | case "Spellweaving": 165 | return Spells.CastSpellweaving; 166 | default: 167 | return null; 168 | } 169 | } 170 | 171 | private void TrainSkill(string casterKey) 172 | { 173 | var skillList = _castHolder[casterKey]; 174 | var skillCap = _spellSchools[casterKey]; 175 | var skill = Player.GetRealSkillValue(casterKey); 176 | if (skill >= skillCap) 177 | { 178 | return; 179 | } 180 | 181 | var castFunc = GetCastFunction(casterKey); 182 | while (skill <= skillCap) 183 | { 184 | skillCap = _spellSchools[casterKey]; 185 | skill = Player.GetRealSkillValue(casterKey); 186 | if (_player.Hits < 30) 187 | { 188 | while (_player.Hits < Player.HitsMax) 189 | { 190 | var magerySkill = Player.GetRealSkillValue("Magery"); 191 | if (magerySkill >= 50) 192 | { 193 | CheckMana(); 194 | Spells.CastMagery("Greater Heal", _player); 195 | Misc.Pause(4000); 196 | continue; 197 | } 198 | 199 | if (magerySkill >= 30) 200 | { 201 | CheckMana(); 202 | Spells.CastMagery("Heal", _player); 203 | Misc.Pause(4000); 204 | continue; 205 | } 206 | 207 | var chivalrySkill = Player.GetRealSkillValue("Chivalry"); 208 | if (chivalrySkill >= 30) 209 | { 210 | CheckMana(); 211 | Spells.CastChivalry("Close Wounds", _player); 212 | Misc.Pause(4000); 213 | continue; 214 | } 215 | 216 | var spiritSpeakSkill = Player.GetRealSkillValue("Spirit Speak"); 217 | if (spiritSpeakSkill >= 30) 218 | { 219 | Player.UseSkill("Spirit Speak"); 220 | Misc.Pause(7000); 221 | continue; 222 | } 223 | 224 | var spellweavingSkill = Player.GetRealSkillValue("Spellweaving"); 225 | if (spellweavingSkill >= 24 && !Player.BuffsExist("Gift of Renewal")) 226 | { 227 | Spells.CastSpellweaving("Gift of Renewal", _player); 228 | Misc.Pause(7000); 229 | continue; 230 | } 231 | 232 | var bandages = _player.Backpack.Contains.FirstOrDefault(i => i.ItemID == 0x0E21); 233 | if (bandages != null) 234 | { 235 | Items.UseItem(bandages, _player); 236 | Misc.Pause(7000); 237 | continue; 238 | } 239 | 240 | Misc.Pause(2000); 241 | } 242 | } 243 | 244 | UpdateGump(casterKey); 245 | if (skill >= skillCap) 246 | { 247 | break; 248 | } 249 | 250 | CheckMana(); 251 | 252 | 253 | foreach (var spell in skillList) 254 | { 255 | if (skill < spell.SkillLevel) 256 | { 257 | castFunc.Invoke(spell.SpellName, _player, true); 258 | Misc.Pause(spell.WaitTime); 259 | UpdateGump(casterKey); 260 | break; 261 | } 262 | } 263 | } 264 | } 265 | 266 | private void CheckMana() 267 | { 268 | if (Player.Mana < 30) 269 | { 270 | while (Player.Mana < Player.ManaMax) 271 | { 272 | if (Player.Buffs.Any(b => b.Contains("Medit"))) 273 | { 274 | while (Player.Mana < Player.ManaMax) 275 | { 276 | Misc.Pause(1000); 277 | } 278 | } 279 | else 280 | { 281 | Player.UseSkill("Mediation"); 282 | Misc.Pause(3000); 283 | } 284 | } 285 | } 286 | } 287 | 288 | private void UpdateGump(string current) 289 | { 290 | var schoolstToTrain = _spellSchools.Where(ss => ss.Value > 0).ToList(); 291 | var gump = Gumps.CreateGump(); 292 | gump.buttonid = -1; 293 | gump.gumpId = _gumpId; 294 | gump.serial = (uint)Player.Serial; 295 | gump.x = 500; 296 | gump.y = 500; 297 | 298 | var height = schoolstToTrain.Any() ? 35 + (schoolstToTrain.Count() * 35) : 100 + (_spellSchools.Count() * 35); 299 | 300 | Gumps.AddBackground(ref gump, 0, 0, 200, height, 1755); 301 | Gumps.AddLabel(ref gump,10,10,0x7b, "Caster Training by Dorana"); 302 | 303 | var index = 0; 304 | if (schoolstToTrain.Any()) 305 | { 306 | foreach (var school in schoolstToTrain) 307 | { 308 | var currentSkill = Player.GetRealSkillValue(school.Key); 309 | var cap = school.Value; 310 | var crystal = school.Key == current ? 2152 : (currentSkill >= cap ? 5826 : 5832); 311 | Gumps.AddImage(ref gump, 10, 30 + (index * 35), crystal); 312 | Gumps.AddLabel(ref gump, 45, 35 + (index * 35), 203, $"{school.Key} - {currentSkill}/{cap}"); 313 | index++; 314 | } 315 | } 316 | else 317 | { 318 | Gumps.AddLabel(ref gump,15,30,0x7f, $"Skill name"); 319 | Gumps.AddLabel(ref gump,100,30,0x7f, $"Target Skill"); 320 | foreach (var school in _spellSchools) 321 | { 322 | var name = school.Key; 323 | var value = school.Value; 324 | Gumps.AddLabel(ref gump,15,55+(index*35),0x7b, $"{name}"); 325 | Gumps.AddImageTiled(ref gump, 100, 59+(index*35), 75, 16,1803); 326 | Gumps.AddTextEntry(ref gump, 100,59+(index*35),75,32,0x16a,index+1,value > 0 ? value.ToString() : ""); 327 | index++; 328 | } 329 | Gumps.AddButton(ref gump, 100,height-50, 247,248, 1,1,1); 330 | } 331 | Gumps.CloseGump(1239862396); 332 | Gumps.SendGump(gump, 500, 500); 333 | } 334 | 335 | private void Setup() 336 | { 337 | _player = Mobiles.FindBySerial(Player.Serial); 338 | if (_spellSchools["Magery"] > 0) 339 | { 340 | var spellList = new List(); 341 | spellList.Add(new SpellSkill {SkillLevel = 45, SpellName = "Fireball",}); 342 | spellList.Add(new SpellSkill {SkillLevel = 55, SpellName = "Lightning",}); 343 | spellList.Add(new SpellSkill {SkillLevel = 65, SpellName = "Paralyse",}); 344 | spellList.Add(new SpellSkill {SkillLevel = 75, SpellName = "Reveal",}); 345 | spellList.Add(new SpellSkill {SkillLevel = 90, SpellName = "Flame Strike",}); 346 | spellList.Add(new SpellSkill {SkillLevel = 120, SpellName = "Earthquake",WaitTime = 5000}); 347 | _castHolder.Add("Magery", spellList); 348 | } 349 | if (_spellSchools["Mysticism"] > 0) 350 | { 351 | var spellList = new List(); 352 | spellList.Add(new SpellSkill {SkillLevel = 60, SpellName = "Stone Form"}); 353 | spellList.Add(new SpellSkill {SkillLevel = 80, SpellName = "Cleansing Winds"}); 354 | spellList.Add(new SpellSkill {SkillLevel = 95, SpellName = "Hail Storm"}); 355 | spellList.Add(new SpellSkill {SkillLevel = 120, SpellName = "Nether Cyclone"}); 356 | _castHolder.Add("Mysticism", spellList); 357 | } 358 | if(_spellSchools["Necromancy"] > 0) 359 | { 360 | var spellList = new List(); 361 | spellList.Add(new SpellSkill {SkillLevel = 50, SpellName = "Pain Spike"}); 362 | spellList.Add(new SpellSkill {SkillLevel = 70, SpellName = "Horrific Beast", DoNotEndOnBuff = "Horrific Beast"}); 363 | spellList.Add(new SpellSkill {SkillLevel = 90, SpellName = "Wither"}); 364 | spellList.Add(new SpellSkill {SkillLevel = 95, SpellName = "Lich Form", DoNotEndOnBuff = "Lich Form"}); 365 | spellList.Add(new SpellSkill {SkillLevel = 120, SpellName = "Vampiric Embrace"}); 366 | _castHolder.Add("Necromancy", spellList); 367 | } 368 | if(_spellSchools["Chivalry"] > 0) 369 | { 370 | var spellList = new List(); 371 | spellList.Add(new SpellSkill {SkillLevel = 45, SpellName = "Consecrate Weapon"}); 372 | spellList.Add(new SpellSkill {SkillLevel = 60, SpellName = "Divine Fury"}); 373 | spellList.Add(new SpellSkill {SkillLevel = 70, SpellName = "Enemy of One"}); 374 | spellList.Add(new SpellSkill {SkillLevel = 90, SpellName = "Holy Light"}); 375 | spellList.Add(new SpellSkill {SkillLevel = 120, SpellName = "Noble Sacrifice"}); 376 | _castHolder.Add("Chivalry", spellList); 377 | } 378 | if(_spellSchools["Spellweaving"] > 0) 379 | { 380 | var spellList = new List(); 381 | spellList.Add(new SpellSkill {SkillLevel = 20, SpellName = "Arcane Circle"}); 382 | spellList.Add(new SpellSkill {SkillLevel = 33, SpellName = "Immolating Weapon", WaitTime = 9000}); 383 | spellList.Add(new SpellSkill {SkillLevel = 52, SpellName = "Reaper Form", DoNotEndOnBuff = "Reaper Form"}); 384 | // spellList.Add(new SpellSkill {SkillLevel = 55, SpellName = "Summon Fey"}); 385 | spellList.Add(new SpellSkill {SkillLevel = 74, SpellName = "Essence of Wind"}); 386 | spellList.Add(new SpellSkill {SkillLevel = 90, SpellName = "Wildfire", WaitTime = 3000}); 387 | spellList.Add(new SpellSkill {SkillLevel = 120, SpellName = "Word of Death"}); 388 | _castHolder.Add("Spellweaving", spellList); 389 | } 390 | } 391 | } 392 | 393 | public class SpellSkill 394 | { 395 | public int SkillLevel { get; set; } 396 | public string SpellName { get; set; } 397 | public int WaitTime { get; set; } = 4000; 398 | public string DoNotEndOnBuff { get; set; } 399 | } 400 | } -------------------------------------------------------------------------------- /RazorScripts/ChestBreaker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.Remoting.Messaging; 5 | using RazorEnhanced; 6 | 7 | namespace Razorscripts 8 | { 9 | public class ChestBreaker 10 | { 11 | Journal _journal = new Journal(); 12 | private Target _tar = new Target(); 13 | 14 | public void Run() 15 | { 16 | var lastEntry = _journal.GetJournalEntry(null).LastOrDefault(); 17 | Misc.SendMessage(lastEntry.Text); 18 | var chestSerial = _tar.PromptTarget("Select Treasure Chest to break open"); 19 | if (chestSerial == 0) 20 | { 21 | Misc.SendMessage("No target selected", 201); 22 | return; 23 | } 24 | 25 | var lockPicks = DigDeep(Player.Backpack,Convert.ToInt32("0x14FC", 16)); 26 | if (lockPicks == null) 27 | { 28 | Misc.SendMessage("Unable to find Lock Picks", 201); 29 | } 30 | 31 | 32 | lastEntry = _journal.GetJournalEntry(lastEntry).LastOrDefault(); 33 | 34 | while (!_journal.GetJournalEntry(lastEntry).Any(j => (j.Text.ToLower().Contains("the lock quickly yields to your skill") || j.Text.ToLower().Contains("this does not appear to be locked")))) 35 | { 36 | Items.UseItem(lockPicks); 37 | Target.WaitForTarget(1000); 38 | Target.TargetExecute(chestSerial); 39 | Misc.Pause(1500); 40 | } 41 | 42 | 43 | lastEntry = _journal.GetJournalEntry(lastEntry).OrderBy(j => j.Timestamp).LastOrDefault(); 44 | 45 | while(!_journal.GetJournalEntry(lastEntry).Any(j => j.Text.ToLower().Contains("you successfully disarm the trap"))) 46 | { 47 | if (_journal.GetJournalEntry(lastEntry).Any(j => j.Type == "System" && j.Text.Contains("You must wait"))) 48 | { 49 | Misc.Pause(1000); 50 | lastEntry = _journal.GetJournalEntry(lastEntry).LastOrDefault(); 51 | continue; 52 | } 53 | 54 | Player.UseSkill("Remove Trap"); 55 | Target.WaitForTarget(3000); 56 | Target.TargetExecute(chestSerial); 57 | Misc.Pause(11250); 58 | } 59 | } 60 | 61 | 62 | private Item DigDeep(Item container, int itemId) 63 | { 64 | var found = container.Contains.FirstOrDefault(i => i.ItemID == itemId); 65 | if (found != null) 66 | { 67 | return found; 68 | } 69 | 70 | var subContainers = container.Contains.Where(c => c.IsContainer && c.Contains.Any() && c.Contains.First().Name != " (0000)").ToList(); 71 | foreach (var subcont in subContainers) 72 | { 73 | return DigDeep(subcont, itemId); 74 | } 75 | 76 | return null; 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /RazorScripts/CottonPicker.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace RazorScripts 6 | { 7 | public class CottonPicker 8 | { 9 | private List CottonPlants = new List 10 | { 11 | 0x0C51, 12 | 0x0C52, 13 | 0x0C53, 14 | 0x0C54 15 | }; 16 | 17 | public void Run() 18 | { 19 | var plantFilter = new Items.Filter 20 | { 21 | RangeMin = 0, 22 | RangeMax = 2 23 | }; 24 | foreach (var item in Items.ApplyFilter(plantFilter).Where(item => CottonPlants.Contains(item.ItemID))) 25 | { 26 | Items.UseItem(item); 27 | Misc.Pause(100); 28 | } 29 | 30 | Misc.Pause(200); 31 | 32 | var cottonFilter = new Items.Filter 33 | { 34 | RangeMin = 0, 35 | RangeMax = 2 36 | }; 37 | foreach (var cotton in Items.ApplyFilter(cottonFilter)) 38 | { 39 | Items.Move(cotton, Player.Backpack, cotton.Amount); 40 | Misc.Pause(300); 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /RazorScripts/Debugger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Dynamic; 4 | using System.Globalization; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Reflection; 8 | using System.Windows.Forms; 9 | using RazorEnhanced; 10 | using RazorEnhanced.UOScript; 11 | 12 | namespace Razorscripts 13 | { 14 | public class Debugger 15 | { 16 | internal class XYPos 17 | { 18 | public int X { get; set; } 19 | public int Y { get; set; } 20 | 21 | public XYPos(int x, int y) 22 | { 23 | X = x; 24 | Y = y; 25 | 26 | 27 | } 28 | 29 | public decimal GetDistance() 30 | { 31 | var a = Math.Abs(Player.Position.X - X); 32 | var b = Math.Abs(Player.Position.Y - Y); 33 | var c = Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2)); 34 | return (decimal) c; 35 | } 36 | } 37 | public void Run() 38 | { 39 | var c1 = Mobiles.FindBySerial(0x000061AB); 40 | var c1field = GetAvailablePosition(c1.Position); 41 | var cloststc1 = GetClosestPosition(c1field); 42 | PathFinding.PathFindTo(cloststc1.X, cloststc1.Y); 43 | 44 | 45 | 46 | // var tar = new Target(); 47 | // var ser = tar.PromptTarget(); 48 | // var itm = Items.FindBySerial(ser); 49 | // Items.WaitForProps(itm, 1000); 50 | // foreach (var prop in itm.Properties) 51 | // { 52 | // Misc.SendMessage($"{prop.Number} {prop.ToString()}"); 53 | // } 54 | 55 | //FocusStrike(); 56 | //PullWeeds(); 57 | // TrainChiv(); 58 | // TrainNecro(); 59 | // TrainBushido(); 60 | } 61 | 62 | private XYPos GetClosestPosition(List field) 63 | { 64 | return field.OrderBy(p => p.GetDistance()).First(); 65 | } 66 | 67 | private List GetAvailablePosition(Point3D pos) 68 | { 69 | var result = new List(); 70 | result.Add(new XYPos(pos.X, pos.Y)); 71 | result.Add(new XYPos(pos.X, pos.Y+1)); 72 | result.Add(new XYPos(pos.X, pos.Y-1)); 73 | result.Add(new XYPos(pos.X+1, pos.Y)); 74 | result.Add(new XYPos(pos.X+1, pos.Y+1)); 75 | result.Add(new XYPos(pos.X+1, pos.Y-1)); 76 | result.Add(new XYPos(pos.X-1, pos.Y)); 77 | result.Add(new XYPos(pos.X-1, pos.Y+1)); 78 | result.Add(new XYPos(pos.X-1, pos.Y-1)); 79 | 80 | return result; 81 | } 82 | 83 | private int? ExampleGetMobId() 84 | { 85 | 86 | var mobs = Mobiles.ApplyFilter(new Mobiles.Filter 87 | { 88 | RangeMax = 12, 89 | RangeMin = 0, 90 | }); 91 | 92 | return mobs.FirstOrDefault(m => m.Name == "MyPetname" && m.MobileID == 0x000)?.Serial; 93 | } 94 | 95 | private void PullWeeds() 96 | { 97 | while (true) 98 | { 99 | var weeds = Items.ApplyFilter(new Items.Filter 100 | { 101 | RangeMin = 0, 102 | RangeMax = 1, 103 | Name = "Creepy weeds" 104 | }); 105 | foreach (var weed in weeds) 106 | { 107 | Items.UseItem(weed); 108 | Misc.Pause(100); 109 | } 110 | } 111 | } 112 | 113 | private void TrainChiv() 114 | { 115 | var skill = Player.GetRealSkillValue("Chivalry"); 116 | while (skill < 100) 117 | { 118 | if (Player.Hits < 20) 119 | { 120 | WaitTillHealed(); 121 | } 122 | if (skill <= 50) 123 | { 124 | Spells.CastChivalry("Consecrate Weapon"); 125 | } 126 | else if (skill <= 70) 127 | { 128 | Spells.CastChivalry("Enemy Of One"); 129 | } 130 | else if (skill <= 90) 131 | { 132 | Spells.CastChivalry("Holy Light"); 133 | } 134 | else 135 | { 136 | Spells.CastChivalry("Noble Sacrifice"); 137 | } 138 | 139 | Misc.Pause(4000); 140 | skill = Player.GetRealSkillValue("Chivalry"); 141 | } 142 | } 143 | 144 | private void WaitTillHealed() 145 | { 146 | while (Player.Hits < Player.HitsMax) 147 | { 148 | Misc.Pause(5000); 149 | } 150 | } 151 | 152 | private void TrainNecro() 153 | { 154 | var skill = Player.GetRealSkillValue("Necromancy"); 155 | var player = Mobiles.FindBySerial(Player.Serial); 156 | while (skill < 100) 157 | { 158 | if (Player.Hits < 20) 159 | { 160 | while (Player.Buffs.Any(b => b.Equals("Lich Form", StringComparison.OrdinalIgnoreCase))) 161 | { 162 | Spells.CastNecro("Lich Form"); 163 | Misc.Pause(5000); 164 | } 165 | 166 | WaitTillHealed(); 167 | } 168 | 169 | if (skill < 50) 170 | { 171 | Spells.CastNecro("Pain Spike"); 172 | Target.WaitForTarget(2000); 173 | Target.TargetExecute(player); 174 | } 175 | else if (skill < 70) 176 | { 177 | Spells.CastNecro("Horrific Beast"); 178 | } 179 | else if (skill == 70 && Player.Buffs.Any(b => b.ToLower().Contains("beast"))) 180 | { 181 | // Spells.CastNecro("Horrific Beast"); 182 | } 183 | else if (skill < 90) 184 | { 185 | Spells.CastNecro("Wither"); 186 | } 187 | else 188 | { 189 | Spells.CastNecro("Lich Form"); 190 | } 191 | 192 | Misc.Pause(5000); 193 | skill = Player.GetRealSkillValue("Necromancy"); 194 | } 195 | } 196 | 197 | private void FocusStrike() 198 | { 199 | while (true) 200 | { 201 | if (!Player.SpellIsEnabled("Focus Attack") && Player.Mana >= 10) 202 | { 203 | Spells.CastNinjitsu("Focus Attack"); 204 | } 205 | Misc.Pause(200); 206 | } 207 | 208 | } 209 | 210 | private void TrainBushido() 211 | { 212 | var skill = Player.GetRealSkillValue("Bushido"); 213 | while (skill < 100) 214 | { 215 | if (Player.Hits < 20) 216 | { 217 | WaitTillHealed(); 218 | } 219 | if (skill <= 60) 220 | { 221 | Spells.CastBushido("Confidence"); 222 | } 223 | else if (skill <= 75) 224 | { 225 | Spells.CastBushido("Counter Attack"); 226 | } 227 | else 228 | { 229 | Spells.CastBushido("Evasion"); 230 | Misc.Pause(16000); 231 | } 232 | 233 | Misc.Pause(4000); 234 | skill = Player.GetRealSkillValue("Bushido"); 235 | } 236 | } 237 | 238 | private void Search(Item container) 239 | { 240 | Items.WaitForContents(container,2000); 241 | foreach (var i in container.Contains) 242 | { 243 | if (i.Name.ToLower().Contains("staff")) 244 | { 245 | Misc.SendMessage(i.Name); 246 | } 247 | 248 | if (i.IsContainer && !i.IsBagOfSending) 249 | { 250 | Search(i); 251 | } 252 | } 253 | } 254 | 255 | } 256 | } -------------------------------------------------------------------------------- /RazorScripts/FindAndUseTool.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace Razorscripts 6 | { 7 | public class MapRepeater 8 | { 9 | private int _itemId = Convert.ToInt32("0x0FBF", 16); 10 | 11 | public void Run() 12 | { 13 | var tool = Player.Backpack.Contains.FirstOrDefault(i => i.ItemID == _itemId); 14 | if (tool == null) 15 | { 16 | return; 17 | } 18 | 19 | Items.UseItem(tool); 20 | } 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /RazorScripts/GuardMe.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace Razorscripts 6 | { 7 | public class GuardMe 8 | { 9 | public void Run() 10 | { 11 | var filter = new Mobiles.Filter 12 | { 13 | RangeMax = 20, 14 | RangeMin = 0, 15 | Notorieties = new List { 1 } 16 | }; 17 | 18 | var mobs = Mobiles.ApplyFilter(filter); 19 | foreach (var mob in mobs) 20 | { 21 | Mobiles.WaitForProps(mob,1000); 22 | var sumProp = mob.Properties.FirstOrDefault(p => p.Number == 1049646); 23 | if (sumProp == null || !sumProp.ToString().Contains("summoned")) continue; 24 | Misc.WaitForContext(mob, 500); 25 | Misc.ContextReply(mob, 2); 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /RazorScripts/HealMaster.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace Razorscripts 7 | { 8 | public class HealMaster 9 | { 10 | public void Run() 11 | { 12 | try 13 | { 14 | var journal = new Journal(); 15 | var counter = 0; 16 | bool retry = false; 17 | do 18 | { 19 | var lastJournal = journal.GetJournalEntry(null).OrderBy(j => j.Timestamp).LastOrDefault(); 20 | if (Player.Poisoned) 21 | { 22 | if (Player.Hits < 15 && Player.GetRealSkillValue("SpiritSpeak") >= 100) 23 | { 24 | var lastNecro = Misc.ReadSharedValue("HealSelf:LastSS").ToString(); 25 | //Check if value is not null and is dateTime 26 | if (lastNecro != null && lastNecro != "0") 27 | { 28 | var lastNecroTime = DateTime.Parse(lastNecro, CultureInfo.InvariantCulture); 29 | if (lastNecroTime.AddSeconds(5) <= DateTime.Now) 30 | { 31 | Misc.SetSharedValue("HealSelf:LastSS", DateTime.Now.ToString(CultureInfo.InvariantCulture)); 32 | Player.UseSkill("SpiritSpeak"); 33 | } 34 | } 35 | else 36 | { 37 | Misc.SetSharedValue("HealSelf:LastSS", DateTime.Now.ToString(CultureInfo.InvariantCulture)); 38 | Player.UseSkill("SpiritSpeak"); 39 | } 40 | } 41 | 42 | Self.Cure(); 43 | } 44 | else 45 | { 46 | if (Self.NeedHealing) 47 | { 48 | Self.Heal(); 49 | } 50 | else 51 | { 52 | Helper.Log("You are already at full health"); 53 | break; 54 | } 55 | } 56 | 57 | if (journal.GetJournalEntry(lastJournal).Any(j => j.Text.ToLower().Contains("you must wait"))) 58 | { 59 | retry = true; 60 | Misc.Pause(100); 61 | } 62 | } while (retry && counter++ < 5); 63 | 64 | Misc.Pause(300); 65 | } 66 | catch (Exception e) 67 | { 68 | Misc.SendMessage(e); 69 | } 70 | } 71 | } 72 | } 73 | 74 | 75 | internal static class Helper 76 | { 77 | public static void Log(object messageString) 78 | { 79 | Misc.SendMessage(messageString, 201); 80 | } 81 | } 82 | 83 | public class Self : Player 84 | { 85 | private static uint USerial => (uint)Serial; 86 | public static bool NeedHealing => HitsMax > Hits; 87 | public static readonly bool ForceBands = GetRealSkillValue("Healing") >= 80; 88 | public static void Cure() 89 | { 90 | Misc.SetSharedValue("Lootmaster:Pause", 2000); 91 | var lastpotstring = Misc.ReadSharedValue("Healmaster:LastPotion").ToString(); 92 | DateTime? lastpot = lastpotstring != "0" ? DateTime.Parse(lastpotstring, CultureInfo.InvariantCulture) : null as DateTime?; 93 | var curepot = Items.FindByID(3847, 0, Backpack.Serial); 94 | var bands = Items.FindByID(3617, 0, Backpack.Serial); 95 | var blockQuickpot = lastpot != null && (DateTime.UtcNow - lastpot).Value.TotalSeconds < 5; 96 | 97 | if(!blockQuickpot && curepot != null && Hits < 20) 98 | { 99 | Items.UseItem(curepot); 100 | Misc.SetSharedValue("Healmaster:LastPotion", DateTime.Now.ToString(CultureInfo.InvariantCulture)); 101 | } 102 | else if (!ForceBands && GetRealSkillValue("Magery") >= 40) 103 | { 104 | Spells.CastMagery("Cure", USerial); 105 | } 106 | else if (!ForceBands && GetRealSkillValue("Chivalry") >= 40) 107 | { 108 | Spells.CastChivalry("Cleanse By Fire", USerial); 109 | } 110 | else if(bands != null) 111 | { 112 | Items.UseItem(bands, (int)USerial); 113 | } 114 | else if (curepot != null) 115 | { 116 | Items.UseItem(curepot); 117 | } 118 | 119 | } 120 | public static void Heal() 121 | { 122 | Misc.SetSharedValue("Lootmaster:Pause", 2000); 123 | var healpot = Items.FindByID(3852, 0, Backpack.Serial); 124 | var barrabPot = Items.FindByID(3846, 1272, Backpack.Serial); 125 | var bands = Items.FindByID(3617, 0, Backpack.Serial); 126 | var lastpotString = Misc.ReadSharedValue("Healmaster:LastPotion").ToString(); 127 | DateTime? lastPot = lastpotString != "0" ? DateTime.Parse(lastpotString) : null as DateTime?; 128 | var lastBarabPotString = Misc.ReadSharedValue("Healmaster:LastBarrabPotion").ToString(); 129 | DateTime? lastBarabPot = lastpotString != "0" ? DateTime.Parse(lastpotString) : null as DateTime?; 130 | var blockQuickpot = lastPot != null && (DateTime.UtcNow - lastPot).Value.TotalSeconds < 5; 131 | var blockBarrabPot = lastPot != null && (DateTime.UtcNow - lastPot).Value.TotalSeconds < 1200; 132 | 133 | //Todo, check LRC Value in order to validate if the player might have died and won't have regs, if so check for Spirit Speak Skill to heal 134 | if(!blockBarrabPot && barrabPot != null && Hits < 40) 135 | { 136 | Items.UseItem(healpot); 137 | Misc.SetSharedValue("Healmaster:LastPotion", DateTime.UtcNow); 138 | } 139 | if(!blockBarrabPot && healpot != null && Hits < 20) 140 | { 141 | Items.UseItem(healpot); 142 | Misc.SetSharedValue("Healmaster:LastPotion", DateTime.UtcNow); 143 | } 144 | else if (!ForceBands && GetRealSkillValue("Magery") > 30) 145 | { 146 | if (GetRealSkillValue("Magery") > 60 && HitsMax - Hits > 20) 147 | { 148 | Spells.CastMagery("Greater Heal", USerial); 149 | } 150 | 151 | else 152 | { 153 | Spells.CastMagery("Heal", USerial); 154 | } 155 | 156 | } 157 | else if (!ForceBands && GetRealSkillValue("Chivalry") > 60 && HitsMax - Hits > 20) 158 | { 159 | Spells.CastChivalry("Close Wounds", USerial); 160 | } 161 | else if(bands != null) 162 | { 163 | Items.UseItem(bands, (int)USerial); 164 | } 165 | else if (healpot != null) 166 | { 167 | Items.UseItem(healpot); 168 | Misc.SetSharedValue("Healmaster:LastPotion", DateTime.UtcNow); 169 | } 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /RazorScripts/Hiding.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace Razorscripts 7 | { 8 | public class Honoring 9 | { 10 | public void Run() 11 | { 12 | var last = Target.GetLast(); 13 | 14 | var target = PickTarget(); 15 | if (target == null) 16 | { 17 | Misc.SendMessage("No target found"); 18 | Target.SetLast(last); 19 | return; 20 | } 21 | InvokeHonor(target); 22 | Attack(target); 23 | } 24 | 25 | private void InvokeHonor(Mobile target) 26 | { 27 | Player.InvokeVirtue("Honor"); 28 | Target.WaitForTarget(3000, true); 29 | Target.TargetExecute(target); 30 | } 31 | 32 | private void Attack(Mobile target) 33 | { 34 | if (Player.HasSecondarySpecial) 35 | { 36 | Player.WeaponSecondarySA(); 37 | } 38 | 39 | Misc.Pause(300); 40 | Player.Attack(target); 41 | Target.SetLast(target); 42 | } 43 | 44 | private Mobile PickTarget() 45 | { 46 | var filter = new Mobiles.Filter 47 | { 48 | IsGhost = 0, 49 | RangeMax = 10, 50 | RangeMin = 0, 51 | Friend = 0, 52 | Notorieties = new List 53 | { 54 | 3, 4, 5, 6 55 | } 56 | }; 57 | 58 | var mobs = Mobiles.ApplyFilter(filter); 59 | var orderedMobs = mobs.OrderBy(m => m.DistanceTo(Mobiles.FindBySerial(Player.Serial))).ToList(); 60 | 61 | foreach (var mob in orderedMobs) 62 | { 63 | Mobiles.WaitForProps(mob,1000); 64 | if (mob.Properties.Any(p => p.Number == 1049646)) 65 | { 66 | continue; 67 | } 68 | 69 | return mob; 70 | } 71 | 72 | return null; 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /RazorScripts/Honoring.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace Razorscripts 7 | { 8 | public class Honoring 9 | { 10 | public void Run() 11 | { 12 | var last = Target.GetLast(); 13 | 14 | var target = PickTarget(); 15 | if (target == null) 16 | { 17 | Misc.SendMessage("No target found"); 18 | Target.SetLast(last); 19 | return; 20 | } 21 | InvokeHonor(target); 22 | Attack(target); 23 | } 24 | 25 | private void InvokeHonor(Mobile target) 26 | { 27 | Player.InvokeVirtue("Honor"); 28 | Target.WaitForTarget(3000, true); 29 | Target.TargetExecute(target); 30 | } 31 | 32 | private void Attack(Mobile target) 33 | { 34 | if (Player.HasSecondarySpecial) 35 | { 36 | Player.WeaponSecondarySA(); 37 | } 38 | 39 | Misc.Pause(300); 40 | Player.Attack(target); 41 | Target.SetLast(target); 42 | } 43 | 44 | private Mobile PickTarget() 45 | { 46 | var filter = new Mobiles.Filter 47 | { 48 | IsGhost = 0, 49 | RangeMax = 10, 50 | RangeMin = 0, 51 | Friend = 0, 52 | Notorieties = new List 53 | { 54 | 3, 4, 5, 6 55 | } 56 | }; 57 | 58 | var mobs = Mobiles.ApplyFilter(filter); 59 | var orderedMobs = mobs.OrderBy(m => m.DistanceTo(Mobiles.FindBySerial(Player.Serial))).ToList(); 60 | 61 | foreach (var mob in orderedMobs) 62 | { 63 | Mobiles.WaitForProps(mob,1000); 64 | if (mob.Properties.Any(p => p.Number == 1049646)) 65 | { 66 | continue; 67 | } 68 | 69 | return mob; 70 | } 71 | 72 | return null; 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /RazorScripts/IdocScanner.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using RazorEnhanced; 6 | 7 | namespace RazorScripts 8 | { 9 | public class IdocScanner 10 | { 11 | private List idocSerialCache = new List(); 12 | private uint _guildGumpId = 1345112424; 13 | private List _trackings = new List(); 14 | 15 | public void Run() 16 | { 17 | try 18 | { 19 | UpdateGump(); 20 | while (Player.Connected) 21 | { 22 | List idocHouses = new List(); 23 | var signs = Items.ApplyFilter(new Items.Filter 24 | { 25 | RangeMax = 100, 26 | RangeMin = 0, 27 | Name = "A House Sign" 28 | }).ToList(); 29 | 30 | foreach (var sign in signs) 31 | { 32 | Items.WaitForProps(sign, 2000); 33 | var conditionProp = sign.Properties.FirstOrDefault(p => p.Number == 1062028); 34 | if (conditionProp?.Args == "#1043015") 35 | { 36 | idocHouses.Add(sign); 37 | } 38 | } 39 | 40 | var cachevalue = idocSerialCache.Sum(i => i.Serial); 41 | var newvalue = idocHouses.Sum(i => i.Serial); 42 | if (cachevalue != newvalue) 43 | { 44 | idocSerialCache = idocHouses; 45 | UpdateGump(); 46 | foreach (var arrow in _trackings) 47 | { 48 | Player.TrackingArrow((ushort)arrow.X, (ushort)arrow.Y, false); 49 | } 50 | foreach (var idoc in idocSerialCache) 51 | { 52 | _trackings.Add(new Tracker 53 | { 54 | X = idoc.Position.X+2, 55 | Y = idoc.Position.Y+2, 56 | Serial = idoc.Serial 57 | }); 58 | Player.TrackingArrow((ushort)(idoc.Position.X+2), (ushort)(idoc.Position.Y+2), true); 59 | } 60 | } 61 | 62 | Misc.Pause(1000); 63 | } 64 | } 65 | catch (ThreadAbortException) 66 | { 67 | //Silent 68 | } 69 | catch (Exception e) 70 | { 71 | Misc.SendMessage(e); 72 | throw; 73 | } 74 | finally 75 | { 76 | Gumps.CloseGump(_guildGumpId); 77 | } 78 | 79 | } 80 | 81 | private void UpdateGump() 82 | { 83 | var gump = Gumps.CreateGump(); 84 | gump.gumpId = _guildGumpId; 85 | gump.serial = (uint)Player.Serial; 86 | var height = idocSerialCache.Count*75; 87 | Gumps.AddImage(ref gump, 0, 0, 1764); 88 | Gumps.AddBackground(ref gump, 0, 49, 205, height, 1755); 89 | Gumps.AddLabel(ref gump, 60, 18, 400, "IDOC Scanner"); 90 | foreach (var sign in idocSerialCache) 91 | { 92 | Gumps.AddItem(ref gump, 5, 60 + idocSerialCache.IndexOf(sign) * 50, sign.ItemID); 93 | Gumps.AddLabel(ref gump, 40, 60 + idocSerialCache.IndexOf(sign) * 50, 0x7b, sign.Properties.FirstOrDefault(s => s.Number == 1061639)?.Args ?? "Unknown"); 94 | } 95 | Gumps.CloseGump(_guildGumpId); 96 | Gumps.SendGump(gump,500,500); 97 | } 98 | 99 | internal class Tracker 100 | { 101 | public int X { get; set; } 102 | public int Y { get; set; } 103 | public int Serial { get; set; } 104 | } 105 | } 106 | } -------------------------------------------------------------------------------- /RazorScripts/LootmasterClearCurrentConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Runtime.Remoting.Messaging; 4 | using RazorEnhanced; 5 | 6 | namespace Razorscripts 7 | { 8 | public class LootmasterClearCurrentConfig 9 | { 10 | public void Run() 11 | { 12 | Misc.SetSharedValue("Lootmaster:ClearCurrentCharacter", true); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /RazorScripts/LootmasterDirectContainer.cs: -------------------------------------------------------------------------------- 1 | using RazorEnhanced; 2 | 3 | namespace Razorscripts 4 | { 5 | public class LootmasterDirectContainer 6 | { 7 | public void Run() 8 | { 9 | var tar = new Target(); 10 | var source = tar.PromptTarget("Select container to run LootMaster on"); 11 | if (source == -1) 12 | { 13 | Misc.SendMessage("No target selected", 201); 14 | return; 15 | } 16 | 17 | Misc.SetSharedValue("Lootmaster:DirectContainer", source); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /RazorScripts/LootmasterOld.cs: -------------------------------------------------------------------------------- 1 | // this is a much older version of Lootmaster 2 | // it is not recommended to use this version 3 | //This is before the UI and many of it's mor advanced functions 4 | 5 | using System; 6 | using System.Collections.Generic; 7 | using System.ComponentModel.Design; 8 | using System.Linq; 9 | using System.Text.RegularExpressions; 10 | using RazorEnhanced; 11 | 12 | namespace Razorscripts 13 | { 14 | public class LootmasterOld 15 | { 16 | private readonly List _gems = new List(); 17 | private readonly List ignoreList = new List(); 18 | 19 | private Item _goldBag; 20 | private Item _gemBag; 21 | private Item _artifactsBag; 22 | private Item _specialRulesBag; 23 | private Item _quiver; 24 | private Dictionary _specialAttributeRules = new Dictionary(); 25 | List _specialNameRules = new List(); 26 | private bool _allSpecialPropertiesRequired; 27 | 28 | private bool _digDeep = false; //Leave off for now, setting to true will recursivly loot though all bags in the corpse, and thus will open all of them 29 | 30 | private Mobile _player; 31 | 32 | private readonly List _lootLevels = new List(); 33 | private int _lootDelay = 300; 34 | Journal _journal = new Journal(); 35 | 36 | public void Run() 37 | { 38 | Setup(); 39 | 40 | while (true) 41 | { 42 | if (Misc.ReadSharedValue("LootmasterDirectContainer") is int directContainerSerial && directContainerSerial != 0) 43 | { 44 | Misc.SendMessage($"Looting direct container {directContainerSerial}"); 45 | var directContainer = Items.FindBySerial(directContainerSerial); 46 | if (directContainer != null) 47 | { 48 | var oldDigValue = _digDeep; 49 | _digDeep = true; 50 | LootCorpse(directContainer); 51 | Misc.RemoveSharedValue("LootmasterDirectContainer"); 52 | Misc.Pause(500); 53 | _digDeep = oldDigValue; 54 | continue; 55 | } 56 | } 57 | var corpses = Items.ApplyFilter(new Items.Filter 58 | { 59 | IsCorpse = 1, 60 | RangeMax = 2, 61 | RangeMin = 0 62 | }); 63 | 64 | foreach (var corpse in corpses) 65 | { 66 | if (Target.HasTarget() || ignoreList.Contains(corpse.Serial)) 67 | { 68 | continue; 69 | } 70 | 71 | var lastEntry = _journal.GetJournalEntry(null)?.FirstOrDefault(); 72 | LootCorpse(corpse); 73 | 74 | var rows = _journal.GetJournalEntry(lastEntry); 75 | if (rows == null) continue; 76 | var filtered = rows.Where(r => r.Type == "System"); 77 | if (filtered.Any(r => r.Text == "You must wait to perform another action.")) 78 | { 79 | _lootDelay += 10; 80 | Misc.SendMessage($"Adjusting loot delay with 10ms, currently at {_lootDelay}"); 81 | } 82 | } 83 | 84 | Misc.Pause(50); 85 | } 86 | } 87 | 88 | private bool SetBag(LootContainer container, int itemSerial) 89 | { 90 | Item current; 91 | if (itemSerial == Player.Backpack.Serial) 92 | current = Player.Backpack; 93 | else 94 | current = FindBag(Player.Backpack, itemSerial); 95 | 96 | if (current == null) 97 | { 98 | Misc.SendMessage($"Unable to set bag for {container}"); 99 | return false; 100 | } 101 | 102 | switch (container) 103 | { 104 | case LootContainer.Gold: 105 | _goldBag = current; 106 | break; 107 | case LootContainer.Gems: 108 | _gemBag = current; 109 | break; 110 | case LootContainer.Other: 111 | _artifactsBag = current; 112 | break; 113 | case LootContainer.Quiver: 114 | _quiver = current; 115 | break; 116 | case LootContainer.Special: 117 | _specialRulesBag = current; 118 | break; 119 | } 120 | 121 | return true; 122 | } 123 | 124 | private Item FindBag(Item bag, int target) 125 | { 126 | var found = bag.Contains.FirstOrDefault(c => c.Serial == target); 127 | return found ?? bag.Contains.Where(c => c.IsContainer).Select(sub => FindBag(sub, target)).FirstOrDefault(); 128 | } 129 | 130 | private void LootCorpse(Item corpse) 131 | { 132 | Items.WaitForContents(corpse, 1000); 133 | Misc.Pause(_lootDelay); 134 | 135 | if (corpse.DistanceTo(_player) > 2) 136 | { 137 | return; 138 | } 139 | 140 | var sum = 1; 141 | while (sum != 0) 142 | { 143 | sum = LootGold(corpse); 144 | Misc.Pause(100); 145 | } 146 | 147 | sum = 1; 148 | while (sum != 0) 149 | { 150 | sum = LootGems(corpse); 151 | Misc.Pause(100); 152 | } 153 | sum = 1; 154 | while (sum != 0) 155 | { 156 | sum = LootObjects(corpse); 157 | Misc.Pause(100); 158 | } 159 | 160 | Misc.Pause(100); 161 | ignoreList.Add(corpse.Serial); 162 | } 163 | 164 | private int LootGems(Item container) 165 | { 166 | //Misc.SendMessage($"digging in {container.Serial}"); 167 | if (_gemBag == null) 168 | { 169 | return 0; 170 | } 171 | 172 | var gems = container.Contains.Where(i => _gems.Contains(i.ItemID)).ToList(); 173 | 174 | var sum = gems.Sum(i => i.Amount); 175 | foreach (var gem in gems) 176 | { 177 | MoveToBag(gem, _gemBag); 178 | } 179 | 180 | if (_digDeep) 181 | { 182 | var subContainers = container.Contains.Where(i => i.IsContainer).ToList(); 183 | foreach (var sub in subContainers) 184 | { 185 | Items.WaitForContents(sub, 1000); 186 | Misc.Pause(_lootDelay); 187 | sum += LootGems(sub); 188 | } 189 | } 190 | 191 | return sum; 192 | } 193 | 194 | private int LootGold(Item container) 195 | { 196 | if (_goldBag == null) 197 | { 198 | return 0; 199 | } 200 | 201 | var goldStacks = container.Contains.Where(i => i.ItemID == 3821).ToList(); 202 | 203 | var sum = goldStacks.Sum(g => g.Amount); 204 | 205 | foreach (var goldStack in goldStacks) 206 | { 207 | MoveToBag(goldStack, _goldBag); 208 | } 209 | 210 | if (_digDeep) 211 | { 212 | var subContainers = container.Contains.Where(i => i.IsContainer).ToList(); 213 | foreach (var sub in subContainers) 214 | { 215 | Misc.Pause(_lootDelay); 216 | Items.WaitForContents(sub, 1000); 217 | Misc.Pause(_lootDelay); 218 | sum += LootGold(sub); 219 | } 220 | } 221 | 222 | 223 | return sum; 224 | } 225 | 226 | private int LootObjects(Item container) 227 | { 228 | var sum = 0; 229 | foreach (var obj in container.Contains) 230 | { 231 | if (_quiver != null && (obj.ItemID == 3903 || obj.ItemID == 7163)) //Bolts and arrows 232 | { 233 | MoveToBag(obj, _quiver); 234 | sum++; 235 | continue; 236 | } 237 | if (obj.ItemID == 3968) //Demon Bones 238 | { 239 | MoveToBag(obj, _goldBag); 240 | continue; 241 | } 242 | 243 | if (_specialRulesBag != null) 244 | { 245 | var nameMatch = false; 246 | foreach (var specialName in _specialNameRules) 247 | { 248 | if (obj.Name.ToLower().Contains(specialName.ToLower())) 249 | { 250 | MoveToBag(obj, _specialRulesBag); 251 | nameMatch = true; 252 | break; 253 | } 254 | } 255 | 256 | if (nameMatch) 257 | { 258 | continue; 259 | } 260 | 261 | if (CheckSpecialProps(obj)) 262 | { 263 | MoveToBag(obj, _specialRulesBag); 264 | continue; 265 | } 266 | } 267 | 268 | if (_artifactsBag != null) 269 | { 270 | if (CheckProps(obj)) 271 | { 272 | MoveToBag(obj, _artifactsBag); 273 | sum++; 274 | } 275 | } 276 | } 277 | 278 | if (_digDeep) 279 | { 280 | var subContainers = container.Contains.Where(i => i.IsContainer).ToList(); 281 | foreach (var sub in subContainers) 282 | { 283 | Items.WaitForContents(sub, 1000); 284 | Misc.Pause(_lootDelay); 285 | sum += LootObjects(sub); 286 | } 287 | } 288 | 289 | return sum; 290 | } 291 | 292 | private bool CheckSpecialProps(Item obj) 293 | { 294 | var checks = _specialAttributeRules.ToDictionary(k => k.Key, v => false); 295 | var re = new Regex(@"\d+"); 296 | Items.WaitForProps(obj, 500); 297 | var take = false; 298 | 299 | foreach (var prop in obj.Properties) 300 | { 301 | var stringVal = prop.ToString().Replace("%",""); 302 | var reMatch = re.Match(stringVal); 303 | var numIndex = reMatch.Success ? reMatch.Index : stringVal.Length; 304 | foreach (var rule in _specialAttributeRules) 305 | { 306 | var propString = ResolvePropertyName(rule.Key); 307 | if (propString.Equals(stringVal.Substring(0,numIndex).Trim(), StringComparison.InvariantCultureIgnoreCase)) 308 | { 309 | var numstring = stringVal.Substring(numIndex); 310 | int.TryParse(numstring, out var parseValue); 311 | if (parseValue >= rule.Value || !reMatch.Success) 312 | { 313 | checks[rule.Key] = true; 314 | break; 315 | } 316 | } 317 | } 318 | } 319 | 320 | if (_allSpecialPropertiesRequired) 321 | { 322 | checks.All(c => c.Value); 323 | } 324 | 325 | return checks.Any(c => c.Value); 326 | } 327 | 328 | private bool CheckProps(Item obj) 329 | { 330 | Items.WaitForProps(obj, 50); 331 | var take = false; 332 | if (obj.Weight == 50) 333 | { 334 | return false; 335 | } 336 | 337 | foreach (var prop in obj.Properties) 338 | { 339 | 340 | foreach (var str in _lootLevels) 341 | { 342 | take = prop.Args.Contains(str); 343 | if (take) break; 344 | } 345 | 346 | if (take) break; 347 | } 348 | 349 | return take; 350 | } 351 | 352 | private string ResolvePropertyName(ItemProperty prop) 353 | { 354 | switch (prop) 355 | { 356 | case ItemProperty.SpellDamageIncrease: 357 | return "Spell Damage Increase"; 358 | case ItemProperty.EnhancePotions: 359 | return "Enhance Potions"; 360 | case ItemProperty.EnhancePoisons: 361 | return "Enhance Poisons"; 362 | case ItemProperty.CastRecovery: 363 | return "Cast Recovery"; 364 | case ItemProperty.CastSpeed: 365 | return "Cast Speed"; 366 | case ItemProperty.LowerManaCost: 367 | return "Lower Mana Cost"; 368 | case ItemProperty.LowerReagentCost: 369 | return "Lower Reagent Cost"; 370 | case ItemProperty.EnhanceMagery: 371 | return "Enhance Magery"; 372 | case ItemProperty.EnhanceMeditation: 373 | return "Enhance Meditation"; 374 | case ItemProperty.NightSight: 375 | return "Night Sight"; 376 | case ItemProperty.ReactiveParalyze: 377 | return "Reactive Paralyze"; 378 | case ItemProperty.ReactiveFireball: 379 | return "Reactive Fireball"; 380 | case ItemProperty.ReactiveCurse: 381 | return "Reactive Curse"; 382 | case ItemProperty.ReactiveLightning: 383 | return "Reactive Lightning"; 384 | case ItemProperty.ReactiveManaDrain: 385 | return "Reactive Mana Drain"; 386 | case ItemProperty.LowerAttackChance: 387 | return "Lower Attack Chance"; 388 | case ItemProperty.LowerDefendChance: 389 | return "Lower Defend Chance"; 390 | case ItemProperty.ReflectPhysicalDamage: 391 | return "Reflect Physical Damage"; 392 | case ItemProperty.EnhanceDamage: 393 | return "Enhance Damage"; 394 | case ItemProperty.EnhanceDefense: 395 | return "Enhance Defense"; 396 | case ItemProperty.BonusStr: 397 | return "Bonus Str"; 398 | case ItemProperty.BonusDex: 399 | return "Bonus Dex"; 400 | case ItemProperty.BonusInt: 401 | return "Bonus Int"; 402 | case ItemProperty.BonusHits: 403 | return "Bonus Hits"; 404 | case ItemProperty.BonusStam: 405 | return "Bonus Stam"; 406 | case ItemProperty.BonusMana: 407 | return "Bonus Mana"; 408 | case ItemProperty.SpellChanneling: 409 | return "Spell Channeling"; 410 | case ItemProperty.DamageIncrease: 411 | return "Damage Increase"; 412 | case ItemProperty.Luck: 413 | return "Luck"; 414 | case ItemProperty.SwingSpeedIncrease: 415 | return "Swing Speed Increase"; 416 | case ItemProperty.HitChanceIncrease: 417 | return "Hit Chance Increase"; 418 | case ItemProperty.DefenseChanceIncrease: 419 | return "Defense Chance Increase"; 420 | } 421 | 422 | return null; 423 | } 424 | 425 | private void Setup() 426 | { 427 | var tar = new Target(); 428 | 429 | var target = tar.PromptTarget("Pick loot bag for Gold"); 430 | SetBag(LootContainer.Gold, target); 431 | target = tar.PromptTarget("Pick loot bag for Gems"); 432 | SetBag(LootContainer.Gems, target); 433 | target = tar.PromptTarget("Pick loot bag for Artifacts"); 434 | SetBag(LootContainer.Other, target); 435 | target = tar.PromptTarget("Pick loot bag for Special Rules Items"); 436 | SetBag(LootContainer.Special, target); 437 | if (Player.GetSkillValue("Archery") > 30) 438 | { 439 | target = tar.PromptTarget("Pick Quiver or arrow bag"); 440 | SetBag(LootContainer.Quiver, target); 441 | } 442 | 443 | Misc.RemoveSharedValue("LootmasterDirectContainer"); 444 | _player = Mobiles.FindBySerial(Player.Serial); 445 | 446 | var gems = Enum.GetValues(typeof(Gem)).Cast().ToList(); 447 | 448 | foreach (var gem in gems) _gems.Add((int)gem); 449 | 450 | _lootLevels.AddRange(new[] 451 | { 452 | "Artifact", 453 | "Major Magic Item" 454 | }); 455 | 456 | SetSpecialRules(); 457 | SetUpSpecialNameRules(); 458 | } 459 | 460 | private void SetSpecialRules() 461 | { 462 | _allSpecialPropertiesRequired = false; //This indicates if all of the special rules needs to be on the item, if false, it will work as ANY of the rules 463 | _specialAttributeRules.Clear(); 464 | //Add special rules by adding a line such as 465 | //_specialAttributeRules.Add(ItemProperty.SpellDamageIncrease, 18); where SpellDamageIncrease is based on the ItemProperty seen below 466 | //and the number is the minumum value you are looking for 467 | _specialAttributeRules.Add(ItemProperty.ReactiveParalyze, 10); 468 | } 469 | 470 | private void SetUpSpecialNameRules() 471 | { 472 | _specialNameRules.Clear(); 473 | //Add special rules by adding a line such as 474 | //_specialNameRules.Add("Name of Item"); where Name of Item is the name of the item you are looking for 475 | _specialNameRules.Add("Raptor Teeth"); 476 | } 477 | 478 | 479 | private void MoveToBag(Item item, Item destinationBag) 480 | { 481 | Items.Move(item, destinationBag, item.Amount); 482 | Misc.Pause(_lootDelay); 483 | } 484 | 485 | private enum LootContainer 486 | { 487 | Gold = 0, 488 | Gems = 1, 489 | Other = 2, 490 | Quiver = 3, 491 | Special = 4 492 | } 493 | 494 | private enum Gem 495 | { 496 | StarSapphire = 3855, 497 | Ruby = 3859, 498 | Emerald = 3856, 499 | Sapphire = 3857, 500 | Citrine = 3861, 501 | Amethyst = 3862, 502 | Tourmaline = 3864, 503 | Amber = 3877, 504 | Diamond = 3878 505 | } 506 | 507 | private enum ItemProperty 508 | { 509 | SpellDamageIncrease = 1, 510 | EnhancePotions = 2, 511 | EnhancePoisons = 3, 512 | CastRecovery = 4, 513 | CastSpeed = 5, 514 | LowerManaCost = 6, 515 | LowerReagentCost = 7, 516 | EnhanceMagery = 8, 517 | EnhanceMeditation = 9, 518 | NightSight = 10, 519 | ReactiveParalyze = 11, 520 | ReactiveFireball = 12, 521 | ReactiveCurse = 13, 522 | ReactiveLightning = 14, 523 | ReactiveManaDrain = 15, 524 | LowerAttackChance = 16, 525 | LowerDefendChance = 17, 526 | ReflectPhysicalDamage = 18, 527 | EnhanceDamage = 19, 528 | EnhanceDefense = 20, 529 | BonusStr = 21, 530 | BonusDex = 22, 531 | BonusInt = 23, 532 | BonusHits = 24, 533 | BonusStam = 25, 534 | BonusMana = 26, 535 | //WeaponDamage = 27, 536 | //WeaponSpeed = 28, 537 | SpellChanneling = 29, 538 | DamageIncrease = 30, 539 | Luck = 31, 540 | SwingSpeedIncrease = 32, 541 | HitChanceIncrease = 33, 542 | DefenseChanceIncrease = 34, 543 | } 544 | } 545 | } -------------------------------------------------------------------------------- /RazorScripts/LootmasterReconfigure.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace Razorscripts 6 | { 7 | public class LootmasterReconfigure 8 | { 9 | public void Run() 10 | { 11 | Misc.SetSharedValue("Lootmaster:ReconfigureBags", true); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /RazorScripts/MineNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms.VisualStyles; 6 | using RazorEnhanced; 7 | 8 | namespace Razorscripts 9 | { 10 | public class MineNode 11 | { 12 | private List _tools = new List 13 | { 14 | 0x0E86, 15 | 0x0F39 16 | }; 17 | private Journal _journal = new Journal(); 18 | private Journal.JournalEntry _journalEntry = null; 19 | 20 | private int _firePetSerial = 0x026888DD; // set to fire beetle or fire fox serial, if you do not have one set to 0 21 | private int _packPetSerial = 0; // set to fire beetle or fire fox serial, if you do not have one set to 0 22 | 23 | private List directSmelts = new List 24 | { 25 | 0x19B8, 26 | 0x19BA, 27 | 0x19B9 28 | }; 29 | private List needs2Smelts = new List 30 | { 31 | 0x19B7 32 | }; 33 | 34 | public void Run() 35 | { 36 | _journalEntry = _journal.GetJournalEntry(_journalEntry).OrderBy(je => je.Timestamp).LastOrDefault(); 37 | while (true) 38 | { 39 | if(Player.Weight > Player.MaxWeight - 50) 40 | { 41 | if(_firePetSerial == 0) 42 | { 43 | if (Player.Weight >= Player.MaxWeight) 44 | { 45 | Player.HeadMessage(33, "Backpack is full, Stopping"); 46 | return; 47 | } 48 | } 49 | else 50 | { 51 | Smelt(); 52 | } 53 | 54 | if(_packPetSerial != 0) 55 | { 56 | var ores = Player.Backpack.Contains.Where(i => i.Name.ToLower().Contains("ore")).ToList(); 57 | var ingots = Player.Backpack.Contains.Where(i => i.ItemID == 0x1BF2).ToList(); 58 | 59 | var combined = ores.Concat(ingots).ToList(); 60 | 61 | foreach (var item in combined) 62 | { 63 | Items.Move(item, _packPetSerial, item.Amount); 64 | Misc.Pause(200); 65 | } 66 | } 67 | 68 | } 69 | 70 | var tool = Player.Backpack.Contains.FirstOrDefault(i => _tools.Contains(i.ItemID)); 71 | if (tool == null) 72 | { 73 | Player.HeadMessage(33, "No tool found"); 74 | return; 75 | } 76 | Target.TargetResource(tool, "ore"); 77 | var newLines = _journal.GetJournalEntry(_journalEntry); 78 | if (newLines.Any(j => j.Text.Contains("There is no metal here to mine"))) 79 | { 80 | return; 81 | } 82 | Misc.Pause(600); 83 | } 84 | } 85 | 86 | private void Smelt() 87 | { 88 | var potentialSmeltings = Player.Backpack.Contains.Where(i => i.Name.ToLower().Contains("ore")).ToList(); 89 | 90 | foreach (var ps in potentialSmeltings) 91 | { 92 | if (directSmelts.Contains(ps.ItemID)) 93 | { 94 | Items.UseItem(ps); 95 | Target.WaitForTarget(1000); 96 | Target.TargetExecute(_firePetSerial); 97 | Misc.Pause(500); 98 | continue; 99 | } 100 | if(needs2Smelts.Contains(ps.ItemID)) 101 | { 102 | if (ps.Amount >= 2) 103 | { 104 | Items.UseItem(ps); 105 | Target.WaitForTarget(1000); 106 | Target.TargetExecute(_firePetSerial); 107 | Misc.Pause(500); 108 | continue; 109 | } 110 | } 111 | } 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /RazorScripts/MountUp.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Text.RegularExpressions; 4 | using RazorEnhanced; 5 | 6 | namespace RazorScripts 7 | { 8 | public class MountUp 9 | { 10 | public void Run() 11 | { 12 | //&Check for bonded bet 1049608 13 | var found = Mobiles.ApplyFilter(new Mobiles.Filter 14 | { 15 | Notorieties = { 1, 2 }, 16 | RangeMax = 2, 17 | }).ToList(); 18 | 19 | foreach (var mob in found) 20 | { 21 | Mobiles.WaitForProps(mob, 1000); 22 | } 23 | 24 | var bonded = found.Where(m => m.Properties.Any(p => p.Number == 1049608)); 25 | if (bonded.Any()) 26 | { 27 | foreach (var mobile in bonded) 28 | { 29 | var isMine = mobile.CanRename; 30 | if (mobile.Backpack == null && isMine) 31 | { 32 | Mobiles.UseMobile(mobile); 33 | return; 34 | } 35 | } 36 | } 37 | 38 | 39 | var regex = new Regex(@"\bEthereal\b.*\bStatuette\b|\bStatuette\b.*\bEthereal\b", RegexOptions.IgnoreCase); 40 | 41 | var mount = Player.Backpack.Contains.FirstOrDefault(i => regex.Match(i.Name).Success); 42 | if (mount == null) 43 | { 44 | return; 45 | } 46 | 47 | Items.UseItem(mount); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /RazorScripts/MoveBoards.cs: -------------------------------------------------------------------------------- 1 | using RazorEnhanced; 2 | using System.Linq; 3 | 4 | namespace Razorscripts 5 | { 6 | public class MoveBoards 7 | { 8 | private string OrganizerListName = "boardmove"; //The name of the organizer hat moves boards to horse 9 | 10 | public void Run() 11 | { 12 | var axe = Player.GetItemOnLayer("RightHand") ?? Player.GetItemOnLayer("LeftHand"); 13 | if (axe == null) 14 | { 15 | Misc.SendMessage("No Axe Equipped", 201); 16 | return; 17 | } 18 | 19 | var logstacks = Player.Backpack.Contains.Where(l => l.ItemID == 7133).ToList(); 20 | if (logstacks.Any()) 21 | { 22 | foreach (var logs in logstacks) 23 | { 24 | Items.UseItem(axe); 25 | Target.WaitForTarget(2000); 26 | Target.TargetExecute(logs); 27 | Misc.Pause(500); 28 | } 29 | } 30 | else 31 | { 32 | Misc.SendMessage("No boards found in backpack", 201); 33 | } 34 | 35 | Organizer.ChangeList(OrganizerListName); 36 | Organizer.FStop(); 37 | Organizer.FStart(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /RazorScripts/MultiQuestmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Data.SqlTypes; 4 | using System.Linq; 5 | using Assistant; 6 | using RazorEnhanced; 7 | using Item = RazorEnhanced.Item; 8 | 9 | namespace Razorscripts 10 | { 11 | public class MultiQuestmark 12 | { 13 | public void Run() 14 | { 15 | var player = Mobiles.FindBySerial(Player.Serial); 16 | Target.ClearLast(); 17 | var rows = Misc.WaitForContext(Player.Serial, 10000); 18 | foreach (var row in rows) 19 | { 20 | if (row.Entry.Equals("Toggle Quest Item", StringComparison.InvariantCultureIgnoreCase)) 21 | { 22 | Misc.ContextReply(Player.Serial, rows.IndexOf(row)); 23 | break; 24 | } 25 | } 26 | 27 | 28 | for (var i = 0; i <= 200; i++) 29 | { 30 | if (Target.GetLast() != 0) 31 | { 32 | break; 33 | } 34 | Misc.Pause(50); 35 | } 36 | 37 | if (Target.GetLast() == 0) 38 | { 39 | Misc.SendMessage("No item selected, aborting script",201); 40 | Target.Cancel(); 41 | return; 42 | } 43 | 44 | 45 | var itemSerial = Target.GetLast(); 46 | var targetItem = Player.Backpack.Contains.FirstOrDefault(i => i.Serial == itemSerial); 47 | 48 | if (targetItem != null) 49 | { 50 | var alreadyMarked = targetItem.Properties.Any(p => p.ToString() == "Quest Item"); 51 | 52 | var all = Player.Backpack.Contains.Where(i=> i.ItemID == targetItem.ItemID && i.Serial != itemSerial).ToList(); 53 | 54 | var filtered = new List(); 55 | if (alreadyMarked) 56 | { 57 | filtered = all.Where(i => i.Properties.Any(p => p.ToString() == "Quest Item")).ToList(); 58 | } 59 | else 60 | { 61 | filtered = all.Where(i => i.Properties.All(p => p.ToString() != "Quest Item")).ToList(); 62 | } 63 | 64 | Misc.Pause(100); 65 | 66 | foreach (var i in filtered) 67 | { 68 | Target.WaitForTarget(3000); 69 | Target.TargetExecute(i); 70 | } 71 | } 72 | 73 | Misc.SendMessage("Multi Toggle Complete, any further clicks will toggle only selected Item"); 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /RazorScripts/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("RazorScripts")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("RazorScripts")] 12 | [assembly: AssemblyCopyright("Copyright © 2023")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("06B26608-0E38-411D-98A9-4A8C9EC66030")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /RazorScripts/Ranger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Windows.Forms.VisualStyles; 6 | using RazorEnhanced; 7 | 8 | namespace Razorscripts 9 | { 10 | public class Ranger 11 | { 12 | private uint _gumpId = 788435742; 13 | 14 | private List LoadedPowers = new List 15 | { 16 | new Power { Name = "None", Type = PowerType.None, GumpId = 21016 }, 17 | new Power { Name = "Armor Ingore", Type = PowerType.WeaponPrimary, GumpId = 20992 }, 18 | new Power { Name = "Lightening Strike", Type = PowerType.Bushido, GumpId = 21540 }, 19 | new Power { Name = "Momentum Strike", Type = PowerType.Bushido, GumpId = 21541 }, 20 | }; 21 | 22 | private Power _selectedPower; 23 | 24 | public void Run() 25 | { 26 | try 27 | { 28 | UpdateGump(); 29 | while (Player.Connected) 30 | { 31 | var reply = Gumps.GetGumpData(_gumpId); 32 | if (reply.buttonid > 0) 33 | { 34 | _selectedPower = LoadedPowers[reply.buttonid - 1]; 35 | UpdateGump(); 36 | 37 | reply.buttonid = -1; 38 | } 39 | 40 | PrimePower(); 41 | 42 | Misc.Pause(1000); 43 | } 44 | } 45 | catch (ThreadAbortException) 46 | { 47 | //Silent 48 | } 49 | catch (Exception e) 50 | { 51 | Misc.SendMessage(e); 52 | throw; 53 | } 54 | finally 55 | { 56 | Gumps.CloseGump(_gumpId); 57 | } 58 | } 59 | 60 | private void PrimePower() 61 | { 62 | if (_selectedPower == null) 63 | { 64 | return; 65 | } 66 | switch (_selectedPower.Type) 67 | { 68 | case PowerType.Bushido: 69 | if (!Player.BuffsExist(_selectedPower.Name)) 70 | { 71 | Spells.CastBushido(_selectedPower.Name); 72 | } 73 | break; 74 | case PowerType.WeaponPrimary: 75 | if (!Player.HasPrimarySpecial) 76 | { 77 | Player.WeaponPrimarySA(); 78 | } 79 | break; 80 | case PowerType.WeaponSecondary: 81 | if (!Player.HasSecondarySpecial) 82 | { 83 | Player.WeaponSecondarySA(); 84 | } 85 | break; 86 | case PowerType.None: 87 | default: 88 | break; 89 | } 90 | } 91 | 92 | private void UpdateGump() 93 | { 94 | var bar = Gumps.CreateGump(); 95 | bar.buttonid = -1; 96 | // bar.gumpId = ; 97 | bar.serial = (uint)Player.Serial; 98 | bar.gumpId = _gumpId; 99 | bar.x = 500; 100 | bar.y = 500; 101 | var powerIndex = 0; 102 | Gumps.AddBackground(ref bar, 0, 0, (LoadedPowers.Count*60-5), 55, 1755); 103 | foreach (var power in LoadedPowers) 104 | { 105 | var x = powerIndex * 60 + 5; 106 | var y = 5; 107 | Gumps.AddButton(ref bar, x,y,(int)power.GumpId,(int)power.GumpId,LoadedPowers.IndexOf(power)+1,1,0); 108 | Gumps.AddTooltip(ref bar, power.Name); 109 | powerIndex++; 110 | } 111 | 112 | if (_selectedPower != null) 113 | { 114 | var index = LoadedPowers.IndexOf(_selectedPower); 115 | Gumps.AddImage(ref bar, (60 * index-17),0,30071); 116 | } 117 | 118 | Gumps.CloseGump(_gumpId); 119 | Gumps.SendGump(bar, 500,500); 120 | } 121 | 122 | 123 | private class Power 124 | { 125 | public string Name { get; set; } 126 | public PowerType Type { get; set; } 127 | public int GumpId { get; set; } 128 | } 129 | 130 | private enum PowerType 131 | { 132 | WeaponPrimary, 133 | WeaponSecondary, 134 | Bushido, 135 | None 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /RazorScripts/RaritySorter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using RazorEnhanced; 7 | 8 | namespace RazorScripts 9 | { 10 | public class RaritySorter 11 | { 12 | List _rules = new List(); 13 | 14 | public void Run() 15 | { 16 | var tar = new Target(); 17 | var raities = Enum.GetValues(typeof(ItemRarity)).Cast().ToList(); 18 | 19 | var sourceBag = tar.PromptTarget("Pick bag you wish to sort"); 20 | 21 | if (sourceBag != -1) 22 | { 23 | var source = Items.FindBySerial(sourceBag); 24 | if (!source.IsContainer) 25 | { 26 | Player.HeadMessage(33, "That s Not a suitable source"); 27 | } 28 | 29 | if (!source.Contains.Any(i => i.IsLootable)) 30 | { 31 | Player.HeadMessage(33, "That bag is empty"); 32 | } 33 | 34 | foreach (var rarity in raities) 35 | { 36 | var rarityName = SplitCamelCase(rarity.ToString()); 37 | var targetSerial = tar.PromptTarget($"Pick a bag for {rarityName}"); 38 | if (targetSerial != -1) 39 | { 40 | _rules.Add(new SortRule 41 | { 42 | TaretBag = Items.FindBySerial(targetSerial), 43 | Rarity = rarity 44 | }); 45 | } 46 | } 47 | 48 | Misc.SendMessage("Starting Sort Cycle", 0x99); 49 | 50 | foreach (var item in source.Contains.Where(i => i.IsLootable)) 51 | { 52 | Items.WaitForProps(item, 1000); 53 | var rarityProp = item.Properties.FirstOrDefault(p => p.Number == 1042971); 54 | if (rarityProp == null) 55 | { 56 | continue; 57 | } 58 | 59 | foreach (var rule in _rules) 60 | { 61 | //Find text between > and < and remove spaces 62 | var rarityString = ""; 63 | var cleaned = rarityProp.Args.Substring(rarityProp.Args.IndexOf(">", StringComparison.Ordinal) + 1).Replace(" ", ""); 64 | var length = cleaned.IndexOf("<", StringComparison.Ordinal); 65 | if (length == -1) 66 | { 67 | rarityString = cleaned.Substring(0); 68 | } 69 | else 70 | { 71 | rarityString = cleaned.Substring(0, cleaned.IndexOf("<", StringComparison.Ordinal)); 72 | } 73 | 74 | 75 | var matched = rarityString.Equals(rule.Rarity.ToString(), StringComparison.OrdinalIgnoreCase); 76 | if (matched) 77 | { 78 | Items.Move(item.Serial, rule.TaretBag.Serial, item.Amount); 79 | Misc.Pause(300); 80 | } 81 | } 82 | } 83 | 84 | Misc.SendMessage("Sorting Complete", 0x99); 85 | 86 | } 87 | 88 | 89 | } 90 | 91 | public string SplitCamelCase(string str) 92 | { 93 | return Regex.Replace( 94 | Regex.Replace( 95 | str, 96 | @"(\P{Ll})(\P{Ll}\p{Ll})", 97 | "$1 $2" 98 | ), 99 | @"(\p{Ll})(\P{Ll})", 100 | "$1 $2" 101 | ); 102 | } 103 | 104 | 105 | } 106 | 107 | internal class SortRule 108 | { 109 | public Item TaretBag { get; set; } 110 | public ItemRarity Rarity { get; set; } 111 | } 112 | 113 | internal enum ItemRarity 114 | { 115 | MinorMagicItem = 0, 116 | LesserMagicItem = 1, 117 | GreaterMagicItem = 2, 118 | MajorMagicItem = 3, 119 | MinorArtifact = 4, 120 | LesserArtifact = 5, 121 | GreaterArtifact = 6, 122 | MajorArtifact = 7, 123 | LegendaryArtifact = 8 124 | } 125 | } -------------------------------------------------------------------------------- /RazorScripts/RazorScripts.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {06B26608-0E38-411D-98A9-4A8C9EC66030} 8 | Library 9 | Properties 10 | RazorScripts 11 | RazorScripts 12 | v4.8 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | {b24e4fb1-4936-4544-9e88-f3ff9b04fdba} 83 | Razor 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /RazorScripts/ReleaseAll.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace Razorscripts 6 | { 7 | public class ReleaseAll 8 | { 9 | public void Run() 10 | { 11 | var filter = new Mobiles.Filter 12 | { 13 | RangeMax = 20, 14 | RangeMin = 0, 15 | Notorieties = new List { 1 } 16 | }; 17 | 18 | var mobs = Mobiles.ApplyFilter(filter); 19 | foreach (var mob in mobs) 20 | { 21 | Mobiles.WaitForProps(mob,1000); 22 | var sumProp = mob.Properties.FirstOrDefault(p => p.Number == 1049646); 23 | if (sumProp == null || !sumProp.ToString().Contains("summoned")) continue; 24 | Misc.WaitForContext(mob, 500); 25 | Misc.ContextReply(mob, 5); 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /RazorScripts/Reloader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using RazorEnhanced; 6 | 7 | namespace Razorscripts 8 | { 9 | public class Reloader 10 | { 11 | private Item Quiver = null; 12 | private uint _gumpId = 32315123; 13 | private int Checksum = 0; 14 | private int _lastMap = 0; 15 | private Item _lastHeldWeapon = null; 16 | 17 | public void Run() 18 | { 19 | try 20 | { 21 | var success = RefreshQuiver(); 22 | if (!success) 23 | { 24 | Player.HeadMessage(0x23, "You do not have a quiver equipped"); 25 | return; 26 | } 27 | 28 | 29 | _lastHeldWeapon = Player.GetItemOnLayer("LeftHand"); 30 | _lastMap = Player.Map; 31 | var a = Quiver.Contains.Where(i => i.ItemID == 3903).Sum(i => i.Amount); 32 | var b = Quiver.Contains.Where(i => i.ItemID == 7163).Sum(i => i.Amount); 33 | Checksum = a+b*1000; 34 | 35 | // Reload(); 36 | UpdateGump(); 37 | 38 | while (Player.Connected) 39 | { 40 | var arrows = Quiver.Contains.Where(i => i.ItemID == 3903).Sum(i => i.Amount); 41 | var bolts = Quiver.Contains.Where(i => i.ItemID == 7163).Sum(i => i.Amount); 42 | var ammoChecksum = arrows+bolts*1000; 43 | if (ammoChecksum != Checksum) 44 | { 45 | Checksum = ammoChecksum; 46 | UpdateGump(); 47 | } 48 | 49 | if (Player.Map != _lastMap) 50 | { 51 | _lastMap = Player.Map; 52 | RefreshQuiver(); 53 | } 54 | 55 | var held = Player.GetItemOnLayer("LeftHand"); 56 | if (held != null && held != _lastHeldWeapon ) 57 | { 58 | if (WeaponUsesBolts(held) != WeaponUsesBolts(_lastHeldWeapon)) 59 | { 60 | Reload(); 61 | } 62 | _lastHeldWeapon = held; 63 | } 64 | 65 | var sharedValue = Misc.ReadSharedValue("Reloader:Ammo") as int?; 66 | if (sharedValue != null && sharedValue.Value != 0) 67 | { 68 | var ammoTypeInQuiver = Quiver.Contains.FirstOrDefault(); 69 | if (sharedValue != ammoTypeInQuiver?.ItemID) 70 | { 71 | Reload(); 72 | } 73 | Misc.SetSharedValue("Reloader:Ammo", 0); 74 | } 75 | 76 | HandleReply(); 77 | 78 | Misc.Pause(1000); 79 | } 80 | } 81 | catch (ThreadAbortException) 82 | { 83 | //Silent 84 | } 85 | catch (Exception e) 86 | { 87 | Misc.SendMessage(e); 88 | throw; 89 | } 90 | finally 91 | { 92 | Gumps.CloseGump(_gumpId); 93 | } 94 | } 95 | 96 | private void HandleReply() 97 | { 98 | 99 | 100 | var reply = Gumps.GetGumpData(_gumpId); 101 | if (reply.buttonid > 0) 102 | { 103 | if (reply.buttonid == 1) 104 | { 105 | Reload(); 106 | UpdateGump(); 107 | } 108 | 109 | reply.buttonid = -1; 110 | } 111 | } 112 | 113 | 114 | private bool WeaponUsesBolts(Item item) 115 | { 116 | if(item == null) 117 | { 118 | return false; 119 | } 120 | 121 | var crossbows = new List { 9923, 3920, 5117 }; 122 | return crossbows.Contains(item.ItemID); 123 | } 124 | 125 | private void UpdateGump() 126 | { 127 | var gump = Gumps.CreateGump(); 128 | var ammoArrows = Quiver.Contains.Where(i => i.ItemID == 3903).Sum(i => i.Amount); 129 | var ammoBolts = Quiver.Contains.Where(i => i.ItemID == 7163).Sum(i => i.Amount); 130 | var ammoTextArrows = $"Arrows: {ammoArrows} / 500"; 131 | var ammoTextBolts = $"Bolts: {ammoBolts} / 500"; 132 | var defaultText = "No Ammo"; 133 | var height = 50; 134 | gump.gumpId = _gumpId; 135 | gump.serial = (uint)Player.Serial; 136 | Gumps.AddBackground(ref gump,0,0,300,height,1755); 137 | 138 | if (ammoArrows > 0) 139 | { 140 | Gumps.AddLabel(ref gump, 15, 15, 0x7b, ammoTextArrows); 141 | } 142 | 143 | if (ammoBolts > 0) 144 | { 145 | Gumps.AddLabel(ref gump, 15, 15, 0x7b, ammoTextBolts); 146 | } 147 | 148 | if (ammoBolts == 0 && ammoArrows == 0) 149 | { 150 | Gumps.AddLabel(ref gump, 15, 15, 0x7b, defaultText); 151 | } 152 | 153 | Gumps.AddButton(ref gump, 200,15,40018,40018,1,1,1); 154 | Gumps.AddLabel(ref gump, 215,15,0x481, "Reload"); 155 | 156 | Gumps.CloseGump(_gumpId); 157 | Gumps.SendGump(gump,500,500); 158 | } 159 | 160 | private void Reload() 161 | { 162 | RefreshQuiver(); 163 | var wep = Player.GetItemOnLayer("LeftHand"); 164 | if (wep != null) 165 | { 166 | Items.WaitForProps(wep,1000); 167 | var archerWep = wep.Properties.Any(p => p.ToString().Contains("archery")); 168 | if (archerWep) 169 | { 170 | var availableSpace = 500 - Quiver.Contains.Sum(i => i.Amount); 171 | var ammoId = WeaponUsesBolts(wep) ? 7163 : 3903; 172 | var ammoInQuiver = Quiver.Contains.FirstOrDefault(); 173 | if (ammoInQuiver != null && ammoInQuiver.ItemID != ammoId) 174 | { 175 | Items.Move(ammoInQuiver, Player.Backpack, ammoInQuiver.Amount); 176 | availableSpace = 500; 177 | Misc.Pause(350); 178 | } 179 | var ammo = Player.Backpack.Contains.FirstOrDefault(i => i.ItemID == ammoId && i.Amount > 0); 180 | if (ammo != null) 181 | { 182 | Items.WaitForProps(ammo,1000); 183 | var reloadAmount = ammo.Amount; 184 | if (reloadAmount > availableSpace) 185 | { 186 | reloadAmount = availableSpace; 187 | } 188 | 189 | if (reloadAmount == 0) 190 | { 191 | 192 | Player.HeadMessage(0x58,$"You are already full on {(ammoId == 7163 ? "Bolts" : "Arrows")}"); 193 | return; 194 | } 195 | 196 | Player.HeadMessage(0x58,$"Reloading {reloadAmount} {(ammoId == 7163 ? "Bolts" : "Arrows")}"); 197 | Items.Move(ammo, Quiver, reloadAmount); 198 | } 199 | else 200 | { 201 | Player.HeadMessage(0x23,"No Ammo in Backpack"); 202 | } 203 | } 204 | else 205 | { 206 | Player.HeadMessage(0x23,"No Archery Weapon Equipped"); 207 | } 208 | } 209 | else 210 | { 211 | Player.HeadMessage(0x23,"No Weapon Equipped"); 212 | } 213 | } 214 | 215 | private bool RefreshQuiver() 216 | { 217 | var quiver= Player.Quiver; 218 | if (quiver == null) 219 | { 220 | var backup = Player.GetItemOnLayer("Cloak"); 221 | if (backup != null && backup.Name.ToLower().Contains("quiver")) 222 | { 223 | quiver = backup; 224 | } 225 | else 226 | { 227 | return false; 228 | } 229 | 230 | Items.WaitForProps(quiver,1000); 231 | Items.WaitForContents(Quiver, 500); 232 | } 233 | 234 | Quiver = quiver; 235 | 236 | return true; 237 | } 238 | } 239 | } -------------------------------------------------------------------------------- /RazorScripts/Repeater.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using RazorEnhanced; 4 | 5 | namespace Razorscripts 6 | { 7 | public class Repeater 8 | { 9 | public void Run() 10 | { 11 | while (Player.GetSkillValue("Necromancy") < 95) 12 | { 13 | Spells.Cast("Wither"); 14 | 15 | Misc.Pause(3000); 16 | 17 | if (Player.Mana < 25) 18 | { 19 | Player.UseSkill("Meditation"); 20 | Misc.Pause(15000); 21 | } 22 | } 23 | 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /RazorScripts/RuneBookFinder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace RazorScripts 7 | { 8 | public class RuneBookFinder 9 | { 10 | private int GumpId = 4598751; 11 | private Item CurrentBook = null; 12 | private List CurrentHits = new List(); 13 | 14 | private readonly List Messages = new List 15 | { 16 | "Pssst...over here...", 17 | "MARCO!", 18 | "Come closer little one...", 19 | }; 20 | public void Run() 21 | { 22 | Gumps.CloseGump((uint)GumpId); 23 | ShowGump(); 24 | while (true) 25 | { 26 | var sd = Gumps.GetGumpData((uint)GumpId); 27 | if (sd.buttonid != -1) 28 | { 29 | if (sd.buttonid == 100) 30 | { 31 | var searchPrompt = sd.text.FirstOrDefault(); 32 | FindBooks(searchPrompt); 33 | } 34 | else if (sd.buttonid == 200) 35 | { 36 | CurrentBook = null; 37 | CurrentHits.Clear(); 38 | sd.text.Clear(); 39 | } 40 | else 41 | { 42 | 43 | CurrentBook = CurrentHits.FirstOrDefault(b => b.Serial == sd.buttonid); 44 | 45 | if (CurrentBook != null) 46 | { 47 | Items.Message(CurrentBook.Serial, 0x1d,GetItemMessage()); 48 | var hue = CurrentBook.Hue; 49 | // for(var i = 0; i<15; i++) 50 | // { 51 | // var curHue = i % 2 == 0 ? 0x7b : hue; 52 | // Items.SetColor(CurrentBook.Serial, curHue); 53 | // Misc.Pause(100); 54 | // } 55 | // Items.SetColor(CurrentBook.Serial, hue); 56 | } 57 | else 58 | { 59 | Misc.SendMessage("Book Missing"); 60 | } 61 | } 62 | sd.buttonid = -1; 63 | ShowGump(); 64 | } 65 | Misc.Pause(100); 66 | } 67 | } 68 | 69 | private void FindBooks(string description) 70 | { 71 | CurrentHits = new List(); 72 | if (string.IsNullOrEmpty(description)) 73 | { 74 | return; 75 | } 76 | 77 | var books = Items.ApplyFilter(new Items.Filter 78 | { 79 | RangeMin = 0, 80 | RangeMax = 10, 81 | }).Where(b => b.Name.Equals("Runebook", StringComparison.Ordinal) || b.Name.Equals("Runic Atlas", StringComparison.OrdinalIgnoreCase)).ToList(); 82 | 83 | books.ForEach(b => Items.WaitForProps(b, 1000)); 84 | 85 | CurrentHits.AddRange(books.Where(b => b.Properties.Any(p => p.ToString().ToLower().Contains(description.ToLower())))); 86 | } 87 | 88 | private void ShowGump() 89 | { 90 | var searchGump = Gumps.CreateGump(); 91 | searchGump.gumpId = (uint)GumpId; 92 | searchGump.serial = (uint)Player.Serial; 93 | Gumps.AddImage(ref searchGump, 0,0,206); 94 | Gumps.AddImage(ref searchGump, 44,0,201); 95 | Gumps.AddImage(ref searchGump, 471,0,207); 96 | Gumps.AddImageTiled(ref searchGump, 0,44,44,GetHeight(), 202); 97 | Gumps.AddImageTiled(ref searchGump, 471,44,44,GetHeight(), 203); 98 | Gumps.AddImage(ref searchGump, 0,44+GetHeight(),204); 99 | Gumps.AddImage(ref searchGump, 44,44+GetHeight(),233); 100 | Gumps.AddImage(ref searchGump, 471,44+GetHeight(),205); 101 | Gumps.AddImageTiled(ref searchGump, 44,44,427,GetHeight(), 200); 102 | Gumps.AddHtml(ref searchGump, 44,24,427,20, "

Runebook Finder

", false, false); 103 | Gumps.AddImage(ref searchGump, 57, 60, 1802); 104 | Gumps.AddImageTiled(ref searchGump, 65, 60, 334, 16,1803); 105 | Gumps.AddImage(ref searchGump, 399, 60, 1804); 106 | Gumps.AddTextEntry(ref searchGump, 65,60,342,32,3171,1,""); 107 | Gumps.AddButton(ref searchGump, 409, 60, 12000,12001,100,1,0); 108 | Gumps.AddButton(ref searchGump, 409, 80, 12003,12004,200,1,0); 109 | 110 | var orderedHits = CurrentHits.OrderBy(GetText).ToList(); 111 | 112 | foreach (var hit in orderedHits) 113 | { 114 | var index = orderedHits.IndexOf(hit); 115 | var baseIndex = CurrentHits.IndexOf(hit); 116 | Gumps.AddButton(ref searchGump, 20, 100 + index * 30, 4005, 4007, hit.Serial, 1, 0); 117 | Gumps.AddLabel(ref searchGump, 60, 100 + index * 30, 0, GetText(hit)); 118 | } 119 | 120 | 121 | Gumps.SendGump(searchGump,500,500); 122 | } 123 | 124 | private string GetText(Item book) 125 | { 126 | return book.Properties.FirstOrDefault(b => b.Number == 1042971)?.ToString(); 127 | } 128 | 129 | private int GetHeight() 130 | { 131 | return CurrentHits.Count * 30 + 50; 132 | } 133 | 134 | private string GetItemMessage() 135 | { 136 | return Messages[new Random().Next(0, Messages.Count)]; 137 | } 138 | } 139 | } -------------------------------------------------------------------------------- /RazorScripts/SampMaster.cs: -------------------------------------------------------------------------------- 1 | //Add 2 scripts that alter the Shared Value for SampMaster to the 2 values below so that you can keybind these. 2 | //Misc.SetSharedValue("SampMaster:Targets","Multi") 3 | //Misc.SetSharedValue("SampMaster:Targets","Single") 4 | //This is simply to allow swapping stance from keybinds 5 | 6 | 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Diagnostics.Tracing; 10 | using System.Linq; 11 | using System.Threading; 12 | using RazorEnhanced; 13 | 14 | namespace RazorScripts 15 | { 16 | public class SampMaster 17 | { 18 | private static uint GumppId = 126542315; 19 | private bool Multi = false; 20 | private bool UseDoubleStrike = false; 21 | 22 | private List AoeSpecials = new List 23 | { 24 | 21004, 25 | 21006 26 | }; 27 | 28 | public void Run() 29 | { 30 | var defensives = new List 31 | { 32 | "Evasion", 33 | "Counter Attack", 34 | //"Confidence" 35 | }; 36 | 37 | var offensivesSingle = new List 38 | { 39 | "Lightning Strike", 40 | "Honorable Execution", 41 | "Stagger" 42 | }; 43 | 44 | var offensivesMulti = new List 45 | { 46 | 47 | "Whirlwind Attack", 48 | "Momentum Strike", 49 | "Frenzied Whirlwind", 50 | }; 51 | try 52 | { 53 | UpdateGump(); 54 | while (true) 55 | { 56 | var gd = Gumps.GetGumpData(GumppId); 57 | if(gd.buttonid == 2) 58 | { 59 | Misc.SetSharedValue("SampMaster:Targets","Single"); 60 | } 61 | else if(gd.buttonid == 1) 62 | { 63 | Misc.SetSharedValue("SampMaster:Targets","Multi"); 64 | } 65 | var oldTarg = Multi; 66 | Multi = IsMulti(); 67 | var targChanged = oldTarg != Multi; 68 | if (targChanged) 69 | { 70 | UpdateGump(); 71 | } 72 | 73 | if (Player.WarMode && Player.Mana > 10) 74 | { 75 | if (!Player.Buffs.Any(b => defensives.Contains(b))) 76 | { 77 | 78 | Spells.CastBushido("Counter Attack"); 79 | Misc.Pause(200); 80 | } 81 | 82 | else 83 | { 84 | if (Multi) 85 | { 86 | if (!Player.Buffs.Any(b => offensivesMulti.Contains(b)) && !Player.HasSpecial) 87 | { 88 | var force = false; 89 | // var targs = Mobiles.ApplyFilter(new Mobiles.Filter 90 | // { 91 | // RangeMin = 0, 92 | // RangeMax = 1, 93 | // Warmode = 1 94 | // }).ToList(); 95 | // targs.ForEach(m => Mobiles.WaitForStats(m, 200)); 96 | // var primeTarget = targs.OrderBy(m => m.Hits).FirstOrDefault(); 97 | // 98 | // if (primeTarget != null && targs.Count > 1 && targs.Count < 3) 99 | // { 100 | // if (primeTarget.Hits < 30) 101 | // { 102 | // force = true; 103 | // Player.Attack(primeTarget); 104 | // } 105 | // } 106 | 107 | PrimeMulti(force); 108 | Misc.Pause(200); 109 | } 110 | } 111 | else 112 | { 113 | if (!offensivesSingle.Any(Player.SpellIsEnabled)) 114 | { 115 | if (UseDoubleStrike && Player.PrimarySpecial == 20998) 116 | { 117 | Player.WeaponPrimarySA(); 118 | } 119 | else 120 | { 121 | Spells.CastBushido("Lightning Strike"); 122 | } 123 | 124 | Misc.Pause(200); 125 | } 126 | } 127 | } 128 | 129 | 130 | } 131 | 132 | Misc.Pause(500); 133 | } 134 | } 135 | catch (Exception e) 136 | { 137 | if (e.GetType() != typeof(ThreadAbortException)) 138 | { 139 | Misc.SendMessage(e.ToString()); 140 | } 141 | } 142 | } 143 | 144 | 145 | private void PrimeMulti(bool forceMomentum = false) 146 | { 147 | if (!forceMomentum && AoeSpecials.Contains(GetMultiIcon("primary"))) 148 | { 149 | Player.WeaponPrimarySA(); 150 | } 151 | else if (!forceMomentum && AoeSpecials.Contains(GetMultiIcon("secondary"))) 152 | { 153 | Player.WeaponSecondarySA(); 154 | } 155 | 156 | else 157 | { 158 | Spells.CastBushido("Momentum Strike"); 159 | } 160 | } 161 | 162 | private bool IsMulti() 163 | { 164 | var val = Misc.ReadSharedValue("SampMaster:Targets"); 165 | var stance = (val is string) ? !string.IsNullOrEmpty(val.ToString()) ? val.ToString() : "Single" : "Single"; 166 | if (string.IsNullOrEmpty(stance)) 167 | { 168 | stance = "Single"; 169 | } 170 | 171 | return stance == "Multi"; 172 | } 173 | 174 | private bool IsDefensive() 175 | { 176 | var val = Misc.ReadSharedValue("SampMaster:Stance"); 177 | var stance = (val is string) ? !string.IsNullOrEmpty(val.ToString()) ? val.ToString() : "Offensive" : "Offensive"; 178 | if (string.IsNullOrEmpty(stance)) 179 | { 180 | stance = "Offensive"; 181 | } 182 | 183 | 184 | 185 | return stance == "Defensive"; 186 | } 187 | 188 | private void UpdateGump() 189 | { 190 | var gump = Gumps.CreateGump(); 191 | gump.gumpId = GumppId; 192 | gump.serial = (uint)Player.Serial; 193 | Gumps.AddBackground(ref gump,0,0,55,55,1755); 194 | 195 | if (!Multi) 196 | { 197 | // Gumps.AddImage(ref gump,5,5,21540); 198 | Gumps.AddButton(ref gump, 5,5,21540,21540,1,1,0); 199 | Gumps.AddTooltip(ref gump, "Single Target"); 200 | } 201 | else 202 | { 203 | Gumps.AddButton(ref gump, 5,5,(int)GetMultiIcon(),(int)GetMultiIcon(),2,1,0); 204 | Gumps.AddTooltip(ref gump, "Multi Target"); 205 | } 206 | 207 | Gumps.CloseGump(GumppId); 208 | Gumps.SendGump(gump,500,500); 209 | } 210 | 211 | private uint GetMultiIcon(string slot = null) 212 | { 213 | switch (slot) 214 | { 215 | case "primary": 216 | { 217 | if (AoeSpecials.Contains(Player.PrimarySpecial)) 218 | { 219 | return Player.PrimarySpecial; 220 | } 221 | 222 | break; 223 | } 224 | case "secondary": 225 | { 226 | if (AoeSpecials.Contains(Player.SecondarySpecial)) 227 | { 228 | return Player.SecondarySpecial; 229 | } 230 | 231 | break; 232 | } 233 | default: 234 | { 235 | if (AoeSpecials.Contains(Player.PrimarySpecial)) 236 | { 237 | return Player.PrimarySpecial; 238 | } 239 | 240 | if (AoeSpecials.Contains(Player.SecondarySpecial)) 241 | { 242 | return Player.SecondarySpecial; 243 | } 244 | 245 | break; 246 | } 247 | } 248 | 249 | return 21541; 250 | } 251 | } 252 | } -------------------------------------------------------------------------------- /RazorScripts/ScriptMonitor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using RazorEnhanced; 6 | 7 | namespace RazorScripts 8 | { 9 | public class ScriptMonitor 10 | { 11 | private int _checksum; 12 | private uint _gumpId = 344763792; 13 | 14 | // please edit this section with your own scripts, it's important that you add the file extension as well sicne this is part of the key that Razor uses to identify the script. 15 | // The script you add must also already be added into the script grid in Razor Enhance for this to work. 16 | //Always add the line with false (this is used internally and should not be changed) 17 | private Dictionary _scriptStatus = new Dictionary 18 | { 19 | {"Lootmaster.cs", false}, 20 | {"SlayerBar.cs", false} 21 | }; 22 | 23 | public void Run() 24 | { 25 | try 26 | { 27 | UpdateGump(); 28 | while (Player.Connected) 29 | { 30 | if (CheckScripts()) 31 | { 32 | UpdateGump(); 33 | } 34 | 35 | HandleReply(); 36 | 37 | Misc.Pause(1000); 38 | } 39 | } 40 | catch (ThreadAbortException) 41 | { 42 | // Silent 43 | } 44 | catch (Exception e) 45 | { 46 | Misc.SendMessage(e); 47 | throw; 48 | } 49 | finally 50 | { 51 | Gumps.CloseGump(_gumpId); 52 | } 53 | 54 | } 55 | 56 | private void HandleReply() 57 | { 58 | var reply = Gumps.GetGumpData(_gumpId); 59 | var replyIndex = reply.buttonid - 1; 60 | if (replyIndex >= 0) 61 | { 62 | UpdateGump(); 63 | reply.buttonid = -1; 64 | var script = _scriptStatus.Keys.ToList()[replyIndex]; 65 | var status = _scriptStatus[script]; 66 | if (status) 67 | { 68 | Misc.ScriptStop(script); 69 | } 70 | else 71 | { 72 | Misc.ScriptRun(script); 73 | } 74 | Misc.Pause(3000); 75 | 76 | UpdateGump(); 77 | } 78 | } 79 | 80 | private void UpdateGump() 81 | { 82 | var gump = Gumps.CreateGump(); 83 | gump.gumpId = _gumpId; 84 | gump.serial = (uint)Player.Serial; 85 | var height = _scriptStatus.Count * 20 + 30; 86 | Gumps.AddBackground(ref gump, 0, 0, 200, height, 1755); 87 | var index = 0; 88 | foreach (var script in _scriptStatus) 89 | { 90 | var marker = script.Value ? 11400 : 11410; 91 | Gumps.AddButton(ref gump, 15, 15 + index * 20, marker,marker,index+1,1,0); 92 | Gumps.AddLabel(ref gump, 40,15 + index * 20, 0x7b, script.Key.Split('.').FirstOrDefault() ?? "N/A"); 93 | index++; 94 | } 95 | 96 | Gumps.CloseGump(_gumpId); 97 | Gumps.SendGump(gump,500,500); 98 | } 99 | 100 | 101 | private bool CheckScripts() 102 | { 103 | var checkSum = 0; 104 | string checksumString = string.Empty; 105 | var keys = _scriptStatus.Keys.ToList(); 106 | foreach (var script in keys) 107 | { 108 | var result = Misc.ScriptStatus(script); 109 | checksumString += result ? "1" : "0"; 110 | _scriptStatus[script] = result; 111 | } 112 | 113 | checkSum = Convert.ToInt32(checksumString, 2); 114 | 115 | if (checkSum != _checksum) 116 | { 117 | _checksum = checkSum; 118 | return true; 119 | } 120 | 121 | return false; 122 | } 123 | } 124 | } -------------------------------------------------------------------------------- /RazorScripts/SlayerBar.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Diagnostics.CodeAnalysis; 5 | using System.Globalization; 6 | using System.Linq; 7 | using System.Text.RegularExpressions; 8 | using System.Threading; 9 | using RazorEnhanced; 10 | 11 | namespace RazorScripts 12 | { 13 | [SuppressMessage("ReSharper", "ConditionIsAlwaysTrueOrFalse")] 14 | public class SlayerBar 15 | { 16 | private Item _SlayerBag { get; set; } 17 | private readonly List _slayerItems = new List(); 18 | private BaseSkill _skill; 19 | // private static string _version = "1.0.1"; 20 | private int _nonSlayerSerial = -1; 21 | private uint _gumpId = 788435749; 22 | //Set to true if you want to open containers to find slayers 23 | //(note that this will open any and all containers in your backpack until a slayer container is found) 24 | private bool _allowOpeningContainers = false; 25 | 26 | private Dictionary _propertyMapper = new Dictionary 27 | { 28 | {BaseSkill.Swordsmanship, 1061172}, 29 | {BaseSkill.MaceFighting, 1061173}, 30 | {BaseSkill.Fencing, 1061174}, 31 | {BaseSkill.Archery, 1061175}, 32 | {BaseSkill.Throwing, 1112075} 33 | }; 34 | 35 | private int GetProperyNumber(BaseSkill skill) 36 | { 37 | if (_propertyMapper.TryGetValue(skill, out var value)) 38 | { 39 | return value; 40 | } 41 | 42 | return 0; 43 | } 44 | 45 | private Func _searchFilter; 46 | private readonly List _slayerList = new List 47 | { 48 | SlayerType.None, 49 | SlayerType.RepondSlayer, 50 | SlayerType.UndeadSlayer, 51 | SlayerType.ReptileSlayer, 52 | SlayerType.DragonSlayer, 53 | SlayerType.ArachnidSlayer, 54 | SlayerType.SpiderSlayer, 55 | SlayerType.ElementalSlayer, 56 | SlayerType.AirElementalSlayer, 57 | SlayerType.FireElementalSlayer, 58 | SlayerType.WaterElementalSlayer, 59 | SlayerType.EarthElementalSlayer, 60 | SlayerType.BloodElementalSlayer, 61 | SlayerType.DemonSlayer, 62 | SlayerType.FeySlayer, 63 | SlayerType.EodonSlayer, 64 | }; 65 | 66 | private bool IsSlayer(Item checkItem) 67 | { 68 | Items.WaitForProps(checkItem,1000); 69 | return checkItem.Properties.Any(p => p.ToString().ToLower().Contains("slayer")) 70 | || checkItem.Properties.Any(p => p.ToString().ToLower().Contains("silver")); 71 | } 72 | 73 | private bool IsCorrectSkill(Item checkItem) 74 | { 75 | Items.WaitForProps(checkItem,1000); 76 | return checkItem.Properties.Any(p => p.Number == GetProperyNumber(_skill)); 77 | } 78 | 79 | private TextInfo _tinfo; 80 | 81 | public void Run() 82 | { 83 | try 84 | { 85 | _tinfo = CultureInfo.CurrentCulture.TextInfo; 86 | _skill = TryFindSkill(); 87 | 88 | if (_skill == BaseSkill.Magery) 89 | { 90 | _searchFilter = i => IsSpellBook(i) 91 | && (IsSlayer(i)); 92 | } 93 | else 94 | { 95 | _searchFilter = i => IsSlayer(i) && IsCorrectSkill(i); 96 | } 97 | 98 | 99 | if (TryFindSlayerBag(Player.Backpack)) 100 | { 101 | SetSlayers(_SlayerBag); 102 | } 103 | else 104 | { 105 | Misc.SendMessage("Unable to find Slayer weapon container, please open the container and try again"); 106 | return; 107 | } 108 | 109 | UpdateBar(); 110 | 111 | while (true) 112 | { 113 | var bar = Gumps.GetGumpData(788435749); 114 | if (bar.buttonid != -1 && bar.buttonid != 0) 115 | { 116 | UpdateBar(); 117 | 118 | EquipSlayer(_slayerItems.FirstOrDefault(i => i.Slayer == (SlayerType)bar.buttonid)); 119 | 120 | UpdateBar(); 121 | } 122 | 123 | 124 | 125 | Misc.Pause(100); 126 | } 127 | } 128 | catch (ThreadAbortException) 129 | { 130 | //Ignore 131 | } 132 | catch (Exception e) 133 | { 134 | Misc.SendMessage(e.ToString()); 135 | throw; 136 | } 137 | finally 138 | { 139 | Gumps.CloseGump(_gumpId); 140 | } 141 | } 142 | 143 | private void EquipSlayer(SlayerItem book) 144 | { 145 | var held = GetEquippedWeapon(); 146 | var resolved = _slayerItems.FirstOrDefault(b => b.Serial == held?.Serial); 147 | if (_SlayerBag == null) 148 | { 149 | Misc.SendMessage("Unable to find slayer bag"); 150 | } 151 | 152 | if (held != null && resolved != null) 153 | { 154 | if (resolved.Serial == book.Serial) 155 | { 156 | return; 157 | } 158 | 159 | var gameEquipped = Items.FindBySerial(resolved.Serial); 160 | var index = _slayerList.IndexOf(resolved.Slayer); 161 | var offset = index > 5 ? 6 : 0; 162 | Items.Move(gameEquipped, _SlayerBag, 1,(index-offset)*20+45, offset == 0 ? 95 : 125); 163 | Misc.Pause(650); 164 | } 165 | else 166 | { 167 | if (held != null) 168 | { 169 | Items.Move(held, Player.Backpack.Serial,held.Amount); 170 | Misc.Pause(600); 171 | } 172 | } 173 | 174 | var gameTarget = Items.FindBySerial(book.Serial); 175 | 176 | while (GetEquippedWeapon()?.ItemID != gameTarget.ItemID) 177 | { 178 | Player.EquipItem(gameTarget); 179 | Misc.Pause(100); 180 | } 181 | Misc.Pause(300); 182 | } 183 | 184 | private int GetActiveSlayerIndex() 185 | { 186 | var held = GetEquippedWeapon(); 187 | var booksSorted = _slayerItems.OrderBy(b => _slayerList.IndexOf(b.Slayer)).ToList(); 188 | var resolved = _slayerItems.FirstOrDefault(b => b.Serial == held?.Serial); 189 | if (resolved != null) 190 | { 191 | return booksSorted.IndexOf(resolved); 192 | } 193 | 194 | return -1; 195 | } 196 | 197 | private void UpdateBar() 198 | { 199 | var activeBookIndex = GetActiveSlayerIndex(); 200 | var bar = Gumps.CreateGump(); 201 | bar.buttonid = -1; 202 | bar.gumpId = _gumpId; 203 | bar.serial = (uint)Player.Serial; 204 | bar.x = 500; 205 | bar.y = 500; 206 | Gumps.AddBackground(ref bar, 0, 0, (_slayerItems.Count*60-5), 55, 1755); 207 | var slayersSorted = _slayerItems.OrderBy(b => _slayerList.IndexOf(b.Slayer)).ToList(); 208 | foreach (var slayerItem in slayersSorted) 209 | { 210 | var index = slayersSorted.IndexOf(slayerItem); 211 | var x = index * 60 + 5; 212 | var y = 5; 213 | Gumps.AddButton(ref bar, x,y,(int)slayerItem.Slayer,(int)slayerItem.Slayer,(int)slayerItem.Slayer,1,0); 214 | Gumps.AddTooltip(ref bar, slayerItem.Name); 215 | } 216 | 217 | if (activeBookIndex != -1) 218 | { 219 | Gumps.AddImage(ref bar, (60 * activeBookIndex-17),0,30071); 220 | } 221 | 222 | Gumps.CloseGump(_gumpId); 223 | Gumps.SendGump(bar, 500,500); 224 | } 225 | 226 | private BaseSkill TryFindSkill() 227 | { 228 | var dict = new Dictionary(); 229 | foreach (var baseSkill in Enum.GetValues(typeof(BaseSkill)).Cast()) 230 | { 231 | // var skillString = _tinfo.ToTitleCase(baseSkill.ToString()); 232 | var value = Player.GetSkillValue(GetSkillName(baseSkill)); 233 | dict.Add(baseSkill, value); 234 | } 235 | 236 | //Return key of highest value 237 | return dict.Aggregate((l, r) => l.Value > r.Value ? l : r).Key; 238 | } 239 | 240 | private string GetSkillName(BaseSkill skill) 241 | { 242 | switch (skill) 243 | { 244 | case BaseSkill.Swordsmanship: 245 | return "Swords"; 246 | case BaseSkill.MaceFighting: 247 | return "Mace Fighting"; 248 | case BaseSkill.Fencing: 249 | return "Fencing"; 250 | case BaseSkill.Archery: 251 | return "Archery"; 252 | case BaseSkill.Throwing: 253 | return "Throwing"; 254 | case BaseSkill.Magery: 255 | return "Magery"; 256 | } 257 | 258 | return ""; 259 | } 260 | 261 | private Item GetEquippedWeapon() 262 | { 263 | var item = Player.GetItemOnLayer("RightHand"); 264 | if (item != null) 265 | { 266 | return item; 267 | } 268 | item = Player.GetItemOnLayer("LeftHand"); 269 | if (item != null) 270 | { 271 | Items.WaitForProps(item,1000); 272 | if (item.Properties.Any(p => p.ToString().ToLower().Contains("two-handed"))) 273 | { 274 | return item; 275 | } 276 | } 277 | 278 | return null; 279 | } 280 | 281 | private bool TryFindSlayerBag(Item container) 282 | { 283 | if (_SlayerBag != null) 284 | { 285 | return true; 286 | } 287 | 288 | var slayersFound = 0; 289 | var held = GetEquippedWeapon(); 290 | if (held != null) 291 | { 292 | var match = IsSlayer(held); 293 | if (match && !IsSpellBook(held)) 294 | { 295 | match = IsCorrectSkill(held); 296 | } 297 | 298 | if (match) 299 | { 300 | slayersFound++; 301 | } 302 | } 303 | 304 | if (_allowOpeningContainers) 305 | { 306 | Items.WaitForContents(container, 1000); 307 | } 308 | 309 | List potentials = new List(); 310 | foreach (var item in container.Contains) 311 | { 312 | Items.WaitForProps(item, 1000); 313 | 314 | if (_searchFilter(item)) 315 | { 316 | potentials.Add(item); 317 | } 318 | 319 | } 320 | 321 | slayersFound += potentials.Count; 322 | 323 | if (slayersFound > 1) 324 | { 325 | _SlayerBag = container; 326 | return true; 327 | } 328 | 329 | foreach (var subContainer in container.Contains.Where(c => c.IsContainer && !c.IsBagOfSending)) 330 | { 331 | var found = TryFindSlayerBag(subContainer); 332 | if (found) 333 | { 334 | return true; 335 | } 336 | } 337 | 338 | return false; 339 | } 340 | 341 | private bool IsSpellBook(Item item) 342 | { 343 | return item.Name.ToLower().Contains("spellbook") || item.Name.Equals("Scrapper's Compendium", StringComparison.InvariantCultureIgnoreCase) || item.Name.Equals("Juo'nar's Grimoire", StringComparison.InvariantCultureIgnoreCase); 344 | } 345 | 346 | private void SetSlayers(Item container) 347 | { 348 | _slayerItems.Clear(); 349 | var compoundList = container.Contains.ToList(); 350 | var held = GetEquippedWeapon(); 351 | if (held != null) 352 | { 353 | compoundList.Add(held); 354 | } 355 | 356 | if (_skill == BaseSkill.Magery) 357 | { 358 | if (_nonSlayerSerial != -1) 359 | { 360 | var nonSlayer = Items.FindBySerial(_nonSlayerSerial); 361 | if (nonSlayer != null) 362 | { 363 | _slayerItems.Add( new SlayerItem 364 | { 365 | Name = _tinfo.ToTitleCase(nonSlayer.Name), 366 | Serial = nonSlayer.Serial, 367 | Slayer = SlayerType.None 368 | }); 369 | } 370 | } 371 | else 372 | { 373 | var nonSlayer = compoundList.FirstOrDefault(i => i.Name.Equals("Scrapper's Compendium", StringComparison.InvariantCultureIgnoreCase)); 374 | if (nonSlayer != null) 375 | { 376 | _slayerItems.Add( new SlayerItem 377 | { 378 | Name = _tinfo.ToTitleCase(nonSlayer.Name), 379 | Serial = nonSlayer.Serial, 380 | Slayer = SlayerType.None 381 | }); 382 | } 383 | } 384 | } 385 | else 386 | { 387 | if (_nonSlayerSerial != -1) 388 | { 389 | var nonSlayer = Items.FindBySerial(_nonSlayerSerial); 390 | if (nonSlayer != null) 391 | { 392 | _slayerItems.Add( new SlayerItem 393 | { 394 | Name = _tinfo.ToTitleCase(nonSlayer.Name), 395 | Serial = nonSlayer.Serial, 396 | Slayer = SlayerType.None 397 | }); 398 | } 399 | } 400 | } 401 | 402 | foreach (var item in compoundList.Where(_searchFilter)) 403 | { 404 | Items.WaitForProps(item,1000); 405 | var prop = item.Properties.FirstOrDefault(p => p.ToString().Contains("slayer")) ?? item.Properties.FirstOrDefault(p => p.Number == 1071451 || p.Number == 1156126); 406 | var slayerString = prop?.ToString().ToLower(); 407 | if (slayerString == "silver") 408 | { 409 | slayerString = "undead slayer"; 410 | } 411 | 412 | 413 | 414 | _slayerItems.Add( new SlayerItem 415 | { 416 | Name = _tinfo.ToTitleCase(prop.ToString()), 417 | Serial = item.Serial, 418 | Slayer = _slayerList.Any(s => _tinfo.ToTitleCase(slayerString).Equals(SplitCamelCase(s.ToString()))) ? _slayerList.First(s => _tinfo.ToTitleCase(slayerString).Equals(SplitCamelCase(s.ToString()))) : SlayerType.UnKnown 419 | }); 420 | 421 | } 422 | } 423 | 424 | private enum BaseSkill 425 | { 426 | Swordsmanship = 0, 427 | MaceFighting = 1, 428 | Fencing = 2, 429 | Archery = 3, 430 | Throwing = 4, 431 | Magery = 5, 432 | } 433 | 434 | public class SlayerItem 435 | { 436 | public int Serial { get; set; } 437 | public string Name { get; set; } 438 | public SlayerType Slayer { get; set; } 439 | } 440 | 441 | public enum SlayerType 442 | { 443 | None = 20744, 444 | RepondSlayer = 2277, 445 | UndeadSlayer = 20486, 446 | ReptileSlayer = 21282, 447 | ArachnidSlayer = 20994, 448 | SpiderSlayer = 20994, 449 | ElementalSlayer = 24014, 450 | AirElementalSlayer = 2299, 451 | FireElementalSlayer = 2302, 452 | WaterElementalSlayer = 2303, 453 | EarthElementalSlayer = 2301, 454 | BloodElementalSlayer = 20993, 455 | DemonSlayer = 2300, 456 | DragonSlayer = 21010, 457 | FeySlayer = 23006, 458 | EodonSlayer = 24011, 459 | UnKnown = 24015 460 | } 461 | 462 | public string SplitCamelCase(string str) 463 | { 464 | return Regex.Replace( 465 | Regex.Replace( 466 | str, 467 | @"(\P{Ll})(\P{Ll}\p{Ll})", 468 | "$1 $2" 469 | ), 470 | @"(\p{Ll})(\P{Ll})", 471 | "$1 $2" 472 | ); 473 | } 474 | } 475 | } -------------------------------------------------------------------------------- /RazorScripts/SummonMaster.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using RazorEnhanced; 7 | using Mobile = RazorEnhanced.Mobile; 8 | 9 | namespace RazorScripts 10 | { 11 | public class SummonMaster 12 | { 13 | private bool _compactMode = false; 14 | private bool _transparancyMode = false; 15 | 16 | private bool _optionShow = false; 17 | private uint Gumpid = 98413566; 18 | private List Summons = new List(); 19 | private List LastLoop = new List(); 20 | private List SerialsLog = new List(); 21 | Dictionary _timers = new Dictionary(); 22 | System.Timers.Timer _timer = new System.Timers.Timer(5000); 23 | private Target _target = new Target(); 24 | private string _version = "1.4.0"; 25 | Journal _journal = new Journal(); 26 | private Journal.JournalEntry _lastJournalEntry = null; 27 | 28 | private List _summonBenefitSpells = new List 29 | { 30 | "In Mani", 31 | "In Vas Mani", 32 | "In Vas Mani Hur", 33 | "Vas An Nox", 34 | "An Nox", 35 | "Olorisstra", 36 | "Rel Sanct" 37 | }; 38 | 39 | public void Run() 40 | { 41 | UpdateGump(); 42 | try 43 | { 44 | _timer.Enabled = true; 45 | _timer.Elapsed += (sender, e) => UpdateGump(); 46 | _timer.AutoReset = true; 47 | _timer.Start(); 48 | 49 | while (true) 50 | { 51 | var newSummons = false; 52 | 53 | var runMobs = Mobiles.ApplyFilter(new Mobiles.Filter 54 | { 55 | RangeMax = 20, 56 | RangeMin = 0, 57 | Notorieties = new List { 1, 2 }, 58 | }).ToList(); 59 | 60 | runMobs.ForEach(m => Mobiles.WaitForProps(m, 1000)); 61 | var runSums = runMobs.Where(m => m.Properties.Any(p => p.Number == (int)PropertyNumber.Summoned)).ToList(); 62 | var mySumms = FilterMySummons(runSums); 63 | Summons = mySumms; 64 | foreach (var summon in Summons) 65 | { 66 | if (SerialsLog.Contains(summon.Serial)) 67 | { 68 | continue; 69 | } 70 | 71 | SerialsLog.Add(summon.Serial); 72 | newSummons = true; 73 | } 74 | var change = false; 75 | if (newSummons) 76 | { 77 | GuardMode(); 78 | } 79 | 80 | var reply = Gumps.GetGumpData(Gumpid); 81 | if (reply.buttonid != -1) 82 | { 83 | switch ((SumReply)reply.buttonid) 84 | { 85 | case SumReply.Guard: 86 | UpdateGump(); 87 | GuardMode(); 88 | reply.buttonid = -1; 89 | break; 90 | case SumReply.Release: 91 | UpdateGump(); 92 | ReleaseAll(); 93 | reply.buttonid = -1; 94 | break; 95 | case SumReply.Follow: 96 | UpdateGump(); 97 | Follow(); 98 | reply.buttonid = -1; 99 | break; 100 | case SumReply.Attack: 101 | var targetSerial = _target.PromptTarget(); 102 | 103 | if(targetSerial != 0) 104 | { 105 | var mob = Mobiles.FindBySerial(targetSerial); 106 | if (mob != null) 107 | { 108 | Attack(mob); 109 | } 110 | } 111 | reply.buttonid = -1; 112 | break; 113 | case SumReply.SetCompact: 114 | _compactMode = true; 115 | break; 116 | case SumReply.SetClassic: 117 | _compactMode = false; 118 | break; 119 | case SumReply.ToggleTransparency: 120 | _transparancyMode = !_transparancyMode; 121 | break; 122 | case SumReply.ToggleOptions: 123 | _optionShow = !_optionShow; 124 | break; 125 | default: 126 | if (Target.HasTarget()) 127 | { 128 | var lines = _journal.GetJournalEntry(_lastJournalEntry).OrderBy(j => j.Timestamp).ToList(); 129 | if (lines.Any()) 130 | { 131 | var lastSpell = lines.LastOrDefault(l => 132 | l.Type.Equals("Spell", StringComparison.InvariantCultureIgnoreCase) && 133 | l.Name.Equals(Player.Name, StringComparison.InvariantCultureIgnoreCase)); 134 | if (lastSpell != null) 135 | { 136 | if (_summonBenefitSpells.Any(word => 137 | lastSpell.Text.Equals(word, 138 | StringComparison.InvariantCultureIgnoreCase))) 139 | { 140 | Target.TargetExecute(reply.buttonid); 141 | UpdateGump(); 142 | reply.buttonid = -1; 143 | _lastJournalEntry = lines.Last(); 144 | break; 145 | } 146 | } 147 | _lastJournalEntry = lines.Last(); 148 | } 149 | } 150 | ReleaseSummon(reply.buttonid); 151 | UpdateGump(); 152 | reply.buttonid = -1; 153 | break; 154 | } 155 | 156 | change = true; 157 | } 158 | 159 | if (Summons.Count != LastLoop.Count) 160 | change = true; 161 | 162 | //compare all Mobiles in Summons with LastLoop, Check Mobile.Warmode and Mobile.Properties for any changes 163 | foreach (var sum in Summons) 164 | { 165 | var last = LastLoop.FirstOrDefault(m => m.Serial == sum.Serial); 166 | if (last == null) 167 | { 168 | change = true; 169 | break; 170 | } 171 | 172 | //check warmode 173 | if (last.WarMode != sum.WarMode) 174 | { 175 | change = true; 176 | break; 177 | } 178 | 179 | //check properties 180 | if (sum.Properties.Count != last.Properties.Count) 181 | { 182 | change = true; 183 | break; 184 | } 185 | 186 | foreach (var prop in sum.Properties) 187 | { 188 | var lastProp = last.Properties.FirstOrDefault(p => p.Number == prop.Number); 189 | if (lastProp == null) 190 | { 191 | //new property 192 | change = true; 193 | break; 194 | } 195 | } 196 | } 197 | 198 | if (change) 199 | { 200 | UpdateGump(); 201 | LastLoop.Clear(); 202 | Summons.ForEach(s => LastLoop.Add(new MockMob 203 | { 204 | Serial = s.Serial, 205 | WarMode = s.WarMode, 206 | Properties = s.Properties.ToList() 207 | })); 208 | } 209 | Misc.Pause(500); 210 | } 211 | } 212 | catch (ThreadAbortException) 213 | { 214 | //silent 215 | } 216 | catch (Exception e) 217 | { 218 | Misc.SendMessage(e.ToString()); 219 | } 220 | finally 221 | { 222 | _timer.Stop(); 223 | _timer.Dispose(); 224 | Gumps.CloseGump(Gumpid); 225 | } 226 | 227 | } 228 | 229 | private List FilterMySummons(List summons) 230 | { 231 | var result = new List(); 232 | foreach (var mob in summons) 233 | { 234 | if(mob.CanRename) 235 | { 236 | result.Add(mob); 237 | } 238 | } 239 | 240 | return result; 241 | } 242 | 243 | private Task GuardMode() 244 | { 245 | foreach (var mob in Summons) 246 | { 247 | Misc.WaitForContext(mob, 500); 248 | Misc.ContextReply(mob, 2); 249 | var timeprop = mob.Properties.FirstOrDefault(p => p.Number == (int)PropertyNumber.TimeRemaining); 250 | if(timeprop != null) 251 | { 252 | var propString = timeprop.Args.Split('\t'); 253 | if(propString.Length >= 2) 254 | { 255 | var parts = propString[1].Split(':'); 256 | if (parts.Length == 2) 257 | { 258 | var time = DateTime.Now.AddMinutes(int.Parse(parts[0])).AddSeconds(int.Parse(parts[1])); 259 | _timers[mob.Serial] = time; 260 | } 261 | } 262 | 263 | } 264 | } 265 | 266 | return Task.CompletedTask; 267 | } 268 | 269 | private Task Follow() 270 | { 271 | foreach (var mob in Summons) 272 | { 273 | Misc.WaitForContext(mob, 500); 274 | Misc.ContextReply(mob, 1); 275 | Target.WaitForTarget(1000); 276 | Target.TargetExecute(Player.Serial); 277 | } 278 | 279 | return Task.CompletedTask; 280 | } 281 | 282 | private Task ReleaseAll() 283 | { 284 | foreach (var mob in Summons) 285 | { 286 | ReleaseSummon(mob.Serial); 287 | } 288 | 289 | return Task.CompletedTask; 290 | } 291 | 292 | private Task Attack(Mobile target) 293 | { 294 | foreach (var mob in Summons) 295 | { 296 | Misc.WaitForContext(mob, 500); 297 | Misc.ContextReply(mob, 0); 298 | Target.WaitForTarget(1000); 299 | Target.TargetExecute(target); 300 | } 301 | 302 | return Task.CompletedTask; 303 | } 304 | 305 | private void ReleaseSummon(int serial) 306 | { 307 | var mob = Mobiles.FindBySerial(serial); 308 | if (mob != null) 309 | { 310 | Misc.WaitForContext(mob, 500); 311 | Misc.ContextReply(mob, 5); 312 | } 313 | } 314 | 315 | private void HandleOptionPanel(Gumps.GumpData gump, int width) 316 | { 317 | var baseX = width+15; 318 | var indentX = baseX+5; 319 | var optionsWidth = 110; 320 | if (_optionShow) 321 | { 322 | Gumps.AddBackground(ref gump,width,0,optionsWidth,140,1755); 323 | if (_transparancyMode) 324 | { 325 | Gumps.AddAlphaRegion(ref gump, width, 0, optionsWidth, 140); 326 | } 327 | 328 | Gumps.AddLabel(ref gump,baseX, 15,0x75, "Mode"); 329 | Gumps.AddButton(ref gump,indentX, 40, 5601, 5601, (int)SumReply.SetCompact, 1, 1); 330 | Gumps.AddLabel(ref gump,indentX+20, 40, _compactMode ? 72 : 0x7b, "Compact"); 331 | Gumps.AddButton(ref gump,indentX, 60, 5601, 5601, (int)SumReply.SetClassic, 1, 1); 332 | Gumps.AddLabel(ref gump,indentX+20, 60,!_compactMode ? 72 : 0x7b, "Classic"); 333 | 334 | Gumps.AddLabel(ref gump,baseX, 85,0x75, "Transparency"); 335 | Gumps.AddButton(ref gump,indentX, 110, 5601, 5601, (int)SumReply.ToggleTransparency, 1, 1); 336 | Gumps.AddLabel(ref gump,indentX+20, 110, _transparancyMode ? 72 : 0x7b, "Ghost"); 337 | 338 | Gumps.AddButton(ref gump, width+optionsWidth-25, 10, 9781, 9781, (int)SumReply.ToggleOptions, 1, 1); 339 | Gumps.AddTooltip(ref gump, "Hide Options"); 340 | } 341 | else 342 | { 343 | Gumps.AddButton(ref gump, width-25, 10, 9780, 9780, (int)SumReply.ToggleOptions, 1, 1); 344 | Gumps.AddTooltip(ref gump, "Show Options"); 345 | } 346 | 347 | } 348 | 349 | private void UpdateGump() 350 | { 351 | var sumGump = Gumps.CreateGump(); 352 | var width = (_compactMode ? (Summons.Count * 58) + 100 : 400)+10; 353 | sumGump.gumpId = Gumpid; 354 | sumGump.serial = (uint)Player.Serial; 355 | Gumps.AddBackground(ref sumGump,0,0, width,140,1755); 356 | if (_transparancyMode) 357 | { 358 | Gumps.AddAlphaRegion(ref sumGump, 0, 0, width, 140); 359 | } 360 | 361 | HandleOptionPanel(sumGump, width); 362 | 363 | foreach (var sum in Summons) 364 | { 365 | var index = Summons.IndexOf(sum) + 1; 366 | 367 | 368 | var healthFraction = (double)sum.Hits / sum.HitsMax; 369 | var healthVal = (int)Math.Floor(healthFraction * 44); 370 | Gumps.AddImageTiled(ref sumGump, index*60-48,30,8,44,9740); 371 | if(sum.Poisoned) 372 | { 373 | Gumps.AddImageTiled(ref sumGump, index*60-48,74-healthVal,8,healthVal,9742); 374 | } 375 | else if(sum.YellowHits) 376 | { 377 | Gumps.AddImageTiled(ref sumGump, index*60-48,74-healthVal,8,healthVal,9743); 378 | } 379 | else 380 | { 381 | Gumps.AddImageTiled(ref sumGump, index*60-48,74-healthVal,8,healthVal,9741); 382 | } 383 | 384 | Gumps.AddButton(ref sumGump,index*60-40,30,GetGumpKey(sum),GetGumpKey(sum),sum.Serial,1,1); 385 | Gumps.AddTooltip(ref sumGump,"Release " + sum.Name); 386 | if (sum.Properties.Any(p => p.Number == (int)PropertyNumber.Guarding)) 387 | { 388 | Gumps.AddLabel(ref sumGump, index*60-40+5,75,0x35,"Guard"); 389 | } 390 | if (sum.WarMode) 391 | { 392 | Gumps.AddLabel(ref sumGump, index*60-40+2,90,0x25,"Combat"); 393 | } 394 | if(_timers.ContainsKey(sum.Serial)) 395 | { 396 | var time = _timers[sum.Serial]; 397 | var diff = time - DateTime.Now; 398 | Gumps.AddLabel(ref sumGump, index*60-40+5,10,0x35,$"{diff.Minutes.ToString("D2")}:{diff.Seconds.ToString("D2")}"); 399 | } 400 | } 401 | 402 | Gumps.AddButton(ref sumGump, width - 90, 10, 9903, 9904, (int)SumReply.Attack, 1, 0); 403 | Gumps.AddButton(ref sumGump, width - 90, 40, 9903, 9904, (int)SumReply.Release, 1, 0); 404 | Gumps.AddButton(ref sumGump, width - 90, 70, 9903, 9904, (int)SumReply.Guard, 1, 0); 405 | Gumps.AddButton(ref sumGump, width - 90, 100, 9903, 9904, (int)SumReply.Follow, 1, 0); 406 | Gumps.AddLabel(ref sumGump, width - 70, 10, 0x30, "Attack"); 407 | Gumps.AddLabel(ref sumGump, width - 70, 40, 0x6D, "Release"); 408 | Gumps.AddLabel(ref sumGump, width - 70, 70, 0x35, "Guard"); 409 | Gumps.AddLabel(ref sumGump, width - 70, 100, 0x55, "Follow"); 410 | 411 | if (!_compactMode || Summons.Count >= 2) 412 | { 413 | Gumps.AddLabel(ref sumGump, 15, 115, 0x7b, "SummonMaster"); 414 | Gumps.AddLabel(ref sumGump, 100, 115, 0x7b, _version); 415 | } 416 | 417 | Gumps.CloseGump(Gumpid); 418 | Gumps.SendGump(sumGump,500,500); 419 | } 420 | 421 | private int GetGumpKey(Mobile mobile) 422 | { 423 | switch ((KnownSummon)mobile.MobileID) 424 | { 425 | case KnownSummon.Fey: 426 | return 23006; 427 | case KnownSummon.AirElemental: 428 | return 2299; 429 | case KnownSummon.Daemon: 430 | return 2300; 431 | case KnownSummon.EarthElemental: 432 | return 2301; 433 | case KnownSummon.FireElemental: 434 | return 2302; 435 | case KnownSummon.WaterElemental: 436 | return 2303; 437 | case KnownSummon.Colossus: 438 | return 24015; 439 | case KnownSummon.AnimateWeapon: 440 | return 24006; 441 | default : 442 | return 2279; 443 | } 444 | } 445 | 446 | private enum PropertyNumber 447 | { 448 | Summoned = 1049646, 449 | Guarding = 1080078, 450 | TimeRemaining = 1060847 451 | } 452 | 453 | private enum KnownSummon 454 | { 455 | BladeSpirits = 0x023E, 456 | EnergyVortex = 0x00A4, 457 | Fey = 0x0080, 458 | AnimateWeapon = 0x02B4, 459 | EarthElemental = 0x000E, 460 | AirElemental = 0x000D, 461 | FireElemental = 0x000F, 462 | WaterElemental = 0x0010, 463 | Daemon = 0x000A, 464 | Colossus = 0x033D 465 | } 466 | 467 | private enum SumReply 468 | { 469 | Attack = 1, 470 | Release = 2, 471 | Guard = 3, 472 | Follow = 4, 473 | SetCompact = 5, 474 | SetClassic = 6, 475 | ToggleTransparency = 7, 476 | ToggleOptions = 8 477 | } 478 | 479 | private class MockMob 480 | { 481 | public int Serial { get; set; } 482 | public List Properties { get; set; } 483 | public bool WarMode { get; set; } 484 | } 485 | } 486 | } -------------------------------------------------------------------------------- /RazorScripts/TargetAllOfType.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Runtime.Remoting.Messaging; 4 | using RazorEnhanced; 5 | 6 | namespace Razorscripts 7 | { 8 | public class TargetAllOfType 9 | { 10 | public void Run() 11 | { 12 | if (!Target.HasTarget()) 13 | { 14 | Misc.SendMessage("You are not currently waiting for targets",201); 15 | return; 16 | } 17 | var itemSerial = Target.GetLast(); 18 | var targetItem = Player.Backpack.Contains.FirstOrDefault(i => i.Serial == itemSerial); 19 | if (targetItem != null) 20 | { 21 | var all = Player.Backpack.Contains.Where(i => i.ItemID == targetItem.ItemID).ToList(); 22 | foreach (var i in all) 23 | { 24 | Target.TargetExecute(i); 25 | Target.WaitForTarget(3000); 26 | } 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /RazorScripts/Targeting.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace RazorScripts 7 | { 8 | public class Targeting 9 | { 10 | private bool _treasureHuntMode = true; 11 | 12 | private Journal _journal = new Journal(); 13 | private Journal.JournalEntry _lastEntry = null; 14 | public void Run() 15 | { 16 | Mobile _player = Mobiles.FindBySerial(Player.Serial); 17 | if (!Target.HasTarget()) 18 | { 19 | return; 20 | } 21 | 22 | if (_treasureHuntMode) 23 | { 24 | 25 | var lastObjSerial = Target.LastUsedObject(); 26 | var lastObject = Items.FindBySerial(lastObjSerial); 27 | if (lastObject != null && 28 | lastObject.Name.ToLower().Contains("lockpick")) 29 | { 30 | var chest = Items.FindByName("Treasure Chest", -1, -1, 3); 31 | if (chest != null) 32 | { 33 | Target.TargetExecute(chest); 34 | } 35 | } 36 | 37 | var newEntries = _journal.GetJournalEntry(_lastEntry).OrderBy(j => j.Timestamp).ToList(); 38 | if (newEntries.Any()) 39 | { 40 | var systemEntries = newEntries.Where(j => 41 | j.Type.Equals("System", StringComparison.InvariantCultureIgnoreCase)).ToList(); 42 | DateTime dateTimeBase = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 43 | var recent = systemEntries.Where(se => (DateTime.Now - dateTimeBase.AddSeconds(se.Timestamp)).TotalSeconds < 5).ToList(); 44 | 45 | if (recent.Any(j => j.Text.Equals("Which trap will you attempt to disarm?",StringComparison.InvariantCultureIgnoreCase))) 46 | { 47 | var chest = Items.FindByName("Treasure Chest", -1, -1, 3); 48 | if (chest != null) 49 | { 50 | Target.TargetExecute(chest); 51 | } 52 | } 53 | } 54 | 55 | } 56 | 57 | if (Target.GetLast() != 0) 58 | { 59 | var filter = new Mobiles.Filter 60 | { 61 | IsGhost = 0, 62 | RangeMax = 10, 63 | RangeMin = 0, 64 | Friend = 0, 65 | Notorieties = new List 66 | { 67 | 3, 4, 5, 6 68 | }, 69 | CheckLineOfSight = true 70 | }; 71 | 72 | var tSerial = Target.GetLast(); 73 | 74 | var mobs = Mobiles.ApplyFilter(filter); 75 | var tar = mobs.FirstOrDefault(t => t.Serial == tSerial); 76 | 77 | if (tar != null) 78 | { 79 | Target.Last(); 80 | return; 81 | } 82 | 83 | if(mobs.Any()) 84 | { 85 | var sorted = mobs.OrderBy(m => m.DistanceTo(_player)).ToList(); 86 | Target.TargetExecute(sorted.First()); 87 | Target.SetLast(mobs.First()); 88 | return; 89 | } 90 | 91 | 92 | if (tSerial != -1 && tSerial != 0 && tSerial != Player.Serial) 93 | { 94 | Target.Last(); 95 | } 96 | 97 | Target.Cancel(); 98 | } 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /RazorScripts/TeleTalk.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using RazorEnhanced; 5 | 6 | namespace RazorScripts 7 | { 8 | public class TeleTalk 9 | { 10 | private List Triggers = new List 11 | { 12 | new TriggerTalk 13 | { 14 | Trigger = "beam me up", 15 | Script = "recall.py" 16 | }, 17 | new TriggerTalk 18 | { 19 | Trigger = "take me home", 20 | Script = "gatehome.py" 21 | }, 22 | }; 23 | 24 | public void Run() 25 | { 26 | Journal jo = new Journal(); 27 | Journal.JournalEntry lastEntry = null; 28 | 29 | try 30 | { 31 | while (true) 32 | { 33 | var entries = jo.GetJournalEntry(lastEntry).OrderBy(j => j.Timestamp).ToList(); 34 | //Find first match between triggers and journal entries and run the script 35 | foreach (var trigger in Triggers) 36 | { 37 | var entry = entries.FirstOrDefault(e => e.Text.Equals(trigger.Trigger, StringComparison.OrdinalIgnoreCase) && e.Name == Player.Name); 38 | if (entry != null) 39 | { 40 | Misc.ScriptRun(trigger.Script); 41 | Misc.Pause(3000); 42 | } 43 | } 44 | 45 | lastEntry = entries.Last(); 46 | Misc.Pause(500); 47 | } 48 | } 49 | catch (Exception e) 50 | { 51 | Misc.SendMessage("Something went wrong, and the script has stopped"); 52 | Misc.SendMessage(e.ToString()); 53 | } 54 | } 55 | } 56 | 57 | public class TriggerTalk 58 | { 59 | public string Trigger { get; set; } 60 | public string Script { get; set; } 61 | } 62 | } -------------------------------------------------------------------------------- /RazorScripts/TheRanger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Windows.Forms.VisualStyles; 6 | using RazorEnhanced; 7 | 8 | namespace Razorscripts 9 | { 10 | public class TheRanger 11 | { 12 | private uint _gumpId = 788435742; 13 | private Item Quiver = null; 14 | private int Checksum = 0; 15 | private int _lastMap = 0; 16 | private Item _lastHeldWeapon = null; 17 | private bool _runAutoReload = false; 18 | private string lastPowerChecksum = string.Empty; 19 | private string _lastLoadedSpecial = string.Empty; 20 | 21 | private List LoadedPowers = new List(); 22 | 23 | private Power _selectedPower; 24 | 25 | public void Run() 26 | { 27 | try 28 | { 29 | var success = RefreshQuiver(); 30 | if (!success) 31 | { 32 | Player.HeadMessage(0x23, "You do not have a quiver equipped"); 33 | return; 34 | } 35 | 36 | SetPowers(); 37 | _selectedPower = LoadedPowers.FirstOrDefault(); 38 | 39 | UpdateGump(); 40 | while (Player.Connected) 41 | { 42 | var powerStringChecksum = SetPowers(); 43 | if (powerStringChecksum != lastPowerChecksum) 44 | { 45 | lastPowerChecksum = powerStringChecksum; 46 | UpdateGump(); 47 | } 48 | 49 | if (_lastLoadedSpecial != _selectedPower?.Name && _lastLoadedSpecial != "None") 50 | { 51 | _selectedPower = LoadedPowers.FirstOrDefault(p => p.Name == _lastLoadedSpecial) ?? 52 | _selectedPower; 53 | } 54 | 55 | var arrows = Quiver.Contains.Where(i => i.ItemID == 3903).Sum(i => i.Amount); 56 | var bolts = Quiver.Contains.Where(i => i.ItemID == 7163).Sum(i => i.Amount); 57 | var ammoChecksum = arrows+bolts*1000; 58 | if (ammoChecksum != Checksum) 59 | { 60 | Checksum = ammoChecksum; 61 | UpdateGump(); 62 | } 63 | 64 | if (Player.Map != _lastMap) 65 | { 66 | _lastMap = Player.Map; 67 | RefreshQuiver(); 68 | } 69 | 70 | var held = Player.GetItemOnLayer("LeftHand"); 71 | if (held != null && held != _lastHeldWeapon ) 72 | { 73 | if (WeaponUsesBolts(held) != WeaponUsesBolts(_lastHeldWeapon)) 74 | { 75 | Reload(); 76 | } 77 | _lastHeldWeapon = held; 78 | } 79 | 80 | var sharedValue = Misc.ReadSharedValue("Reloader:Ammo") as int?; 81 | if (sharedValue != null && sharedValue.Value != 0) 82 | { 83 | var ammoTypeInQuiver = Quiver.Contains.FirstOrDefault(); 84 | if (sharedValue != ammoTypeInQuiver?.ItemID) 85 | { 86 | Reload(); 87 | } 88 | Misc.SetSharedValue("Reloader:Ammo", 0); 89 | } 90 | 91 | HandleReply(); 92 | 93 | PrimePower(); 94 | 95 | if (_runAutoReload) 96 | { 97 | if(Quiver.Contains.Sum(i => i.Amount) < 50) 98 | { 99 | Reload(); 100 | } 101 | } 102 | 103 | Misc.Pause(1000); 104 | } 105 | } 106 | catch (ThreadAbortException) 107 | { 108 | //Silent 109 | } 110 | catch (Exception e) 111 | { 112 | Misc.SendMessage(e); 113 | throw; 114 | } 115 | finally 116 | { 117 | Gumps.CloseGump(_gumpId); 118 | } 119 | } 120 | 121 | private string SetPowers() 122 | { 123 | LoadedPowers.Clear(); 124 | LoadedPowers.Add(new Power { Name = "None", Type = PowerType.None, GumpId = 21013 }); 125 | if (Player.PrimarySpecial == 20992) 126 | { 127 | LoadedPowers.Add(new Power { Name = "Armor Ingore", Type = PowerType.WeaponPrimary, GumpId = 20992 }); 128 | } 129 | else if (Player.SecondarySpecial == 20992) 130 | { 131 | LoadedPowers.Add(new Power { Name = "Armor Ingore", Type = PowerType.WeaponSecondary, GumpId = 20992 }); 132 | } 133 | if (Player.PrimarySpecial == 21016) 134 | { 135 | LoadedPowers.Add(new Power { Name = "Force Arrow", Type = PowerType.WeaponPrimary, GumpId = 21016 }); 136 | } 137 | else if (Player.SecondarySpecial == 21016) 138 | { 139 | LoadedPowers.Add(new Power { Name = "Force Arrow", Type = PowerType.WeaponSecondary, GumpId = 21016 }); 140 | } 141 | if (Player.PrimarySpecial == 20994) 142 | { 143 | LoadedPowers.Add(new Power { Name = "Crushing Blow", Type = PowerType.WeaponPrimary, GumpId = 20994 }); 144 | } 145 | else if (Player.SecondarySpecial == 20994) 146 | { 147 | LoadedPowers.Add(new Power { Name = "Crushing Blow", Type = PowerType.WeaponSecondary, GumpId = 20994 }); 148 | } 149 | if (Player.PrimarySpecial == 20998) 150 | { 151 | LoadedPowers.Add(new Power { Name = "Double Strike", Type = PowerType.WeaponPrimary, GumpId = 20998 }); 152 | } 153 | else if (Player.SecondarySpecial == 20998) 154 | { 155 | LoadedPowers.Add(new Power { Name = "Double Strike", Type = PowerType.WeaponSecondary, GumpId = 20998 }); 156 | } 157 | if(Player.GetSkillValue("Bushido") > 70) 158 | { 159 | LoadedPowers.Add(new Power { Name = "Lightening Strike", Type = PowerType.Bushido, GumpId = 21540 }); 160 | LoadedPowers.Add(new Power { Name = "Momentum Strike", Type = PowerType.Bushido, GumpId = 21541 }); 161 | } 162 | 163 | return string.Join(":", LoadedPowers.Select(p => p.Name)); 164 | } 165 | 166 | private void HandleReply() 167 | { 168 | var reply = Gumps.GetGumpData(_gumpId); 169 | if (reply.buttonid > 0 && reply.buttonid < 100) 170 | { 171 | _selectedPower = LoadedPowers[reply.buttonid - 1]; 172 | _lastLoadedSpecial = _selectedPower.Name; 173 | UpdateGump(); 174 | } 175 | else if (reply.buttonid == 100) 176 | { 177 | Reload(); 178 | UpdateGump(); 179 | } 180 | else if(reply.buttonid == 200) 181 | { 182 | _runAutoReload = !_runAutoReload; 183 | UpdateGump(); 184 | } 185 | 186 | reply.buttonid = -1; 187 | } 188 | 189 | private void Reload() 190 | { 191 | RefreshQuiver(); 192 | var wep = Player.GetItemOnLayer("LeftHand"); 193 | if (wep != null) 194 | { 195 | Items.WaitForProps(wep,1000); 196 | var archerWep = wep.Properties.Any(p => p.ToString().Contains("archery")); 197 | if (archerWep) 198 | { 199 | var availableSpace = 500 - Quiver.Contains.Sum(i => i.Amount); 200 | var ammoId = WeaponUsesBolts(wep) ? 7163 : 3903; 201 | var ammoInQuiver = Quiver.Contains.FirstOrDefault(); 202 | if (ammoInQuiver != null && ammoInQuiver.ItemID != ammoId) 203 | { 204 | Items.Move(ammoInQuiver, Player.Backpack, ammoInQuiver.Amount); 205 | availableSpace = 500; 206 | Misc.Pause(350); 207 | } 208 | var ammo = Player.Backpack.Contains.FirstOrDefault(i => i.ItemID == ammoId && i.Amount > 0); 209 | if (ammo != null) 210 | { 211 | Items.WaitForProps(ammo,1000); 212 | var reloadAmount = ammo.Amount; 213 | if (reloadAmount > availableSpace) 214 | { 215 | reloadAmount = availableSpace; 216 | } 217 | 218 | if (reloadAmount == 0) 219 | { 220 | 221 | Player.HeadMessage(0x58,$"You are already full on {(ammoId == 7163 ? "Bolts" : "Arrows")}"); 222 | return; 223 | } 224 | 225 | Player.HeadMessage(0x58,$"Reloading {reloadAmount} {(ammoId == 7163 ? "Bolts" : "Arrows")}"); 226 | Items.Move(ammo, Quiver, reloadAmount); 227 | } 228 | else 229 | { 230 | Player.HeadMessage(0x23,"No Ammo in Backpack"); 231 | } 232 | } 233 | else 234 | { 235 | Player.HeadMessage(0x23,"No Archery Weapon Equipped"); 236 | } 237 | } 238 | else 239 | { 240 | Player.HeadMessage(0x23,"No Weapon Equipped"); 241 | } 242 | } 243 | 244 | private bool RefreshQuiver() 245 | { 246 | var quiver= Player.Quiver; 247 | if (quiver == null) 248 | { 249 | var backup = Player.GetItemOnLayer("Cloak"); 250 | if (backup != null && backup.Name.ToLower().Contains("quiver")) 251 | { 252 | quiver = backup; 253 | } 254 | else 255 | { 256 | return false; 257 | } 258 | 259 | Items.WaitForProps(quiver,1000); 260 | Items.WaitForContents(Quiver, 500); 261 | } 262 | 263 | Quiver = quiver; 264 | 265 | return true; 266 | } 267 | 268 | private bool WeaponUsesBolts(Item item) 269 | { 270 | if(item == null) 271 | { 272 | return false; 273 | } 274 | 275 | var crossbows = new List { 9923, 3920, 5117 }; 276 | return crossbows.Contains(item.ItemID); 277 | } 278 | 279 | private void PrimePower() 280 | { 281 | if (_selectedPower == null) 282 | { 283 | return; 284 | } 285 | var held = Player.GetItemOnLayer("LeftHand"); 286 | if (held == null) 287 | { 288 | return; 289 | } 290 | switch (_selectedPower.Type) 291 | { 292 | case PowerType.Bushido: 293 | if (!Player.BuffsExist(_selectedPower.Name)) 294 | { 295 | Spells.CastBushido(_selectedPower.Name); 296 | } 297 | break; 298 | case PowerType.WeaponPrimary: 299 | if (!Player.HasPrimarySpecial) 300 | { 301 | if (Player.PrimarySpecial == _selectedPower.GumpId) 302 | { 303 | Player.WeaponPrimarySA(); 304 | } 305 | } 306 | break; 307 | case PowerType.WeaponSecondary: 308 | if (!Player.HasSecondarySpecial) 309 | { 310 | if (Player.SecondarySpecial == _selectedPower.GumpId) 311 | { 312 | Player.WeaponSecondarySA(); 313 | } 314 | } 315 | break; 316 | case PowerType.None: 317 | default: 318 | break; 319 | } 320 | } 321 | 322 | private void UpdateGump() 323 | { 324 | var gump = Gumps.CreateGump(); 325 | gump.buttonid = -1; 326 | // bar.gumpId = ; 327 | gump.serial = (uint)Player.Serial; 328 | gump.gumpId = _gumpId; 329 | gump.x = 500; 330 | gump.y = 500; 331 | var width = (LoadedPowers.Count * 60 - 5); 332 | if(width < 250) 333 | { 334 | width = 250; 335 | } 336 | UpdateRangerGumpDetails(gump, width); 337 | UpdateReloaderGumpDetails(gump, width); 338 | 339 | Gumps.CloseGump(_gumpId); 340 | Gumps.SendGump(gump, 500,500); 341 | } 342 | 343 | private void UpdateRangerGumpDetails(Gumps.GumpData gump, int width) 344 | { 345 | 346 | Gumps.AddBackground(ref gump, 0, 0, width, 55, 1755); 347 | var powerIndex = 0; 348 | foreach (var power in LoadedPowers) 349 | { 350 | var x = powerIndex * 60 + 5; 351 | var y = 5; 352 | Gumps.AddButton(ref gump, x,y,(int)power.GumpId,(int)power.GumpId,LoadedPowers.IndexOf(power)+1,1,0); 353 | Gumps.AddTooltip(ref gump, power.Name); 354 | powerIndex++; 355 | } 356 | 357 | if (_selectedPower != null) 358 | { 359 | var selected = LoadedPowers.FirstOrDefault(i => i.Name == _selectedPower.Name); 360 | var index = LoadedPowers.IndexOf(selected); 361 | if (index < 0) 362 | { 363 | index = 0; 364 | } 365 | Gumps.AddImage(ref gump, (60 * index-17),0,30071); 366 | } 367 | } 368 | 369 | private void UpdateReloaderGumpDetails(Gumps.GumpData gump, int width) 370 | { 371 | var baseY = 55; 372 | var ammoArrows = Quiver.Contains.Where(i => i.ItemID == 3903).Sum(i => i.Amount); 373 | var ammoBolts = Quiver.Contains.Where(i => i.ItemID == 7163).Sum(i => i.Amount); 374 | var ammoTextArrows = $"Arrows: {ammoArrows} / 500"; 375 | var ammoTextBolts = $"Bolts: {ammoBolts} / 500"; 376 | var defaultText = "No Ammo"; 377 | var height = 50; 378 | gump.gumpId = _gumpId; 379 | gump.serial = (uint)Player.Serial; 380 | Gumps.AddBackground(ref gump,0,baseY,width,height,1755); 381 | 382 | if (ammoArrows > 0) 383 | { 384 | Gumps.AddLabel(ref gump, 15, baseY+15, 0x7b, ammoTextArrows); 385 | } 386 | 387 | if (ammoBolts > 0) 388 | { 389 | Gumps.AddLabel(ref gump, 15, baseY+15, 0x7b, ammoTextBolts); 390 | } 391 | 392 | if (ammoBolts == 0 && ammoArrows == 0) 393 | { 394 | Gumps.AddLabel(ref gump, 15, baseY+15, 0x7b, defaultText); 395 | } 396 | 397 | var buttonId = _runAutoReload ? 9027 : 9026; 398 | 399 | Gumps.AddButton(ref gump, width-105, baseY+15 , buttonId,buttonId,200,1,1); 400 | 401 | Gumps.AddButton(ref gump, width-80,baseY+15,40018,40018,100,1,1); 402 | Gumps.AddLabel(ref gump, width-65,baseY+15,0x481, "Reload"); 403 | } 404 | 405 | 406 | private class Power 407 | { 408 | public string Name { get; set; } 409 | public PowerType Type { get; set; } 410 | public int GumpId { get; set; } 411 | } 412 | 413 | private enum PowerType 414 | { 415 | WeaponPrimary, 416 | WeaponSecondary, 417 | Bushido, 418 | None 419 | } 420 | } 421 | } -------------------------------------------------------------------------------- /RazorScripts/WeaponMaster.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using RazorEnhanced; 7 | 8 | namespace RazorScripts 9 | { 10 | public class WeaponMaster 11 | { 12 | private Item _weaponContainer { get; set; } 13 | private readonly List _slayerWeapons = new List(); 14 | private readonly List _areaWeapons = new List(); 15 | private readonly List _extras = new List(); 16 | private BaseSkill _skill; 17 | private static string _version = "1.0.1"; 18 | 19 | private Func _slayerSearchFilter; 20 | private Func _areaSearchFilter; 21 | private readonly List _slayerList = new List 22 | { 23 | WeaponIcon.None, 24 | WeaponIcon.RepondSlayer, 25 | WeaponIcon.UndeadSlayer, 26 | WeaponIcon.ReptileSlayer, 27 | WeaponIcon.DragonSlayer, 28 | WeaponIcon.ArachnidSlayer, 29 | WeaponIcon.ElementalSlayer, 30 | WeaponIcon.AirElementalSlayer, 31 | WeaponIcon.FireElementalSlayer, 32 | WeaponIcon.WaterElementalSlayer, 33 | WeaponIcon.EarthElementalSlayer, 34 | WeaponIcon.BloodElementalSlayer, 35 | WeaponIcon.DemonSlayer, 36 | WeaponIcon.FeySlayer, 37 | }; 38 | 39 | private TextInfo _tinfo; 40 | 41 | public void Run() 42 | { 43 | _tinfo = CultureInfo.CurrentCulture.TextInfo; 44 | _skill = TryFindSkill(); 45 | 46 | if (_skill == BaseSkill.Magery) 47 | { 48 | _slayerSearchFilter = i => IsSpellBook(i) 49 | && (i.Properties.Any(p => p.ToString().ToLower().Contains("slayer")) 50 | || i.Properties.Any(p => p.ToString().ToLower().Contains("silver"))); 51 | } 52 | else 53 | { 54 | _slayerSearchFilter = i => (i.Properties.Any(p => p.ToString().ToLower().Contains("slayer")) 55 | || i.Properties.Any(p => p.ToString().ToLower().Contains("silver"))) 56 | && i.Properties.Any(p => p.ToString().ToLower().Contains(_tinfo.ToTitleCase(_skill.ToString()).ToLower())); 57 | } 58 | 59 | 60 | if (TryFindWeaponBag(Player.Backpack)) 61 | { 62 | SetWeapons(_weaponContainer); 63 | } 64 | else 65 | { 66 | Misc.SendMessage("Unable to find Slayer weapon container, please open the container and try again"); 67 | return; 68 | } 69 | 70 | UpdateBar(); 71 | 72 | while (true) 73 | { 74 | var bar = Gumps.GetGumpData(788435749); 75 | if (bar.buttonid != -1 && bar.buttonid != 0) 76 | { 77 | UpdateBar(); 78 | 79 | EquipSlayer(_slayerWeapons.FirstOrDefault(i => i.Slayer == (WeaponIcon)bar.buttonid)); 80 | 81 | UpdateBar(); 82 | } 83 | 84 | 85 | 86 | Misc.Pause(100); 87 | } 88 | } 89 | 90 | private void EquipSlayer(Weapon book) 91 | { 92 | var held = GetEquippedWeapon(); 93 | var resolved = _slayerWeapons.FirstOrDefault(b => b.Serial == held?.Serial); 94 | if (_weaponContainer == null) 95 | { 96 | Misc.SendMessage("Unable to find book binder"); 97 | } 98 | 99 | if (held != null && resolved != null) 100 | { 101 | if (resolved.Serial == book.Serial) 102 | { 103 | return; 104 | } 105 | 106 | var gameEquipped = Items.FindBySerial(resolved.Serial); 107 | var index = _slayerList.IndexOf(resolved.Slayer); 108 | var offset = index > 5 ? 6 : 0; 109 | Items.Move(gameEquipped, _weaponContainer, 1,(index-offset)*20+45, offset == 0 ? 95 : 125); 110 | Misc.Pause(600); 111 | } 112 | else 113 | { 114 | if (held != null) 115 | { 116 | Items.Move(held, Player.Backpack.Serial,held.Amount); 117 | Misc.Pause(600); 118 | } 119 | } 120 | 121 | var gameTarget = Items.FindBySerial(book.Serial); 122 | Player.EquipItem(gameTarget); 123 | Misc.Pause(200); 124 | } 125 | 126 | private int GetActiveBookIndex() 127 | { 128 | var held = GetEquippedWeapon(); 129 | var booksSorted = _slayerWeapons.OrderBy(b => _slayerList.IndexOf(b.Slayer)).ToList(); 130 | var resolved = _slayerWeapons.FirstOrDefault(b => b.Serial == held?.Serial); 131 | if (resolved != null) 132 | { 133 | return booksSorted.IndexOf(resolved); 134 | } 135 | 136 | return -1; 137 | } 138 | 139 | private void UpdateBar() 140 | { 141 | var activeBookIndex = GetActiveBookIndex(); 142 | var bar = Gumps.CreateGump(); 143 | bar.buttonid = -1; 144 | bar.gumpId = 788435749; 145 | bar.serial = (uint)Player.Serial; 146 | bar.x = 500; 147 | bar.y = 500; 148 | Gumps.AddBackground(ref bar, 0, 0, (_slayerWeapons.Count*60-5), 55, 1755); 149 | var slayersSorted = _slayerWeapons.OrderBy(b => _slayerList.IndexOf(b.Slayer)).ToList(); 150 | foreach (var slayerItem in slayersSorted) 151 | { 152 | var index = slayersSorted.IndexOf(slayerItem); 153 | var x = index * 60 + 5; 154 | var y = 5; 155 | Gumps.AddButton(ref bar, x,y,(int)slayerItem.Slayer,(int)slayerItem.Slayer,(int)slayerItem.Slayer,1,0); 156 | Gumps.AddTooltip(ref bar, slayerItem.Name); 157 | } 158 | 159 | if (activeBookIndex != -1) 160 | { 161 | Gumps.AddImage(ref bar, (60 * activeBookIndex-17),0,30071); 162 | } 163 | 164 | Gumps.CloseGump(788435749); 165 | Gumps.SendGump(bar, 500,500); 166 | } 167 | 168 | private BaseSkill TryFindSkill() 169 | { 170 | var dict = new Dictionary(); 171 | foreach (var baseSkill in Enum.GetValues(typeof(BaseSkill)).Cast()) 172 | { 173 | var skillString = _tinfo.ToTitleCase(baseSkill.ToString()); 174 | var value = Player.GetSkillValue(skillString); 175 | dict.Add(baseSkill, value); 176 | } 177 | 178 | //Return key of highest value 179 | return dict.Aggregate((l, r) => l.Value > r.Value ? l : r).Key; 180 | } 181 | 182 | private Item GetEquippedWeapon() 183 | { 184 | var item = Player.GetItemOnLayer("RightHand"); 185 | if (item != null) 186 | { 187 | return item; 188 | } 189 | item = Player.GetItemOnLayer("LeftHand"); 190 | if (item != null) 191 | { 192 | if (item.Properties.Any(p => p.ToString().ToLower().Contains("two-handed"))) 193 | { 194 | return item; 195 | } 196 | } 197 | 198 | return null; 199 | } 200 | 201 | private bool TryFindWeaponBag(Item container) 202 | { 203 | if (_weaponContainer != null) 204 | { 205 | return true; 206 | } 207 | 208 | var slayersFound = 0; 209 | var held = GetEquippedWeapon(); 210 | if (held != null) 211 | { 212 | slayersFound++; 213 | } 214 | 215 | 216 | 217 | List potentials = new List(); 218 | foreach (var item in container.Contains) 219 | { 220 | Items.WaitForProps(item, 1000); 221 | 222 | if (_slayerSearchFilter(item)) 223 | { 224 | potentials.Add(item); 225 | } 226 | 227 | } 228 | 229 | slayersFound += potentials.Count; 230 | 231 | if (slayersFound > 1) 232 | { 233 | _weaponContainer = container; 234 | return true; 235 | } 236 | 237 | foreach (var subContainer in container.Contains.Where(c => c.IsContainer && !c.IsBagOfSending)) 238 | { 239 | var found = TryFindWeaponBag(subContainer); 240 | if (found) 241 | { 242 | return true; 243 | } 244 | } 245 | 246 | return false; 247 | } 248 | 249 | private bool IsSpellBook(Item item) 250 | { 251 | return item.Name.ToLower().Contains("spellbook") || item.Name.Equals("Scrapper's Compendium", StringComparison.InvariantCultureIgnoreCase); 252 | } 253 | 254 | private void SetWeapons(Item container) 255 | { 256 | _slayerWeapons.Clear(); 257 | var compoundList = container.Contains.ToList(); 258 | var held = GetEquippedWeapon(); 259 | if (held != null) 260 | { 261 | compoundList.Add(held); 262 | } 263 | 264 | foreach (var extra in _extras) 265 | { 266 | var exAdd = Items.FindBySerial(extra.Serial); 267 | if (exAdd != null) 268 | { 269 | _slayerWeapons.Add( new Weapon 270 | { 271 | Name = _tinfo.ToTitleCase(exAdd.Name), 272 | Serial = exAdd.Serial, 273 | Slayer = WeaponIcon.None 274 | }); 275 | } 276 | } 277 | 278 | foreach (var item in compoundList.Where(_slayerSearchFilter)) 279 | { 280 | var prop = item.Properties.FirstOrDefault(p => p.ToString().Contains("slayer")) ?? item.Properties.FirstOrDefault(p => p.Number == 1071451); 281 | var slayerString = prop.ToString().ToLower(); 282 | if (slayerString == "silver") 283 | { 284 | slayerString = "undead slayer"; 285 | } 286 | 287 | 288 | 289 | _slayerWeapons.Add( new Weapon 290 | { 291 | Name = _tinfo.ToTitleCase(prop.ToString()), 292 | Serial = item.Serial, 293 | Slayer = _slayerList.Any(s => _tinfo.ToTitleCase(slayerString).Equals(SplitCamelCase(s.ToString()))) ? _slayerList.First(s => _tinfo.ToTitleCase(slayerString).Equals(SplitCamelCase(s.ToString()))) : WeaponIcon.UnKnown 294 | }); 295 | 296 | } 297 | } 298 | 299 | private enum BaseSkill 300 | { 301 | Swordsmanship = 0, 302 | MaceFighting = 1, 303 | Fencing = 2, 304 | Archery = 3, 305 | Throwing = 4, 306 | Magery = 5, 307 | } 308 | 309 | public class Weapon 310 | { 311 | public int Serial { get; set; } 312 | public string Name { get; set; } 313 | public WeaponIcon Slayer { get; set; } 314 | } 315 | 316 | 317 | public enum WeaponIcon 318 | { 319 | None = 20744, 320 | RepondSlayer = 2277, 321 | UndeadSlayer = 20486, 322 | ReptileSlayer = 21282, 323 | ArachnidSlayer = 20994, 324 | ElementalSlayer = 24014, 325 | AirElementalSlayer = 2299, 326 | FireElementalSlayer = 2302, 327 | WaterElementalSlayer = 2303, 328 | EarthElementalSlayer = 2301, 329 | BloodElementalSlayer = 20993, 330 | DemonSlayer = 2300, 331 | DragonSlayer = 21010, 332 | FeySlayer = 23006, 333 | UnKnown = 24015, 334 | 335 | //Hit Area 336 | HitAreaFire = 2267, 337 | HitAreaLightning = 2288, 338 | HitAreaEnergy = 2289, 339 | HitAreaCold = 23010, 340 | HitAreaPoison = 2285, 341 | 342 | //Selectable 343 | SwordFlame = 21015, 344 | SwordSerpent = 21019, 345 | SwordQuick = 21004, 346 | SwordHeart = 21000, 347 | SwordSpin = 21006, 348 | SwordDouble = 20998, 349 | SwordDrop = 20996, 350 | SwordPierce = 20992, 351 | Sword5Point = 20741, 352 | SwordMagic = 20483, 353 | PoisonStrike = 20489, 354 | LighteningArrow = 21017, 355 | BowQuick = 21001, 356 | Crossbow = 21013, 357 | 358 | Shuriken = 21021, 359 | JumpKill = 21293, 360 | 361 | BrokenSword = 2305, 362 | BrokenShield = 2304, 363 | BloodSkull = 2237, 364 | 365 | Swirl = 2297, 366 | FlameStrike = 2290, 367 | BladeSpirit = 2272, 368 | FireBall = 2257, 369 | Poison = 2259, 370 | Needles = 2251, 371 | MagicArrow = 2244, 372 | Heal = 2243, 373 | GreaterHeal = 2268, 374 | 375 | 376 | 377 | } 378 | 379 | public string SplitCamelCase(string str) 380 | { 381 | return Regex.Replace( 382 | Regex.Replace( 383 | str, 384 | @"(\P{Ll})(\P{Ll}\p{Ll})", 385 | "$1 $2" 386 | ), 387 | @"(\p{Ll})(\P{Ll})", 388 | "$1 $2" 389 | ); 390 | } 391 | } 392 | } -------------------------------------------------------------------------------- /RazorScripts/WeedPuller.cs: -------------------------------------------------------------------------------- 1 | using RazorEnhanced; 2 | 3 | namespace RazorScripts 4 | { 5 | public class WeedPuller 6 | { 7 | public void Run() 8 | { 9 | while (true) 10 | { 11 | var weeds = Items.ApplyFilter(new Items.Filter 12 | { 13 | RangeMin = 0, 14 | RangeMax = 1, 15 | Name = "Creepy weeds" 16 | }); 17 | foreach (var weed in weeds) 18 | { 19 | Items.UseItem(weed); 20 | Misc.Pause(100); 21 | } 22 | 23 | Misc.Pause(100); 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /RazorScripts/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --------------------------------------------------------------------------------