using System.Collections.Generic;
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.
///
public static class ItemSpawner
{
/// Auswahl im Admin-Menü (Name ohne "(itemx)").
public static readonly string[] Items =
{
"beer case", "sausages", "pizza", "macaron box", "milk", "juice", "ground coffee", "sugar", "yeast", "booze",
"gasoline", "diesel", "spray can", "fire extinguisher", "flashlight", "lantern", "car jack", "floor jack",
"spanner set", "sledgehammer", "radio", "camera", "grill charcoal", "fireworks bag", "water bucket"
};
static readonly Dictionary templates = new Dictionary();
static GameObject FindTemplate(string item)
{
GameObject cached;
if (templates.TryGetValue(item, out cached) && cached != null) return cached;
string name = item + "(itemx)";
GameObject best = null;
foreach (Object o in Resources.FindObjectsOfTypeAll(typeof(GameObject)))
{
var go = (GameObject)o;
if (go.name != name || go.GetComponent() == null) continue;
if (best == null || (go.activeInHierarchy && !best.activeInHierarchy)) best = go; // am liebsten ein echtes in der Welt
}
templates[item] = best;
return best;
}
/// Item erzeugen. Gibt false zurück, wenn es im Spiel kein solches Item gibt.
public static bool Spawn(string item, Vector3 position, Quaternion rotation)
{
GameObject template = FindTemplate(item);
if (template == null)
{
MscoLog.Warning("Cannot spawn '" + item + "' - no such item in this game");
return false;
}
var clone = (GameObject)Object.Instantiate(template, position, rotation);
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;
}
public static void ClearCache() { templates.Clear(); }
}
}