Script:PetControl.cs

Z AmonWiki

Verze z 23. 5. 2010, 11:07; Mikee (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

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);
        }
    }
}
Osobní nástroje