CanLootEntity
OxideCarbonEntityCalled 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
void LootableCorpse.RPC_LootCorpse(BaseEntity.RPCMessage)
Передаёт: BasePlayer basePlayer, LootableCorpse lootableCorpse
Где вызывается (код игры этой ветки)
// …
[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
void ResourceContainer.StartLootingContainer(BaseEntity.RPCMessage)
Передаёт: BasePlayer basePlayer, ResourceContainer resourceContainer
Где вызывается (код игры этой ветки)
[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
void DroppedItemContainer.PlayerOpenLoot(BasePlayer)
Передаёт: BasePlayer player, DroppedItemContainer droppedItemContainer
Где вызывается (код игры этой ветки)
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
void RidableHorse.SERVER_OpenLoot(BaseEntity.RPCMessage)
Передаёт: BasePlayer basePlayer, RidableHorse ridableHorse
Где вызывается (код игры этой ветки)
// …
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
bool StorageContainer.PlayerOpenLoot(BasePlayer, string, bool)
Передаёт: BasePlayer player, StorageContainer storageContainer
Где вызывается (код игры этой ветки)
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
bool ContainerIOEntity.PlayerOpenLoot(BasePlayer, string, bool)
Передаёт: BasePlayer player, ContainerIOEntity containerIOEntity
Где вызывается (код игры этой ветки)
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
bool IndustrialCrafter.PlayerOpenLoot(BasePlayer, string, bool)
Передаёт: BasePlayer player, IndustrialCrafter industrialCrafter
Где вызывается (код игры этой ветки)
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
void WorldItem.RPC_OpenLoot(BaseEntity.RPCMessage)
Передаёт: object L1, WorldItem worldItem
Где вызывается (код игры этой ветки)
// …
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). Код методов — декомпиляция сервера этой ветки.