terraria-source-code/Social/WeGame/CoreSocialModule.cs
2021-10-26 12:45:26 -04:00

87 lines
3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Decompiled with JetBrains decompiler
// Type: Terraria.Social.WeGame.CoreSocialModule
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using rail;
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace Terraria.Social.WeGame
{
public class CoreSocialModule : ISocialModule
{
private RailCallBackHelper _callbackHelper = new RailCallBackHelper();
private static object _railTickLock = new object();
private bool isRailValid;
[DllImport("kernel32.dll")]
private static extern uint GetCurrentThreadId();
public static event Action OnTick;
public void Initialize()
{
RailGameID railGameId = new RailGameID();
((RailComparableID) railGameId).id_ = (__Null) 2000328L;
string[] strArray = new string[1]{ " " };
if (rail_api.RailNeedRestartAppForCheckingEnvironment(railGameId, strArray.Length, strArray))
Environment.Exit(1);
if (!rail_api.RailInitialize())
Environment.Exit(1);
// ISSUE: method pointer
this._callbackHelper.RegisterCallback((RAILEventID) 2, new RailEventCallBackHandler((object) null, __methodptr(RailEventCallBack)));
this.isRailValid = true;
ThreadPool.QueueUserWorkItem(new WaitCallback(this.TickThread), (object) null);
Main.OnTickForThirdPartySoftwareOnly += new Action(CoreSocialModule.RailEventTick);
}
public static void RailEventTick()
{
rail_api.RailFireEvents();
if (!Monitor.TryEnter(CoreSocialModule._railTickLock))
return;
Monitor.Pulse(CoreSocialModule._railTickLock);
Monitor.Exit(CoreSocialModule._railTickLock);
}
private void TickThread(object context)
{
Monitor.Enter(CoreSocialModule._railTickLock);
while (this.isRailValid)
{
if (CoreSocialModule.OnTick != null)
CoreSocialModule.OnTick();
Monitor.Wait(CoreSocialModule._railTickLock);
}
Monitor.Exit(CoreSocialModule._railTickLock);
}
public void Shutdown()
{
Application.ApplicationExit += (EventHandler) ((obj, evt) => this.isRailValid = false);
this._callbackHelper.UnregisterAllCallback();
rail_api.RailFinalize();
}
public static void RailEventCallBack(RAILEventID eventId, EventBase data)
{
if (eventId != 2)
return;
CoreSocialModule.ProcessRailSystemStateChange((RailSystemState) ((RailSystemStateChanged) data).state);
}
public static void SaveAndQuitCallBack() => Main.WeGameRequireExitGame();
private static void ProcessRailSystemStateChange(RailSystemState state)
{
if (state != 2 && state != 3)
return;
int num = (int) MessageBox.Show("检测到WeGame异常游戏将自动保存进度并退出游戏", "Terraria--WeGame Error");
WorldGen.SaveAndQuit(new Action(CoreSocialModule.SaveAndQuitCallBack));
}
}
}