/// <summary> /// RetrieveCampaignObject hook. Called when the server script /// function RetrieveCampaignObject is called by any script. /// </summary> /// <param name="CodeBaseObject">Supplies the code base this /// pointer.</param> /// <param name="CampaignName">Supplies the campaign name.</param> /// <param name="VarName">Supplies the variable name.</param> /// <param name="PlayerName">Supplies the player name.</param> /// <param name="Cls">Always receives 'O'.</param> /// <param name="Size">Receives the size of the restored object GFF /// data.</param> /// <returns>An unmanaged pointer on the server heap that contains /// the raw GFF data for the object. IntPtr.Zero if there is no /// data to restore.</returns> 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)); }