"
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Reflection;
namespace Oxide.Plugins
{
[Info("MagazinBoost", "Fujikura", "1.6.2", ResourceId = 1962)]
[Description("Can change magazines, ammo and condition for most projectile weapons")]
public class MagazinBoost : RustPlugin
{
bool Changed;
Dictionary<string, object> weaponContainer = new Dictionary <string, object>();
Dictionary<string, string> guidToPath;
#region Config
string permissionAll;
string permissionMaxAmmo;
string permissionPreLoad;
string permissionMaxCondition;
string permissionAmmoType;
bool checkPermission;
bool removeSkinIfNoRights;
object GetConfig(string menu, string datavalue, object defaultValue)
{
var data = Config[menu] as Dictionary<string, object>;
if (data == null)
{
data = new Dictionary<string, object>();
Config[menu] = data;
Changed = true;
}
object value;
if (!data.TryGetValue(datavalue, out value))
{
value = defaultValue;
data[datavalue] = value;
Changed = true;
}
return value;
}
void LoadVariables()
{
permissionAll = Convert.ToString(GetConfig("Permissions", "permissionAll", "magazinboost.canall"));
permissionMaxAmmo = Convert.ToString(GetConfig("Permissions", "permissionMaxAmmo", "magazinboost.canmaxammo"));
permissionPreLoad = Convert.ToString(GetConfig("Permissions", "permissionPreLoad", "magazinboost.canpreload"));
permissionMaxCondition = Convert.ToString(GetConfig("Permissions", "permissionMaxCondition", "magazinboost.canmaxcondition"));
permissionAmmoType = Convert.ToString(GetConfig("Permissions", "permissionAmmoType", "magazinboost.canammotype"));
checkPermission = Convert.ToBoolean(GetConfig("CheckRights", "checkForRightsInBelt", true));
removeSkinIfNoRights = Convert.ToBoolean(GetConfig("CheckRights", "removeSkinIfNoRights", true));
weaponContainer = (Dictionary<string, object>)GetConfig("Weapons", "Data", new Dictionary<string, object>());
if (!Changed) return;
SaveConfig();
Changed = false;
}
protected override void LoadDefaultConfig()
{
Config.Clear();
LoadVariables();
}
#endregion Config
void GetWeapons()
{
weaponContainer = (Dictionary <string, object>)Config["Weapons", "Data"];
var weapons = ItemManager.GetItemDefinitions().Where(p => p.category == ItemCategory.Weapon && p.GetComponent<ItemModEntity>() != null);
if (weaponContainer != null && weaponContainer.Count() > 0)
{
int countLoadedServerStats = 0;
foreach (var weapon in weapons)
{
if (!guidToPath.ContainsKey(weapon.GetComponent<ItemModEntity>().entityPrefab.guid) || weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>() == null) continue;
if (weaponContainer.ContainsKey(weapon.shortname))
{
Dictionary <string, object> serverDefaults = weaponContainer[weapon.shortname] as Dictionary <string, object>;
if(!serverDefaults.ContainsKey("givemaxammo"))
{
serverDefaults.Add("givemaxammo", serverDefaults["servermaxammo"]);
serverDefaults.Add("givepreload", serverDefaults["serverpreload"]);
serverDefaults.Add("giveammotype", serverDefaults["serverammotype"]);
serverDefaults.Add("givemaxcondition", serverDefaults["servermaxcondition"]);
serverDefaults.Add("giveskinid", 0);
}
if ((bool)serverDefaults["serveractive"])
{
ItemDefinition weaponDef = ItemManager.FindItemDefinition(weapon.shortname);
weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize = (int)serverDefaults["servermaxammo"];
weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents = (int)serverDefaults["serverpreload"];
ItemDefinition ammo = ItemManager.FindItemDefinition((string)serverDefaults["serverammotype"]);
if (ammo != null)
weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType = ammo;
weaponDef.condition.max = Convert.ToSingle(serverDefaults["servermaxcondition"]);
countLoadedServerStats++;
}
continue;
}
Dictionary <string, object> weaponStats = new Dictionary <string, object>();
weaponStats.Add("displayname", weapon.displayName.english);
weaponStats.Add("maxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("preload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("maxcondition", weapon.condition.max);
weaponStats.Add("ammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("skinid", 0);
weaponStats.Add("settingactive", true);
weaponStats.Add("servermaxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("serverpreload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("serverammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("servermaxcondition", weapon.condition.max);
weaponStats.Add("serveractive", false);
weaponStats.Add("givemaxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("givepreload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("giveammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("givemaxcondition", weapon.condition.max);
weaponContainer.Add(weapon.shortname, weaponStats);
Puts($"Added NEW weapon '{weapon.displayName.english} ({weapon.shortname})' to weapons list");
}
if (countLoadedServerStats > 0)
Puts($"Changed server default values for '{countLoadedServerStats}' weapons");
Config["Weapons", "Data"] = weaponContainer;
Config.Save();
return;
}
else
{
int counter = 0;
foreach (var weapon in weapons)
{
if (!guidToPath.ContainsKey(weapon.GetComponent<ItemModEntity>().entityPrefab.guid)) continue;
if (weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>() == null) continue;
Dictionary <string, object> weaponStats = new Dictionary <string, object>();
weaponStats.Add("displayname", weapon.displayName.english);
weaponStats.Add("maxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("preload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("maxcondition", weapon.condition.max);
weaponStats.Add("ammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("skinid", 0);
weaponStats.Add("settingactive", true);
weaponStats.Add("servermaxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("serverpreload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("serverammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("servermaxcondition", weapon.condition.max);
weaponStats.Add("serveractive", false);
weaponStats.Add("givemaxammo", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize);
weaponStats.Add("givepreload", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents);
weaponStats.Add("giveammotype", weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname);
weaponStats.Add("givemaxcondition", weapon.condition.max);
weaponStats.Add("giveskinid", 0);
weaponContainer.Add(weapon.shortname, weaponStats);
counter++;
}
Puts($"Created initial weaponlist with '{counter}' projectile weapons.");
Config["Weapons", "Data"] = weaponContainer;
Config.Save();
return;
}
}
bool hasAnyRight(BasePlayer player)
{
if (permission.UserHasPermission(player.UserIDString, permissionAll)) return true;
if (permission.UserHasPermission(player.UserIDString, permissionMaxAmmo)) return true;
if (permission.UserHasPermission(player.UserIDString, permissionPreLoad)) return true;
if (permission.UserHasPermission(player.UserIDString, permissionMaxCondition)) return true;
if (permission.UserHasPermission(player.UserIDString, permissionAmmoType)) return true;
return false;
}
bool hasRight(BasePlayer player, string perm)
{
bool right = false;
switch (perm)
{
case "all":
if (permission.UserHasPermission(player.UserIDString, permissionAll)) {right = true;}
break;
case "maxammo":
if (permission.UserHasPermission(player.UserIDString, permissionMaxAmmo)) {right = true;}
break;
case "preload":
if (permission.UserHasPermission(player.UserIDString, permissionPreLoad)) {right = true;}
break;
case "maxcondition":
if (permission.UserHasPermission(player.UserIDString, permissionMaxCondition)) {right = true;}
break;
case "ammotype":
if (permission.UserHasPermission(player.UserIDString, permissionAmmoType)) {right = true;}
break;
default:
break;
}
return right;
}
void OnServerInitialized()
{
LoadVariables();
guidToPath = GameManifest.guidToPath;
GetWeapons();
permission.RegisterPermission(permissionAll, this);
permission.RegisterPermission(permissionMaxAmmo, this);
permission.RegisterPermission(permissionPreLoad, this);
permission.RegisterPermission(permissionMaxCondition, this);
permission.RegisterPermission(permissionAmmoType, this);
}
void OnItemCraftFinished(ItemCraftTask task, Item item)
{
if (item == null || task == null) return;
if (!(item.GetHeldEntity() is BaseProjectile)) return;
// Reflection ile oyuncuyu bulmaya çalışıyoruz
BasePlayer player = null;
var field = typeof(ItemCraftTask).GetField("owner", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic)
?? typeof(ItemCraftTask).GetField("ownerPlayer", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null)
{
player = field.GetValue(task) as BasePlayer;
}
// Eğer field üzerinden bulunamadıysa (yeni sürüm), ID üzerinden tekrar deneyelim
if (player == null)
{
var idField = typeof(ItemCraftTask).GetField("ownerId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
if (idField != null)
{
ulong uid = (ulong)idField.GetValue(task);
player = BasePlayer.FindByID(uid);
}
}
if (player == null || !hasAnyRight(player)) return;
Dictionary<string, object> weaponStats = null;
if (weaponContainer.ContainsKey(item.info.shortname))
weaponStats = weaponContainer[item.info.shortname] as Dictionary<string, object>;
if (weaponStats == null || !(bool)weaponStats["settingactive"]) return;
var projectile = item.GetHeldEntity() as BaseProjectile;
if (projectile == null) return;
if (hasRight(player, "maxammo") || hasRight(player, "all"))
projectile.primaryMagazine.capacity = (int)weaponStats["maxammo"];
if (hasRight(player, "preload") || hasRight(player, "all"))
projectile.primaryMagazine.contents = (int)weaponStats["preload"];
if (hasRight(player, "ammotype") || hasRight(player, "all"))
{
var ammo = ItemManager.FindItemDefinition((string)weaponStats["ammotype"]);
if (ammo != null)
projectile.primaryMagazine.ammoType = ammo;
}
if (hasRight(player, "maxcondition") || hasRight(player, "all"))
{
item._maxCondition = Convert.ToSingle(weaponStats["maxcondition"]);
item._condition = Convert.ToSingle(weaponStats["maxcondition"]);
}
}
private void OnItemAddedToContainer(ItemContainer container, Item item)
{
if(!checkPermission) return;
if(item.GetHeldEntity() is BaseProjectile && container.HasFlag(ItemContainer.Flag.Belt))
{
Dictionary <string, object> weaponStats = null;
object checkStats;
if (weaponContainer.TryGetValue(item.info.shortname, out checkStats))
{
weaponStats = checkStats as Dictionary <string, object>;
if (!(bool)weaponStats["settingactive"]) return;
}
else
return;
if ((item.GetHeldEntity() as BaseProjectile).primaryMagazine.capacity > item.info.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize && !(hasRight(container.playerOwner, "maxammo") || hasRight(container.playerOwner, "all")))
{
(item.GetHeldEntity() as BaseProjectile).primaryMagazine.capacity = item.info.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize;
if ((item.GetHeldEntity() as BaseProjectile).primaryMagazine.contents > (item.GetHeldEntity() as BaseProjectile).primaryMagazine.capacity)
(item.GetHeldEntity() as BaseProjectile).primaryMagazine.contents = (item.GetHeldEntity() as BaseProjectile).primaryMagazine.capacity;
}
if (item.maxCondition > item.info.condition.max && !(hasRight(container.playerOwner, "maxcondition") || hasRight(container.playerOwner, "all")))
{
var newCon = item.condition * (item.info.condition.max / item.maxCondition);
item._maxCondition = Convert.ToSingle(item.info.condition.max);
item._condition = Convert.ToSingle(newCon);
}
if (removeSkinIfNoRights && !hasAnyRight(container.playerOwner) && item.GetHeldEntity().skinID == Convert.ToUInt64(weaponStats["skinid"]) && item.GetHeldEntity().skinID != 0uL)
{
item.skin = 0uL;
item.GetHeldEntity().skinID = 0uL;
}
}
}
[ConsoleCommand("mb.giveplayer")]
void BoostGive(ConsoleSystem.Arg arg)
{
if (arg.Connection != null && arg.Connection.authLevel < 2) return;
if (arg.Args == null || arg.Args.Length < 2)
{
SendReply(arg, "Usage: magazinboost.give playername|id weaponshortname (optional: skinid)");
return;
}
string targetName = arg.Args[0].ToString();
string weaponShortName = arg.Args[1].ToString();
string skinIdArg = arg.Args.Length > 2 ? arg.Args[2].ToString() : null;
ulong skinid = 0;
if (arg.Args.Length > 2)
{
if (!ulong.TryParse(skinIdArg, out skinid))
{
SendReply(arg, "Skin has to be a number");
return;
}
if (skinIdArg.Length != 9)
{
SendReply(arg, "Skin has to be a 9-digit number");
return;
}
}
BasePlayer target = BasePlayer.Find(targetName);
if (target == null)
{
SendReply(arg, $"Player '{targetName}' not found");
return;
}
Dictionary <string, object> weaponStats = null;
object checkStats;
if (weaponContainer.TryGetValue(weaponShortName, out checkStats))
weaponStats = checkStats as Dictionary <string, object>;
else
{
SendReply(arg, $"Weapon '{weaponShortName}' not included/supported");
return;
}
Item item = ItemManager.Create(ItemManager.FindItemDefinition(weaponShortName), 1, skinid);
if (item == null)
{
SendReply(arg, "Weapon for unknown reason not created");
return;
}
(item.GetHeldEntity() as BaseProjectile).primaryMagazine.capacity = (int)weaponStats["givemaxammo"];
(item.GetHeldEntity() as BaseProjectile).primaryMagazine.contents = (int)weaponStats["givepreload"];
var ammo = ItemManager.FindItemDefinition((string)weaponStats["giveammotype"]);
if (ammo != null)
(item.GetHeldEntity() as BaseProjectile).primaryMagazine.ammoType = ammo;
item._maxCondition = Convert.ToSingle(weaponStats["givemaxcondition"]);
item._condition = Convert.ToSingle(weaponStats["givemaxcondition"]);
if (skinid == 0 && Convert.ToUInt64(weaponStats["giveskinid"]) > 0)
skinid = Convert.ToUInt64(weaponStats["giveskinid"]);
if(skinid > 0)
{
item.skin = Convert.ToUInt64(weaponStats["giveskinid"]);
item.GetHeldEntity().skinID = Convert.ToUInt64(weaponStats["giveskinid"]);
}
target.GiveItem(item);
SendReply(arg, $"Weapon '{weaponShortName}' given to Player '{target.displayName}'");
}
}
}