using Newtonsoft.Json;
using Rust;
using Oxide.Game.Rust.Cui;
using Debug = UnityEngine.Debug;
using System.Text;
using System.Drawing;
using Color = UnityEngine.Color;
using UnityEngine;
using System.Collections.Generic;
using System;
using Facepunch;
using System.Collections;
using VLB;
using Rust.Ai;
using Oxide.Core;
using Oxide.Core.Plugins;
namespace Oxide.Plugins
{
[Info("IQBearRide", "rustmods.ru", "1.1.11")]
[Description("IQBearRide")]
class IQBearRide : RustPlugin
{
void Unload()
{
PluginData.SaveData();
_unloading = true;
InterfaceManager.DestroyAll();
try
{
foreach (var value in _bearControllers)
{
var bearController = value.Value;
if (bearController == null)
continue;
bearController.SetRider(null);
var bear = bearController.BearOwner;
if (bear != null)
{
var data = PluginData.Get(bear.net.ID.Value);
data.Health = bear.Health();
data.LastPosition = bear.transform.position;
bear.Kill();
}
}
_bearControllers.Clear();
}
catch(Exception e)
{
Debug.LogError($"Error in Unload! Message: {e.Message}!\n{e.StackTrace}");
}
PluginData.SaveData();
_plugin = null;
}
[ConsoleCommand("iqbr.teddy")]
private void Console_YoungBearAdd(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player != null && !permission.UserHasPermission(player.UserIDString, PermissionsGiveTeddyBear)) return;
if (arg.Args == null || arg.Args.Length < 1)
{
if(player == null) Puts("Wrong syntax! Usage: iqbr.teddy SteamID:Name:IP");
else player.ConsoleMessage("Wrong syntax! Usage: iqbr.teddy 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;
}
basePlayer.GiveItem(_config.YoungBearItem.ToItem());
if(player == null) Puts("Success! Item added to inventory!");
else player.ConsoleMessage("Success! Item added to inventory!");
}
void OnEntityBuilt(Planner plan, GameObject go)
{
var item = plan.GetItem();
if (item == null)
return;
var entity = go.ToBaseEntity();
if (entity == null)
return;
var player = plan.GetOwnerPlayer();
if (player == null)
return;
var pos = entity.transform.position;
if (_config.BearItem.CompareTo(item))
{
var bear = PluginData.ItemToBear(player.userID, item.uid.Value, pos, false);
NextTick(() => entity.Kill());
return;
}
if (_config.YoungBearItem.CompareTo(item))
{
var bear = PluginData.ItemToBear(player.userID, item.uid.Value, pos, true);
bear.OwnerID = player.userID;
NextTick(() => entity.Kill());
return;
}
}
private string GetImage(string name)
{
string ID = (string)ImageLibrary?.Call("GetImage", name);
if (ID == "")
ID = (string)ImageLibrary?.Call("GetImage", name) ?? ID;
return ID;
}
private PluginConfig GetDefaultConfig()
{
return new PluginConfig
{
BearItem = new CustomItem("Медведь | Bear", "stash.small", 2445048695),
YoungBearItem = new CustomItem("Медвеженок | Teddy bear", "stash.small", 2445033042),
BearDamage = new Dictionary<string, float>()
{
["default"] = 50f,
["player"] = 20f,
},
};
}
void Init()
{
Unsubscribe("OnEntityTakeDamage");
permission.RegisterPermission(PermissionsGiveBear, this);
permission.RegisterPermission(PermissionsGiveTeddyBear, this);
}
[ConsoleCommand("iqbr.bear")]
private void Console_BearAdd(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player != null)
if(!permission.UserHasPermission(player.UserIDString, PermissionsGiveBear)) return;
if (arg.Args == null || arg.Args.Length < 1)
{
if(player == null) Puts("Wrong syntax! Usage: iqbr.bear SteamID:Name:IP");
else player.ConsoleMessage("Wrong syntax! Usage: iqbr.bear 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;
}
basePlayer.GiveItem(_config.BearItem.ToItem());
if(player == null) Puts("Success! Item added to inventory!");
else player.ConsoleMessage("Success! Item added to inventory!");
}
private static bool _unloading = false;
void OnEntitySpawned(BaseCorpse corpse)
{
if (corpse != null && corpse.ShortPrefabName.Contains("bear"))
{
int random = Core.Random.Range(0, 100);
if (random > _config.YoungDropChance)
return;
var def = ItemManager.FindItemDefinition("glue");
ItemAmount itemBonus = new ItemAmount(def, 1f);
corpse.resourceDispenser.finishBonus.Add(itemBonus);
return;
}
}
private void ValidateConfig()
{
if (Interface.Oxide.CallHook("OnConfigValidate") != null)
{
PrintWarning("Using default configuration...");
_config = GetDefaultConfig();
}
}
object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
{
if (_config.BearItem.CompareTo(item.item) || _config.YoungBearItem.CompareTo(item.item))
{
return false;
}
if (_config.BearItem.CompareTo(targetItem.item) || _config.YoungBearItem.CompareTo(targetItem.item))
{
return false;
}
return null;
}
private void StartPluginLoad()
{
//if (ImageLibrary != null)
//{
//Load your images here
AddImage(_config.FollowImage);
AddImage(_config.RideImage);
AddImage(_config.TakeImage);
AddImage(_config.InventoryImage);
AddImage(_config.InstructionImage);
CheckStatus();
//}
//else
//{
// PrintError($"ImageLibrary not found! Please, check your plugins list.");
// _plugin.LogToFile("fjfjfj32341dsffagfdsa332572232", "IL NULLLLLLLLLLLLLL", this);
//}
}
private new void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["BEAR_FARM_WOOD"] = "[Bear] Wood",
["BEAR_PICK_UP"] = "Only the owner can lift the bear",
["BEAR_PICK_UP_FULL_INVENTORY"] = "You need to pick up everything from the bear's inventory before picking it up",
["BEAR_GROWING_SECOND"] = "It will grow in <size=20>{0} seconds",
["BEAR_GROWING_USE_MENU"] = "Press '<size=20>E' for \ninteraction!",
["BEAR_MENU_TITLE"] = "BEAR MANAGEMENT",
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
["BEAR_FARM_WOOD"] = "[Мишка] Дерево",
["BEAR_PICK_UP"] = "Только владелец может поднять медведя",
["BEAR_PICK_UP_FULL_INVENTORY"] = "Нужно забрать всё из инвентаря медведя перед тем как его поднять",
["BEAR_GROWING_SECOND"] = "Вырастет через <size=20>{0} секунд",
["BEAR_GROWING_USE_MENU"] = "Нажмите '<size=20>E' для \nвзаимодействия!",
["BEAR_MENU_TITLE"] = "УПРАВЛЕНИЕ МЕДВЕДЕМ",
}, this, "ru");
PrintWarning(LanguageEn ? "The language file was uploaded successfully" : "Языковой файл загружен успешно");
}
private static bool _initiated = false;
private const String PermissionsGiveBear = "iqbearride.givebear";
private static PluginConfig _config;
object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
{
if (hitInfo == null)
return null;
var attacker = hitInfo.InitiatorPlayer;
if (attacker == null || !(attacker is BasePlayer)) return null;
{
Bear bear = entity as Bear;
if (bear != null && bear.OwnerID != 0 && bear.OwnerID.IsSteamId())
return false;
}
return null;
}
private static bool IsFriend(ulong player, ulong friend)
{
if (player == friend)
return true;
var team = RelationshipManager.ServerInstance.FindPlayersTeam(player);
if (team == null)
return false;
return team.members.Contains(friend);
}
private class PluginConfig
{
[JsonProperty(LanguageEn ? "Forbid the bear to defecate (true - yes / false - no)" : "Запретить медведю испражняться (true - да/false - нет)")]
public Boolean BlockDefecateBear = false;
[JsonProperty(LanguageEn ? "Chance of a bear cub falling out" : "Шанс выпадения медвеженка")]
public int YoungDropChance = 20;
[JsonProperty(LanguageEn ? "Make a bear immortal (true - yes/false - no)" : "Сделать бессмертным медведя (true - да/false - нет)")]
public Boolean Immortals = false;
[JsonProperty(LanguageEn ? "The number of hp of the bear" : "Количество хп медведя")]
public int MaxHealthAmount = 1200;
[JsonProperty(LanguageEn ? "How long does a bear grow in seconds" : "Сколько времени растёт медведь в секундах")]
public int GrowSeconds = 100;
[JsonProperty(LanguageEn ? "Walking speed" : "Скорость ходьбы")]
public float WalkSpeed = 5f;
[JsonProperty(LanguageEn ? "Leash speed" : "Скорость поводка")]
public float LeadSpeed = 7.5f;
[JsonProperty(LanguageEn ? "Running speed" : "Скорость бега")]
public float RunSpeed = 7.5f;
[JsonProperty(LanguageEn ? "Running speed with shift" : "Скорость бега с шифтом")]
public float SprintSpeed = 10f;
[JsonProperty(LanguageEn ? "Turning speed" : "Скорость поворота")]
public float RotateSpeed = 150;
[JsonProperty(LanguageEn ? "Step size up (If you don't know what it is, don't touch this function)" : "Размер шага вверх (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float StepHigh = 1f;
[JsonProperty(LanguageEn ? "Step size down (If you don't know what it is, don't touch this function)" : "Размер шага вниз (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float StepDown = 1f;
[JsonProperty(LanguageEn ? "Board size length (If you don't know what it is, don't touch this function)" : "Размер доски длина (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float BoardForward = 1.5f;
[JsonProperty(LanguageEn ? "Board size width (If you don't know what it is, don't touch this function)" : "Размер доски ширина (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float BoardRight = 0.2f;
[JsonProperty(LanguageEn ? "The maximum height that can climb" : "Максимальная высота на которую может залезть")]
public float MaxWallClimbSlope = 50f;
[JsonProperty(LanguageEn ? "The radius of checking for objects (If you don't know what it is, don't touch this function)" : "Радиус проверки на обьекты (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float ObsCheckDis = 0.6f;
[JsonProperty(LanguageEn ? "The radius of the rotation balls check (If you do not know what it is, do not touch this function)" : "Радиус проверки шариков поворота (Если вы не знаете что это такое, не трогайте данную функцию)")]
public float RotSphereDis = 0.35f;
[JsonProperty(LanguageEn ? "Maximum depth" : "Максимальная глубина")]
public float MaxWaterDepth = 150f;
[JsonProperty(LanguageEn ? "Inventory Size" : "Размер инвентаря")]
public int InventorySize = 24;
[JsonProperty(LanguageEn ? "The damage inflicted is individual" : "Наносимый урон идивидуальный")]
public Dictionary<string, float> BearDamage;
[JsonProperty(LanguageEn ? "How much health to give when eating" : "Сколько здоровья давать при еде")]
public float EatHealAmount = 50f;
[JsonProperty(LanguageEn ? "IQ Chat : Custom prefix in the chat" : "IQChat : Кастомный префикс в чате")]
public String CustomPrefix = "[IQBearRide]";
[JsonProperty(LanguageEn ? "IQChat : Custom avatar in the chat (If required)" : "IQChat : Кастомный аватар в чате(Если требуется)")]
public String CustomAvatar = "0";
[JsonProperty(LanguageEn ? "IQChat : Use UI notifications" : "IQChat : Использовать UI уведомления")]
public Boolean UIAlertUse = false;
[JsonProperty(LanguageEn ? "Setting up the Bear Item" : "Настройка предмета Медведь")]
public CustomItem BearItem;
[JsonProperty(LanguageEn ? "Setting up the Bear Cub item" : "Настройка предмета Медвеженок")]
public CustomItem YoungBearItem;
[JsonProperty(LanguageEn ? "Picture To Follow" : "Картинка Следовать")]
public string FollowImage = "https://i.imgur.com/0sGNhqD.png";
[JsonProperty(LanguageEn ? "Picture to ride" : "Картинка Ехать")]
public string RideImage = "https://i.imgur.com/xar8gWn.png";
[JsonProperty(LanguageEn ? "Picture Raise" : "Картинка Поднять")]
public string TakeImage = "https://i.imgur.com/973xdCt.png";
[JsonProperty(LanguageEn ? "Picture Inventory" : "Картинка Инвентарь")]
public string InventoryImage = "https://i.imgur.com/OpjOCgL.png";
[JsonProperty(LanguageEn ? "Picture Instructions" : "Картинка Инструкции (С русским переводом - https://i.imgur.com/D5rIpyM.png)")]
public string InstructionImage = "https://i.imgur.com/32JQy4R.png";
}
private static void DrawText(BasePlayer player, Vector3 position, string text, float time = 1)
{
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsAdmin, true);
player.SendEntityUpdate();
player.SendConsoleCommand("ddraw.text", time, Color.white, position, text);
player.SendConsoleCommand("camspeed 0");
if (player.Connection.authLevel < 2)
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsAdmin, false);
player.SendEntityUpdate();
}
private void DrawUI_BearMenu(BasePlayer player, ulong bear)
{
var controller = _bearControllers[bear];
string gui = InterfaceManager.GetInterface("BearMain");
gui = gui.Replace("{bear}", bear.ToString());
gui = gui.Replace("%TEXT%", GetLang("BEAR_MENU_TITLE", player.UserIDString));
gui = gui.Replace("{LeadColor}", GetColor(controller.HasLead() ? "#18CA77" : "#CA2539", 0.8f));
CuiHelper.DestroyUi(player, InterfaceManager.UI_Layer);
CuiHelper.AddUi(player, gui);
}
///
///Обновление 1.0.x
/// - Поправлено уведомление о добыче мишкой
/// - Исправления после обновления игры
/// - Добавлена возможность запретить медведю испражняться
[PluginReference] Plugin IQChat, StackSizeController;
private void OnEntityDismounted(BaseVehicleSeat chair, BasePlayer player)
{
if (chair == null || player == null) return;
var bear = chair.parentEntity.Get(true) as Bear;
if (bear == null) return;
var controller = bear.GetComponent();
if (controller == null) return;
controller.SetRider(null);
CuiHelper.DestroyUi(player, InterfaceManager.UI_Instruction);
}
private static string GetNameByURL(string url)
{
var splitted = url.Split('/');
var endUrl = splitted[splitted.Length - 1];
var name = endUrl.Split('.')[0];
return name;
}
protected override void SaveConfig()
{
Config.WriteObject(_config);
}
private void OpenContainer(BasePlayer player, ItemContainer container, int capacity)
{
var loot = player.inventory.loot;
var position = player.transform.position - new Vector3(0, 500, 0);
var entity = GameManager.server.CreateEntity("assets/prefabs/visualization/sphere.prefab", position);
if (entity == null)
{
return;
}
entity.enableSaving = false;
entity.Spawn();
container.entityOwner = entity;
container.playerOwner = player;
container.capacity = capacity;
foreach (var item in container.itemList.ToArray())
{
if (item.position >= capacity)
{
item.RemoveFromContainer();
item.MoveToContainer(container);
}
}
entity.StartCoroutine(UserChecker(player, entity));
_plugin.timer.Once(0.5f, () =>
{
if (player == null)
{
return;
}
loot.Clear();
loot.PositionChecks = false;
loot.entitySource = entity;
loot.itemSource = (Item) null;
loot.MarkDirty();
loot.AddContainer(container);
loot.SendImmediate();
player.ClientRPCPlayer(null, player, "RPC_OpenLootPanel", "generic");
player.SendNetworkUpdateImmediate();
});
}
private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item)
{
if (dispenser.name.Contains("bear.corpse") == false)
return;
if (item.info.shortname != "glue")
return;
item.Remove();
player.GiveItem(_config.YoungBearItem.ToItem());
return;
}
private static Dictionary<ulong, BearController> _bearControllers = new Dictionary<ulong, BearController>();
private static IQBearRide _plugin;
void OnServerInitialized()
{
if (ImageLibrary == null)
{
NextTick(() => {
PrintError(LanguageEn ? "For the plugin to work correctly, you need to install the Image Library plugin (https://umod.org/plugins/image-library)" : "Для корректной работы плагина требуется установить плагин ImageLibrary (https://umod.org/plugins/image-library)");
Interface.Oxide.UnloadPlugin(Name);
});
}
_plugin = this;
_unloading = false;
StartPluginLoad();
}
private class InterfaceManager
{
public static InterfaceManager Instance;
public const string UI_Layer = "UI_BearRide";
public const string UI_Instruction = "UI_Instruction_Bear";
public Dictionary<string, string> Interfaces;
public InterfaceManager()
{
Instance = this;
Interfaces = new Dictionary<string, string>();
BuildInterface();
BuildInstruction();
}
public static void AddInterface(string name, string json)
{
if (Instance.Interfaces.ContainsKey(name))
{
_plugin.PrintError(
}
public float GetObstacleDistance()
{
if ((double) UnityEngine.Time.time >= (double) this.nextObstacleCheckTime)
{
float desiredVelocity = this.GetDesiredVelocity();
if ((double) this.currentSpeed > 0.0 || (double) desiredVelocity > 0.0)
this.cachedObstacleDistance = this.ObstacleDistanceCheck(Mathf.Max(desiredVelocity, 2f));
this.nextObstacleCheckTime = UnityEngine.Time.time + UnityEngine.Random.Range(0.25f, 0.35f);
}
return this.cachedObstacleDistance;
}
public float AttackDamage(string targetName)
{
float value = _config.BearDamage["default"];
foreach (var keyValuePair in _config.BearDamage)
{
if (targetName.Contains(keyValuePair.Key))
value = keyValuePair.Value;
}
return value;
}
public int GrowingSeconds = 0;
[NonSerialized] private BaseEntity[] SensesResults = new BaseEntity[64];
private void TryAttack()
{
var inSphere = BaseEntity.Query.Server.GetInSphere(BearOwner.transform.position, VisionRange, SensesResults,
AiCaresAbout);
if (inSphere > 0)
{
BaseEntity foundTarget = null;
float minDistance = float.MaxValue;
for (var index = 0; index < inSphere; ++index)
{
var sensesResult = SensesResults[index];
if (sensesResult == null || sensesResult.IsDestroyed
|| sensesResult.net.ID == _rider.net.ID
|| sensesResult.net.ID == BearOwner.net.ID) continue;
var dist = Vector3.Distance(sensesResult.transform.position, BearOwner.transform.position);
if (minDistance > dist)
{
foundTarget = sensesResult;
minDistance = dist;
}
}
if (foundTarget != null && WithinVisionCone(BearOwner, foundTarget))
{
var attackPosition = BearOwner.ServerPosition + BearOwner.transform.TransformDirection(BearOwner.AttackOffset);
if (IsVisible(attackPosition, foundTarget.CenterPoint()) || IsVisible(attackPosition, BearOwner.transform.position))
{
StartAttack(/AttackOperator.AttackType.MediumRange,/ foundTarget);
return;
}
}
}
StartAttack(/AttackOperator.AttackType.CloseRange, /null);
}
private void StartAttack(/AttackOperator.AttackType type,/ BaseEntity entity)
{
if (!AttackReady() /|| _bear.GetFact(BaseNpc.Facts.IsAttackReady) == 0/)
return;
var target = entity as BaseCombatEntity;
var Tree = CheckTree(BearOwner.transform.position, _rider.eyes.HeadForward());
if (Tree != null)
{
float DamageBear = AttackDamage(Tree.ShortPrefabName);
float MainFormul = Mathf.Min(DamageBear, Tree.Health()) / Tree.MaxHealth();
float Result = (Mathf.Clamp(DamageBear * UnityEngine.Random.Range(1, 5) / UnityEngine.Random.Range(1, 5), 0f, MainFormul * 8)) * 2.5f * 2f;
Int32 Amount = Mathf.FloorToInt(Result) + UnityEngine.Random.Range(1, 20);
global::Item item = global::ItemManager.CreateByName("wood", Amount, 0UL);
if (item == null)
{
return;
}
Interface.Call("OnDispenserGather", Tree.resourceDispenser, _rider, item);
var Data = _data.BearsData.Find(x => x.EntityId == BearOwner.net.ID.Value);
_rider.SendConsoleCommand(
int startTime = GrowingSeconds;
int curTime = 0;
while (curTime < startTime)
{
curTime++;
GrowingSeconds--;
data.GrowSeconds = GrowingSeconds;
yield return CoroutineEx.waitForSeconds(1f);
}
ShouldGrow = false;
yield break;
}
public void SwitchMoveState(BaseRidableAnimal.RunState newState)
{
if (newState == this.currentRunState)
return;
this.currentRunState = newState;
this.timeInMoveState = 0.0f;
BearOwner.SetFlag(BaseEntity.Flags.Reserved8, this.currentRunState == BaseRidableAnimal.RunState.sprint, false, false);
this.MarkObstacleDistanceDirty();
}
private void PlayerInput()
{
if (HasDriver() == false)
return;
InputState inputState = _rider.serverInput;
RiderInput(inputState, _rider);
if (inputState.IsDown(BUTTON.USE))
{
SwitchMoveState(BaseRidableAnimal.RunState.stopped);
TryAttack();
}
}
public float sprintSpeed = _config.SprintSpeed;
public float lastInputTime;
private void UpdateDropToGroundForDuration(float duration)
{
this.dropUntilTime = (TimeUntil) duration;
}
private static bool AiCaresAbout(BaseEntity ent)
{
if (ent is BasePlayer || ent is BaseNpc || ent.ShortPrefabName.Contains("barrel"))
return true;
return false;
}
private void RemoveMovement()
{
if (BearOwner == null)
return;
BearOwner.StopMoving();
BearOwner.GetNavAgent.autoRepath = false;
BearOwner.Pause();
BearOwner.CancelInvoke(BearOwner.TickAi);
BearOwner.CancelInvoke(BearOwner.TickNavigation);
BearOwner.CancelInvoke(BearOwner.TickStuck);
BearOwner.CancelInvoke(BearOwner.TickNavigationWater);
var script1 = BearOwner.GetComponent();
UnityEngine.Object.Destroy(script1);
//var script2 = BearOwner.GetComponent();
//UnityEngine.Object.Destroy(script2);
AIThinkManager.RemoveAnimal(BearOwner);
BearOwner.CurrentBehaviour = BaseNpc.Behaviour.Idle;
}
public Bear BearOwner;
private BaseRidableAnimal.RunState currentRunState = BaseRidableAnimal.RunState.stopped;
public float AttackRange = 2f;
public Vector3 currentVelocity;
private float acceleration;
private BaseVehicleSeat _saddle;
public void MarkObstacleDistanceDirty()
{
this.nextObstacleCheckTime = 0.0f;
}
private static bool WithinVisionCone(BaseNpc npc, BaseEntity other)
{
if (Mathf.Approximately(npc.Stats.VisionCone, -1f))
return true;
var normalized = (other.ServerPosition - npc.ServerPosition).normalized;
return Vector3.Dot(npc.transform.forward, normalized) >= npc.Stats.VisionCone;
}
public float maxStepDownHeight = _config.StepDown;
public void FixedUpdate()
{
this.timeAlive += UnityEngine.Time.fixedDeltaTime;
PlayerInput();
EatNearbyFood();
if (lastMovementUpdateTime == -1.0)
this.lastMovementUpdateTime = UnityEngine.Time.realtimeSinceStartup;
float delta = UnityEngine.Time.realtimeSinceStartup - this.lastMovementUpdateTime;
UpdateMovement(delta);
this.lastMovementUpdateTime = UnityEngine.Time.realtimeSinceStartup;
}
private void IncreaseState(BaseRidableAnimal.RunState oldState)
{
switch (oldState)
{
case BaseRidableAnimal.RunState.stopped:
{
SwitchMoveState(BaseRidableAnimal.RunState.walk);
break;
}
case BaseRidableAnimal.RunState.walk:
{
if (BearOwner.health < (BearOwner._maxHealth / 50))
break;
SwitchMoveState(BaseRidableAnimal.RunState.run);
break;
}
}
}
public void SetRider(BasePlayer player)
{
_leadTarget = null;
if (_rider != null)
{
CuiHelper.DestroyUi(player, InterfaceManager.UI_Instruction);
_saddle.DismountPlayer(_rider, true);
}
_rider = player;
if (_rider != null)
{
_plugin.DrawUI_BearMenu(_rider);
_saddle.MountPlayer(_rider);
}
}
public float rotateSpeed = _config.RotateSpeed;
public float leadSpeed = _config.LeadSpeed;
private float lastSprintPressedTime;
private void OnPhysicsNeighbourChanged()
{
this.Invoke(nameof(DelayedDropToGround), UnityEngine.Time.fixedDeltaTime);
}
public List PlayersWithUI = new List();
private float lastMovementUpdateTime = -1f;
private void PlayersChecker()
{
if (HasDriver())
return;
List players = Facepunch.Pool.GetList();
players.Clear();
Vis.Entities(BearOwner.transform.position, 1f, players);
try
{
if (players.Count > 0)
{
foreach (var basePlayer in players)
{
if (IsFriend(BearOwner.OwnerID, basePlayer.userID) == false)
continue;
if (ShouldGrow == false && basePlayer.serverInput.IsDown(BUTTON.USE))
{
_plugin.DrawUI_BearMenu(basePlayer, BearOwner.net.ID.Value);
if(PlayersWithUI.Contains(basePlayer) == false)
PlayersWithUI.Add(basePlayer);
}
if (lastDdrawUpdate <= Time.time)
{
string text = ShouldGrow ? _plugin.GetLang("BEAR_GROWING_SECOND", basePlayer.UserIDString, GrowingSeconds) : _plugin.GetLang("BEAR_GROWING_USE_MENU", basePlayer.UserIDString);
DrawText(basePlayer, BearOwner.transform.position + Vector3.up, text);
lastDdrawUpdate = Time.time + 1f;
}
}
}
for (var i = PlayersWithUI.Count - 1; i >= 0; i--)
{
var player = PlayersWithUI[i];
var distance = Vector3.Distance(player.transform.position, this.transform.position);
if (distance > 2f)
{
//Debug.Log("Close " + distance);
CuiHelper.DestroyUi(player, InterfaceManager.UI_Layer);
PlayersWithUI.Remove(player);
}
}
}
catch
{
// ignored
}
Facepunch.Pool.FreeList(ref players);
//_plugin.TrackEnd();
}
}
private void FullLoad()
{
_interface = new InterfaceManager();
PluginData.LoadData();
_initiated = true;
if(_config.Immortals)
Subscribe("OnEntityTakeDamage");
}
private void AddImage(string name)
{
if (!(bool)ImageLibrary.Call("HasImage", GetNameByURL(name)))
ImageLibrary.Call("AddImage", name, GetNameByURL(name));
}
public void SendChat(string Message, BasePlayer player, ConVar.Chat.ChatChannel channel = ConVar.Chat.ChatChannel.Global)
{
if (IQChat)
if (_config.UIAlertUse)
IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
else IQChat?.Call("API_ALERT_PLAYER", player, Message, _config.CustomPrefix, _config.CustomAvatar);
else player.SendConsoleCommand("chat.add", channel, 0, Message);
}
public struct CustomItem
{
public CustomItem(string displayName, string shortName, ulong skinId)
{
DisplayName = displayName;
ShortName = shortName;
SkinId = skinId;
}
public string DisplayName;
public string ShortName;
public ulong SkinId;
public Item ToItem(int amount = 1)
{
Item item = ItemManager.CreateByName(ShortName, amount, SkinId);
if (item != null && string.IsNullOrEmpty(DisplayName) == false)
item.name = DisplayName;
return item;
}
public bool CompareTo(Item item)
{
return this.SkinId == item?.skin && this.ShortName == item?.info.shortname;
}
}
void OnEntityKill(Bear Bear)
{
if (Bear == null) return;
data.BearKilled(Bear);
}
[PluginReference] private Plugin ImageLibrary;
object CanStackItem(Item item, Item targetItem)
{
if (item.skin != targetItem.skin) return false;
return null;
}
private void CheckStatus()
{
//if (!(bool)ImageLibrary.Call("IsReady"))
//{
// PrintError("Plugin is not ready! Images are loading.");
// timer.Once(10f, () => CheckStatus());
//}
//else
//{
FullLoad();
PrintWarning("Plugin succesfully loaded!");
// }
}
private string GetSizedImade(string name, int size) => GetImage($"{name}{size}");
object OnMaxStackable(Item item)
{
if (StackSizeController) return null;
if (_config.BearItem.CompareTo(item) || _config.YoungBearItem.CompareTo(item))
{
return 1;
}
return null;
}
private static double GetCurrentTime()
{
return new TimeSpan(DateTime.UtcNow.Ticks).TotalSeconds;
}
private Item OnItemSplit(Item item, int amount)
{
if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
if (item.info.shortname == _config.BearItem.ShortName)
{
if (item.skin == _config.BearItem.SkinId)
{
Item x = ItemManager.CreateByPartialName(_config.BearItem.ShortName, amount);
x.name = _config.BearItem.DisplayName;
x.skin = _config.BearItem.SkinId;
x.amount = amount;
item.amount -= amount;
return x;
}
}
if (item.info.shortname == _config.YoungBearItem.ShortName)
{
if (item.skin == _config.YoungBearItem.SkinId)
{
Item x = ItemManager.CreateByPartialName(_config.YoungBearItem.ShortName, amount);
x.name = _config.YoungBearItem.DisplayName;
x.skin = _config.YoungBearItem.SkinId;
x.amount = amount;
item.amount -= amount;
return x;
}
}
return null;
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject();
if (_config == null)
{
LoadDefaultConfig();
}
}
catch
{
for (var i = 0; i < 3; i++)
{
PrintError("Configuration file is corrupt! Check your config file at https://jsonlint.com/");
}
LoadDefaultConfig();
return;
}
ValidateConfig();
SaveConfig();
}
private IEnumerator UserChecker(BasePlayer player, BaseEntity entity)
{
while (Vector3.Distance(player.transform.position, entity.transform.position + new Vector3(0, 500, 0)) < 2f)
{
yield return CoroutineEx.waitForSeconds(1f);
if (entity == null || player == null)
break;
if (player.IsConnected == false)
break;
}
player.EndLooting();
//Puts("stopped!");
yield break;
}
void OnServerSave()
{
PluginData.SaveData();
}
protected override void LoadDefaultConfig()
{
_config = GetDefaultConfig();
}
private static StringBuilder sb = new StringBuilder();
private class PluginData
{
private const string BackpackPrefab = "assets/prefabs/misc/item drop/item_drop_backpack.prefab";
private const string DataPath = "IQBearRide/Data";
public List BearsData;
public class BearData
{
public ulong OwnerId;
public ulong EntityId;
public float Health;
public byte[] Inventory;
public Vector3 LastPosition;
public bool IsItem = false;
public int GrowSeconds;
[JsonIgnore] private ItemContainer _itemContainer;
[JsonIgnore]
public ItemContainer Container
{
get
{
if (_itemContainer == null)
{
_itemContainer = ByteToItemContainer(Inventory);
if (_itemContainer == null)
{
_itemContainer = new ItemContainer();
_itemContainer.ServerInitialize(null, 6);
_itemContainer.GiveUID();
}
//Saving container to raw bytes
_itemContainer.onDirty += () =>
{
if (_itemContainer == null || _itemContainer.itemList.Count < 1)
{
Inventory = null;
return;
}
Inventory = PluginData.ItemContainerToByte(_itemContainer);
};
}
return _itemContainer;
}
}
public void Drop(Vector3 position)
{
if (Container.itemList.Count > 0)
{
var dropContainer = Container.Drop(BackpackPrefab, position, Quaternion.identity, 0);
if (dropContainer == null) return;
dropContainer.lootPanelName = "generic";
Container.Clear();
ItemManager.DoRemoves();
}
else
{
//Debug.Log("Backpack empty");
}
}
}
public void BearKilled(Bear bear)
{
//Debug.Log("Bear dead");
if (_unloading)
return;
//Debug.Log("Searching bear in list");
BearData data = _data.BearsData.Find(x => x.EntityId == bear.net.ID.Value);
if (data == null)
return;
//Debug.Log("Trying to drop backpack");
data.Drop(bear.transform.position + new Vector3(0, 2f, 0));
BasePlayer player = BasePlayer.FindByID(data.OwnerId);
if(player != null)
CuiHelper.DestroyUi(player, InterfaceManager.UI_Instruction);
_data.BearsData.Remove(data);
}
public static Item BearToItem(ulong bear)
{
Item bearItem = _config.BearItem.ToItem();
var data = PluginData.Get(bear);
data.EntityId = bearItem.uid.Value;
data.IsItem = true;
return bearItem;
}
public static Bear ItemToBear(ulong player, ulong item, Vector3 position, bool young)
{
Bear bearEntity = CreateControlledBear(player, position, young);
if (bearEntity == null)
return null;
var data = PluginData.Get(item);
data.EntityId = bearEntity.net.ID.Value;
data.IsItem = false;
data.OwnerId = player;
if(data.Health > 0)
bearEntity.SetHealth(data.Health);
if (young)
{
data.GrowSeconds = _config.GrowSeconds;
}
return bearEntity;
}
public static Bear CreateControlledBear(ulong player, Vector3 position, bool young)
{
Bear bearEntity = GameManager.server.CreateEntity("assets/rust.ai/agents/bear/bear.prefab", position) as Bear;
// Bear bearEntity = GameManager.server.CreateEntity("assets/rust.ai/agents/Bear/Bear.prefab", position) as Bear;
if (bearEntity == null)
return null;
bearEntity.Spawn();
bearEntity.OwnerID = player;
var controller = bearEntity.gameObject.GetOrAddComponent();
return bearEntity;
}
public static BearData Get(ulong bear)
{
BearData data = _data.BearsData.Find(x => x.EntityId == bear);
if (data == null)
{
data = new BearData();
data.EntityId = bear;
_data.BearsData.Add(data);
}
return data;
}
public static ItemContainer ByteToItemContainer(byte[] bItem)
{
if (bItem == null)
return null;
ProtoBuf.ItemContainer validItem = ProtoBuf.ItemContainer.Deserialize(bItem);
ItemContainer itm = Pool.Get();
itm.isServer = true;
itm.Load(validItem);
return itm;
}
public static byte[] ItemContainerToByte(ItemContainer item)
{
var protoItem = item.Save();
return protoItem.ToProtoBytes();
}
public static void SaveContainer(ulong bear, ItemContainer container)
{
var data = PluginData.Get(bear);
data.Inventory = ItemContainerToByte(container);
}
public static void SaveData()
{
if (_data == null) return;
Interface.Oxide.DataFileSystem.WriteObject(DataPath, _data);
}
public static void LoadData()
{
try
{
if (Interface.Oxide.DataFileSystem.ExistsDatafile(DataPath))
{
_data = Interface.Oxide.DataFileSystem.ReadObject(DataPath);
}
else
{
_data = new PluginData()
{
BearsData = new List()
};
}
if (_data == null)
{
_data = new PluginData()
{
BearsData = new List()
};
}
foreach (var bearData in _data.BearsData)
{
if (bearData.IsItem)
continue;
var bear = CreateControlledBear(bearData.OwnerId, bearData.LastPosition, bearData.GrowSeconds > 0);
bearData.EntityId = bear.net.ID.Value;
}
}
catch (Exception ex)
{
_plugin.PrintWarning(LanguageEn ? "Date file upload error, contact the developer if you don't know how to solve the problem - Mercury#5212" : "Ошибка загрузки дата-файла, свяжитесь с разработчиком если не знаете как решить проблему - Mercury#5212");
}
}
}
private const Boolean LanguageEn = false;
private void DrawUI_BearMenu(BasePlayer player)
{
string gui = InterfaceManager.GetInterface("BearInstruciont");
CuiHelper.DestroyUi(player, InterfaceManager.UI_Instruction);
CuiHelper.AddUi(player, gui);
}
public static string GetColor(string hex, float alpha = 1f)
{
if (hex.Length != 7) hex = "#FFFFFF";
if (alpha < 0 || alpha > 1f) alpha = 1f;
var color = ColorTranslator.FromHtml(hex);
var r = Convert.ToInt16(color.R) / 255f;
var g = Convert.ToInt16(color.G) / 255f;
var b = Convert.ToInt16(color.B) / 255f;
return $"{r} {g} {b} {alpha}";
}
[ConsoleCommand("UI_BearControl")]
private void Console_BearControl(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player == null)
return;
if (arg.HasArgs(2) == false)
{
return;
}
ulong bear = 0;
if (ulong.TryParse(arg.Args[1], out bear) == false)
return;
BearController controller;
if (_bearControllers.TryGetValue(bear, out controller) == false)
return;
if (controller.PlayersWithUI.Contains(player))
controller.PlayersWithUI.Remove(player);
var data = PluginData.Get(bear);
if (IsFriend(data.OwnerId, player.userID) == false)
return;
switch (arg.Args[0])
{
case "ride":
{
controller.SetRider(player);
break;
}
case "inventory":
{
OpenContainer(player, data.Container, _config.InventorySize);
break;
}
case "lead":
{
if (controller.HasLead())
{
controller.SetLead(null);
break;
}
controller.SetLead(player);
break;
}
case "pickup":
{
if (data.OwnerId != player.userID)
{
SendChat(GetLang("BEAR_PICK_UP", player.UserIDString), player);
break;
}
if (data.Container.itemList.Count > 0)
{
SendChat(GetLang("BEAR_PICK_UP_FULL_INVENTORY", player.UserIDString), player);
break;
}
data.Health = controller.BearOwner.Health();
var item = PluginData.BearToItem(bear);
player.GiveItem(item);
controller.BearOwner.Kill();
break;
}
}
}
private static PluginData _data;
private void OnServerShutdown() => Unload();
private static InterfaceManager _interface;
public string GetLang(string LangKey, string userID = null, params object[] args)
{
sb.Clear();
if (args != null)
{
sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
}
}
ametistmine Goto Github PK
Type: User