ALFA.Shared.CampaignDatabase.CampaignDatabaseHook.GetBinaryDataHook C# (CSharp) Метод

GetBinaryDataHook() приватный Метод

RetrieveCampaignObject hook. Called when the server script function RetrieveCampaignObject is called by any script.
private GetBinaryDataHook ( IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, Byte &Cls, UInt32 &Size ) : IntPtr
CodeBaseObject System.IntPtr Supplies the code base this /// pointer.
CampaignName System.IntPtr Supplies the campaign name.
VarName System.IntPtr Supplies the variable name.
PlayerName System.IntPtr Supplies the player name.
Cls Byte Always receives 'O'.
Size System.UInt32 Receives the size of the restored object GFF /// data.
Результат System.IntPtr
            private IntPtr GetBinaryDataHook(IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, out Byte Cls, out UInt32 Size)
            {
                string CampaignNameStr = ServerInterop.ReadCExoString(CampaignName);

                //
                // If the campaign is the virtual database, call registered
                // event handlers.
                //

                if (CampaignNameStr.StartsWith("VDB_"))
                {
                    Cls = (byte)'O';

                    try
                    {
                        RetrieveCampaignDatabaseEventArgs EventArgs;
                        string VarNameStr = ServerInterop.ReadCExoString(VarName);
                        string PlayerNameStr = ServerInterop.ReadCExoString(PlayerName);

                        EventArgs = new RetrieveCampaignDatabaseEventArgs(CampaignNameStr.Substring(4), VarNameStr, PlayerNameStr);
                        CampaignDatabase.RetrieveCampaignDatabaseEvent(null, EventArgs);

                        //
                        // If no handler instantiated a GFF, then return no
                        // data found.  Otherwise, allocate a buffer from the
                        // unmanaged server heap, and copy the contents of the
                        // GFF into the heap buffer and return the heap buffer.
                        //

                        if (EventArgs.GFF == null || EventArgs.GFF.Length == 0)
                        {
                            Size = 0;
                            return IntPtr.Zero;
                        }
                        else
                        {
                            IntPtr GFFBuffer = IntPtr.Zero;

                            try
                            {
                                GFFBuffer = ServerInterop.AllocateServerHeap((uint)EventArgs.GFF.Length);
                                Marshal.Copy(EventArgs.GFF, 0, GFFBuffer, EventArgs.GFF.Length);
                                Size = (uint)EventArgs.GFF.Length;

                                return GFFBuffer;
                            }
                            catch (Exception e)
                            {
                                Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);

                                if (GFFBuffer != IntPtr.Zero)
                                {
                                    ServerInterop.FreeServerHeap(GFFBuffer);
                                    GFFBuffer = IntPtr.Zero;
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);

                        Size = 0;
                        return IntPtr.Zero;
                    }
                }

                //
                // Pass through to the original server implementation that uses
                // the standard campaign database.
                //

                return CCodeBase_GetBinaryData_OriginalDelegate(CodeBaseObject, CampaignName, VarName, PlayerName, out Cls, out Size);
            }