Script:PetControl.cs
Z AmonWiki
Jazyk: CSharp
Shard: Dark Paradise
Automaticky přejmenovává summony a zvířátka
Tento script je součástí základního balíku pro DP.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Phoenix.WorldData; using Phoenix; using Phoenix.Communication; using System.Runtime.CompilerServices; using System.Threading; using System.Diagnostics; namespace Scripts.DarkParadise { [RuntimeObject] public class PetControl { public const int PrefixLen = 0; public const bool IncludeAll = false; public static readonly string Names = "Andres,Blanca,Carlos,Dolores,Enrique,Felicia,Guillermo,Hilda,Ignacio,Jimena,Kevin,Linda,Marty,Nora,Olaf," + "Damrey,Haikui,Kirogi,Tembin,Bolaven,Sanba,Jelawat,Ewiniar,Malaksi,Gaemi,Prapiroon,Maria,SonTinh,Bopha,Wukong,Sonamu,Shanshan," + "Yagi,Leepi,Bebinca,Rumbia,Soulik,Cimaron,Jebi,Mangkhut,Utor,Trami,Yutu,Toraji,Usagi,Pabuk,Wutip,Sepat,Fitow,Danas,Nari," + "Wipha,Francisco,Lekima,Krosa,Haiyan,Podul,Lingling,Kaziki,Faxai,Peipah,Tapah,Mitag,Hagibis,Neoguri,Rammasun,Matmo,Halong,Nakri,Fengshen," + "Kalmaegi,Kanmuri,Phanfone,Vongfong,Nuri,Sinlaku,Hagupit,Jangmi,Mekkhala,Higos,Bavi,Maysak,Haishen,Noul,Dolphin,Kujira,Chanhom," + "Linfa,Nangka,Soudelor,Molave,Goni,Morakot,Etau,Vamco,Krovanh,Dujuan,Mujigae,Choiwan,Koppu,Ketsana,Parma,Melor,Nepartak,Lupit,Mirinae," + "Nida,Omais,Conson,Chanthu,Dianmu,Mindulle,Lionrock,Kompasu,Namtheun,Malou,Meranti,Fanapi,Malakas,Megi,Chaba,Aere,Songda,Sarika,Haima," + "Meari,Tokage,Muifa,Merbok,Nanmadol,Talas,Noru,Kulap,Roke,Sonca,Nesat,Haitang,Nalgae,Banyan,Washi,Pakhar,Sanvu,Mawar,Guchol," + "Patricia,Rick,Sandra,Terry,Vivian,Waldo,Xina,York,Zelda,Agatha,Blas,Celia,Darby,Estelle,Frank,Georgette,Howard,Isis,Javier,Kay,Lester," + "Madeline,Newton,Orlene,Paine,Roslyn,Seymour,Tina,Virgil,Winifred,Xavier,Yolanda,Zeke,Adrian,Beatriz,Calvin,Dora,Eugene,Fernanda,Greg," + "Hilary,Irwin,Jova,Kenneth,Lidia,Max,Norma,Otis,Pilar,Ramon,Selma,Todd,Veronica,Wiley,Xina,York,Zelda,Aletta,Bud,Carlotta,Daniel,Emilia," + "Fabio,Gilma,Hector,Ileana,John,Kristy,Lane,Miriam,Norman,Olivia,Paul,Rosa,Sergio,Tara,Vicente,Willa,Xavier,Yolanda,Zeke,Alvin,Barbara," + "Cosme,Dalila,Erick,Flossie,Gil,Henriette,Ivo,Juliette,Kiko,Lorena,Manuel,Narda,Octave,Priscilla,Raymond,Sonia,Tico,Velma,Wallis,Xina,York," + "Zelda,Amanda,Boris,Cristina,Douglas,Elida,Fausto,Genevieve,Hernan,Iselle,Julio,Karina,Lowell,Marie,Norbert,Odile,Polo,Rachel,Simon,Trudy,Vance,Winnie,Xavier,Yolanda,Zeke" + "Talim,Doksuri,Khanun,Vicente,Saola"; private int lastUsed; private int lastCalled; private string[] names = Names.Split(',').Distinct().ToArray(); public static bool Enabled { get; [Command("petcontrol")] set; } /// <summary> /// Initializes a new instance of the <see cref="T:PetControl"/> class. /// </summary> public PetControl() { World.CharacterAppeared += new CharacterAppearedEventHandler(World_CharacterAppeared); Enabled = true; } void World_CharacterAppeared(object sender, CharacterAppearedEventArgs e) { if (!Enabled) return; UOCharacter mob = new UOCharacter(e.Serial); Log("Nalezen mob {0}", e.Serial); // Neprejmenovavej kone, kteri nejsou hnedi if (mob.Model == 0x00CC && mob.Color != 0x0000) return; // A taky vsechny ostatni jezditka if (new Graphic[] { 0xE4, 0xC8, 0xE2, 0xD2, 0xDC, 0xDB, 0xDA, 0x0123, 0x0124 }.Contains(mob.Model)) return; // Lidi a upiry taky preskakuj rovnou if (new Graphic[] { 0x190, 0x191, 0x0004 }.Contains(mob.Model)) return; if (mob.MaxHits < 0) { // Request renamable flag Log("Mob {0} nema znamy status, odesilam pozadavek...", e.Serial); if (!mob.RequestStatus(5000)) { Log("Nepodarilo se ziskat status pro {0}", e.Serial); return; } } // Is this my pet? if (!mob.Renamable) { Log("Mob {0} se neda prejmenovat ({1}, {2}, {3}).", e.Serial, mob.MaxHits, mob.Name, mob.Renamable); return; } // Zaregistruj handler na update jmena if (mob.Name != null) { // Prejmenuj, pokud uz je jmeno zname Init(mob); } else { Log("Mob {0} je registrovan pro prejmenovani.", e.Serial); mob.Changed += new ObjectChangedEventHandler(mob_Changed); } } void mob_Changed(object sender, ObjectChangedEventArgs e) { UOCharacter mob = new UOCharacter(e.Serial); if (mob.Name != null) { Log("Ziskano jmeno {0}", e.Serial); mob.Changed -= new ObjectChangedEventHandler(mob_Changed); // Prejmenuj Init(mob); } } private void Init(UOCharacter mob) { if (!Monitor.TryEnter(this, 20000)) throw new TimeoutException("Rename"); try { Log("Hledam jmeno pro {0}", mob.Serial); if (names.Contains(mob.Name)) { Log("Mob {0} je jiz pojmenovany jako {1}", mob.Serial, mob.Name); return; } // Find unused name for (int i = 0; i < names.Length; i++) { string name = NextName(ref lastUsed, false); if (!FindByName(name).Exist) { Log("Prejmenovavam {0} na {1}", mob.Serial, name); // Rename mob.Rename(name); UO.Wait(500); byte[] data = PacketBuilder.CharacterSpeechUnicode(mob.Serial, mob.Model, name, SpeechType.Regular, SpeechFont.Normal, Env.ConsoleColor, "[ " + name + " ]"); Core.SendToClient(data, true); Log("Prejmenovani {0} dokonceno", mob.Serial); return; } } UO.PrintWarning("No unused name found."); } finally { Monitor.Exit(this); } } [Executable("saykill")] [Obsolete] public void Kill() { CommandPet("Kill"); } [Executable] public void CommandPet(string command) { for (int i = 0; i < names.Length; i++) { string name = NextName(ref lastCalled, IncludeAll); UOCharacter mob = FindByName(name); if (name == "All" || (mob.Renamable && mob.Distance < 18)) { // Substitute the name UO.Say(name + " " + command); return; } } UO.Say("All " + command); } private string NextName(ref int index, bool includeAll) { if (++index >= names.Length) { if (includeAll) { index = -1; // Pri pristim volani se to dostane krasne na nulu return "All"; } else { index = 0; } } string me = World.Player.Name ?? ""; return me.Substring(0, PrefixLen) + names[index]; } private UOCharacter FindByName(string name) { foreach (var m in World.Characters) { if (m.Name != null && String.Compare(m.Name, name, true) == 0) return m; } return new UOCharacter(Serial.Invalid); } private void Log(string text, params object[] args) { // UO.Print(text, args); } } }