C#:
using System.Collections.Generic;
using Rust;
using System.Linq;
namespace Oxide.Plugins
{
[Info("Teams", "https://topplugin.ru / https://discord.com/invite/5DPTsRmd3G", "1.0.3")]
public class Teams : RustPlugin
{
#region Вар
List<ulong> enableDamage = new List<ulong>();
List<ulong> disableMessage = new List<ulong>();
#endregion
#region Команды
[ChatCommand("ff")]
void cmdChatDamage(BasePlayer player, string command, string[] args)
{
if (args.Length == 0)
{
SendReply(player, "Используйте:\n <color=#ee3e61>/ff on</color> - включить урон по союзникам\n <color=#ee3e61>/ff off</color> - выключить урон по союзникам");
return;
}
if (args[0].ToLower() == "on")
{
if (enableDamage.Contains(player.userID))
{
SendReply(player, "У вас уже <color=#ee3e61>включен</color> урон по союзникам!");
return;
}
enableDamage.Add(player.userID);
SendReply(player, "Вы <color=#ee3e61>включили</color> урон по союзникам!");
return;
}
if (args[0].ToLower() == "off")
{
if (!enableDamage.Contains(player.userID))
{
SendReply(player, "У вас уже <color=#ee3e61>выключен</color> урон по союзникам!");
return;
}
enableDamage.Remove(player.userID);
SendReply(player, "Вы <color=#ee3e61>выключили</color> урон по союзникам!");
return;
}
SendReply(player, "Используйте:\n<color=#ee3e61>/ff on</color> - включить урон по союзникам\n<color=#ee3e61>/ff off</color> - выключить урон по союзникам");
}
[ChatCommand("team")]
void cmdChatFriends(BasePlayer player, string command, string[] args)
{
if (args == null || args.Length <= 0 || args.Length == 1 && args[0].ToLower() != "accept" && args[0].ToLower() != "cancel")
{
SendReply(player, "Используйте:\n<color=#ee3e61>/team add ник игрока</color> - отправить запрос игроку\n<color=#ee3e61>/team remove ник игрока</color> - выгнать игрока из команды");
return;
}
var playerTeam = API_GetPlayerTeam(player);
switch (args[0].ToLower())
{
case "add":
if (playerTeam == null)
{
SendReply(player, "У вас нету команды, сначала создайте её!\n<size=12>Создать её можно в левом нижнем углу инвентаря</size>");
return;
}
if (playerTeam.GetLeader() != player)
{
SendReply(player, "Вы не лидер этой команды, вы не можете приглашать игроков!");
return;
}
var target = FindBasePlayer(args[1]);
if (target == null)
{
SendReply(player, $"Игрок не найден!");
return;
}
if (target == player)
{
SendReply(player, "Вы не можете добавить себя в команду!");
return;
}
var targetTeam = API_GetPlayerTeam(target);
if (targetTeam != null)
{
SendReply(player, $"Игрок <color=#ee3e61>{target.displayName}</color> уже состоит в команде!");
return;
}
playerTeam.SendInvite(target);
SendReply(player, $"Вы успешно пригласили игрока <color=#ee3e61>{target.displayName}</color> в свою команду!");
SendReply(target, $"Игрок <color=#ee3e61>{player.displayName}</color> пригласил вас в команду\nПримите приглашение в инвентаре!");
break;
case "remove":
var playerArg2 = args[1];
BasePlayer target2 = BasePlayer.Find(playerArg2);
if (target2 == null)
{
SendReply(player, $"Игрока с именем <color=#ee3e61>{playerArg2}</color> нет в вашей команде!");
return;
}
if (target2 == player)
{
SendReply(player, "Вы не можете выгнать себя из команды!");
return;
}
if (playerTeam == null)
{
SendReply(player, "У вас нету команды, сначала создайте её!\n<size=12>Создать её можно в левом нижнем углу инвентаря</size>");
return;
}
if (playerTeam.GetLeader() != player)
{
SendReply(player, "Вы не лидер этой команды, вы не можете выгонять игроков!");
return;
}
playerTeam.RemovePlayer(target2.userID);
SendReply(player, $"Вы успешно выгнали игрока <color=#ee3e61>{target2.displayName}</color> из вашей команды!");
SendReply(target2, $"Игрок <color=#ee3e61>{player.displayName}</color> выгнал вас из команды!");
break;
}
}
#endregion
#region Хуки
void OnServerInitialized()
{
PrintWarning("\n-----------------------------\n" +
" Author - https://topplugin.ru/\n" +
" VK - https://vk.com/rustnastroika\n" +
" Discord - https://discord.com/invite/5DPTsRmd3G\n" +
"-----------------------------");
rust.RunServerCommand("maxteamsize 228");
}
object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
{
if (!(entity is BasePlayer) || info?.InitiatorPlayer == null || info?.InitiatorPlayer.GetComponent<NPCPlayer>() != null || info.damageTypes.GetMajorityDamageType() == DamageType.Suicide)
return null;
if (info.InitiatorPlayer == entity as BasePlayer)
return null;
if (API_AreTeamMates(entity.GetComponent<BasePlayer>(), info.InitiatorPlayer) && !enableDamage.Contains(info.InitiatorPlayer.userID))
{
if (!disableMessage.Contains(info.InitiatorPlayer.userID))
{
disableMessage.Add(info.InitiatorPlayer.userID);
SendReply(info.InitiatorPlayer, "Вы не можете нанести урон своему другу!");
timer.Once(1, () =>
{
if (disableMessage.Contains(info.InitiatorPlayer.userID))
disableMessage.Remove(info.InitiatorPlayer.userID);
});
}
info.damageTypes.ScaleAll(0);
return false;
}
return null;
}
#endregion
#region Авторизация
object CanUseLockedEntity(BasePlayer player, BaseLock @lock)
{
if (player.currentTeam == 0) return null;
if (!(@lock is CodeLock) || @lock.GetParentEntity().OwnerID <= 0) return null;
if (@lock.GetParentEntity().OwnerID == player.userID) return null;
if (ApiIsFriend(@lock.GetParentEntity().OwnerID, player.userID)) return true;
return null;
}
/*object OnTurretTarget(AutoTurret turret, BaseCombatEntity target)
{
var player = (BasePlayer)target;
if (player.currentTeam == 0) return null;
if (!(target is BasePlayer) || turret.OwnerID <= 0) return null;
if (turret.IsAuthed(player)) return null;
if (API_AreTeamMates(turret.OwnerID, player.userID)) return true;
turret.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
return null;
}*/
#endregion
#region Апи
RelationshipManager.PlayerTeam API_GetPlayerTeam(BasePlayer player)
{
RelationshipManager.PlayerTeam playerTeam = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
return playerTeam ?? null;
}
bool API_AreTeamMates(BasePlayer player, BasePlayer target)
{
if (player.currentTeam == 0 || target.currentTeam == 0)
return false;
return player.currentTeam == target.currentTeam;
}
bool API_AreTeamMates(ulong playerId, ulong targetId)
{
if (!RelationshipManager.ServerInstance.cachedPlayers.ContainsKey(playerId))
return false;
ulong teamId1 = RelationshipManager.ServerInstance.playerToTeam[playerId].teamID;
if (!RelationshipManager.ServerInstance.cachedPlayers.ContainsKey(targetId))
return false;
ulong teamId2 = RelationshipManager.ServerInstance.playerToTeam[targetId].teamID;
return teamId2 == teamId1;
}
bool ApiIsFriend(ulong playerId, ulong targetId)
{
if (!RelationshipManager.ServerInstance.cachedPlayers.ContainsKey(playerId))
return false;
ulong teamId1;
ulong teamId2;
teamId1 = RelationshipManager.ServerInstance.cachedPlayers[playerId].currentTeam;
if (!RelationshipManager.ServerInstance.cachedPlayers.ContainsKey(targetId))
return false;
teamId2 = RelationshipManager.ServerInstance.cachedPlayers[targetId].currentTeam;
if ((teamId1 == 0) && teamId2 == 0) return false;
bool success = false;
if (teamId1 == teamId2) success = true;
else success = false;
return success;
}
#endregion
#region Хелпер
BasePlayer FindBasePlayer(string nameOrUserId)
{
nameOrUserId = nameOrUserId.ToLower();
foreach (var player in BasePlayer.activePlayerList)
{
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
foreach (var player in BasePlayer.sleepingPlayerList)
{
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
return default(BasePlayer);
}
#endregion
}
}