Hello, I have an issue with Clan Teams in my console. I have this:
Failed to call hook 'OnClanUpdate' on plugin 'ClanTeam v1.0.6' (NullReferenceException: Object reference not set to an instance of an object)
at Oxide.Plugins.ClanTeam.IsAnOwner (BasePlayer player) [0x0003d] in <ef7c786903244daf85f6cfe4b5e363c8>:0
at Oxide.Plugins.ClanTeam.GenerateClanTeam (System.Collections.Generic.List`1[T] memberIds) [0x000d3] in <ef7c786903244daf85f6cfe4b5e363c8>:0
at Oxide.Plugins.ClanTeam.OnClanUpdate (System.String tag) [0x00008] in <ef7c786903244daf85f6cfe4b5e363c8>:0
at Oxide.Plugins.ClanTeam.DirectCallHook (System.String name, System.Object& ret, System.Object[] args) [0x00339] in <ef7c786903244daf85f6cfe4b5e363c8>:0
at Oxide.Plugins.CSharpPlugin.InvokeMethod (Oxide.Core.Plugins.HookMethod method, System.Object[] args) [0x00079] in <42f9bedc659b4f4786eb778d3cd58968>:0
at Oxide.Core.Plugins.CSPlugin.OnCallHook (System.String name, System.Object[] args) [0x000de] in <15f61ddda771464d8246ebdce8ff4811>:0
at Oxide.Core.Plugins.Plugin.CallHook (System.String hook, System.Object[] args) [0x00060] in <15f61ddda771464d8246ebdce8ff4811>:0So I did a quick search with AI following the updates since on rust. He gave me a file. completely redone and now I have no more issues in play :
Stop your server (or at least unload the old version: oxide.unload ClanTeam).
• Replace the content of the file oxide/plugins/ClanTeam.cs with the code above.
• Reload the plugin: oxide.reload ClanTeam.
// Requires: Clans
using Newtonsoft.Json.Linq;
using Oxide.Core.Plugins;
using System.Collections.Generic;
namespace Oxide.Plugins
{
[Info("Clan Team", "deivismac", "1.0.6")]
[Description("Adds clan members to the same team")]
class ClanTeam : CovalencePlugin
{
#region Definitions
[PluginReference]
private Plugin Clans;
private readonly Dictionary<string, List<ulong>> clans = new Dictionary<string, List<ulong>>();
#endregion Definitions
#region Functions
private bool CompareTeams(List<ulong> currentIds, List<ulong> clanIds)
{
foreach (ulong clanId in clanIds)
{
if (!currentIds.Contains(clanId))
{
return false;
}
}
return true;
}
private void GenerateClanTeam(List<ulong> memberIds)
{
if (memberIds == null || memberIds.Count == 0) return;
if (clans.ContainsKey(ClanTag(memberIds[0])))
{
clans.Remove(ClanTag(memberIds[0]));
}
clans[ClanTag(memberIds[0])] = new List<ulong>();
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.CreateTeam();
foreach (ulong memberId in memberIds)
{
BasePlayer player = BasePlayer.FindByID(memberId);
if (player != null)
{
if (player.currentTeam != 0UL)
{
RelationshipManager.PlayerTeam current = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
current?.RemovePlayer(player.userID);
}
team.AddPlayer(player);
clans[ClanTag(memberId)].Add(player.userID);
if (IsAnOwner(player))
{
team.SetTeamLeader(player.userID);
}
}
}
}
private bool IsAnOwner(BasePlayer player)
{
string clanTag = Clans.Call<string>("GetClanOf", player.userID);
if (string.IsNullOrEmpty(clanTag)) return false;
JObject clanInfo = Clans.Call<JObject>("GetClan", clanTag);
if (clanInfo == null) return false;
string owner = clanInfo["owner"]?.ToString();
return owner == player.UserIDString;
}
private string ClanTag(ulong memberId)
{
return Clans.Call<string>("GetClanOf", memberId) ?? string.Empty;
}
private List<ulong> ClanPlayers(BasePlayer player)
{
string tag = Clans.Call<string>("GetClanOf", player.userID);
if (string.IsNullOrEmpty(tag)) return new List<ulong>();
JObject clanInfo = Clans.Call<JObject>("GetClan", tag);
if (clanInfo == null) return new List<ulong>();
return clanInfo["members"]?.ToObject<List<ulong>>() ?? new List<ulong>();
}
private List<ulong> ClanPlayersTag(string tag)
{
if (string.IsNullOrEmpty(tag)) return new List<ulong>();
JObject clanInfo = Clans.Call<JObject>("GetClan", tag);
if (clanInfo == null) return new List<ulong>();
return clanInfo["members"]?.ToObject<List<ulong>>() ?? new List<ulong>();
}
#endregion Functions
#region Hooks
private void OnClanCreate(string tag)
{
timer.Once(1f, () =>
{
List<ulong> clanPlayers = new List<ulong>();
JObject clanInfo = Clans.Call<JObject>("GetClan", tag);
if (clanInfo == null) return;
JArray players = clanInfo["members"] as JArray;
if (players == null) return;
foreach (string memberId in players)
{
ulong clanId;
ulong.TryParse(memberId, out clanId);
if (clanId != 0UL)
{
clanPlayers.Add(clanId);
}
}
GenerateClanTeam(clanPlayers);
});
}
private void OnClanUpdate(string tag)
{
if (string.IsNullOrEmpty(tag)) return;
var clanPlayers = ClanPlayersTag(tag);
if (clanPlayers.Count == 0) return;
GenerateClanTeam(clanPlayers);
}
private void OnClanDestroy(string tag)
{
if (!clans.ContainsKey(tag)) return;
BasePlayer player = BasePlayer.FindByID(clans[tag][0]);
if (player != null)
{
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
if (team != null)
{
foreach (ulong memberId in clans[tag])
{
team.RemovePlayer(memberId);
}
RelationshipManager.ServerInstance.DisbandTeam(team);
}
clans.Remove(tag);
}
}
private void OnPlayerSleepEnded(BasePlayer player)
{
if (player == null) return;
string clanTag = ClanTag(player.userID);
if (!string.IsNullOrEmpty(clanTag))
{
List<ulong> clanPlayers = ClanPlayers(player);
if (clanPlayers.Count == 0) return;
if (player.currentTeam != 0UL)
{
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
if (team != null && CompareTeams(team.members, clanPlayers))
{
return;
}
}
GenerateClanTeam(clanPlayers);
}
}
#endregion Hooks
}
}If that helped you, I am delighted, I am not a modder or something else, I just used AI to find a solution that worked for me