/// <summary> /// StoreCampaignObject hook. Called when the server script /// function StoreCampaignObject 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 supplies the value 'O'.</param> /// <param name="Data">Supplies the raw GFF buffer.</param> /// <param name="Size">Supplies the count of raw GFF bytes in the /// data buffer.</param> /// <returns>True if the object was stored, else false if the /// object was not stored. private Int32 AddBinaryDataHook(IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, Byte Cls, IntPtr Data, UInt32 Size) { string CampaignNameStr = ServerInterop.ReadCExoString(CampaignName); // // If the campaign is the virtual database, call registered // event handlers. // if (CampaignNameStr.StartsWith("VDB_")) { try { StoreCampaignDatabaseEventArgs EventArgs; string VarNameStr = ServerInterop.ReadCExoString(VarName); string PlayerNameStr = ServerInterop.ReadCExoString(PlayerName); byte[] GFF = new byte[(int)Size]; Marshal.Copy(Data, GFF, 0, (int)Size); EventArgs = new StoreCampaignDatabaseEventArgs(CampaignNameStr.Substring(4), VarNameStr, PlayerNameStr, GFF); CampaignDatabase.StoreCampaignDatabaseEvent(null, EventArgs); return(EventArgs.Handled ? 1 : 0); } catch (Exception e) { Logger.Log("CampaignDatabaseHook.AddBinaryDataHook: Exception: {0}", e); return(0); } } // // Pass through to the original server implementation that uses // the standard campaign database. // return(CCodeBase_AddBinaryData_OriginalDelegate(CodeBaseObject, CampaignName, VarName, PlayerName, Cls, Data, Size)); }
/// <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)); }