RustTip

OnRfFrequencyChange

OxideRadio
object OnRfFrequencyChange(RFBroadcaster rFBroadcaster, int int32, BasePlayer player)
object OnRfFrequencyChange(RFReceiver rFReceiver, int int32, BasePlayer player)
object OnRfFrequencyChange(Detonator detonator, int freq, BasePlayer player)
object OnRfFrequencyChange(PagerEntity pagerEntity, int int32, BasePlayer player)
Работает — метод игры в этой сборке тот же, под который написан хук.

Параметры

rFBroadcaster
RFBroadcaster
int32
int
player
BasePlayer

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

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

Пример

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

private object OnRfFrequencyChange(RFBroadcaster rFBroadcaster, int int32, BasePlayer player)
{
    Puts("OnRfFrequencyChange");

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

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

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

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

Rust.opj (Oxide)
void RFBroadcaster.ServerSetFrequency(BaseEntity.RPCMessage)

Передаёт: RFBroadcaster rFBroadcaster, int int32, BasePlayer player

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

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

// …
	{
		nextChangeTime = Time.time + 2f;
		int num = RFManager.ClampFrequency(msg.read.Int32());
		if (RFManager.IsReserved(num))
		{
			RFManager.ReserveErrorPrint(msg.player);
			return;
		}
		if (Interface.CallHook("OnRfFrequencyChange", this, num, msg.player) != null)
		{
			return;
		}
		SetFrequency(num);
		Hurt(MaxHealth() * 0.01f, DamageType.Decay, this);
	}
}

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

Rust.opj (Oxide)
void RFReceiver.ServerSetFrequency(BaseEntity.RPCMessage)

Передаёт: RFReceiver rFReceiver, int int32, BasePlayer player

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

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

[RPC_Server]
[RPC_Server.IsVisible(3f)]
[RPC_Server.CallsPerSecond(3uL)]
public void ServerSetFrequency(RPCMessage msg)
{
	if (!(msg.player == null) && msg.player.CanBuild())
	{
		int num = RFManager.ClampFrequency(msg.read.Int32());
		if (Interface.CallHook("OnRfFrequencyChange", this, num, msg.player) != null)
		{
			return;
		}
		SetFrequency(num);
	}
}

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

Rust.opj (Oxide)
void Detonator.ServerSetFrequency(BasePlayer, int)

Передаёт: Detonator detonator, int freq, BasePlayer player

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

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

// …
	return;
}
nextChangeTime = Time.time + 2f;
if (RFManager.IsReserved(freq))
{
	RFManager.ReserveErrorPrint(player);
	return;
}
if (Interface.CallHook("OnRfFrequencyChange", this, freq, player) != null)
{
	return;
}
Item ownerItem = GetOwnerItem();
RFManager.ChangeFrequency(frequency, freq, this, isListener: false, IsOn());
frequency = freq;
SendNetworkUpdate();
Item item = GetItem();
// …

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

Rust.opj (Oxide)
void PagerEntity.ServerSetFrequency(BaseEntity.RPCMessage)

Передаёт: PagerEntity pagerEntity, int int32, BasePlayer player

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

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

[RPC_Server]
[RPC_Server.IsVisible(3f)]
public void ServerSetFrequency(RPCMessage msg)
{
	if (!(msg.player == null) && msg.player.CanBuild() && !(Time.time < nextChangeTime))
	{
		nextChangeTime = Time.time + 2f;
		int newFrequency = msg.read.Int32();
		if (Interface.CallHook("OnRfFrequencyChange", this, newFrequency, msg.player) != null)
		{
			return;
		}
		RFManager.ChangeFrequency(frequency, newFrequency, this, isListener: true);
		frequency = newFrequency;
		SendNetworkUpdateImmediate();
	}
}

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