C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System;
using System.Reflection;
using System.Data;
using UnityEngine;
using Oxide.Core;
using System.IO;
using Oxide.Core.Libraries;
using System.Linq;
namespace Oxide.Plugins {
[Info("RaidAlert", "By JV", "1.0.4")]
class RustySheriffAlertSystem : RustPlugin {
List<BasePlayer> allBasePlayer;
List<Auth> authList = new List<Auth>();
List<DrawListEntry> drawList = new List<DrawListEntry>();
List<IgnoreListEntry> ignoreList = new List<IgnoreListEntry>();
List<ulong> muteList = new List<ulong>();
List<Trespasser> newTrespassers = new List<Trespasser>();
List<Trespasser> oldTrespassers = new List<Trespasser>();
List<Perimeter> perimeters = new List<Perimeter>();
List<TestAlert> testAlerts = new List<TestAlert>();
List<ValReq> valReqs = new List<ValReq>();
List<ulong> validated = new List<ulong>();
Dictionary<ulong, int> authDict = new Dictionary<ulong, int>();
Dictionary<ulong, int> ignoreDict = new Dictionary<ulong, int>();
Dictionary<ulong, int> perimeterDict = new Dictionary<ulong, int>();
private static DateTime epoch;
string url = "http://jvetech.co.uk";
double drawCheck = 0;
double nextCheck = 0;
double playerUpdateCheck = 0;
int maxPerimeterDelta = 75;
int maxPerimeterPoints = 50;
int maxPerimetersPerPlayer = 4;
int playerCheckIndex = 0;
int timeBetweenChecks = 30;
bool alertsVisibleInGame = true;
bool alertTriggeredOnlyWhenSleepingInPerimeter = false;
bool automaticCheckingEnabled = true;
bool enabledForAuthorisedUsersOnly = false;
bool sendAnon = false;
bool syncWithRustySheriffServer = true;
bool updatedOldData = false;
bool useCupboards = false;
bool adminsAuthed = false;
private FieldInfo buildingPrivlidges;
float perimeterHeightDelta = 1.5f;
System.Random rnd = new System.Random(DateTime.Now.Millisecond);
[ChatCommand("rs")]
void cmdChatRS(BasePlayer player, string command, string[] args) {
if (getAuthLevel(player.userID) >= 0 || !enabledForAuthorisedUsersOnly) {
if (args == null || args.Length == 0) {
showMainMenu(player);
return;
}
else {
if (args[0] == "set") {
set(player, args);
return;
}
if (args[0] == "view") {
viewPerimeters(player, args);
return;
}
if (args[0] == "start") {
startPerimeter(player, args);
return;
}
if (args[0] == "add") {
addPerimeterEntry(player, false);
return;
}
if (args[0] == "stop") {
stopPerimeter(player);
return;
}
if (args[0] == "cancel") {
cancelPerimeter(player);
return;
}
if (args[0] == "clear") {
clearPerimeters(player);
return;
}
if (args[0] == "delete") {
deletePerimeter(player, args);
return;
}
if (args[0] == "validate") {
validatePlayer(player, false);
return;
}
if (args[0] == "validatenew") {
validatePlayer(player, true);
return;
}
if (args[0] == "ignore") {
ignorePlayer(player, args);
return;
}
if (args[0] == "unignore") {
unignorePlayer(player, args);
return;
}
if (args[0] == "clearignores") {
clearIgnoreList(player);
return;
}
if (args[0] == "ignores") {
viewIgnoreList(player);
return;
}
if (args[0] == "ignoredetect") {
ignoreDetect(player);
return;
}
if (args[0] == "mute") {
muteIngameAlerts(player, true);
return;
}
if (args[0] == "unmute") {
muteIngameAlerts(player, false);
return;
}
if (args[0] == "help") {
showHelpMenu(player);
return;
}
if (args[0] == "undo") {
undoLastPoint(player);
return;
}
if (args[0] == "test") {
testPerimeter(player);
return;
}
if (args[0] == "adv") {
showAdvancedMenu(player);
return;
}
if (getAuthLevel(player.userID) == 2) {
if (args[0] == "time") {
setTimeBetweenChecks(player, args);
return;
}
if (args[0] == "adduser") {
addUser(player, args);
return;
}
if (args[0] == "deluser") {
delUser(player, args);
return;
}
if (args[0] == "enable") {
toggleAutoCheck(player, true);
return;
}
if (args[0] == "disable") {
toggleAutoCheck(player, false);
return;
}
if (args[0] == "save") {
saveAllData(player);
return;
}
if (args[0] == "auths") {
showAuthorisedUsers(player);
return;
}
if (args[0] == "secure") {
toggleSecureMode(player);
return;
}
if (args[0] == "chatmute") {
toggleChatMute(player);
return;
}
if (args[0] == "sleepers") {
toggleSleepers(player);
return;
}
if (args[0] == "maxperim") {
setMaxPerimeters(player, args);
return;
}
if (args[0] == "maxsize") {
setMaxSize(player, args);
return;
}
if (args[0] == "maxpoints") {
setMaxPoints(player, args);
return;
}
if (args[0] == "checkinterval") {
setCheckInterval(player, args);
return;
}
if (args[0] == "sync") {
toggleSync(player);
return;
}
if (args[0] == "status") {
showStatus(player);
return;
}
if (args[0] == "anon") {
toggleAnon(player);
return;
}
if (args[0] == "cupboard") {
toggleUseCupboard(player);
return;
}
if (args[0] == "admin") {
showAdminMenu(player);
Puts("|{}+*#");
Puts("CLEAN - " + cleanString("|{}+*#"));
return;
}
if (args[0] == "auth") {
showAuthMenu(player);
return;
}
}
SendReply(player, "Please enter a valid command.Do /rs for a list.");
}
}
}
[ConsoleCommand("rs.adduser")]
void cmdRSAddUser(ConsoleSystem.Arg arg) {
addUser(null, arg.Args);
}
[ConsoleCommand("rs.auths")]
void cmdRSAuths(ConsoleSystem.Arg arg) {
showAuthorisedUsers(null);
}
[ConsoleCommand("rs.deluser")]
void cmdRSDelUser(ConsoleSystem.Arg arg) {
delUser(null, arg.Args);
}
[ConsoleCommand("rs.save")]
void cmdRSSave(ConsoleSystem.Arg arg) {
saveAllData(null);
Puts("Config and data saved.");
}
void addPerimeter(BasePlayer player, string perimeterName) {
if (isInProgress(player.userID)) {
SendReply(player, "You already have a perimeter in progress.Do /rs cancel to remove it.");
return;
}
perimeterName = cleanString(perimeterName);
int perimeterIndex = getPerimeterIndex(player.userID);
if (perimeterIndex == -1) {
Perimeter per = new Perimeter();
per.steamid = player.userID;
perimeters.Add(per);
perimeterDict.Add(player.userID, perimeters.Count - 1);
perimeterIndex = perimeters.Count - 1;
}
if (!isPerimeterNameInUse(player.userID, perimeterName)) {
PlayerPerimeter pl = new PlayerPerimeter();
pl.name = perimeterName;
Vector3 v = new Vector3();
v.x = player.transform.position.x;
v.y = player.transform.position.y;
// +perimeterHeightDelta;
v.z = player.transform.position.z;
pl.coords.Add(v);
pl.finished = false;
pl.id = (uint)rnd.Next(1000, 999999999);
perimeters[perimeterIndex].playerPerimeters.Add(pl);
SendReply(player, "Started perimeter entry for perimeter " + perimeterName + ".Do /rs add to enter, and /rs stop for the last waypoint.");
//*** ENSURE ANY PLAYER TIMERS ARE DESTROYED HERE ***//
plotPerimeter(player, perimeterIndex, perimeters[perimeterIndex].playerPerimeters.Count - 1);
DrawListEntry d = new DrawListEntry();
d.basePlayer = player;
d.perimeterIndex = perimeterIndex;
d.playerPerimeterIndex = perimeters[perimeterIndex].playerPerimeters.Count - 1;
drawList.Add(d);
}
else {
SendReply(player, "You already have a perimeter called " + perimeterName + ".Do /rs delete <index> to remove it, or choose another name.");
}
}
int addPerimeterEntry(BasePlayer player, bool stop) {
PerimeterPosition pPos = getInProgress(player.userID);
if (pPos.perimeterIndex == -1) {
SendReply(player, "You need to start a perimeter first.Do /rs start <name>, or /rs set for auto-creation.");
return -1;
}
string perimeterName = perimeters[pPos.perimeterIndex].playerPerimeters[pPos.playerPerimeterIndex].name;
int perimeterCount = perimeters[pPos.perimeterIndex].playerPerimeters[pPos.playerPerimeterIndex].coords.Count;
int authLevel = getAuthLevel(player.userID);
if (!stop) {
if ((perimeterCount > maxPerimeterPoints - 1) && authLevel < 1) {
SendReply(player, "You cannot enter any more waypoints for perimeter " + perimeterName + ".Do /rs stop to finalise this perimeter or /rs cancel discard it.");
return -1;
}
}
Vector3 ePoint = player.transform.position;
//ePoint.y += perimeterHeightDelta;
perimeters[pPos.perimeterIndex].playerPerimeters[pPos.playerPerimeterIndex].coords.Add(ePoint);
if (!findTolerances(pPos) && authLevel < 1) {
SendReply(player, "You cannot add this waypoint as the resulting perimeter will be larger than permitted.(" + maxPerimeterDelta.ToString() + " x " + maxPerimeterDelta.ToString() + ")");
perimeters[pPos.perimeterIndex].playerPerimeters[pPos.playerPerimeterIndex].coords.RemoveAt(perimeters[pPos.perimeterIndex].playerPerimeters[pPos.playerPerimeterIndex].coords.Count - 1);
return -1;
}
if (authLevel < 1) {
SendReply(player, "Added current location to perimeter " + perimeterName + ".- " + (perimeterCount + 1).ToString() + "/" + maxPerimeterPoints.ToString() + ".");
}
else {
SendReply(player, "Added current location to perimeter " + perimeterName + ".");
}
plotPerimeter(player, pPos.perimeterIndex, pPos.playerPerimeterIndex);
return perimeterCount + 1;
}
void addUser(BasePlayer initPlayer, string[] args) {
int argIndexDelta = 0;
if (initPlayer != null) {
//called from ingame
argIndexDelta = 1;
}
string name = "";
if ((args == null && initPlayer == null) || (args.Length == 1 && initPlayer != null)) {
if (args != null) {
SendReply(initPlayer, "Do /rs adduser followed by either <steamid> <authlevel> or <name> <authlevel> if the player's online.");
SendReply(initPlayer, "Or /rs <steamid> <name> <authLevel> if they're offline.");
SendReply(initPlayer, "0 = Normal User, 1 = Privileged user, 2 = Admin.");
return;
}
else {
Puts("Do /rs adduser followed by either <steamid> <authlevel> or <name> <authlevel> if the player's online.");
Puts("Or /rs <steamid> <name> <authLevel> if they're offline.");
Puts("0 = Normal User, 1 = Privileged user, 2 = Admin.");
return;
}
}
if (args.Length < 2) {
if (initPlayer != null) {
SendReply(initPlayer, "Do /rs adduser followed by either <steamid> <authlevel> or <name> <authlevel> if the player's online.Or /rs <steamid> <name> <authLevel> if they're offline.0 = Normal User, 1 = Privileged user, 2 = Admin.");
return;
}
else {
Puts("Do /rs adduser followed by either <steamid> <authlevel> or <name> <authlevel> if the player's online.");
Puts("Or /rs <steamid> <name> <authLevel> if they're offline.");
Puts("0 = Normal User, 1 = Privileged user, 2 = Admin.");
return;
}
}
//check authLevel
int argIndex = -1;
if (args.Length == 2 + argIndexDelta) {
argIndex = 1 + argIndexDelta;
}
else {
argIndex = 2 + argIndexDelta;
}
int authLevel;
try {
authLevel = Convert.ToInt32(args[argIndex]);
}
catch (Exception e) {
if (initPlayer != null) {
SendReply(initPlayer, "Invalid auth level entered.0 = Normal User, 1 = Privileged User, 2 = Admin.");
}
else {
Puts("Invalid auth level entered.0 = Normal User, 1 = Privileged User, 2 = Admin.");
}
return;
}
ulong steamid = 0;
if (args.Length == 2 + argIndexDelta) {
//can be steamid or playername + authlevel
//check if steamid
bool match = false;
if (args[argIndexDelta].Length == 17) {
match = false;
name = "";
if (args[argIndexDelta].Substring(0, 6) == "765611") {
try {
steamid = Convert.ToUInt64(args[argIndexDelta]);
}
catch (Exception e) {
if (initPlayer != null) {
SendReply(initPlayer, "Invalid SteamID entered.");
}
else {
Puts("Invalid SteamID entered.");
}
return;
}
for (int i = 0; i < allBasePlayer.Count; i++) {
if (allBasePlayer[i].userID == (ulong)steamid) {
name = allBasePlayer[i].displayName;
match = true;
break;
}
}
}
}
if (!match) {
//check for playername instead
int r = checkDupes(args[argIndexDelta]);
if (r >= 0) {
for (int i = 0; i < allBasePlayer.Count; i++) {
if (allBasePlayer[i].displayName.Length >= args[argIndexDelta].Length) {
if (allBasePlayer[i].displayName.Substring(0, args[argIndexDelta].Length) == args[argIndexDelta]) {
steamid = allBasePlayer[i].userID;
name = allBasePlayer[i].displayName;
match = true;
break;
}
}
}
}
else {
if (initPlayer != null) {
if (r == -2) {
SendReply(initPlayer, "There is more than 1 player with that name.");
}
else {
SendReply(initPlayer, "There are no players with that name.");
}
}
else {
if (r == -2) {
Puts("There is more than 1 player with that name.");
}
else {
Puts("There are no players with that name.");
}
}
return;
}
}
if (match) {
int aIndex = -1;
if (getPlayerIndex(steamid) != -1) {
setAuthLevel(steamid, authLevel, name, initPlayer, false);
}
}
else {
if (initPlayer != null) {
SendReply(initPlayer, "No players with that name or SteamID are currently online.Try /rs adduser <steamid> <name> <authlevl> to add an offline player.");
}
else {
Puts("No players with that name or SteamID are currently online.Try /rs adduser <steamid> <name> <authlevl> to add an offline player.");
}
}
}
if (args.Length == 3 + argIndexDelta) {
//<steamid> <name> <level>
try {
steamid = Convert.ToUInt64(args[argIndexDelta]);
}
catch (Exception e) {
if (initPlayer != null) {
SendReply(initPlayer, "Invalid SteamID entered.");
}
else {
Puts("Invalid SteamID entered.");
}
return;
}
name = args[1 + argIndexDelta];
setAuthLevel(steamid, authLevel, name, initPlayer, false);
}
}
void addValidationRequest(ulong steamid, bool newCode) {
for (int i = 0; i < valReqs.Count; i++) {
if (valReqs[i].steamid == steamid) {
valReqs.RemoveAt(i);
break;
}
}
ValReq v = new ValReq();
v.steamid = steamid;
v.newCode = newCode;
valReqs.Add(v);
}
void cancelPerimeter(BasePlayer player) {
stopPerimeter(player, true);
}
void checkAdminsAuthed() {
for (int i = 0; i < allBasePlayer.Count; i++) {
if (isServerModerator(allBasePlayer[i])) {
setAuthLevel(allBasePlayer[i].userID, 2, allBasePlayer[i].displayName, null, true);
}
}
}
int checkDupes(string playerName) {
int count = 0;
int index = 0;
for (int i = 0; i < allBasePlayer.Count; i++) {
if (allBasePlayer[i].displayName.Length >= playerName.Length) {
if (allBasePlayer[i].displayName.Substring(0, playerName.Length) == playerName) {
count++;
index = i;
}
}
}
if (count == 0) {
return -1;
}
if (count == 1) {
return index;
}
//count must be > 1 so
return -2;
}
void checkTrespass() {
if (allBasePlayer.Count > playerCheckIndex) {
BasePlayer serverPlayer = allBasePlayer[playerCheckIndex];
int authLevel = getAuthLevel(serverPlayer.userID);
if (authLevel < 2) {
string serverPlayerName = serverPlayer.displayName;
serverPlayerName = cleanString(serverPlayerName);
Vector3 serverPlayerPos = serverPlayer.transform.position;
for (int i = 0; i < perimeters.Count; i++) {
for (int p = 0; p < perimeters[i].playerPerimeters.Count; p++) {
bool doCheck = false;
if (enabledForAuthorisedUsersOnly) {
if (authLevel == 0) {
if (alertTriggeredOnlyWhenSleepingInPerimeter) {
if (perimeters[i].playerPerimeters[p].sleeperPresent) {
doCheck = true;
}
}
else {
doCheck = true;
}
}
if (authLevel > 0) {
doCheck = true;
}
}
else {
if (alertTriggeredOnlyWhenSleepingInPerimeter) {
if (perimeters[i].playerPerimeters[p].sleeperPresent) {
doCheck = true;
}
}
else {
doCheck = true;
}
}
if (doCheck) {
doCheck = false;
if (perimeters[i].playerPerimeters[p].finished) {
int wn = 0;
if (serverPlayerPos.x >= perimeters[i].playerPerimeters[p].minX && serverPlayerPos.x <= perimeters[i].playerPerimeters[p].maxX) {
if (serverPlayerPos.z >= perimeters[i].playerPerimeters[p].minY && serverPlayerPos.z <= perimeters[i].playerPerimeters[p].maxY) {
PerimeterPosition pPos = new PerimeterPosition();
pPos.perimeterIndex = i;
pPos.playerPerimeterIndex = p;
wn = windingPoly(serverPlayerPos, pPos);
}
}
if (wn != 0) {
if (syncWithRustySheriffServer && isValidated(serverPlayer.userID)) {
if (!isPlayerIgnored(perimeters[i].steamid, serverPlayer.userID)) {
Trespasser t = new Trespasser();
t.id = perimeters[i].playerPerimeters[p].id;
t.steamid = perimeters[i].steamid;
t.name = cleanString(perimeters[i].playerPerimeters[p].name);
t.trespasserSteamID = serverPlayer.userID;
t.alertText = "|" + perimeters[i].playerPerimeters[p].id + "|" + cleanString(serverPlayerName) + "|" + serverPlayerPos.x.ToString() + "|" + serverPlayerPos.z.ToString();
newTrespassers.Add(t);
}
}
if (alertsVisibleInGame) {
doCheck = true;
}
else {
if (authLevel > 0) {
doCheck = true;
}
}
if (doCheck) {
for (int t = 0; t < allBasePlayer.Count; t++) {
if (perimeters[i].steamid == allBasePlayer[t].userID) {
if (!muteList.Contains(perimeters[i].steamid)) {
if (!isPlayerIgnored(perimeters[i].steamid, serverPlayer.userID)) {
bool isValid = true;
//if (authLevel == 2 && perimeters[i].steamid != serverPlayer.userID)
//{
// isValid = false;
//}
//if (isValid)
//{
if (!sendAnon || getAuthLevel(perimeters[i].steamid) == 2) {
SendReply(allBasePlayer[t], serverPlayerName + " " + serverPlayer.userID.ToString() + " has breached perimeter " + perimeters[i].playerPerimeters[p].name + ".");
}
else {
SendReply(allBasePlayer[t], "Perimeter " + perimeters[i].playerPerimeters[p].name + " has been breached.");
}
// }
break;
}
}
}
}
}
}
}
}
}
}
}
}
}
string cleanString(string msg) {
string newMsg = "";
for (int i = 0; i < msg.Length; i++) {
if (msg.Substring(i, 1) != "|") {
if (msg.Substring(i, 1) != "{") {
if (msg.Substring(i, 1) != "}") {
if (msg.Substring(i, 1) != "+") {
if (msg.Substring(i, 1) != "*") {
if (msg.Substring(i, 1) != "#") {
newMsg += msg.Substring(i, 1);
}
}
}
}
}
}
}
return newMsg;
}
void clearIgnoreList(BasePlayer player) {
int count = 0;
int ignoreListIndex = getIgnoreListIndex(player.userID);
if (ignoreListIndex != -1) {
count = ignoreList[ignoreListIndex].ignores.Count;
ignoreList[ignoreListIndex].ignores.Clear();
}
else {
SendReply(player, "Your ignore list is already empty.");
}
if (count == 0) {
SendReply(player, "Your ignore list is already empty.");
}
else {
SendReply(player, "Removed " + count.ToString() + " players from your ignore list.");
}
}
void clearPerimeters(BasePlayer player) {
int perimeterIndex = getPerimeterIndex(player.userID);
if (perimeterIndex == -1) {
SendReply(player, "You have no perimeters to remove.Do /rs set <name> to create one.");
}
else {
if (perimeters[perimeterIndex].playerPerimeters.Count == 0) {
SendReply(player, "You have no perimeters to remove.Do /rs set <name> to create one.");
return;
}
if (isInProgress(player.userID)) {
stopDrawing(player);
}
SendReply(player, "Removed " + perimeters[perimeterIndex].playerPerimeters.Count.ToString() + " perimeters on this server.");
perimeters[perimeterIndex].playerPerimeters.Clear();
}
}
void convertOldAlertsObj(OldAlertsObjectDict oldAlertsObj) {
//Puts("Converting perimeters");
//key is steamid to which perimeter belongs
var keyArray = oldAlertsObj.alerts.Keys.ToArray();
//for each steamid
for (int i = 0; i < keyArray.Length; i++) {
//Puts(keyArray[i]);
int pIndex = getPerimeterIndex(Convert.ToUInt64(keyArray[i]));
//key is alert name
var pKeyArray = oldAlertsObj.alerts[keyArray[i]].Keys.ToArray();
//for each alert name
for (int p = 0; p < pKeyArray.Length; p++) {
//Puts(pKeyArray[p]);
int count = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].count;
bool finished = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].finished;
uint id = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].id;
double maxx = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].maxx;
double maxy = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].maxy;
double minx = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].minx;
double miny = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].miny;
bool sleeperPresent = oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].SleeperPresent;
PlayerPerimeter pp = new PlayerPerimeter();
pp.name = pKeyArray[p];
pp.finished = finished;
pp.id = id;
pp.minX = minx;
pp.minY = miny;
pp.maxX = maxx;
pp.maxY = maxy;
pp.sleeperPresent = sleeperPresent;
Vector3 vec;
for (int c = 0; c < count; c++) {
vec = new Vector3();
vec.x = (float)oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].coords[c.ToString()]["0"];
vec.y = (float)oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].coords[c.ToString()]["2"];
vec.z = (float)oldAlertsObj.alerts[keyArray[i]][pKeyArray[p]].coords[c.ToString()]["1"];
pp.coords.Add(vec);
}
if (pIndex == -1) {
Perimeter per = new Perimeter();
per.steamid = Convert.ToUInt64(keyArray[i]);
per.playerPerimeters.Add(pp);
perimeters.Add(per);
pIndex = perimeters.Count - 1;
perimeterDict.Add(perimeters[pIndex].steamid, pIndex);
}
else {
perimeters[pIndex].playerPerimeters.Add(pp);
}
}
}
}
void convertOldAuthObjs(OldAuthObjectDict oldAuthObj) {
//Puts("Converting auths");
var steamIDs = oldAuthObj.authorised.Keys.ToArray();
for (int i = 0; i < steamIDs.Length; i++) {
//Puts(steamIDs[i]);
Auth a = new Auth();
a.steamid = Convert.ToUInt64(steamIDs[i]);
a.name = oldAuthObj.authNames[steamIDs[i]];
a.level = Convert.ToInt32(oldAuthObj.authorised[steamIDs[i]]);
authList.Add(a);
authDict.Add(a.steamid, authList.Count - 1);
}
}
void convertOldIgnoresObjs(OldIgnoresObjectDict oldIgnoresObj) {
//Puts("Converting ignores");
var keyArray = oldIgnoresObj.ignores.Keys.ToArray();
for (int i = 0; i < keyArray.Length; i++) {
IgnoreListEntry ie = new IgnoreListEntry();
ie.steamid = Convert.ToUInt64(keyArray[i]);
var pKeyArray = oldIgnoresObj.ignores[keyArray[i]].Keys.ToArray();
for (int p = 0; p < pKeyArray.Length; p++) {
IgnoredPlayer ip = new IgnoredPlayer();
ip.steamid = Convert.ToUInt64(pKeyArray[p]);
ip.name = oldIgnoresObj.ignores[keyArray[i]][pKeyArray[p]];
ie.ignores.Add(ip);
}
ignoreList.Add(ie);
ignoreDict.Add(ie.steamid, ignoreList.Count - 1);
}
}
void convertOldMuteList(OldMuteList oldMuteList) {
var steamIDs = oldMuteList.muted.Keys.ToArray();
//Puts("Converting mute list");
for (int i = 0; i < oldMuteList.muted.Count; i++) {
muteList.Add(Convert.ToUInt64(steamIDs[i]));
}
}
void convertOldValObjs(OldValidatedObjectDict oldValObj) {
//Puts("Converting validations");
var steamIDs = oldValObj.validated.Keys.ToArray();
for (int i = 0; i < steamIDs.Length; i++) {
validated.Add(Convert.ToUInt64(steamIDs[i]));
}
}
int countPerimeters(ulong steamid) {
int cnt = 0;
if (perimeterDict.ContainsKey(steamid)) {
return perimeters[perimeterDict[steamid]].playerPerimeters.Count;
}
return cnt;
}
double currentTime() {
return System.DateTime.UtcNow.Subtract(epoch).TotalSeconds;
}
void deletePerimeter(BasePlayer player, string[] args) {
if (args.Length > 1) {
int perimeterIndex = getPerimeterIndex(player.userID);
if (perimeterIndex == -1) {
SendReply(player, "You have no perimeters to delete.Do /rs set <name> to create one.");
}
if (perimeters[perimeterIndex].playerPerimeters.Count == 0) {
SendReply(player, "You have no perimeters to delete.Do /rs set <name> to create one.");
}
else {
int index;
try {
index = Convert.ToInt32(args[1]);
}
catch (Exception e) {
SendReply(player, "Invalid index.Do /rs view to get a valid index.");
return;
}
bool inProgress = false;
if (isInProgress(player.userID)) {
inProgress = true;
for (int i = 0; i < drawList.Count; i++) {
if (drawList[i].basePlayer.userID == player.userID) {
if (drawList[i].playerPerimeterIndex != index - 1) {
SendReply(player, "You have a perimeter in progress.Complete or cancel it first.");
return;
}
}
}
}
if (index > perimeters[perimeterIndex].playerPerimeters.Count || index < 0) {
SendReply(player, "Invalid index.Do /rs view to get a valid index.");
return;
}
SendReply(player, "Removed " + perimeters[perimeterIndex].playerPerimeters[index - 1].name + " from your perimeter list.");
if (inProgress) {
stopDrawing(player);
}
perimeters[perimeterIndex].playerPerimeters.RemoveAt(index - 1);
}
}
else {
SendReply(player, "Enter a perimeter index to delete.");
}
}
void delUser(BasePlayer player, string[] args) {
int argIndexDelta = 0;
if (player != null) {
argIndexDelta = 1;
}
int index = -1;
if (args.Length > argIndexDelta) {
try {
index = Convert.ToInt32(args[argIndexDelta]);
}
catch (Exception e) {
if (player != null) {
SendReply(player, "Invalid index entered.Do /rs auths for a list of authorised users, and their indices.");
}
else {
Puts("Invalid index entered.Do rs.auths for a list of authorised users, and their indices.");
}
return;
}
}
if (index < 1 || index > authList.Count) {
if (player != null) {
SendReply(player, "Invalid index entered.Do /rs auths for a list of authorised users, and their indices.");
}
else {
Puts("Invalid index entered.Do rs.auths for a list of authorised users, and their indices.");
}
return;
}
string name = authList[index - 1].name;
ulong steamid = authList[index - 1].steamid;
int level = authList[index - 1].level;
string levelText = "";
if (level == 0) {
levelText = "Basic User ";
}
if (level == 1) {
levelText = "Privileged User ";
}
if (level == 2) {
levelText = "Raid Alert Admin ";
}
if (player != null) {
if (steamid == player.userID) {
SendReply(player, "You cannot remove yourself.");
return;
}
}
authList.RemoveAt(index - 1);
hashAuths();
for (int i = 0; i < allBasePlayer.Count; i++) {
if (allBasePlayer[i].userID == steamid) {
SendReply(allBasePlayer[i], "You have been removed from the authorised users list.");
}
}
if (player != null) {
SendReply(player, levelText + name + " " + steamid.ToString() + " has been removed from the authorised users list.");
}
else {
Puts(levelText + name + " " + steamid.ToString() + " has been removed from the authorised users list.");
}
}
Point doFacesJoinTogether(List<Point> perimeterPoints, int facesIndex2, List<Face> faces) {
double delta = 0.5;
Point nextPnt = new Point();
int cnt = perimeterPoints.Count - 1;
if (Math.Abs(perimeterPoints[cnt].x - faces[facesIndex2].sx) < delta) {
if (Math.Abs(perimeterPoints[cnt].y - faces[facesIndex2].sy) < delta) {
nextPnt.x = faces[facesIndex2].ex;
nextPnt.y = faces[facesIndex2].ey;
return nextPnt;
}
}
if (Math.Abs(perimeterPoints[cnt].x - faces[facesIndex2].ex) < delta) {
if (Math.Abs(perimeterPoints[cnt].y - faces[facesIndex2].ey) < delta) {
nextPnt.x = faces[facesIndex2].sx;
nextPnt.y = faces[facesIndex2].sy;
return nextPnt;
}
}
//if (Math.Abs(faces[facesIndex].ex - faces[facesIndex2].sx) < 0.1)
//{
// if (Math.Abs(faces[facesIndex].ey - faces[facesIndex2].sy) < 0.1)
// {
// nextPnt.x = faces[facesIndex2].ex;
// nextPnt.y = faces[facesIndex2].ey;
// return nextPnt;
// }
//}
//if (Math.Abs(faces[facesIndex].ex - faces[facesIndex2].ex) < 0.1)
//{
// if (Math.Abs(faces[facesIndex].ey - faces[facesIndex2].ey) < 0.1)
// {
// nextPnt.x = faces[facesIndex2].sx;
// nextPnt.y = faces[facesIndex2].sy;
// return nextPnt;
// }
//}
nextPnt.x = -65535;
nextPnt.y = -65535;
return nextPnt;
}
bool doFacesOverlap(int facesIndex, int facesIndex2, List<Face> faces) {
double pntX, pntY, pntX2, pntY2;
double pnt2X, pnt2Y, pnt2X2, pnt2Y2;
pntX = faces[facesIndex].sx;
pntY = faces[facesIndex].sy;
pntX2 = faces[facesIndex].ex;
pntY2 = faces[facesIndex].ey;
pnt2X = faces[facesIndex2].sx;
pnt2Y = faces[facesIndex2].sy;
pnt2X2 = faces[facesIndex2].ex;
pnt2Y2 = faces[facesIndex2].ey;
//Puts(pntX.ToString() + "," + pntY.ToString()+ "," + pntX2.ToString() + "," + pntY2.ToString() + "," + pnt2X.ToString() + "," + pnt2Y.ToString() + "," + pnt2X2.ToString() + "," + pnt2Y2.ToString());
if (Math.Abs(pntX - pnt2X) < 0.1) {
if (Math.Abs(pntY - pnt2Y) < 0.1) {
if (Math.Abs(pntX2 - pnt2X2) < 0.1) {
if (Math.Abs(pntY2 - pnt2Y2) < 0.1) {
return true;
}
}
}
}
if (Math.Abs(pntX - pnt2X2) < 0.1) {
if (Math.Abs(pntY - pnt2Y2) < 0.1) {
if (Math.Abs(pntX2 - pnt2X) < 0.1) {
if (Math.Abs(pntY2 - pnt2Y) < 0.1) {
return true;
}
}
}
}
return false;
}
void drawFaces(BasePlayer player, List<Face> faces, double height) {
//Puts("Drawing " + faces.Count.ToString() + " faces!");
int persistSeconds = 10;
Vector3 lastPos;
Vector3 thisPos;
height += 1;
int triCount = 1;
float delta = 0;
for (int f = 0; f < faces.Count; f++) {
delta +=.025f;
lastPos = new Vector3();
thisPos = new Vector3();
lastPos.x = (float)faces[f].sx;
lastPos.z = (float)faces[f].sy;
thisPos.x = (float)faces[f].ex;
thisPos.z = (float)faces[f].ey;
UnityEngine.Color col;
lastPos.y = (float)height + delta;
thisPos.y = (float)height + delta;
col = UnityEngine.Color.red;
player.SendConsoleCommand("ddraw.arrow", persistSeconds, col, lastPos, thisPos, 0.25);
}
}
void drawPerimeterPoints(BasePlayer player, List<Point> perimeterPoints, double height) {
//Puts("Drawing perimeter points!");
int persistSeconds = 10;
Vector3 lastPos;
Vector3 thisPos;
height += perimeterHeightDelta;
for (int p = 0; p < perimeterPoints.Count - 1; p++) {
lastPos = new Vector3();
thisPos = new Vector3();
// ... [Code preview truncated due to length. Full source in attached file] ...