RustTip

OnEntityTakeDamage

OxideCarbonEntity

Called when an entity take is damaged.

object OnEntityTakeDamage(ResourceEntity resourceEntity, HitInfo info)
object OnEntityTakeDamage(Rust.Ai.Gen2.LivestockAnimal livestockAnimal, HitInfo info)
Работает — метод игры в этой сборке тот же, под который написан хук.

Параметры

resourceEntity
ResourceEntity
info
HitInfo

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

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

Пример

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

private object OnEntityTakeDamage(ResourceEntity resourceEntity, HitInfo info)
{
    Puts("OnEntityTakeDamage");

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

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

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

Где вызывается

ядро Oxide (Oxide.Rust)
RustCore::IOnBaseCombatEntityHurt(BaseCombatEntity entity, HitInfo hitInfo)

Код ядра Oxide — отсюда вызывается хук

private object IOnBaseCombatEntityHurt(BaseCombatEntity entity, HitInfo hitInfo)
{
    if (entity is BasePlayer || entity is LivestockAnimal)
    {
        return null;
    }

    return Interface.CallHook("OnEntityTakeDamage", entity, hitInfo);
}

Где вызывается

ядро Oxide (Oxide.Rust)
RustCore::IOnBasePlayerAttacked(BasePlayer basePlayer, HitInfo hitInfo)

Код ядра Oxide — отсюда вызывается хук

private object IOnBasePlayerAttacked(BasePlayer basePlayer, HitInfo hitInfo)
{
    if (!serverInitialized || basePlayer == null || hitInfo == null || basePlayer.IsDead() || isPlayerTakingDamage || basePlayer is NPCPlayer)
    {
        return null;
    }

    if (Interface.CallHook("OnEntityTakeDamage", basePlayer, hitInfo) != null)
    {
        return true;
    }

    isPlayerTakingDamage = true;
    try
    {
        basePlayer.OnAttacked(hitInfo);
// …

Где вызывается

ядро Oxide (Oxide.Rust)
RustCore::IOnBasePlayerHurt(BasePlayer basePlayer, HitInfo hitInfo)

Код ядра Oxide — отсюда вызывается хук

private object IOnBasePlayerHurt(BasePlayer basePlayer, HitInfo hitInfo)
{
    return isPlayerTakingDamage ? null : Interface.CallHook("OnEntityTakeDamage", basePlayer, hitInfo);
}

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

Rust.opj (Oxide)
void ResourceEntity.OnAttacked(HitInfo)

Передаёт: ResourceEntity resourceEntity, HitInfo info

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

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

public override void OnAttacked(HitInfo info)
{
	if (!isServer || isKilled)
	{
		return;
	}
	if (Interface.CallHook("OnEntityTakeDamage", this, info) != null)
	{
		return;
	}
	if (resourceDispenser != null)
	{
		resourceDispenser.OnResourceDispenserAttacked(info);
	}
	if (!info.DidGather)
// …

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

Rust.opj (Oxide)
void Rust.Ai.Gen2.LivestockAnimal.Hurt(HitInfo)

Передаёт: Rust.Ai.Gen2.LivestockAnimal livestockAnimal, HitInfo info

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

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

public override void Hurt(HitInfo info)
{
	if (Interface.CallHook("OnEntityTakeDamage", this, info) != null)
	{
		return;
	}
	base.Hurt(info);
	if (!InSafeZone())
	{
		if (IsLeading())
		{
// …

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