RustTip

CanLootEntity

OxideCarbonEntity

Called to determine whether to loot entity.

Return true to allow the action and false to block it.

object CanLootEntity(BasePlayer basePlayer, LootableCorpse lootableCorpse)
object CanLootEntity(BasePlayer basePlayer, ResourceContainer resourceContainer)
object CanLootEntity(BasePlayer player, DroppedItemContainer droppedItemContainer)
object CanLootEntity(BasePlayer basePlayer, RidableHorse ridableHorse)
object CanLootEntity(BasePlayer player, StorageContainer storageContainer)
object CanLootEntity(BasePlayer player, ContainerIOEntity containerIOEntity)
object CanLootEntity(BasePlayer player, IndustrialCrafter industrialCrafter)
object CanLootEntity(object L1, WorldItem worldItem)
Работает — метод игры в этой сборке тот же, под который написан хук.

Параметры

basePlayer
BasePlayer
lootableCorpse
LootableCorpse

Возвращаемое значение

objectВерните не null, чтобы отменить действие игры.

Пример

object — можно повлиять на игру: вернуть значение, чтобы изменить или отменить действие.

private object CanLootEntity(BasePlayer basePlayer, LootableCorpse lootableCorpse)
{
    Puts("CanLootEntity");

    // ничего не меняем — игра продолжит как обычно
    return null;

    // повлиять на игру:
    // return false; // не null — действие игры отменяется
}

Работает и в Oxide, и в Carbon: Carbon загружает плагины Oxide без изменений.

Место встраивания 1

Rust.opj (Oxide)
void LootableCorpse.RPC_LootCorpse(BaseEntity.RPCMessage)

Передаёт: BasePlayer basePlayer, LootableCorpse lootableCorpse

РаботаетReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (l0, this)Assembly-CSharp.dll

Где вызывается (код игры этой ветки)

// …
[RPC_Server.IsVisible(3f)]
private void RPC_LootCorpse(RPCMessage rpc)
{
	BasePlayer player = rpc.player;
	if (!player || !player.CanInteract() || !CanLoot(player) || containers == null || !player.inventory.loot.StartLootingEntity(this))
	{
		return;
	}
	if (Interface.CallHook("CanLootEntity", player, this) != null)
	{
		return;
	}
	using (FlagsUpdateScope flagsUpdateScope = StartSetFlags(FlagsUpdateMode.SendNetworkUpdate))
	{
		flagsUpdateScope.Set(Flags.Open, b: true);
	}
	for (int i = 0; i < containers.Length; i++)
// …

Место встраивания 2

Rust.opj (Oxide)
void ResourceContainer.StartLootingContainer(BaseEntity.RPCMessage)

Передаёт: BasePlayer basePlayer, ResourceContainer resourceContainer

РаботаетReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (l0, this)Assembly-CSharp.dll

Где вызывается (код игры этой ветки)

[BaseEntity.RPC_Server]
[BaseEntity.RPC_Server.IsVisible(3f)]
private void StartLootingContainer(BaseEntity.RPCMessage msg)
{
	BasePlayer player = msg.player;
	if ((bool)player && player.CanInteract() && lootable && player.inventory.loot.StartLootingEntity(baseEntity))
	{
		if (Interface.CallHook("CanLootEntity", player, this) != null)
		{
			return;
		}
		lastAccessTime = Time.realtimeSinceStartup;
		player.inventory.loot.AddContainer(container);
	}
}

Место встраивания 3

Rust.opj (Oxide)
void DroppedItemContainer.PlayerOpenLoot(BasePlayer)

Передаёт: BasePlayer player, DroppedItemContainer droppedItemContainer

РаботаетReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (a0, this)Assembly-CSharp.dll

Где вызывается (код игры этой ветки)

public void PlayerOpenLoot(BasePlayer player)
{
	if ((bool)player && player.CanInteract() && player.inventory.loot.StartLootingEntity(this))
	{
		if (Interface.CallHook("CanLootEntity", player, this) != null)
		{
			return;
		}
		SetFlagLocal(Flags.Open, b: true);
		player.inventory.loot.AddContainer(inventory);
		player.inventory.loot.SendImmediate();
		player.ClientRPC(RpcTarget.Player("RPC_OpenLootPanel", player), lootPanelName);
		SendNetworkUpdate();
// …

Место встраивания 4

Rust.opj (Oxide)
void RidableHorse.SERVER_OpenLoot(BaseEntity.RPCMessage)

Передаёт: BasePlayer basePlayer, RidableHorse ridableHorse

РаботаетReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (l0, this)Assembly-CSharp.dll

Где вызывается (код игры этой ветки)

// …
if (storageInventory == null)
{
	return;
}
BasePlayer player = rpc.player;
string text = rpc.read.String();
if (!(player == null) && player.CanInteract() && CanOpenStorage(player) && (!needsBuildingPrivilegeToUse || player.CanBuild()) && player.inventory.loot.StartLootingEntity(this))
{
	if (Interface.CallHook("CanLootEntity", player, this) != null)
	{
		return;
	}
	ItemContainer container = equipmentInventory;
	string arg = lootPanelName;
	if (text == "storage")
	{
		arg = storagePanelName;
// …

Место встраивания 5

Rust.opj (Oxide)
bool StorageContainer.PlayerOpenLoot(BasePlayer, string, bool)

Передаёт: BasePlayer player, StorageContainer storageContainer

РаботаетReturnBehavior: ExitWhenNonNullAssembly-CSharp.dll

Где вызывается (код игры этой ветки)

public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = "", bool doPositionChecks = true)
{
	if (Interface.CallHook("CanLootEntity", player, this) != null)
	{
		return false;
	}
	if (IsLocked() || IsTransferring())
	{
		player.ShowToast(GameTip.Styles.Red_Normal, LockedMessage, false);
		return false;
	}
// …

Место встраивания 6

Rust.opj (Oxide)
bool ContainerIOEntity.PlayerOpenLoot(BasePlayer, string, bool)

Передаёт: BasePlayer player, ContainerIOEntity containerIOEntity

РаботаетReturnBehavior: ExitWhenNonNullAssembly-CSharp.dll

Где вызывается (код игры этой ветки)

public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = "", bool doPositionChecks = true)
{
	if (Interface.CallHook("CanLootEntity", player, this) != null)
	{
		return false;
	}
	if ((needsBuildingPrivilegeToUse || StorageContainer.ShouldRequireAuthIfNoCodelock(this, requireAuthIfNotLocked)) && !player.CanBuild())
	{
		return false;
	}
	if (needsBuildingPrivilegeToUse && !player.CanBuild())
// …

Место встраивания 7

Rust.opj (Oxide)
bool IndustrialCrafter.PlayerOpenLoot(BasePlayer, string, bool)

Передаёт: BasePlayer player, IndustrialCrafter industrialCrafter

РаботаетReturnBehavior: ExitWhenNonNullAssembly-CSharp.dll

Где вызывается (код игры этой ветки)

public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = "", bool doPositionChecks = true)
{
	if (Interface.CallHook("CanLootEntity", player, this) != null)
	{
		return false;
	}
	if (NeedsBuildingPrivilegeToUse && !player.CanBuild())
	{
		return false;
	}
	if (OnlyOneUser && IsOpen())
// …

Место встраивания 8

Rust.opj (Oxide)
void WorldItem.RPC_OpenLoot(BaseEntity.RPCMessage)

Передаёт: object L1, WorldItem worldItem

РаботаетReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (L1, this)Assembly-CSharp.dll

Где вызывается (код игры этой ветки)

// …
	return;
}
ItemModContainer component = item.info.GetComponent<ItemModContainer>();
if (!(component == null) && component.canLootInWorld)
{
	BasePlayer player = rpc.player;
	if ((bool)player && player.CanInteract() && !player.IsBlockedFromLootingByMountable() && CanOpenInSafeZone(player) && player.inventory.loot.StartLootingEntity(this))
	{
		if (Interface.CallHook("CanLootEntity", L1, this) != null)
		{
			return;
		}
		SetFlagLocal(Flags.Open, b: true);
		player.inventory.loot.AddContainer(item.contents);
		player.inventory.loot.SendImmediate();
		player.ClientRPC(RpcTarget.Player("RPC_OpenLootPanel", player), "generic_resizable");
		SendNetworkUpdate();
// …

Источники: Rust.opj из OxideMod/Oxide.Rust (MIT) и метаданные хуков документации Carbon (MIT). Код методов — декомпиляция сервера этой ветки.