Как обратить условие в C# скрипте?
Добрый день есть скрипт на игровом сервере, я не использую visual studio, а отлаживаю прямо на сервере встроенным компилятором. Смысл скрипта в том, что бы блокировать использование некоторых предметов пока не наступила определенная дата в переменной DeniedInvtims
то есть пока дата не наступила, то предметы указанные в void OnGetClientMove
списком if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Torch") ?? false))
Дело в том, что это список разрешенных предметов. То есть скрипт устроен так, что бы блокировать все предметы кроме тех что указаны в списке. Я долго думал, как обратить условие.
Пробовал убирать ! в inv.activeItem? в каждом условии предмета. что бы сделать таким образом список запрещенных предметов. Но как тогда указать скрипту, что бы он не блокировал все а только указанные?
Сам скрипт:
using System;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Libraries;
using RustExtended;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Blockpredmet", "misvor", 1.0)]
class Blockpredmet : RustLegacyPlugin
{
IInventoryItem item;
private Core.Configuration.DynamicConfigFile DeniedInv;
DateTime DeniedInvtims = new DateTime(2020, 07, 17, 03, 00, 00); //(Год,Месяц,День,Час,Минуты,Секунды)
DateTime outputDateTimeValue;
bool hasAccess(NetUser netuser, string permissionname)
{
if (netuser.CanAdmin()) return true;
else if (permission.UserHasPermission(netuser.playerClient.userID.ToString(), "Admin"))
{
return true;
}
return permission.UserHasPermission(netuser.playerClient.userID.ToString(), permissionname);
}
void LoadData()
{
DeniedInv = Interface.GetMod().DataFileSystem.GetDatafile("Deniedinvconfig");
}
void SaveData()
{
Interface.GetMod().DataFileSystem.SaveDatafile("Deniedinvconfig");
}
void OnGetClientMove(HumanController сontroller, Vector3 newPos)
{
DateTime CurTime = DateTime.Now;
if (CurTime<=DeniedInvtims)
{
System.TimeSpan fulltime = DeniedInvtims.Subtract(CurTime);
var netuser = сontroller.netUser;
var inv = netuser.playerClient.rootControllable.idMain.GetComponent<Inventory>();
//Разрешенные предметы
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Torch") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Rock") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Pipe") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Hatchet") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Bow") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Axe") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Revolver") ?? false))
//if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("M4") ?? false))
//if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("MP5A4") ?? false))
//if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Shotgun") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Pipe Shotgun") ?? false))
//if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("P250") ?? false))
//if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Bolt Action Rifle") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wall") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Pillar") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Foundation") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Doorway") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Window") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Stairs") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Ramp") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Ceiling") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Box") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Spike") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Shelter") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Bed") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Metal Door") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Large Wood Storage") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Furnace") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood Gate") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood Storage Box") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood Bariccade") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wooden Door") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood Gateway") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Repair Bench") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Workbench") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("HandCannon") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("9mm Pistol") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood Barricade") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Wood") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Fire") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("HandCannon") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Bag") ?? false))
if (inv != null && (!inv.activeItem?.datablock?.name?.Contains("Bed") ?? false))
{
if (!hasAccess(netuser, "Admin"))
{
var giveup = DatablockDictionary.GetByName(inv.activeItem.datablock.name);
int giveslot = inv.activeItem.slot;
if (inv.GetItem(giveslot, out item))
{
var mod = item as IHeldItem;
int slot = giveslot;
string name = item.datablock.name.ToString();
int qty = Convert.ToInt32(item.uses);
if (qty == 0) return;
float condition = Convert.ToSingle(item.condition);
string modslots = "";
string mods = "";
if (mod != null)
{
modslots = mod.totalModSlots.ToString();
mods = mod.modFlags.ToString();
}
inv.RemoveItem(giveslot);
IInventoryItem itemmod;
AddItemToSlot(inv, name, slot, qty);
if (inv.GetItem(slot, out itemmod))
{
itemmod.SetCondition(condition);
if (Convert.ToInt32(modslots) != 0)
{
var m = itemmod as IHeldItem;
m.SetTotalModSlotCount(Convert.ToInt32(modslots));
}
}
string giveupe=giveup.ToString();
int dotIndex = giveupe.IndexOfAny(new char[]{ '('});
if (dotIndex >= 0)
{
giveupe = giveupe.Substring(0, dotIndex);
rust.SendChatMessage(netuser, "Блок", string.Format(" Запрещенно использовать " + giveupe + " еще " +Convert.ToInt32(fulltime.TotalMinutes)+ " минут"));
}
}
}
}
}
}
void AddItemToSlot(Inventory inv, string name, int slot, int amount)
{
ItemDataBlock byName = DatablockDictionary.GetByName(name);
if (byName != null)
{
Inventory.Slot.Kind belt = Inventory.Slot.Kind.Default;
if ((slot > 0x1d) && (slot < 0x24))
{
belt = Inventory.Slot.Kind.Belt;
}
else if ((slot >= 0x24) && (slot < 40))
{
belt = Inventory.Slot.Kind.Armor;
}
inv.AddItemSomehow(byName, new Inventory.Slot.Kind?(belt), slot, amount);
}
}
}
}
И можно ли как то указать несколько дат и несколько списков блокирующих предметов? например, что бы одни предметы блокировались до одной даты, а другие уже до другой даты?
Ответы (1 шт):
Если я правильно понял, что inv.activeItem.datablock.name это string, то получается такая функция:
private bool ActiveItemContains(Inventory inventory, string[] items)
{
if (inventory?.activeItem?.datablock?.name is string itemName && itemName?.Length > 0)
{
foreach (string item in items)
{
if (itemName.Contains(item)) return true;
}
}
return false;
}
Только учтите, что string.Contains() возвращает true, если в ней содержится фрагмент, другими словами, если у вас в списке уже есть Wood, то нет никакого смысла туда добавлять Wooden Door, Wood Gateway, и т.д. Либо следует праверять на точное соответствие:
if (itemName.Equals(item)) return true;
или так
if (itemName == item) return true;
А использовать можно вот так:
string[] itemsList = new string[]
{
"Torch", "Rock", "Pipe", "Hatchet", "Bow", "Axe", "Revolver",
// "M4", "MP5A4", "Shotgun",
"Pipe Shotgun",
// "P250", "Bolt Action Rifle",
"Wall", "Pillar", "Foundation", "Doorway", "Window", "Stairs",
"Ramp", "Ceiling", "Box", "Spike", "Shelter", "Bed",
"Metal Door", "Large Wood Storage", "Furnace", "Wood Gate", "Wood Storage Box", "Wood Bariccade",
"Wooden Door", "Wood Gateway", "Repair Bench", "Workbench", "HandCannon", "9mm Pistol",
"Wood Barricade", "Wood", "Fire", "HandCannon", "Bag", "Bed"
};
if (ActiveItemContains(inv, itemsList))
{
...
}
Ну и чтобы обратить условие, можно просто воткнуть в него !
if (!ActiveItemContains(inv, itemsList))
{
...
}