C#:
using Network;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Facepunch;
using UnityEngine;
using UnityEngine.Networking;
using VLB;
namespace Oxide.Plugins
{
[Info("IQAlcoholFarm", "BadMandarin / Support: Mercury", "1.3.34")]
[Description("IQAlcoholFarm")]
internal class IQAlcoholFarm : RustPlugin
{
private Boolean FullLoadedNPC = false;
private const Boolean LanguageEn = true;
private enum CategoryType
{
Equipment,
Exchanger,
}
#region Reference
[PluginReference] private readonly Plugin TruePVE, NextGenPVE, Imperium, StackModifier;
private Boolean IsPVE()
{
return TruePVE != null || NextGenPVE != null || Imperium != null;
}
#endregion
#region Classes
private class DrunkPlayer
{
public UInt64 UserId = 0;
[JsonIgnore] private Boolean _playerFound = false;
[JsonIgnore] private BasePlayer _player;
[JsonIgnore]
public BasePlayer Player
{
get
{
if (_playerFound == false)
{
_player = BasePlayer.activePlayerList.FirstOrDefault(x => x != null && x.userID == UserId);
if (_player != null)
{
_playerFound = true;
}
else
{
_data.DrunkPlayers.Remove(this);
}
}
return _player;
}
}
public String CurrectColor = AlcoholColorGradient[0];
public String CurrectFade = AlcoholBlur[0];
public Single ModifiersUpdate = 0;
public Single DrunkRemaining = 0;
}
#endregion
#region Variables
private static IQAlcoholFarm _plugin;
private static MonumentInfo Compound;
private static MonumentInfo BanditTown;
private static MonumentInfo Airfield;
private const String SignImgLeft = "https://i.postimg.cc/90dJ8Z73/left.png";
private const String SignImgRight = "https://i.postimg.cc/T1MtJChq/right.png";
private readonly List<BaseEntity> MonumentEntities = new List<BaseEntity>();
private class Point
{
public String Name;
public Vector3 Pos;
public Single Y;
public Single X;
public String LinkImage;
}
private readonly Dictionary<String, List<Point>> PointsList = new Dictionary<String, List<Point>>
{
["COMPOUND"] = new List<Point>
{
new Point
{
Name = "NPC.POINT",
Y = 0f,
X = 0f,
Pos = new Vector3(21.7f, 0.3f, 7.4f),
LinkImage = String.Empty,
},
new Point
{
Name = "TABLES.POINT",
Y = -90f,
X = 30f,
Pos = new Vector3(17.9f, 0.3f, 11f),
LinkImage = SignImgLeft,
},
new Point
{
Name = "TABLES.POINT",
Y = 0,
X = 0f,
Pos = new Vector3(3.7f, 3f, 16.2f),
LinkImage = SignImgLeft,
},
},
["BANDIT_TOWN"] = new List<Point>
{
new Point
{
Name = "NPC.POINT",
Y = 180f,
X = 0f,
Pos = new Vector3(-28.8f, 1.78f, 35f),
LinkImage = String.Empty,
},
new Point
{
Name = "TABLES.POINT",
Y = 180f,
X = 0,
Pos = new Vector3(-24.8f, 3.78f, 35.5f),
LinkImage = SignImgLeft,
},
},
["AIRFIELD"] = new List<Point>
{
new Point
{
Name = "NPC.POINT",
Y = 200f,
X = 0f,
Pos = new Vector3(-10.5f, 3.31f, -93.3f),
LinkImage = String.Empty,
},
new Point
{
Name = "TABLES.POINT",
Y = 0f,
X = 0f,
Pos = new Vector3(-7.5f, 2.8f, -75.8f),
LinkImage = SignImgLeft,
},
new Point
{
Name = "TABLES.POINT",
Y = -90f,
X = 0f,
Pos = new Vector3(-0.86f, 4.5f, -92f),
LinkImage = SignImgLeft,
},
new Point
{
Name = "TABLES.POINT",
Y = -30f,
X = 30f,
Pos = new Vector3(-59.3f, 0.3f, -72.7f),
LinkImage = SignImgLeft,
},
new Point
{
Name = "TABLES.POINT",
Y = 180f,
X = 13f,
Pos = new Vector3(-154.5f, 0.22f, -76.8f),
LinkImage = SignImgRight,
},
},
};
private const String AlcoholConsumeEffect = "assets/bundled/prefabs/fx/gestures/drink_vomit.prefab";
private const String AlcoholWortProcessEffect = "assets/bundled/prefabs/fx/animals/flies/flies_medium.prefab";
private readonly String[] AlcoholShakeEffect = new[]
{
"assets/bundled/prefabs/fx/takedamage_generic.prefab",
"assets/bundled/prefabs/fx/screen_land.prefab",
"assets/bundled/prefabs/fx/screen_jump.prefab",
"assets/prefabs/tools/jackhammer/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/cake/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/halloween/butcher knife/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/halloween/pitchfork/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/halloween/sickle/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/hatchet/effects/strike_screenshake.prefab",
"assets/prefabs/weapons/knife/effects/strike_screenshake.prefab",
"assets/bundled/prefabs/fx/player/drown.prefab",
};
private static readonly String[] AlcoholColorGradient = new[]
{
"#FFFFFF",
"#F7D358",
"#FAAC58",
"#FA8258",
"#FA5858",
"#B40404",
};
private static readonly String[] AlcoholBlur = new[]
{
"0 0 0 0.05",
"0 0 0 0.07",
"0 0 0 0.10",
"0 0 0 0.12",
"0 0 0 0.15",
"0 0 0 0.2",
};
#region SoundList
public Dictionary<String, List<Byte[]>> RenderSounds = new Dictionary<string, List<byte[]>>()
{
["welcome"] = new List<byte[]> { },
["bye"] = new List<byte[]> { },
};
private void GetSounds()
{
if (!_config.UseNPCSounds) return;
timer.Once(3f, () =>
{
if (RenderSounds.Values != null && RenderSounds.Values.Count != 0) return;
PrintWarning(LanguageEn ? "Loading sounds.." : "Загружаем звуки..");
try
{
webrequest.Enqueue($"https://iqsystem.skyplugins.ru/iqalcohol/getsound/W5fgSD3dfVBxc", null, (code, response) =>
{
switch (code)
{
case 404:
{
PrintError($"ERROR #63445485 {response} | ERROR #:545445 (Discord - Mercury#5212)");
_initiated = false;
break;
}
case 503:
{
PrintError($"ERROR #45445 Your plugin version is outdated!Upgrade to the latest version! (Discord - Mercury#5212)");
_initiated = false;
break;
}
case 200:
{
Dictionary<String, List<Byte[]>> obj = JsonConvert.DeserializeObject<Dictionary<String, List<Byte[]>>>(response);
RenderSounds = obj;
WriteData();
PrintWarning(LanguageEn ? "Successful data acquisition" : "Звук успешно создан!");
break;
}
default:
{
PrintWarning($"HTTP {code}: Failed to load sounds. Continuing without sounds...");
_initiated = true; // Continue initialization without sounds
break;
}
}
}, this, RequestMethod.GET);
}
catch (Exception e)
{
PrintError($"ERROR #8573 Network error while loading sounds: {e.Message}");
PrintWarning("Continuing without sounds...");
_initiated = true; // Continue initialization without sounds
}
PrintWarning(LanguageEn ? "Sounds uploaded successfully.." : "Звуки загружены успешно..");
});
}
#endregion
#endregion
#region OxideHooks
private void Init() => ReadData();
private void OnPluginUnloaded(Plugin name)
{
if (StackModifier != null && name.Name == StackModifier.Name)
{
Subscribe(nameof(OnItemSplit));
Subscribe(nameof(CanCombineDroppedItem));
Subscribe(nameof(CanStackItem));
Subscribe(nameof(OnItemAddedToContainer));
Subscribe(nameof(OnItemRemovedFromContainer));
}
}
private void OnPluginLoaded(Plugin name)
{
if (StackModifier != null && name.Name == StackModifier.Name)
{
Unsubscribe(nameof(OnItemSplit));
Unsubscribe(nameof(CanCombineDroppedItem));
Unsubscribe(nameof(CanStackItem));
Unsubscribe(nameof(OnItemAddedToContainer));
Unsubscribe(nameof(OnItemRemovedFromContainer));
}
}
private void OnServerInitialized()
{
if (StackModifier is { IsLoaded: true })
{
Unsubscribe(nameof(OnItemSplit));
Unsubscribe(nameof(CanCombineDroppedItem));
Unsubscribe(nameof(CanStackItem));
Unsubscribe(nameof(OnItemAddedToContainer));
Unsubscribe(nameof(OnItemRemovedFromContainer));
}
_plugin = this;
BanditTown = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("bandit_town"));
Compound = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("compound"));
Airfield = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("airfield"));
if (_config.itemSettings.AlcoholBottleSkinId == 0)
{
Unsubscribe(nameof(OnItemAddedToContainer));
Unsubscribe(nameof(OnItemRemovedFromContainer));
}
if (IsPVE())
Unsubscribe(nameof(OnEntityTakeDamage));
StartPluginLoad();
}
private void OnServerSave()
{
PluginData.SaveData();
}
private void Unload()
{
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQAlcoholFarm/CustomPosNPC", CustomPosNPC, true);
PluginData.SaveData();
DestroyControllers();
lootPlayerContainers.Clear();
if (_data is { DrunkPlayers: not null })
{
for (Int32 i = _data.DrunkPlayers.Count - 1; i >= 0; i--)
{
DrunkPlayer drunkPlayer = _data.DrunkPlayers[i];
if (drunkPlayer != null && drunkPlayer.Player != null)
DestroyAllUi(drunkPlayer.Player);
}
_data.DrunkPlayers.Clear();
}
foreach(CustomNpcController npcController in NPCList)
UnityEngine.Object.DestroyImmediate(npcController);
foreach (BaseEntity ent in MonumentEntities.Where(x => !x.IsDestroyed))
ent.Kill();
InterfaceBuilder.DestroyAll();
ImageUi.Unload();
MonumentEntities.Clear();
BanditTown = null;
Compound = null;
Airfield = null;
_plugin = null;
}
object OnItemAction(Item item, string action, BasePlayer player)
{
if(action.Equals("consume") && item.skin != 0)
foreach(PluginConfig.ShopStore.CategorySettings.ItemsPair ItemPair in _config.storeNpc.EquipmentCategory.ItemsList)
if (ItemPair.BuyItems.SkinID == item.skin && ItemPair.BuyItems.Shortname.Equals(item.info.shortname))
return false;
return null;
}
private System.Object CanBradleyApcTarget(BradleyAPC apc, BaseEntity entity)
{
if (_initiated == false)
return null;
if (apc == null || entity == null) return null;
foreach (BradleyAPC.TargetInfo Targets in apc.targetList.Where(ent => ent.entity != null && ent.entity.OwnerID == 199949458))
NextTick(() => { apc.targetList.Remove(Targets); });
return null;
}
private System.Object OnNpcTarget(BaseAnimalNPC animal, BasePlayer target)
{
if (_initiated == false)
return null;
if (animal == null || target == null) return null;
if (target.OwnerID == 199949458)
return false;
return null;
}
private System.Object CanLootEntity(BasePlayer player, StorageContainer container)
{
if (_initiated == false)
return null;
if (container.skinID == 23129547)
{
DrawUI_Trade_Main(player);
return false;
}
return null;
}
private System.Object OnEntityTakeDamage(BaseEntity entity, HitInfo info)
{
if (_initiated == false)
return null;
if (info == null || entity == null)
return null;
if (entity.OwnerID == 199949458) return false;
return null;
}
private void OnPlayerDisconnected(BasePlayer player, String reason)
{
if (_initiated == false)
return;
_data.DrunkPlayers.RemoveAll(x => x.Player.userID == player.userID);
DestroyAllUi(player);
}
private Item OnItemSplit(Item item, int amount)
{
if (_initiated == false)
return null;
if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
if(item.info.shortname == "smallwaterbottle" && _config.itemSettings.AlcoholBottleSkinId == item.skin)
{
Item x = ItemManager.CreateByPartialName(item.info.shortname, amount);
x.skin = _config.itemSettings.AlcoholBottleSkinId;
x.amount = amount;
item.amount -= amount;
item.MarkDirty();
return x;
}
if (item.info.shortname == _config.BarrelItem.ShortName && _config.BarrelItem.SkinId == item.skin)
{
Item x = ItemManager.CreateByPartialName(item.info.shortname, amount);
x.name = _config.BarrelItem.DisplayName;
x.skin = _config.BarrelItem.SkinId;
x.amount = amount;
item.amount -= amount;
item.MarkDirty();
return x;
}
return null;
}
object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
{
if (_initiated == false)
return null;
if (item.GetItem().skin != targetItem.GetItem().skin) return false;
return null;
}
object CanStackItem(Item item, Item targetItem)
{
if (_initiated == false)
return null;
if (item.skin != targetItem.skin) return false;
return null;
}
private void OnPlayerDeath(BasePlayer player, HitInfo info)
{
if (_initiated == false)
return;
_data.DrunkPlayers.RemoveAll(x => x.Player.userID == player.userID);
DestroyAllUi(player);
}
private void OnEntitySpawned(WaterPurifier entity)
{
if (_initiated == false)
return;
if (entity is PoweredWaterPurifier)
return;
entity.maxStackSize = _config.fermentationSettings.PurifierCapacity;
}
private void OnEntityBuilt(Planner plan, GameObject go)
{
if (_initiated == false)
return;
BaseEntity entity = go.ToBaseEntity();
if (entity == null)
return;
if (entity.skinID == _config.BarrelItem.SkinId)
{
SetupBarrel(entity);
return;
}
}
private void SetupBarrel(BaseEntity entity)
{
BaseEntity stashEntity = GameManager.server.CreateEntity("assets/prefabs/deployable/small stash/small_stash_deployed.prefab");
if (stashEntity == null)
{
PrintError("Failed to spawn small stash on barrel!");
return;
}
stashEntity.Spawn();
stashEntity.SetParent(entity, false);
stashEntity.transform.localPosition += new Vector3(-0.365f, 1.14f, 0.42f);
stashEntity.transform.localRotation = Quaternion.Euler(new Vector3(90f, 0f, 0));
entity.gameObject.AddComponent<BarrelController>();
}
private object OnWireConnect(BasePlayer player, IOEntity entity1, Int32 inputs, IOEntity entity2, Int32 outputs)
{
if (_initiated == false)
return null;
LiquidContainer liquid1 = entity1 as LiquidContainer;
if (liquid1 != null)
{
Item item1 = liquid1.inventory.GetSlot(0);
if (item1 != null && item1.skin != 0)
return false;
}
LiquidContainer liquid2 = entity2 as LiquidContainer;
if (liquid2 != null)
{
Item item2 = liquid2.inventory.GetSlot(0);
if (item2 != null && item2.skin != 0)
return false;
}
if (BarrelController.ActiveControllersIds.Exists(x => x == entity1.net.ID.Value || x == entity2.net.ID.Value))
return false;
return null;
}
private Dictionary<UInt64, BasePlayer> lootPlayerContainers = new Dictionary<UInt64, BasePlayer>();
void OnLootEntity(BasePlayer player, IOEntity entity) => lootPlayerContainers[entity.net.ID.Value] = player;
private ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, Int32 targetPos)
{
if (_initiated == false)
return null;
Item item1 = container.GetSlot(0);
if (item.skin != 0 && (item.info.shortname.Equals("water") || item.info.shortname.Equals("water.salt")))
{
if (container.GetEntityOwner() is IOEntity ioEntity)
{
lootPlayerContainers.TryGetValue(ioEntity.net.ID.Value, out BasePlayer player);
foreach (IOEntity.IOSlot ioInptut in ioEntity.inputs)
{
if (ioInptut.connectedTo.Get())
{
if (player)
SendReply(player, GetLang("CHAT_MESSAGE_NO_CONNECTED_WIRE", player.UserIDString));
return ItemContainer.CanAcceptResult.CannotAccept;
}
}
foreach (IOEntity.IOSlot ioOutput in ioEntity.outputs)
{
if (ioOutput.connectedTo.Get())
{
if (player)
SendReply(player, GetLang("CHAT_MESSAGE_NO_CONNECTED_WIRE", player.UserIDString));
return ItemContainer.CanAcceptResult.CannotAccept;
}
}
}
}
if (container.GetEntityOwner() != null && container.GetEntityOwner() is PaddlingPool)
{
if(item.skin != 0)
return ItemContainer.CanAcceptResult.CannotAccept;
}
if (item1 != null && item.info.shortname.Equals("water") && item1.info.shortname.Equals("water") &&
item1.skin != 0 && item.skin == 0)
{
return ItemContainer.CanAcceptResult.CannotAccept;
}
if (item1 != null && item.info.shortname.Equals("water.salt") && item1.info.shortname.Equals("water.salt") &&
item1.skin != 0 && item.skin == 0)
{
return ItemContainer.CanAcceptResult.CannotAccept;
}
if (item.skin != _config.itemSettings.AlcoholItemSkinId && item.skin != _config.itemSettings.WortItemSkinId)
{
return null;
}
return null;
}
private System.Object OnWaterPurify(WaterPurifier waterPurifier, Single timeCooked)
{
if (_initiated == false)
return null;
Item item = waterPurifier.inventory.GetSlot(0);
if (item == null)
return null;
if (item.skin == _config.itemSettings.AlcoholItemSkinId)
return false;
if (item.skin != _config.itemSettings.WortItemSkinId)
{
Item outputItem = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
if (outputItem != null && outputItem.skin != 0)
return false;
return null;
}
ConvertWort(waterPurifier, timeCooked);
return false;
}
private System.Object OnWaterCollect(WaterCatcher waterCatcher)
{
if (_initiated == false)
return null;
Item item = waterCatcher.inventory.GetSlot(0);
if (item == null)
return null;
if (item.skin == _config.itemSettings.AlcoholItemSkinId || item.skin == _config.itemSettings.WortItemSkinId)
{
return false;
}
return null;
}
private System.Object OnLiquidVesselFill(BaseLiquidVessel liquidVessel, BasePlayer player, LiquidContainer facingLiquidContainer)
{
if (_initiated == false)
return null;
Item item = liquidVessel.GetItem()?.contents?.GetSlot(0);
if (item == null)
return null;
if (item.skin == _config.itemSettings.AlcoholItemSkinId || item.skin == _config.itemSettings.WortItemSkinId)
{
return false;
}
return null;
}
private System.Object CanHideStash(BasePlayer player, StashContainer stash)
{
if (_initiated == false)
return null;
if (BarrelController.ActiveControllers.Exists(x => x.GetStashId() == stash.net.ID.Value))
return false;
return null;
}
private void ConvertWort(WaterPurifier waterPurifier, Single timeCooked)
{
if (_initiated == false)
return;
Item storageSlot = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
if (storageSlot != null && storageSlot.amount >= waterPurifier.purifiedWaterStorage.maxStackSize)
return;
Single single = timeCooked * (_config.fermentationSettings.PurifierProcessTick / 60f);
waterPurifier.dirtyWaterProcssed += single;
if (waterPurifier.dirtyWaterProcssed >= 1f)
{
Item item = waterPurifier.inventory.GetSlot(0);
Int32 num = Mathf.Min(Mathf.FloorToInt(waterPurifier.dirtyWaterProcssed), item.amount);
single = num;
item.amount -= num;
if (item.amount <= 0)
{
item.RemoveFromContainer();
item.Remove();
}
item.MarkDirty();
waterPurifier.dirtyWaterProcssed -= num;
waterPurifier.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
waterPurifier.pendingFreshWater = waterPurifier.pendingFreshWater + single / _config.fermentationSettings.PurifierProcessRatio;
if (waterPurifier.pendingFreshWater >= 1f)
{
Int32 num1 = Mathf.FloorToInt(waterPurifier.pendingFreshWater);
waterPurifier.pendingFreshWater -= num1;
storageSlot = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
if (storageSlot != null && storageSlot.skin != _config.itemSettings.AlcoholItemSkinId)
{
storageSlot.RemoveFromContainer();
storageSlot.Remove(0f);
}
if (storageSlot != null)
{
storageSlot.amount += num1;
storageSlot.amount = Mathf.Clamp(storageSlot.amount, 0, waterPurifier.purifiedWaterStorage.maxStackSize);
waterPurifier.purifiedWaterStorage.inventory.MarkDirty();
}
else
{
//old water //TODO:!
Item item1 = ItemManager.CreateByName("water.salt", num1, _config.itemSettings.AlcoholItemSkinId);
if (!item1.MoveToContainer(waterPurifier.purifiedWaterStorage.inventory, -1, true, false))
{
item1.Remove(0f);
}
}
waterPurifier.purifiedWaterStorage.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
}
private void OnItemAddedToContainer(ItemContainer container, Item item)
{
if (_initiated == false)
return;
if (container == null)
return;
if (container.parent == null)
return;
if (item.skin != _config.itemSettings.AlcoholItemSkinId)
return;
if (container.parent.info.shortname != "smallwaterbottle")
return;
container.parent.skin = _config.itemSettings.AlcoholBottleSkinId;
}
private void OnItemRemovedFromContainer(ItemContainer container, Item item)
{
if (_initiated == false)
return;
if (item.skin != _config.itemSettings.AlcoholItemSkinId)
return;
if (container == null)
return;
if (container.parent == null)
return;
if (container.parent.skin != _config.itemSettings.AlcoholBottleSkinId)
return;
container.parent.skin = 0;
}
private System.Object OnPlayerAddModifiers(BasePlayer player, Item item, ItemModConsumable consumable)
{
if (item.skin == _config.itemSettings.AlcoholItemSkinId)
{
Int32 oldAmount = item.amount;
NextTick(() =>
{
Int32 consumed = Math.Abs(item.amount - oldAmount);
OnAlcoholDrink(player, item, consumed);
});
return false;
}
if (item.skin == _config.itemSettings.WortItemSkinId)
{
ExecuteNegativeEffect(player);
return false;
}
return null;
}
private void OnAlcoholDrink(BasePlayer player, Item item, Int32 amountToUse)
{
if (_initiated == false)
return;
Single time = (amountToUse * _config.drinkedSettings.AlcoholDrinkTime) / _config.drinkedSettings.AlcoholDrinkAmount;
DrunkPlayer drunkPlayer = _data.DrunkPlayers.Find(x => x.Player.userID == player.userID);
if (drunkPlayer == null)
{
drunkPlayer = new DrunkPlayer
{
UserId = player.userID
};
drunkPlayer.DrunkRemaining += 5f;
_data.DrunkPlayers.Add(drunkPlayer);
DrawUI_DrunkBlock(player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
if (_data.DrunkPlayers.Count == 1)
ServerMgr.Instance.StartCoroutine(PlayersUpdate());
}
Int32 index = GetIndexFromGradient(AlcoholColorGradient.Length, (Int32)drunkPlayer.DrunkRemaining, (Int32)_config.drinkedSettings.AlcoholDrinkLimit);
String color = AlcoholColorGradient[index];
if (color != drunkPlayer.CurrectColor)
{
drunkPlayer.CurrectColor = color;
DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
}
color = AlcoholBlur[index];
if (color != drunkPlayer.CurrectFade)
{
drunkPlayer.CurrectFade = color;
DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
}
drunkPlayer.DrunkRemaining += time;
DrawUI_DrunkTimer(player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
UpdateModifiers(drunkPlayer);
if (drunkPlayer.DrunkRemaining >= _config.drinkedSettings.AlcoholDrinkLimit)
{
drunkPlayer.Player.modifiers.RemoveAll();
ExecuteNegativeEffect(player);
}
}
private void UpdateModifiers(DrunkPlayer drunkPlayer)
{
List<ModifierDefintion> modifiersToAdd = new List<ModifierDefintion>();
for (Int32 i = 0; i < _config.ModifierDefintions.Count; i++)
{
ModifierDefintionConfig modif = _config.ModifierDefintions[i];
if (modif.MinTime > drunkPlayer.DrunkRemaining)
continue;
if (drunkPlayer.ModifiersUpdate < modif.MinTime)
drunkPlayer.ModifiersUpdate = modif.MinTime;
ModifierDefintion modifDef = modif.GetDef();
modifDef.duration = drunkPlayer.DrunkRemaining;
modifiersToAdd.Add(modifDef);
}
if (modifiersToAdd.Count < 1)
return;
drunkPlayer.Player.modifiers.Add(modifiersToAdd);
}
private void ExecuteNegativeEffect(BasePlayer player)
{
Vector3 vector3 = (player.IsDucked() ? new Vector3(0f, 1f, 0f) : new Vector3(0f, 2f, 0f));
EffectNetwork.Send(new Effect(AlcoholConsumeEffect, player, 0, vector3, Vector3.zero, null), player.net.connection);
EffectNetwork.Send(new Effect(AlcoholShakeEffect.GetRandom(), vector3, Vector3.zero), player.net.connection);
player.Hurt(_config.drinkedSettings.AlcoholDrunkNegativeDamage);
player.metabolism.calories.Subtract(_config.drinkedSettings.AlcoholDrunkNegativeCalories);
player.metabolism.hydration.Subtract(_config.drinkedSettings.AlcoholDrunkNegativeHydration);
}
private IEnumerator PlayersUpdate(Boolean afterReload = false)
{
while (_data.DrunkPlayers.Count > 0)
{
try
{
for (Int32 i = _data.DrunkPlayers.Count - 1; i >= 0; i--)
{
DrunkPlayer drunkPlayer = _data.DrunkPlayers[i];
if (--drunkPlayer.DrunkRemaining <= 0)
{
_data.DrunkPlayers.Remove(drunkPlayer);
DestroyAllUi(drunkPlayer.Player);
continue;
}
if (afterReload)
{
DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
}
Int32 index = GetIndexFromGradient(AlcoholColorGradient.Length, (Int32)drunkPlayer.DrunkRemaining, (Int32)_config.drinkedSettings.AlcoholDrinkLimit);
String color = AlcoholColorGradient[index];
if (color != drunkPlayer.CurrectColor)
{
drunkPlayer.CurrectColor = color;
DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
}
color = AlcoholBlur[index];
if (color != drunkPlayer.CurrectFade)
{
drunkPlayer.CurrectFade = color;
DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
}
if (drunkPlayer.DrunkRemaining >= _config.drinkedSettings.AlcoholDrinkLimit)
{
if (Core.Random.Range(0, 100) <= _config.drinkedSettings.AlcoholDrunkNegativeChance)
ExecuteNegativeEffect(drunkPlayer.Player);
}
else
{
drunkPlayer.Player.Heal(_config.drinkedSettings.AlcoholDrunkHeal);
}
if (drunkPlayer.ModifiersUpdate > drunkPlayer.DrunkRemaining)
UpdateModifiers(drunkPlayer);
drunkPlayer.Player.metabolism.temperature.SetValue(40f);
DrawUI_DrunkTimer(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
if (Core.Random.Range(0, 100) <= _config.RareEffect)
EffectNetwork.Send(new Effect(AlcoholShakeEffect.GetRandom(), drunkPlayer.Player.transform.position, Vector3.zero), drunkPlayer.Player.net.connection);
}
}
catch (Exception)
{
//PrintError(e.ToString());
}
afterReload = false;
yield return new WaitForSeconds(1f);
}
yield break;
}
private Int32 GetIndexFromGradient(Int32 length, Int32 amount, Int32 capacity)
{
if (capacity < amount)
amount = capacity;
Int32 index = length * amount / (capacity <= 0 ? 1 : capacity);
if (index == 0) index++;
return index - 1;
}
#endregion
#region Commands
[ConsoleCommand("func.alcohol")]
private void FuncionalCommad(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player == null) return;
String Funcion = arg.Args[0];
switch (Funcion)
{
case "category":
{
String Action = arg.Args[1];
CategoryType Category = (CategoryType)Enum.Parse(typeof(CategoryType), arg.Args[2]);
switch (Action)
{
case "select":
{
DrawUI_ItemPanel(player, Category);
DrawUI_PanelCategory(player, Category);
break;
}
case "page":
{
String ActionPage = arg.Args[3];
Int32 Page = Int32.Parse(arg.Args[4]);
switch (ActionPage)
{
case "next":
{
DrawUI_ItemPanel(player, Category, Page + 1);
break;
}
case "back":
{
DrawUI_ItemPanel(player, Category, Page - 1);
break;
}
}
break;
}
case "selling": //
{
String ActionSelling = arg.Args[3];
Int32 Y = Int32.Parse(arg.Args[4]);
Int32 Page = Int32.Parse(arg.Args[5]);
Int32 Amount = Int32.Parse(arg.Args[6]);
if (Amount == 0) return;
List<PluginConfig.ShopStore.CategorySettings.ItemsPair> CategoryItems = Category == CategoryType.Equipment ? _config.storeNpc.EquipmentCategory.ItemsList : _config.storeNpc.ExchangerCategory.ItemsList;
PluginConfig.ShopStore.CategorySettings.ItemsPair CategoryItem = CategoryItems.Skip(Page * 5).Take(5).ToList()[Y];
switch (ActionSelling)
{
case "amount.next":
{
DrawUI_Items_AmountController(player, Y, CategoryItem, Page, Amount + 1, Category);
break;
}
case "amount.back":
{
if (Amount - 1 <= 0) return;
DrawUI_Items_AmountController(player, Y, CategoryItem, Page, Amount - 1, Category);
break;
}
case "amount.buy":
{
BuyItem(player, CategoryItem, Category, Page, Amount);
break;
}
}
break;
}
}
break;
}
}
}
[ConsoleCommand("barrel.add")]
private void Console_BarrelAdd(ConsoleSystem.Arg arg)
{
if (!arg.IsAdmin) return;
BasePlayer player = arg.Player();
if (arg.Args == null || arg.Args.Length < 1)
{
if (player == null) Puts("Wrong syntax! Usage: barrel.add <SteamID:Name:IP>");
else player.ConsoleMessage("Wrong syntax! Usage: barrel.add <SteamID:Name:IP>");
return;
}
String playerid = arg.Args[0];
BasePlayer basePlayer = BasePlayer.Find(playerid);
if (basePlayer == null)
{
if (player == null) Puts("Error! Player not found!");
else player.ConsoleMessage("Error! Player not found!");
return;
}
Item item = _config.BarrelItem.ToItem();
basePlayer.GiveItem(item);
if (player == null) Puts("Success! Item added to inventory!");
else player.ConsoleMessage("Success! Item added to inventory!");
}
[ConsoleCommand("bottle.add")]
private void Console_BottleAdd(ConsoleSystem.Arg arg)
{
if (!arg.IsAdmin) return;
BasePlayer player = arg.Player();
if (arg.Args == null || arg.Args.Length < 1)
{
if (player == null) Puts("Wrong syntax! Usage: bottle.add <SteamID:Name:IP> [amount]");
else player.ConsoleMessage("Wrong syntax! Usage: bottle.add <SteamID:Name:IP> [amount]");
return;
}
String playerid = arg.Args[0];
Int32 amount = 1;
if (arg.Args.Length > 1)
{
if (!Int32.TryParse(arg.Args[1], out amount) || amount <= 0)
{
if (player == null) Puts("Error! Invalid amount! Must be a positive number.");
else player.ConsoleMessage("Error! Invalid amount! Must be a positive number.");
return;
}
}
BasePlayer basePlayer = BasePlayer.Find(playerid);
if (basePlayer == null)
{
if (player == null) Puts("Error! Player not found!");
else player.ConsoleMessage("Error! Player not found!");
return;
}
// Create alcohol bottle with skin
Item bottle = ItemManager.CreateByName("smallwaterbottle", amount, _config.itemSettings.AlcoholBottleSkinId);
if (bottle != null)
{
// Create alcohol liquid and put it in the bottle
Item alcohol = ItemManager.CreateByName("water.salt", amount * _config.drinkedSettings.AlcoholDrinkAmount, _config.itemSettings.AlcoholItemSkinId);
if (alcohol != null)
{
alcohol.MoveToContainer(bottle.contents);
}
basePlayer.GiveItem(bottle);
}
if (player == null) Puts($"Success! {amount} bottle(s) with alcohol added to inventory!");
else player.ConsoleMessage($"Success! {amount} bottle(s) with alcohol added to inventory!");
}
#endregion
#region Utils
private Boolean IsCompound()
{
return _config.storeNpc.TurnedShop.UseCompound && Compound != null;
}
private Boolean IsBanitTown()
{
return _config.storeNpc.TurnedShop.UseBanditTown && BanditTown != null;
}
private Boolean IsAirfield()
{
return _config.storeNpc.TurnedShop.UseAirfield && Airfield != null;
}
private Boolean IsInitializeNPCShop()
{
Int32 CountSpawn = 0;
if (IsCompound())
CountSpawn++;
if (IsBanitTown())
CountSpawn++;
if (IsAirfield())
CountSpawn++;
return CountSpawn != 0;
}
private String FormatTime(TimeSpan timespan)
{
return String.Format(timespan.TotalHours >= 1 ? "{2:00}:{0:00}:{1:00}" : "{0:00}:{1:00}", timespan.Minutes, timespan.Seconds, System.Math.Floor(timespan.TotalHours));
}
private void InitControllers()
{
foreach (KeyValuePair<NetworkableId, BaseNetworkable> keyValuePair in BaseNetworkable.serverEntities.entityList.Get())
{
BaseNetworkable entity = keyValuePair.Value;
if (entity is LiquidContainer)
{
LiquidContainer cont = ((LiquidContainer)entity);
Item item = cont.inventory.GetSlot(0);
if (item != null && item.skin != 0)
{
cont.ClearConnections();
}
InitBarrel(entity);
}
}
Puts($"Loaded: {BarrelController.ActiveControllers.Count} custom barrels custom purifiers!");
}
private void InitBarrel(BaseNetworkable entity)
{
if (entity is WaterPurifier && ent
// ... [Code preview truncated due to length. Full source in attached file] ...