ravenfield吧 关注:10,399贴子:111,790
  • 6回复贴,共1

Ravenfield Multiplayer代码反编译完成并发布

只看楼主收藏回复

Ravenfield Multiplayer的代码分为87个代码块,其中主要的有20个。
Ravenfield Multiplayer的代码值得借鉴的地方主要是Unity开发网络技术中的网络游戏开发。
这套代码是非常经典的C/S架构的服务端联机代码,非常值得参考。
我觉得Ravenfield Multiplayer这套代码的核心就在下面这段代码。这段代码定义的是子网络服务处理类。
public class RFMPMirrorNetworkManager : LiteNetLib4MirrorNetworkManager
{
// Token: 0x06000501 RID: 1281 RVA: 0x0001E440 File Offset: 0x0001C640
public override void Awake()
{
base.Awake();
base.StartCoroutine(this.getExternalIP());//抓IPv4
base.StartCoroutine(this.getExternalIPv6());//抓IPv6
this.browser = UnityEngine.Object.FindObjectOfType<ServerBrowser>();
if (!Game.network)
{
Game.SetNetworkManager(this);
}
}
// Token: 0x06000502 RID: 1282 RVA: 0x0001E47F File Offset: 0x0001C67F
public override void Start()
{
base.Start();
this.ClearMapVotes();
NetworkTime.PingFrequency = 5f;//获取服务器Ping时间
MatchMaker.instance.FetchServerData();
}
// Token: 0x06000503 RID: 1283 RVA: 0x0001E4A4 File Offset: 0x0001C6A4
private void Update()
{
NetworkManager.singleton = this;
this.ThisShouldWork = NetworkManager.singleton;
if (this.browser == null)
{
this.browser = Game.currentBrowser;
}
MouseLockService.Update();
this.updateSceneDataTimer += Time.deltaTime;//计算服务器预延迟
if (this.updateSceneDataTimer > 1f)
{
this.updateSceneDataTimer = 0f;
this.UpdateSceneData();
}
if (this.mapVoting())
{
this.mapVoteTimer += Time.deltaTime;
this.mapVoteMenu_time.text = (Mathf.Round((25f - this.mapVoteTimer) * 10f) / 10f).ToString();//计时器
}
if (this.server_mapvoting)
{
this.mapVoteTimer += Time.deltaTime;
this.mapVoteMenu_time.text = (Mathf.Round((25f - this.mapVoteTimer) * 10f) / 10f).ToString();
}
}
// Token: 0x06000504 RID: 1284 RVA: 0x0001E5A4 File Offset: 0x0001C7A4
private void UpdateSceneData()
{
if (SceneManager.GetActiveScene().buildIndex == 0)
{
this.offlineScene = "";
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60;
return;
}
this.offlineScene = "NewMenu 1 - Copy";
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = Mathf.RoundToInt(SteelInput.GetSliderInput(OptionSlider.Id.TargetFrameRate));
MatchMaker.instance.UpdateServerPlayerCount(Game.actorCount());
for (int i = 0; i < NetworkServer.connections.Count; i++)
{
}
}
// Token: 0x06000505 RID: 1285 RVA: 0x0001E61E File Offset: 0x0001C81E
private IEnumerator DelayedBannageAction(NetworkConnection conn)
{
yield return new WaitForEndOfFrame();
yield return new WaitForSeconds(3f);//监听服务器等待时间
yield return new WaitForEndOfFrame();
conn.Disconnect();
yield break;
}
// Token: 0x06000506 RID: 1286 RVA: 0x0001E62D File Offset: 0x0001C82D
public void CreateMatch(string matchName, string password, string mapName, int tickRate, int playerCount)
{
MonoBehaviour.print(password);
//开始验证密码
MonoBehaviour.print(password.GetStableHashCode());//取Hash值验证密码
this.AddMatchToServer(matchName, this.externalIP, this.externalIPv6, playerCount, password);//加入服务器
this.CreateServer(mapName, this.serverTickRate, playerCount);//回应服务器
}
// Token: 0x06000507 RID: 1287 RVA: 0x0001E66A File Offset: 0x0001C86A
public void AddMatchToServer(string name, string ip, string ip4, int maxPlayers, string password)
{
MatchMaker.instance.AddServerData(new MatchMaker.MasterServerData(name, ip, ip4, maxPlayers, 1, "", password));
MatchMaker.instance.StartKeepAlive();
}
// Token: 0x06000508 RID: 1288 RVA: 0x0001E692 File Offset: 0x0001C892
public void CreateServer(string mapName, int tickRate, int playerCount)
{
this.maxConnections = playerCount;
this.onlineScene = mapName;
this.serverTickRate = tickRate;
this.StartHost();
}
// Token: 0x06000509 RID: 1289 RVA: 0x0001E6AF File Offset: 0x0001C8AF
public void ConnectToServer(string ip, string ipv4)
{
this.connectedServer = new RFMPMirrorNetworkManager.ServerConnectionInfo(ip, ipv4);
this.networkAddress = this.connectedServer.ip4;
base.StartClient();
}
// Token: 0x0600050A RID: 1290 RVA: 0x0001E6D8 File Offset: 0x0001C8D8
public RFMPMirrorNetworkManager.Server GetServerFromBomp(MatchMaker.MasterServerData masterServerData)
{
return new RFMPMirrorNetworkManager.Server
{
serverName = masterServerData.name,
serverIP = masterServerData.internal_ip,
serverIP4 = masterServerData.external_ip,
serverPlayers = masterServerData.numTags[0].data,
serverMaxPlayers = masterServerData.numTags[1].data,
serverPasswordHash = masterServerData.numTags[3].data
};
}
// Token: 0x0600050B RID: 1291 RVA: 0x0001E747 File Offset: 0x0001C947
public bool hostingServer()
{
return this.isNetworkActive && this.isServerHost;
}
// Token: 0x0600050C RID: 1292 RVA: 0x0001E759 File Offset: 0x0001C959
public void RemoveServer(string ip)
{
base.StartCoroutine(this.DCP_RemoveServer(ip));
}
// Token: 0x0600050D RID: 1293 RVA: 0x0001E769 File Offset: 0x0001C969
public void RejoinServer(RFMPMirrorNetworkManager.ServerConnectionInfo Server, float delay)
{
base.StartCoroutine(this.delayedRejoinServer(Server, delay));
}
// Token: 0x0600050E RID: 1294 RVA: 0x0001E77A File Offset: 0x0001C97A
public void SearchServers()
{
base.StartCoroutine(this.SearchServersSequence());
base.StartCoroutine(this.CancleConnection());
}
// Token: 0x0600050F RID: 1295 RVA: 0x0001E796 File Offset: 0x0001C996
private IEnumerator DCP_AddServer(string name, string ip, string ip4, string maxPlayers, string password)
{
yield return null;
yield break;
}
// Token: 0x06000510 RID: 1296 RVA: 0x0001E79E File Offset: 0x0001C99E
private IEnumerator DCP_RemoveServer(string ip)
{
yield return null;
yield break;
}
// Token: 0x06000511 RID: 1297 RVA: 0x0001E7A6 File Offset: 0x0001C9A6
private IEnumerator SearchServersSequence()
{
this.browser.refreshLoading.SetActive(true);
MatchMaker.instance.FetchServerData();
while (MatchMaker.instance.fetchingData)
{
yield return null;
}
this.foundServers.Clear();
for (int i = 0; i < MatchMaker.instance.serverList.Count; i++)
{
this.foundServers.Add(this.GetServerFromBomp(MatchMaker.instance.serverList[i]));
}
this.browser.HideRefreshList();
this.browser.RemoveServerItems();
for (int j = 0; j < this.foundServers.Count; j++)
{
this.browser.AddServerItem(this.foundServers[j]);
}
this.browser.Invoke("Invokable_HideRefresh", 0.1f);
yield break;
}
// Token: 0x06000512 RID: 1298 RVA: 0x0001E7B5 File Offset: 0x0001C9B5
private IEnumerator CancleConnection()
{
yield return new WaitForSeconds(15f);
if (UnityEngine.Object.FindObjectOfType<ServerBrowser>())
{
UnityEngine.Object.FindObjectOfType<ServerBrowser>().connectingLoading.SetActive(false);
}
yield break;
}
// Token: 0x06000513 RID: 1299 RVA: 0x0001E7BD File Offset: 0x0001C9BD
public void Server_HandleMapSwitch(string map)
{
base.StartCoroutine(this.Server_SwitchToMap(map));
}
// Token: 0x06000514 RID: 1300 RVA: 0x0001E7CD File Offset: 0x0001C9CD
private IEnumerator Server_SwitchToMap(string map)
{
this.ClearMapVotes();
yield return new WaitForSeconds(0.5f);
base.StopHost();
yield return new WaitForSeconds(0.35f);
this.onlineScene = map;
yield return new WaitForSeconds(5f);
this.StartHost();
Game.server_switchingMap = true;
yield break;
}
// Token: 0x06000515 RID: 1301 RVA: 0x0001E7E3 File Offset: 0x0001C9E3
public IEnumerator delayedRejoinServer(RFMPMirrorNetworkManager.ServerConnectionInfo Server, float delay)
{
yield return new WaitForSeconds(delay);
this.connectedServer = Server;
this.ConnectToServer(Server.ip, Server.ip4);
yield break;
}
// Token: 0x06000516 RID: 1302 RVA: 0x0001E800 File Offset: 0x0001CA00
public IEnumerator ConsoleCleanUpServer(bool exit)
{
MonoBehaviour.print("server removed and cleaned up");
if (exit)
{
ConsoleSystem.Run("hardexit_dfgsg335gh4ws35uyeq345j");
}
yield break;
}
// Token: 0x06000517 RID: 1303 RVA: 0x0001E810 File Offset: 0x0001CA10
public virtual string getLocalIPv6()
{
try
{
foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces())
{
if (networkInterface.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation unicastIPAddressInformation in networkInterface.GetIPProperties().UnicastAddresses)
{
if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetworkV6)
{
return unicastIPAddressInformation.Address.ToString().Trim();
}
}
}
}
}
catch (Exception)
{
return "";
}
return "";
}
// Token: 0x06000518 RID: 1304 RVA: 0x0001E8C4 File Offset: 0x0001CAC4
private IEnumerator getExternalIPv6()
{
WWW www = new WWW(this.externalIPv6Source);
float startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < 10f && !http://www.isDone)
{
yield return 0;
}
this.handleExternalIPResponse(www, out this.externalIPv6);
this.isDoneFetchingExternalIPv6 = true;
yield break;
}
// Token: 0x06000519 RID: 1305 RVA: 0x0001E8D4 File Offset: 0x0001CAD4
private bool handleExternalIPResponse(WWW www, out string ip)
{
try
{
if (!http://www.isDone)
{
Debug.LogWarning("BlipsTraversal: Timed out fetching ip from " + http://www.url);
ip = "";
http://www.Dispose();
return false;
}
if (!string.IsNullOrEmpty(http://www.error))
{
ip = "";
return false;
}
IPAddress ipaddress = null;
string text = http://www.text.Trim();
if (!IPAddress.TryParse(text, out ipaddress) || text != ipaddress.ToString())
{
Debug.LogWarning("BlipsTraversal: External ip source responded with something other than an IP: " + http://www.text);
ip = "";
return false;
}
ip = ipaddress.ToString();
}
catch (Exception arg)
{
ip = "";
Debug.Log("BlipsTraversal: Failed to fetch external IP: " + arg);
return false;
}
return true;
}
// Token: 0x0600051A RID: 1306 RVA: 0x0001E9AC File Offset: 0x0001CBAC
public virtual IEnumerator getExternalIP()
{
WWW www = new WWW(this.externalIPSource);
float startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < 10f && !http://www.isDone)
{
yield return 0;
}
if (this.handleExternalIPResponse(www, out this.externalIP))
{
Debug.Log("NATTraversal: External IP address fetched: " + this.externalIP);
}
this.isDoneFetchingExternalIPv4 = true;
yield break;
}
// Token: 0x0600051B RID: 1307 RVA: 0x0001E9BB File Offset: 0x0001CBBB
public void AddMapVote(int map)
{
this.voted = true;
if (Game.localActor)
{
Game.localActor.CallCmdAddMapVote(map, this.lastVotedMap);
this.lastVotedMap = map;
}
}
// Token: 0x0600051C RID: 1308 RVA: 0x0001E9E8 File Offset: 0x0001CBE8
public void CloseMapVoteMenu()
{
this.mapVoteMenu.SetActive(false);
}
// Token: 0x0600051D RID: 1309 RVA: 0x0001E9F6 File Offset: 0x0001CBF6
public bool mapVoting()
{
return this.mapVoteMenu.activeSelf;
}
// Token: 0x0600051E RID: 1310 RVA: 0x0001EA04 File Offset: 0x0001CC04
public void ClearMapVotes()
{
this.mapVoteStatus.Clear();
for (int i = 0; i < this.mapCount; i++)
{
this.mapVoteStatus.Add(0);
}
this.lastVotedMap = -1;
}
// Token: 0x0600051F RID: 1311 RVA: 0x0001EA40 File Offset: 0x0001CC40
public void SwitchMap(int map, RFMPMirrorNetworkManager.ServerConnectionInfo server)
{
base.StartCoroutine(this.MapUISwitch(map, server));
}
// Token: 0x06000520 RID: 1312 RVA: 0x0001EA51 File Offset: 0x0001CC51
private IEnumerator MapUISwitch(int map, RFMPMirrorNetworkManager.ServerConnectionInfo server)
{
this.ClearMapVotes();
this.mapSwitchUI.SetActive(true);
this.mapSwitchText.gameObject.SetActive(false);
ServerBrowser s = null;
while (!s)
{
if (this.browser)
{
s = this.browser;
yield return null;
}
yield return null;
}
string str = s.mapName[map];
this.mapSwitchText.text = "SERVER SWITCHING LEVELS TO " + str;
this.mapSwitchText.gameObject.SetActive(true);
this.RejoinServer(server, 15f);
yield return new WaitForSeconds(20f);
this.mapSwitchUI.SetActive(false);
yield break;
}
// Token: 0x0400051A RID: 1306
public NetworkManager ThisShouldWork;
// Token: 0x0400051B RID: 1307
public List<RFMPMirrorNetworkManager.Server> foundServers = new List<RFMPMirrorNetworkManager.Server>();
// Token: 0x0400051C RID: 1308
public ServerBrowser browser;
// Token: 0x0400051D RID: 1309
public bool isServerHost;
// Token: 0x0400051E RID: 1310
public RFMPMirrorNetworkManager.Server hostedServer;
// Token: 0x0400051F RID: 1311
public RFMPMirrorNetworkManager.ServerConnectionInfo connectedServer;
// Token: 0x04000520 RID: 1312
public RFMPMirrorNetworkManager.ServerGameStats gamedata;
// Token: 0x04000521 RID: 1313
public RFMPMirrorNetworkManager.BanList banData;
// Token: 0x04000522 RID: 1314
public string externalIPSource = "http://ipv4.noblewhale.com";
// Token: 0x04000523 RID: 1315
public bool isDoneFetchingExternalIPv4;
// Token: 0x04000524 RID: 1316
public string externalIP;
// Token: 0x04000525 RID: 1317
public string externalIPv6Source = "http://ipv6.noblewhale.com";
// Token: 0x04000526 RID: 1318
public bool isDoneFetchingExternalIPv6;
// Token: 0x04000527 RID: 1319
public string externalIPv6;
// Token: 0x04000528 RID: 1320
public string bannedData;
// Token: 0x04000529 RID: 1321
private float updateSceneDataTimer;
// Token: 0x0400052A RID: 1322
public GameObject mapSwitchUI;
// Token: 0x0400052B RID: 1323
public Text mapSwitchText;
// Token: 0x0400052C RID: 1324
public GameObject mapVoteMenu;
// Token: 0x0400052D RID: 1325
public Text mapVoteMenu_time;
// Token: 0x0400052E RID: 1326
public List<int> mapVoteStatus = new List<int>();
// Token: 0x0400052F RID: 1327
public List<string> mapNames = new List<string>();
// Token: 0x04000530 RID: 1328
public bool server_mapvoting;
// Token: 0x04000531 RID: 1329
public float mapVoteTimer;
// Token: 0x04000532 RID: 1330
public bool voted;
// Token: 0x04000533 RID: 1331
public int lastVotedMap = -1;
// Token: 0x04000534 RID: 1332
public int mapCount;
// Token: 0x04000535 RID: 1333
public int mapCounsdat;
// Token: 0x020000AE RID: 174
[Serializable]
public class BanList
{
// Token: 0x06000523 RID: 1315 RVA: 0x0001EB78 File Offset: 0x0001CD78
public void AddBan(string ip)
{
this.bans.Add(new RFMPMirrorNetworkManager.Ban(RFMPMirrorNetworkManager.Ban.getHashSet(ip)));
}
// Token: 0x06000524 RID: 1316 RVA: 0x0001EB90 File Offset: 0x0001CD90
public void RevokeBan(string ip)
{
this.bans.Remove(new RFMPMirrorNetworkManager.Ban(RFMPMirrorNetworkManager.Ban.getHashSet(ip)));
}
// Token: 0x06000525 RID: 1317 RVA: 0x0001EBAC File Offset: 0x0001CDAC
public bool IsBanned(string ip)
{
bool result = false;
for (int i = 0; i < this.bans.Count; i++)
{
if (RFMPMirrorNetworkManager.Ban.checkIP(ip, this.bans[i].IPHashSet.ToArray()))
{
result = true;
}
}
return result;
}
// Token: 0x04000536 RID: 1334
public List<RFMPMirrorNetworkManager.Ban> bans = new List<RFMPMirrorNetworkManager.Ban>();
}
// Token: 0x020000AF RID: 175
[Serializable]
public class Ban
{
// Token: 0x06000527 RID: 1319 RVA: 0x0001EC08 File Offset: 0x0001CE08
public Ban(int[] hashset)
{
this.IPHashSet.Clear();
for (int i = 0; i < hashset.Length; i++)
{
this.IPHashSet.Add(hashset[i]);
}
}
// Token: 0x06000528 RID: 1320 RVA: 0x0001EC50 File Offset: 0x0001CE50
public static int[] getHashSet(string ip)
{
List<int> list = new List<int>();
for (int i = 0; i < 10; i++)
{
list.Add(RFMPMirrorNetworkManager.Ban.GetHash(ip, RFMPMirrorNetworkManager.Ban.ipKey(ip) + i * 42, i + ip.Length * 2));
}
return list.ToArray();
}
// Token: 0x06000529 RID: 1321 RVA: 0x0001EC98 File Offset: 0x0001CE98
public static int ipKey(string ip)
{
int num = ip.Length;
foreach (char c in ip.ToCharArray())
{
num += (int)c;
}
return num;
}
// Token: 0x0600052A RID: 1322 RVA: 0x0001ECCC File Offset: 0x0001CECC
public static bool checkIP(string ip, int[] hashset)
{
bool result = false;
int num = 0;
int[] hashSet = RFMPMirrorNetworkManager.Ban.getHashSet(ip);
for (int i = 0; i < hashset.Length; i++)
{
if (hashSet[i] == hashset[i])
{
num++;
}
}
if (num > 9)
{
result = true;
}
return result;
}
// Token: 0x0600052B RID: 1323 RVA: 0x0001ED08 File Offset: 0x0001CF08
public static int GetHash(string text, int startKey, int iterateKey)
{
int num = startKey;
foreach (char c in text)
{
num = num * iterateKey + (int)c;
}
return num;
}
// Token: 0x04000537 RID: 1335
public List<int> IPHashSet = new List<int>();
}
// Token: 0x020000B0 RID: 176
[Serializable]
public class Server
{
// Token: 0x04000538 RID: 1336
public string serverName = "";
// Token: 0x04000539 RID: 1337
public string serverIP = "";
// Token: 0x0400053A RID: 1338
public string serverIP4 = "";
// Token: 0x0400053B RID: 1339
public int serverPlayers;
// Token: 0x0400053C RID: 1340
public int serverMaxPlayers;
// Token: 0x0400053D RID: 1341
public string serverPassword = "";
// Token: 0x0400053E RID: 1342
public int serverPasswordHash = -1;
}
// Token: 0x020000B1 RID: 177
[Serializable]
public class ServerConnectionInfo
{
// Token: 0x0600052D RID: 1325 RVA: 0x0001ED74 File Offset: 0x0001CF74
public ServerConnectionInfo(string ipAddress, string ipv4Address)
{
this.ip = ipAddress;
this.ip4 = ipv4Address;
}
// Token: 0x0400053F RID: 1343
public string ip;
// Token: 0x04000540 RID: 1344
public string ip4;
}
// Token: 0x020000B2 RID: 178
[Serializable]
public class ServerGameStats
{
// Token: 0x04000541 RID: 1345
public float gameRespawnTime = 10f;
// Token: 0x04000542 RID: 1346
public bool startAsSpectator;
// Token: 0x04000543 RID: 1347
public bool autoBalance;
// Token: 0x04000544 RID: 1348
public int winScore = 100;
}
}


IP属地:山东1楼2019-07-18 01:00回复
    这太专业了


    IP属地:美国来自Android客户端3楼2019-07-18 14:04
    回复
      楼主最好别上代码。大部分人看不懂。不过确实值得借鉴。


      IP属地:美国来自Android客户端4楼2019-07-18 14:06
      回复
        我的头好疼


        IP属地:辽宁来自Android客户端6楼2019-07-18 19:35
        回复
          好,是c井
          新水贴方式√


          IP属地:福建来自Android客户端7楼2019-07-18 20:24
          回复
            所以什么时候解决外挂,光靠玩家举报是不行的大乌鸦要是把心铺在多人上还有没有战役模式了


            IP属地:河北来自Android客户端9楼2019-07-19 21:00
            回复