ArcEmu: Scripting In .net - ArcEmu

Jump to content

Toggle shoutbox Lastest Announcements

dfighter  : (07 December 2014 - 12:06 PM) Arcemu is in hibernation mode, please read http://arcemu.org/fo...showtopic=26903
dfighter  : (01 January 2013 - 05:56 PM) Arcemu wishes you all a happy new year!
Hasbro  : (12 September 2012 - 10:01 AM) Please excuse our outage from the web! Our web host had a major malfunction!
dfighter  : (01 September 2012 - 04:05 PM) Since the spam bots just don't want to stop, I've enabled admin verification when registering.
dfighter  : (23 January 2012 - 09:56 PM) Please note that from now on you will need to confirm your email on the wiki in order to edit it!
Hasbro  : (31 December 2011 - 12:50 PM) Happy New Years all!
Navid  : (26 December 2011 - 04:09 AM) Merry Christmas !!!!!! Happy holidays all :)
WAmadeus  : (24 December 2011 - 03:54 PM) Merry Christmas to all!
dfighter  : (24 December 2011 - 11:05 AM) The Arcemu team wishes y'all a Merry Christmukkah!
Hasbro  : (05 October 2011 - 12:53 PM) Looking for web designers for upcoming web related project. If you're interested in designing user interfaces contact me
dfighter  : (02 September 2011 - 03:47 PM) So who here wants vehicles in Arcemu? :P http://arcemu.org/fo...showtopic=25440
Hasbro  : (14 August 2011 - 03:25 PM) Join us on irc, grab an irc client and connect to irc.freenode.net join channel #arcemu /server irc.freenode.net:6667 /join #arcemu
jackpoz  : (03 August 2011 - 05:33 AM) to all Lua Engine (old one) users: please check http://arcemu.org/fo...showtopic=25274
Hasbro  : (20 May 2011 - 05:27 PM) Looking for people experienced with CMake configuration and setup! Contact me asap
Hasbro  : (15 May 2011 - 05:03 PM) ArcEmu is recruiting C++ programmers, contact Hasbro if interested.
paroxysm  : (03 May 2011 - 06:26 PM) Updated luabridge gossip example to describe the whole gossip creation process rather than just how to create menu. Gossip tutorial
paroxysm  : (23 April 2011 - 11:35 AM) Lua writers can refer to the Luabridge Tutorials section in the Wiki to learn how to write gossip code correctly.
Hasbro  : (20 April 2011 - 05:22 PM) Thank you for your continuous contribution of bug reports, we are working on them.
Hasbro  : (17 April 2011 - 03:20 AM) Please consider donating to support our bills. Donations can be sent using PayPal to donations@arcemu.org - Thank you for your support.
paroxysm  : (10 April 2011 - 12:43 AM) Refer to the Luabridge Tutorials section in the Wiki to learn the new syntax of luabridge.
Resize Shouts Area

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Scripting In .net A wrapper to enable C#, vb.NET, C++/CLI as scripts

#21 User is offline   jackpoz 

  • ArcEmu Lemon Priest
  • PipPipPipPipPipPipPipPip
  • Group: Developers
  • Posts: 2,153
  • Joined: 19-June 08
  • Gender:Male
  • Location:Italy
  • Server OS:Windows

Posted 09 November 2010 - 04:06 AM

you let it run on another thread without calling GC.KeepAlive() then^^
Posted Image We develop dreams. Your dreams ;)
Posted ImagePosted Image
0

#22 User is offline   Cromon 

  • Occasional Poster
  • Group: Contributor
  • Posts: 118
  • Joined: 07-June 08
  • Gender:Male
  • Location:Switzerland

Posted 11 November 2010 - 06:19 PM

Luckily i had a reference on that somewhere, so the GC didnt sweep it away :(

Ive reforged the source code as i was kinda shocked how sloppy i worked with the .NET-runtime :D. At the moment its features are mainly for my own developing purposes, like the chat command .pack which can be scripted like that:
    public class PacketHook : IHook
    {
        public PacketHook()
        {
            Writers.Add("f", WriteFloat);
            Writers.Add("u32", WriteUInt32);
            Writers.Add("u64", WriteUInt64);
            Writers.Add("s", WriteString);
            Writers.Add("u8", WriteUInt8);
        }

        public override bool OnChat(Player plr, string message)
        {
            if (message[0] == '.')
            {
                if(message.IndexOf("pack") == 1)
                {
                    string[] parts = message.Split(' ');
                    if(parts.Length < 1)
                    {
                        plr.RedSystemMessage("Usage: .pack <opcode> ...<format> <value>");
                        return false;
                    }
                    string opcs = parts[1];
                    Opcodes opc;
                    if(!Enum.TryParse(opcs, out opc))
                    {
                        plr.RedSystemMessage("Opcode {0} is not recognized!", opcs);
                        return false;
                    }
                    WoWPacket pack = new WoWPacket(opc);
                    if(parts.Length == 1)
                    {
                        plr.SendPacket(pack);
                        return false;
                    }
                    if(((parts.Length - 2) % 2) != 0)
                    {
                        plr.RedSystemMessage("Please always write <format> <value> for each value!");
                        return false;
                    }
                    for(int i = 0; i < (parts.Length - 2) / 2; ++i)
                    {
                        string fmt = parts[2 * i + 2];
                        string value = parts[2 * i + 3];
                        if (!Writers.ContainsKey(fmt))
                        {
                            plr.RedSystemMessage("Value {0} has an unrecognized type {1}!", i, fmt);
                            return false;
                        }
                        if (Writers[fmt](pack, value) == false)
                        {
                            plr.RedSystemMessage("Value {0} could not be parsed from '{1}' to '{2}'!", i, value, fmt);
                            return false;
                        }
                    }
                    plr.SendPacket(pack);
                }
            }
            return true;
        }

        delegate bool WriteToPacket(WoWPacket pack, string value);
        Dictionary<string, WriteToPacket> Writers = new Dictionary<string, WriteToPacket>();

        bool WriteFloat(WoWPacket pack, string val)
        {
            float value = 0;
            if (!float.TryParse(val, out value))
                return false;
            pack.Write(value);
            return true;
        }

        bool WriteUInt32(WoWPacket pack, string val)
        {
            uint value = 0;
            if (!uint.TryParse(val, out value))
                return false;
            pack.Write(value);
            return true;
        }

        bool WriteUInt64(WoWPacket pack, string val)
        {
            ulong value = 0;
            if (!ulong.TryParse(val, out value))
                return false;
            pack.Write(value);
            return true;
        }

        bool WriteString(WoWPacket pack, string val)
        {
            pack.Write(val);
            return true;
        }

        bool WriteUInt8(WoWPacket pack, string val)
        {
            byte value = 0;
            if (!byte.TryParse(val, out value))
                return false;
            pack.Write(value);
            return true;
        }
    }


With two examples:
http://imagr.eu/up/4...1210_001021.jpg
http://imagr.eu/up/4...1210_001040.jpg

Ill definitely stick on that as its pretty cool to develop :D

Greetings
Cromon
0

Share this topic:


  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users