using System.Collections.Generic; using HutongGames.PlayMaker; using UnityEngine; namespace MSCO { /// /// Admin: Items spawnen. Kopiert ein vorhandenes Item des Spiels (z.B. "beer case(itemx)" aus dem Laden) und /// setzt die Kopie an die gewünschte Stelle. Die Kopie behält den Namen des Originals, damit sich die Spiel-Logik /// (Trinken, Essen, Tanken ...) wie beim echten Item verhält und der Objekt-Sync sie bei allen gleich benennt. /// Werkzeuge wie der Ratschenkasten sind im Spiel keine Gegenstände, sondern ein Schalter ("hat der Spieler") - /// die werden dem Admin direkt gegeben. /// public static class ItemSpawner { /// Werkzeug statt Gegenstand: globale Spielvariable, die "gekauft" bedeutet. public const string RatchetSet = "ratchet set"; /// Auswahl im Admin-Menü (Anzeigename). public static readonly string[] Items = { // Werkzeug / Auto RatchetSet, "spanner set", "battery", "car jack", "floor jack", "motor hoist", "flashlight", "lantern", "fire extinguisher", "spray can", "sledgehammer", "ax", "digging bar", // Flüssigkeiten / Kraftstoff "motor oil", "coolant", "brake fluid", "two stroke fuel", "gasoline", "diesel", "n2o bottle", // Essen / Trinken / Laden "beer case", "beer", "booze", "vodka shot", "milk", "juice", "coffee", "ground coffee", "sugar", "yeast", "sausages", "pizza", "macaron box", "potato chips", "cigarettes", "mosquito spray", "grill charcoal", // Sonstiges "grill", "radio", "camera", "helmet", "bucket", "water bucket", "fireworks bag", "parts magazine" }; // Items, die im Spiel nicht "(itemx)" heißen static readonly Dictionary objectNames = new Dictionary { { "battery", "battery(Clone)" } }; static readonly Dictionary templates = new Dictionary(); public static bool IsKnown(string item) { return System.Array.IndexOf(Items, item) >= 0; } static string ObjectName(string item) { string name; return objectNames.TryGetValue(item, out name) ? name : item + "(itemx)"; } static GameObject FindTemplate(string item) { return FindTemplateByObjectName(ObjectName(item)); } static GameObject FindTemplateByObjectName(string name) { GameObject cached; if (templates.TryGetValue(name, out cached) && cached != null) return cached; GameObject best = null; foreach (Object o in Resources.FindObjectsOfTypeAll(typeof(GameObject))) { var go = (GameObject)o; if (go.name != name || go.GetComponent() == null) continue; // Keine eingebauten Teile kopieren (z.B. die Batterie im Auto): nicht unter einem anderen Rigidbody if (go.transform.parent != null && go.transform.parent.GetComponentInParent() != null) continue; if (best == null || (go.activeInHierarchy && !best.activeInHierarchy)) best = go; // am liebsten eins aus der Welt } templates[name] = best; return best; } /// Zuletzt erzeugtes Objekt (damit der Objekt-Sync es nicht als "neu gekauft" meldet). public static GameObject LastSpawned { get; private set; } /// Item nach seinem Objektnamen erzeugen (z.B. "beer case(itemx)") - für Einkäufe anderer Spieler. public static bool SpawnObjectNamed(string objectName, Vector3 position, Quaternion rotation) { if (string.IsNullOrEmpty(objectName) || !objectName.EndsWith("(itemx)") || objectName.Length > 100) return false; return SpawnTemplate(FindTemplateByObjectName(objectName), objectName, position, rotation); } /// Item erzeugen. Gibt false zurück, wenn es im Spiel kein solches Item gibt. public static bool Spawn(string item, Vector3 position, Quaternion rotation) { return SpawnTemplate(FindTemplate(item), item, position, rotation); } static bool SpawnTemplate(GameObject template, string item, Vector3 position, Quaternion rotation) { LastSpawned = null; if (template == null) { MscoLog.Warning("Cannot spawn '" + item + "' - no such item in this game"); return false; } var clone = (GameObject)Object.Instantiate(template, position, rotation); LastSpawned = clone; clone.name = template.name; clone.transform.SetParent(null, true); clone.SetActive(true); Rigidbody rb = clone.GetComponent(); if (rb != null) { rb.isKinematic = false; rb.velocity = Vector3.zero; rb.angularVelocity = Vector3.zero; } return true; } /// Ratschenkasten "kaufen": der Spieler hat ihn dann wie nach dem Kauf im Laden. public static bool GiveRatchetSet() { FsmBool has = FsmVariables.GlobalVariables.FindFsmBool("PlayerHasRatchet"); if (has == null) return false; has.Value = true; return true; } public static void ClearCache() { templates.Clear(); } } }