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(); }
}
}