예제 #1
0
        /// <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()));
        }
예제 #2
0
        /*---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);
        }
예제 #3
0
        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();
        }
예제 #4
0
        /*---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;
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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();
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        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();
        }