RustTip

IOnNpcTarget

OxideNPC
object IOnNpcTarget(BaseNpc baseNpc, BaseEntity target)
object IOnNpcTarget(Rust.Ai.Gen2.SenseComponent senseComponent, BaseEntity entity)
object IOnNpcTarget(WildlifeHazard wildlifeHazard, BasePlayer player)
object IOnNpcTarget(BoatAI boatAI, BasePlayer ply)
Метод изменился — проверить — код метода игры отличается от того, под который записан хук в Oxide. Хук всё равно вызывается, но место вызова могло сместиться — стоит проверить после обновления.

Параметры

baseNpc
BaseNpc
target
BaseEntity

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

objectЕсли вернуть значение типа результата метода, игра сразу вернёт его; null — продолжит как обычно.

Пример

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

private object IOnNpcTarget(BaseNpc baseNpc, BaseEntity target)
{
    Puts("IOnNpcTarget");

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

    // повлиять на игру:
    // return null; // null — игра продолжит как обычно
}

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

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

Rust.opj (Oxide)
float BaseNpc.GetWantsToAttack(BaseEntity)

Передаёт: BaseNpc baseNpc, BaseEntity target

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

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

public float GetWantsToAttack(BaseEntity target)
{
	object returnvar = Interface.CallHook("IOnNpcTarget", this, target);
	if (returnvar is float)
	{
		return (float)returnvar;
	}
	return WantsToAttack(target);
}

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

Rust.opj (Oxide)
bool Rust.Ai.Gen2.SenseComponent.CanTarget(BaseEntity)

Передаёт: Rust.Ai.Gen2.SenseComponent senseComponent, BaseEntity entity

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

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

// …
	{
		return false;
	}
	if (SimpleAIMemory.PlayerIgnoreList.Contains(item))
	{
		return false;
	}
}
object returnvar = Interface.CallHook("IOnNpcTarget", this, entity);
if (returnvar is bool)
{
	return (bool)returnvar;
}
if (Observer != null && Observer.RefusesToTarget(entity))
{
	return false;
}
// …

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

Rust.opj (Oxide)
bool WildlifeHazard.ShouldStartHazard(BasePlayer)

Передаёт: WildlifeHazard wildlifeHazard, BasePlayer player

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

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

// …
if (IsInvoking(FailHazardDelayed))
{
	return false;
}
if (SingularInteraction && SingularInteractionPlayer != null)
{
	return false;
}
object returnvar = Interface.CallHook("IOnNpcTarget", this, player);
if (returnvar is bool)
{
	return (bool)returnvar;
}
if (!CanSeeTarget(player.transform))
{
	return false;
}
// …

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

Rust.opj (Oxide)
bool BoatAI.IsPlayerTargetValid(BasePlayer)

Передаёт: BoatAI boatAI, BasePlayer ply

Метод изменился — проверитьReturnBehavior: ExitWhenValidTypeArgumentBehavior: UseArgumentString (this, a0)Assembly-CSharp.dll

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

// …
		Debug.LogWarning("[BoatAI] Invalid target: " + ply.displayName + " is in ignore list");
	}
	return false;
}
if (_ignoredUntil.TryGetValue(ply.userID.Get(), out var value) && Time.time < value)
{
	if (PRINT_DEBUGS)
	{
		object returnvar = Interface.CallHook("IOnNpcTarget", this, ply);
		if (returnvar is bool)
		{
			return (bool)returnvar;
		}
		Debug.LogWarning("[BoatAI] Invalid target: " + ply.displayName + " was given up on recently");
	}
	return false;
}
// …

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