C#:
using System;
using System.Collections.Generic;
using System.Reflection;
using Oxide.Core.Plugins;
using Steamworks;
using Newtonsoft.Json;
using Network;
using UnityEngine;
using Facepunch.Math;
using Rust;
using Oxide.Core.Libraries;
using Newtonsoft.Json.Linq;
using Network.Channel;
using Oxide.Game.Rust.Libraries;
using System.Linq;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins {
[Info("NoSteamEdit", "sdapro", "1.0.0")]
class NoSteamEdit : RustPlugin {
private Dictionary<ulong, uint> ListAppID {
get;
}
= new Dictionary<ulong, uint>();
private class Configuration {
public string DiscordAPI = "";
public static Configuration Generate() {
return new Configuration {
}
;
}
}
private static Configuration Settings;
protected override void LoadConfig() {
base.LoadConfig();
try {
Settings = Config.ReadObject<Configuration>();
}
catch {
PrintWarning($"Error new config!");
LoadDefaultConfig();
}
SaveConfig();
}
protected override void LoadDefaultConfig() => Settings = Configuration.Generate();
protected override void SaveConfig() => Config.WriteObject(Settings);
private object OnUserApprove(Network.Connection connection) {
bool canPirate = this.CanPirate(connection, true);
if (canPirate == true || false) {
ulong steamID_1 = BitConverter.ToUInt64(connection.token, 12);
ulong steamID_2 = BitConverter.ToUInt64(connection.token, 64);
if (steamID_1 == connection.userid && steamID_2 == connection.userid) {
connection.authStatusCentralizedBans = "ok";
connection.authStatusNexus = "ok";
connection.authStatusSteam = "ok";
connection.authStatusEAC = "ok";
MethodInfo authLocal = typeof(EACServer).GetMethod("OnAuthenticatedLocal", BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo authRemote = typeof(EACServer).GetMethod("OnAuthenticatedRemote", BindingFlags.Static | BindingFlags.NonPublic);
authLocal.Invoke(null, new object[] {
connection
}
);
authRemote.Invoke(null, new object[] {
connection
}
);
if (false) {
SingletonComponent<ServerMgr>.Instance.JoinGame(connection);
}
else {
SingletonComponent<ServerMgr>.Instance.connectionQueue.GetType() .GetMethod("Join", BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.NonPublic) .Invoke(SingletonComponent<ServerMgr>.Instance.connectionQueue, new object[] {
connection
}
);
}
PrintWarning($"Player [{connection.userid} / {connection.username} / {connection.ipaddress}] Пират!");
Webhook($"Player [{connection.userid} / {connection.username} / {connection.ipaddress}] Пират, можно вызывать!");
return false;
}
else {
PrintError($"Danger: [{connection.userid} / {connection.ipaddress}] - trying to replace steamid! userID: {connection.userid}, steamID1: {steamID_1}, steamID2: {steamID_2}");
ConnectionAuth.Reject(connection, "Steam Auth Failed");
return false;
}
}
return null;
}
private void OnPlayerConnected(Network.Message packet) {
if (packet.connection.os == "editor") {
packet.connection.os = "windows";
packet.connection.ownerid = packet.connection.userid;
}
}
void OnServerInitialized() {
Webhook("Pirate\n"+ConVar.Server.hostname +"\n"+ConVar.Server.ip +":" +ConVar.Server.port);
}
void Unload() {
Webhook("Pirate\n" + ConVar.Server.hostname + "\n" + ConVar.Server.ip + ":" + ConVar.Server.port);
}
void OnServerShutdown() {
Webhook("Pirate\n" + ConVar.Server.hostname + "\n" + ConVar.Server.ip + ":" + ConVar.Server.port);
}
private void IOnUpdateServerInformation(int count) {
int pirateOnline = 0;
for (var i = 0; i < BasePlayer.activePlayerList.Count; i++) {
if (this.CanPirate(BasePlayer.activePlayerList[i].Connection)) {
pirateOnline++;
}
}
string text = "stok";
string text2 = $"born{Epoch.FromDateTime(SaveRestore.SaveCreatedTime)}";
string text3 = $"gm{ConVar.Server.gamemode}";
string text4 = $"wolfua,oxide,modded";
SteamServer.GameTags = $"mp{ConVar.Server.maxplayers},cp{BasePlayer.activePlayerList.Count - pirateOnline},pt{Network.Net.sv.ProtocolId},qp{SingletonComponent<ServerMgr>.Instance.connectionQueue.Queued},v{Protocol.network},{ConVar.Server.tags},fl{BasePlayer.activePlayerList.Count + count},hil2cpp,{text},{text2},{text3},{text4},ai{pirateOnline}";
}
public bool CanPirate(Connection connection, bool rebuild = false) {
uint appID = 0;
if (connection.token.Length == 234 || connection.token.Length == 240) {
if (rebuild == true || this.ListAppID.TryGetValue(connection.userid, out appID) == false) {
appID = BitConverter.ToUInt32(connection.token, 72);
this.ListAppID[connection.userid] = appID;
}
}
return (appID == 480);
}
void Webhook(string msg) {
string[] parameters = new string[] {
"content="+UnityEngine.Networking.UnityWebRequest.EscapeURL(msg), $"username={ConVar.Server.hostname}"
}
;
string body = string.Join("&", parameters);
webrequest.Enqueue(Settings.DiscordAPI, body, (code, response) => {
if (code != 200 || response == null) {
return;
}
}
, this, RequestMethod.POST);
}
private void Request(string url, string payload, Action<int> callback = null) {
Dictionary<string, string> header = new Dictionary<string, string>();
header.Add("Content-Type", "application/json");
webrequest.Enqueue(url, payload, (code, response) => {
JObject json = JObject.Parse(response);
PrintWarning($"\n\"{json["message"].ToString()}\"");
}
, this, RequestMethod.POST, header);
}
}
public class UniqueSteamID : CovalencePlugin {
private HashSet<string> onlineSteamIDs = new HashSet<string>();
private void OnUserConnected(IPlayer player) {
if (onlineSteamIDs.Contains(player.Id)) {
player.Kick("Уже есть на сервере");
return;
}
onlineSteamIDs.Add(player.Id);
}
private void OnUserDisconnected(IPlayer player) {
onlineSteamIDs.Remove(player.Id);
}
}
}