RustTip

OnCorpsePopulate

OxideCarbonNPC

Called when corpse populate occurs.

object OnCorpsePopulate(NPCPlayer nPCPlayer, NPCPlayerCorpse local1)
object OnCorpsePopulate(object Owner, LootableCorpse lootableCorpse)
object OnCorpsePopulate()
Работает — метод игры в этой сборке тот же, под который написан хук.

Параметры

nPCPlayer
NPCPlayer
local1
NPCPlayerCorpse

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

objectВозвращённое значение заменяет результат игры; null — игра решает сама.

Пример

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

private object OnCorpsePopulate(NPCPlayer nPCPlayer, NPCPlayerCorpse local1)
{
    Puts("OnCorpsePopulate");

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

    // повлиять на игру:
    // return default(BaseCorpse); // своё значение вместо результата игры
}

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

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

Rust.opj (Oxide)
BaseCorpse NPCPlayer.CreateCorpse(BasePlayer.PlayerFlags, Vector3, Quaternion, List<TriggerBase>, bool)

Передаёт: NPCPlayer nPCPlayer, NPCPlayerCorpse local1

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

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

// …
		for (int i = 0; i < nPCPlayerCorpse.containers.Length; i++)
		{
			ItemContainer itemContainer = nPCPlayerCorpse.containers[i];
			if (!KeepCorpseClothingIntact || i != 1)
			{
				itemContainer.Clear();
			}
		}
		object returnvar = Interface.CallHook("OnCorpsePopulate", this, nPCPlayerCorpse);
		if (returnvar is BaseCorpse)
		{
			return (BaseCorpse)returnvar;
		}
		ApplyLoot(nPCPlayerCorpse);
	}
	return nPCPlayerCorpse;
}
// …

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

Rust.opj (Oxide)
void Rust.Ai.Gen2.State_Dead.StartRagdoll()

Передаёт: object Owner, LootableCorpse lootableCorpse

РаботаетReturnBehavior: ExitWhenNonNullArgumentBehavior: UseArgumentString (this.Owner, l1)Assembly-CSharp.dll

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

// …
	castedUnityObject.playerName = prefabInformation.title.translated;
}
else
{
	castedUnityObject.playerName = Owner.GetType().Name;
}
castedUnityObject.Spawn();
baseCorpse.TakeChildren(Owner);
if (Interface.CallHook("OnCorpsePopulate", this.Owner, castedUnityObject) != null)
{
	return;
}
if (LootSpawnSlots.Length != 0)
{
	LootContainer.LootSpawnSlot[] lootSpawnSlots = LootSpawnSlots;
	for (int i = 0; i < lootSpawnSlots.Length; i++)
	{
// …

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

Rust.opj (Oxide)
void Rust.Ai.Gen2.State_Dead.StartRagdoll()

Передаёт: —

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

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

// …
else
{
	castedUnityObject.playerName = Owner.GetType().Name;
}
castedUnityObject.Spawn();
baseCorpse.TakeChildren(Owner);
if (LootSpawnSlots.Length != 0)
{
	object result = Interface.CallHook("OnCorpsePopulate");
	// … проверка результата (Modify-хук, см. Rust.opj)
	LootContainer.LootSpawnSlot[] lootSpawnSlots = LootSpawnSlots;
	for (int i = 0; i < lootSpawnSlots.Length; i++)
	{
		LootContainer.LootSpawnSlot lootSpawnSlot = lootSpawnSlots[i];
		for (int j = 0; j < lootSpawnSlot.numberToSpawn; j++)
		{
			if (Random.Range(0f, 1f) <= lootSpawnSlot.probability)
// …

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