/// <summary> /// Add a custom prefab to the manager with known source mod metadata. Don't fix references. /// </summary> /// <param name="prefab">Prefab to add</param> /// <param name="sourceMod">Metadata of the mod adding this prefab</param> /// <returns>true if the custom prefab was added to the manager.</returns> internal bool AddPrefab(GameObject prefab, BepInPlugin sourceMod) { CustomPrefab customPrefab = new CustomPrefab(prefab, sourceMod); AddPrefab(customPrefab); return(Prefabs.ContainsKey(prefab.name.GetStableHashCode())); }
/*---Creates a new grenade object---*/ public static GrenadeObject CreateNew(Vector3 position, Quaternion rotation, ShipRefs owner) { // create object CustomPrefab grenadePrefab = Instantiate(GrenadeMod.GrenadePrefab); GrenadeObject grenade = grenadePrefab.gameObject.AddComponent <GrenadeObject>(); grenade.Owner = owner; // setup the grenades transform grenade.transform.position = position; grenade.transform.rotation = rotation; // get the components from the custom prefab and apply them to the grenade MeshRenderer grenadeRenderer = grenadePrefab.GetComponent <MeshRenderer>("Mesh"); BoxCollider shipCollider = grenadePrefab.GetComponent <BoxCollider>("ShipCollider"); BoxCollider environmentCollider = grenadePrefab.GetComponent <BoxCollider>("EnvCollider"); // setup Components environmentCollider.gameObject.layer = LayerMask.NameToLayer("Weapon"); // the weapon layer only collides with scenery // setup speed float velBasedSpeed = owner.InverseTransformDirection(owner.RBody.velocity).z *ConfigSpeed * 0.06f; grenade.StatSpeed = Mathf.Max(ConfigSpeed, velBasedSpeed); // setup other stats grenade.ImpactSettings = ConfigImpactSettings; grenade.StatLifetime = ConfigLifetime; grenade.StatGravity = ConfigGravity; grenade.StatBounceForce = ConfigBounceForce; grenade.StatMaxBounces = ConfigMaxBounces; // setup Colliders grenade.ShipCollider = shipCollider; grenade.EnvironmentCollider = environmentCollider; grenade.ProjectileMeshRenderer = grenadeRenderer; // cache transform of the grenade mesh object. grenade.GrenadeMeshT = grenadeRenderer.transform; // assign explosion prefab grenade.PrefabExplosion = GrenadeMod.ExposionPrefab; grenade.ConfigureProjectile(owner.CollisionMeshObject, grenade.StatSpeed, owner); // check if there is environment between the ship and grenade spawn position and destroy the grenade if there is bool envBlockingGrenade = Physics.Linecast(owner.RBody.position, position, Layers.FloorMask | Layers.TrackWall); if (envBlockingGrenade) { grenade.DestroyProjectile(null); } return(grenade); }
private void DocCharacters(Player self) { if (Generated) { return; } var imageDirectory = Path.Combine(DocumentationDirConfig.Value, "images/characters"); Directory.CreateDirectory(imageDirectory); Jotunn.Logger.LogInfo("Documenting characters"); AddHeader(1, "Character list"); AddText("All of the Character prefabs currently in the game."); AddText("This file is automatically generated from Valheim using the JotunnDoc mod found on our GitHub."); AddTableHeader("Name", "Components"); List <GameObject> allPrefabs = new List <GameObject>(); allPrefabs.AddRange(ZNetScene.instance.m_nonNetViewPrefabs); allPrefabs.AddRange(ZNetScene.instance.m_prefabs); foreach (GameObject obj in allPrefabs.Where(x => !CustomPrefab.IsCustomPrefab(x.name) && x.GetComponent <Character>() != null).OrderBy(x => x.name)) { string name = obj.name; if (RequestSprite(Path.Combine(imageDirectory, $"{name}.png"), obj, RenderManager.IsometricRotation)) { name += $"<br><img src=\"../../images/characters/{name}.png\">"; } string components = "<ul>"; foreach (Component comp in obj.GetComponents <Component>()) { components += "<li>" + comp.GetType().Name + "</li>"; } components += "</ul>"; AddTableRow( name, components ); } Save(); }
/*---Called when our mod is registered into the game. Use this for setting stuff up---*/ public override void OnRegistered() { // load assets GrenadeAssets = ModAssets.Load(Path.Combine(ModLocation, "grenade.nga")); GrenadePrefab = GrenadeAssets.GetComponent <CustomPrefab>("Grenade", false); ExposionPrefab = GrenadeAssets.GetAsset <GameObject>("Explosion"); GrenadePickupLine = GrenadeAssets.GetAsset <AudioClip>("Voice_Pickup"); GrenadeWarningLine = GrenadeAssets.GetAsset <AudioClip>("Voice_Warning"); Texture2D iconTexture = GrenadeAssets.GetAsset <Texture2D>("Icon"); // sprites are always saved as texture2d, we'll need to convert it back to a sprite manually GrenadeIcon = Sprite.Create(iconTexture, new Rect(0.0f, 0.0f, iconTexture.width, iconTexture.height), Vector2.zero); // setup prefab explosion with callback (see the script for more details) ExposionPrefab.AddComponent <GrenadeParticleCallback>(); /*--------------------------------------------------------------------------- * Register the pickup. There's a lot going on here, so let's break this down * --------------------------------------------------------------------------*/ RegisteredPickup = new Pickup( r => new GrenadePickup(r), // when the ship goes to setup the pickup logic, this returns a new instance of our weapon pickup class "grenades", // this is the name of the pickup and will be used for stuff like the give command GrenadeIcon, // this is the icon of the pickup for the hud Pickup.EHudColor.Offensive, // this is the color of the pickup icon. Offensive is red, defensive is green GrenadePickupLine, // the audio clip to play when a player picks this pickup up GrenadeWarningLine, // the audio clip to play for AI warning callouts for this pickup new [] { "Grenades_Pickup", "Grenades_Warning" }, // the name of the .wav files to load for custom sound packs. First entry is the pickup line, 2nd is the warning (ship, chance) => ship.CurrentPlace > 1, // called when determining to give this pickup to a ship. Return true to always give the pickup to a ship, // otherwise return your condition as true/false here // the chance value is a random value between 0 and 100 that you can also use for extra randomness 100); // the weighting of the pickup. This is how likely this pickup is to be picked. A higher number = better chance of being picked // register Network Packet Callback NgNetworkBase.OnRecievedCustomPacketData += OnRecievedCustomPacketData; }
/// <summary> /// Add a custom prefab to the manager.<br /> /// Checks if a prefab with the same name is already added.<br /> /// Added prefabs get registered to the <see cref="ZNetScene"/> on <see cref="ZNetScene.Awake"/>. /// </summary> /// <param name="customPrefab">Prefab to add</param> public void AddPrefab(CustomPrefab customPrefab) { if (!customPrefab.IsValid()) { Logger.LogWarning($"Custom prefab {customPrefab} is not valid"); return; } int hash = customPrefab.Prefab.name.GetStableHashCode(); if (Prefabs.ContainsKey(hash)) { Logger.LogWarning($"Prefab '{customPrefab}' already exists"); return; } customPrefab.Prefab.transform.SetParent(PrefabContainer.transform, false); Prefabs.Add(hash, customPrefab); }
private void DocPrefabs(Player self) { if (Generated) { return; } Jotunn.Logger.LogInfo("Documenting prefabs"); AddHeader(1, "Prefab list"); AddText("All of the prefabs currently in the game (ZNetScene and ZoneManager)."); AddText("This file is automatically generated from Valheim using the JotunnDoc mod found on our GitHub."); AddTableHeader("Name", "Components"); List <GameObject> allPrefabs = new List <GameObject>(); allPrefabs.AddRange(ZNetScene.instance.m_nonNetViewPrefabs); allPrefabs.AddRange(ZNetScene.instance.m_prefabs); allPrefabs.AddRange(ZoneSystem.instance.m_locations.Where(x => x.m_prefab).Select(x => x.m_prefab)); foreach (GameObject obj in allPrefabs.Where(x => !CustomPrefab.IsCustomPrefab(x.name)).OrderBy(x => x.name)) { string components = "<ul>"; foreach (Component comp in obj.GetComponents <Component>()) { components += "<li>" + comp.GetType().Name + "</li>"; } components += "</ul>"; AddTableRow( obj.name, components ); } Save(); }
/// <summary> /// Add a custom prefab to the manager.<br /> /// Checks if a prefab with the same name is already added.<br /> /// Added prefabs get registered to the <see cref="ZNetScene"/> on <see cref="ZNetScene.Awake"/>. /// </summary> /// <param name="prefab">Prefab to add</param> public void AddPrefab(GameObject prefab) { CustomPrefab customPrefab = new CustomPrefab(prefab, false); AddPrefab(customPrefab); }
private void DocMaterials(Player self) { if (Generated) { return; } Jotunn.Logger.LogInfo("Documenting prefab materials"); AddHeader(1, "Prefab material list"); AddText("All materials, the prefabs they are used in and their respective shaders and keywords currently in the game (ZNetScene and ZoneManager)."); AddText("This file is automatically generated from Valheim using the JotunnDoc mod found on our GitHub."); AddTableHeader("Material", "Prefabs", "Shader", "Keywords"); List <GameObject> allPrefabs = new List <GameObject>(); allPrefabs.AddRange(ZNetScene.instance.m_nonNetViewPrefabs); allPrefabs.AddRange(ZNetScene.instance.m_prefabs); allPrefabs.AddRange(ZoneSystem.instance.m_locations.Where(x => x.m_prefab).Select(x => x.m_prefab)); Dictionary <string, Material> mats = new Dictionary <string, Material>(); Dictionary <string, List <string> > matPrefabs = new Dictionary <string, List <string> >(); foreach (GameObject prefab in allPrefabs.Where(x => !CustomPrefab.IsCustomPrefab(x.name)).OrderBy(x => x.name)) { foreach (Material mat in ShaderHelper.GetAllRendererMaterials(prefab)) { const string instanceToken = " (Instance)"; string matName = mat.name; // Add distinct materials if (matName.EndsWith(instanceToken)) { matName = matName.Substring(0, matName.Length - instanceToken.Length); } if (!mats.ContainsKey(matName)) { mats.Add(matName, mat); } // Add prefab per material if (!matPrefabs.ContainsKey(matName)) { matPrefabs.Add(matName, new List <string>()); } matPrefabs[matName].Add(prefab.name); } } foreach (var entry in mats.OrderBy(x => x.Key)) { Material mat = entry.Value; StringBuilder prefabsb = new StringBuilder(); prefabsb.Append("<ul>"); foreach (string prefab in matPrefabs[entry.Key].Distinct().OrderBy(x => x)) { prefabsb.Append("<li>"); prefabsb.Append(prefab); prefabsb.Append("</li>"); } prefabsb.Append("</ul>"); StringBuilder keysb = new StringBuilder(); keysb.Append("<dl>"); if (mat.shaderKeywords.Length > 0) { foreach (string prop in mat.shaderKeywords) { keysb.Append("<dd>"); keysb.Append(prop); keysb.Append("</dd>"); } } keysb.Append("</dl>"); AddTableRow(entry.Key, prefabsb.ToString(), mat.shader.name, keysb.ToString()); } Save(); }