Rust, ich wollte nur einen Tank spawnen!

Mar 13 2023
Das Ziel und der Hintergrund Ein paar Freunde und ich haben vor kurzem angefangen, Rust zu spielen, und es kann auf jeden Fall viel Spaß machen. Solange du es schaffst, am Leben zu bleiben.
Bradley APC in Rust (über Rustified)

Das Ziel und der Hintergrund

Ein paar Freunde und ich haben vor kurzem angefangen, Rust zu spielen , und es kann auf jeden Fall eine Menge Spaß machen. Solange du es schaffst, am Leben zu bleiben.

Als wir mit dem Spiel weiter vorankamen, beschloss ein Freund, einen Server zu hosten – was großartig war, um mehr über das Spiel zu erfahren! Um den Spaß noch zu steigern, installierte er das Guarded Crate -Plugin von Bazz3l .

Die Plugin-Funktionalität ist unkompliziert: Mit Locked Crates werden zufällig Ereignisse auf der gesamten Karte erzeugt . Wenn Sie die Wachen („Wissenschaftler“) besiegen, die die Kiste beschützen, erhalten Sie die süße, süße Beute darin eingeschlossen.

Wir waren nie zufrieden und fragten uns, ob es möglich wäre, es um die folgende Funktionalität zu erweitern:

  • Erzeuge einen BradleyAPC-Panzer, um die Kiste zu schützen (warum nicht?)
  • Ereignis, das am aktuellen Standort des Spielers erscheint (statt nur zufällig)
  • Fügen Sie Guard-Vielfalt hinzu (damit sie nicht mehr alle gleich sind)

Nachdem wir nun unseren Geltungsbereich definiert hatten, wurde mir schnell klar, dass ich über Folgendes nichts weiß :

  • Rust-Plugin-Entwicklung
  • Einheit
  • C#

Okay, fangen wir mit der Dokumentation an!

Viel Glück. Die Dokumentation des Rust-Plugins ist unglaublich spärlich!
– Irgendein zufälliger Entwickler

Im Ernst, das ist wahrscheinlich eine Untertreibung. In den meisten Foren wird einem empfohlen, sich einfach andere Plugins anzusehen. Auch wenn das sicher nie schadet, sind hier ein paar Referenzen, die mir dabei geholfen haben:

Wenn Sie neu anfangen und neugierig auf Methoden, Funktionen und Standardverhalten sind, müssen Sie Assembly-CSharp.dll (eine der wichtigsten Serverbibliotheken von Rust) dekompilieren.

Sie können diese DLL erhalten, indem Sie den ersten Schritt unter Erstellen eines Rust-Servers ausführen . Sie müssen den Server nicht ausführen, sondern ihm lediglich erlauben, die neueste DLL herunterzuladen

Es mag wie ein entmutigender Schritt klingen (ein Schritt, den ich VIEL länger aufgeschoben habe, als ich hätte tun sollen), aber er ist unglaublich aufschlussreich. Und zum Glück gibt es viele Tools, die dies einfach machen.

JustDecompile von Telerik ist ein großartiges kostenloses Tool (obwohl eine Anmeldung erforderlich ist) und macht die Überprüfung von Rust-Interna zum Kinderspiel.

Dieser Schritt hat mir geholfen, mich viel besser darauf vorzubereiten, in den bestehenden Plugin-Code einzutauchen, also lasst uns zum Spaß übergehen!

Erlaube dem Ereignis, am Standort des Spielers zu erscheinen

Das Plugin verfügt bereits über die Fähigkeit, an zufälligen Orten zu spawnen. Ich dachte, es könnte nicht allzu schwierig sein, stattdessen auf dem Player zu spawnen, und könnte als guter Einstiegspunkt in den bestehenden Plugin-Code dienen.

Zum Glück war es einfacher als ich dachte:

private Vector3 GetPlayerPosition(IPlayer player)
{
  BasePlayer _player = player.Object as BasePlayer;
  return _player.transform.position;
}

Nebenbemerkung: Ich verstehe die Beziehung zwischen IPlayer und BasePlayer noch nicht. Fast alles geht von einer „Basis“-bezogenen Klasse aus, sodass die Typerzwingung möglicherweise nicht erforderlich ist. Ich verstehe auch Unitys Vector3 noch nicht ganz , abgesehen davon, dass es sich um eine Darstellung von Raum oder Punkten auf der Karte handelt.

Erfolg!! Das Ereignis ist bei mir statt an einem zufälligen Ort entstanden!

Ja, Lektion gelernt ... Aktivieren Sie beim Testen den Gott-Modus ‍♂️

Hinzufügen von Guard-Vielfalt

Nachdem ich einige andere Plugins überprüft hatte, konnte ich die vorgefertigten Standorte der anderen Wissenschaftler finden.

  • Hier finden Sie eine umfassende Fertigteilliste

string[] NPC_PREFABS = {
  "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_roam.prefab",
  "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab",
  "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_oilrig.prefab",
  "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_patrol.prefab"
};

var prefab = NPC_PREFABS[Random.Range(0, NPC_PREFABS.Length - 1)];
var npc = (ScientistNPC)GameManager.server.CreateEntity(prefab, position, rotation);

Woot! Sie sind jetzt anders!

Spawn BradleyAPC Panzer

Okay, verschiedene Guard-Fertigteile waren einfach genug. Lasst uns den Tank ausprobieren!

Ich habe der NPC-Spawn-Methode den folgenden Code hinzugefügt

string BRADLEY_PREFAB = "assets/prefabs/npc/m2bradley/bradleyapc.prefab";

var apc = (BradleyAPC)GameManager.server.CreateEntity(BRADLEY_PREFAB, position, rotation);
apc.enableSaving = false;
apc.Spawn();

Tank rennt weg, erschießt seine Freunde und kümmert sich nicht um mich... absoluter Knaller!

Anscheinend hat der BradleyAPC also seinen eigenen Kopf.

Es mag schwer zu sagen sein, aber es eröffnet das Feuer auf seine NPC-Freunde und versucht, seinen vordefinierten Weg zu vollenden ‍♂️

Hier war die Dekompilierung von Assembly-CSharp.dll unglaublich hilfreich. Ich konnte verstehen, welche Methoden zur Steuerung des APC zur Verfügung standen (leider nicht viele).

apc.targetList.Clear();
apc.ClearPath();

Vielfalt an meinem Standort und ein Tank! Erfolg!!

Es gibt wahrscheinlich weitaus ausgefeiltere Möglichkeiten, Tank-NPC-Ziele zu kontrollieren, da ich sicherlich nicht behaupte, ein Experte zu sein, aber dies war eine unglaublich unterhaltsame Möglichkeit, das Rust-Plugin-Ökosystem und die Komplexität kennenzulernen, die es mit sich bringt, „einfach“ jeden NPC hervorzubringen!

Schauen Sie sich unten meine (groben) Änderungen am GuardedCrate-Plugin an!

  • https://github.com/sean3z/GuardedCrate-Rust