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);
}
}
}
Block or Report
Block or report AmetistMine
Report abuse
Contact GitHub support about this user’s behavior. Learn more about reporting abuse.
Report abusePopular repositories Loading
Something went wrong, please refresh the page to try again.
If the problem persists, check the GitHub status page or contact support.
If the problem persists, check the GitHub status page or contact support.