Exemplo n.º 1
0
        private void DocItems()
        {
            if (Generated)
            {
                return;
            }

            Jotunn.Logger.LogInfo("Documenting items");

            AddHeader(1, "Item list");
            AddText("All of the items currently in the game, with English localizations applied");
            AddText("This file is automatically generated from Valheim using the JotunnDoc mod found on our GitHub.");
            AddTableHeader("Prefab", "Name", "Type", "Description");

            foreach (GameObject obj in ObjectDB.instance.m_items)
            {
                ItemDrop item = obj.GetComponent <ItemDrop>();
                ItemDrop.ItemData.SharedData shared = item.m_itemData.m_shared;

                AddTableRow(
                    obj.name,
                    JotunnDoc.Localize(shared.m_name),
                    shared.m_itemType.ToString(),
                    JotunnDoc.Localize(shared.m_description));
            }

            Save();
        }
Exemplo n.º 2
0
        private static GameObject DesignThornAttack()
        {
            GameObject gameObject = RRRLateLoadPrefabs.Clone("gd_king_shoot", MobNames.Groot.ToString() + "_shoot", true, true);

            ItemDrop.ItemData.SharedData shared = ((ItemDrop.ItemData)((ItemDrop)gameObject.GetComponent <ItemDrop>()).m_itemData).m_shared;
            shared.m_aiAttackRangeMin            = 2.0f;
            shared.m_dodgeable                   = true;
            shared.m_blockable                   = true;
            shared.m_damages.m_poison            = Groot.ShootDmgPoison;
            shared.m_damages.m_pierce            = Groot.ShootDmgPierce;
            shared.m_damages.m_chop              = 0;
            shared.m_damages.m_pickaxe           = 0;
            shared.m_attack.m_attackAnimation    = "shoot";
            shared.m_attack.m_projectileVel      = (float)20.0;
            shared.m_attack.m_attackHeight       = (float)1.200000011920929;
            shared.m_attack.m_attackRange        = (float)2.15000009536743;
            shared.m_attack.m_attackAngle        = (float)2.0;
            shared.m_attack.m_attackRayWidth     = (float)1.0;
            shared.m_attack.m_projectileBursts   = (int)1;
            shared.m_attack.m_projectileAccuracy = (float)1.0;
            shared.m_attack.m_burstInterval      = (float)0.5;
            shared.m_aiAttackInterval            = (float)7.0;
            shared.m_aiAttackRange               = (float)25.0;
            shared.m_aiAttackRangeMin            = (float)1.0;
            shared.m_startEffect                 = ObjectDB.instance.GetItemPrefab("gd_king_shoot").GetComponent <ItemDrop>().m_itemData.m_shared.m_startEffect;
            return(gameObject);
        }
            public void PrefabCreated()
            {
                SurtlingCoreOverclocking.dropTable["$" + SurtlingCoreOverclocking.coreSlotKey] = ItemDrop;
                sharedData = ItemDrop.m_itemData.m_shared;

                sharedData.m_name        = "$" + SurtlingCoreOverclocking.coreSlotKey;
                sharedData.m_description = "$" + SurtlingCoreOverclocking.coreSlotKey + "_description";
                sharedData.m_icons[0]    = sprite;
            }
 //Extraction Related Methods
 //
 //
 public static void TryExtractEffectsFromItemDropShared(ItemDrop.ItemData.SharedData shared)
 {
     CollectEffectsFromItemDrop(shared.m_hitEffect);
     CollectEffectsFromItemDrop(shared.m_hitTerrainEffect);
     CollectEffectsFromItemDrop(shared.m_holdStartEffect);
     CollectEffectsFromItemDrop(shared.m_startEffect);
     CollectEffectsFromItemDrop(shared.m_triggerEffect);
     CollectEffectsFromItemDrop(shared.m_blockEffect);
     CollectEffectsFromItemDrop(shared.m_trailStartEffect);
 }
Exemplo n.º 5
0
        private static GameObject DesignSquitoSting()
        {
            GameObject gameObject = RRRLateLoadPrefabs.Clone("Deathsquito_sting", "miniSting", true, true);

            ItemDrop.ItemData.SharedData shared =
                ((ItemDrop.ItemData)((ItemDrop)gameObject.GetComponent <ItemDrop>()).m_itemData).m_shared;
            shared.m_damages.m_pierce = MiniSquito.MeleeDmgPierce;
            shared.m_secondaryAttack  = shared.m_attack;

            return(gameObject);
        }
            public void PrefabCreated()
            {
                Debug.Log("Configuring item drop for OverclockProductivityCore");

                SurtlingCoreOverclocking.dropTable["$" + SurtlingCoreOverclocking.productivityCoreKey] = ItemDrop;
                sharedData = ItemDrop.m_itemData.m_shared;

                sharedData.m_name        = "$" + SurtlingCoreOverclocking.productivityCoreKey;
                sharedData.m_description = "$" + SurtlingCoreOverclocking.productivityCoreKey + "_description";
                sharedData.m_icons[0]    = sprite;
            }
Exemplo n.º 7
0
        private void DocStatusEffects()
        {
            if (Generated)
            {
                return;
            }

            Jotunn.Logger.LogInfo("Documenting status effects");

            AddHeader(1, "Status effect list");
            AddText("All of the status effects currently in the game, with English localizations applied");
            AddText("This file is automatically generated from Valheim using the JotunnDoc mod found on our GitHub.");
            AddTableHeader("Object", "Name", "Category");

            Dictionary <string, StatusEffect> statusEffects = new Dictionary <string, StatusEffect>();

            foreach (GameObject obj in ObjectDB.instance.m_items)
            {
                ItemDrop item = obj.GetComponent <ItemDrop>();
                ItemDrop.ItemData.SharedData shared = item.m_itemData.m_shared;

                if (shared.m_attackStatusEffect)
                {
                    statusEffects[shared.m_attackStatusEffect.name] = shared.m_attackStatusEffect;
                }

                if (shared.m_consumeStatusEffect)
                {
                    statusEffects[shared.m_consumeStatusEffect.name] = shared.m_consumeStatusEffect;
                }

                if (shared.m_equipStatusEffect)
                {
                    statusEffects[shared.m_equipStatusEffect.name] = shared.m_equipStatusEffect;
                }

                if (shared.m_setStatusEffect)
                {
                    statusEffects[shared.m_setStatusEffect.name] = shared.m_setStatusEffect;
                }
            }

            foreach (StatusEffect statusEffect in statusEffects.Values)
            {
                AddTableRow(
                    statusEffect.name,
                    JotunnDoc.Localize(statusEffect.m_name),
                    JotunnDoc.Localize(statusEffect.m_category));
            }

            Save();
        }
Exemplo n.º 8
0
        public void Register()
        {
            logger.LogDebug("Configuring item drop for PlanCrystal");

            ItemDrop.ItemData.SharedData sharedData = ItemDrop.m_itemData.m_shared;
            sharedData.m_name        = "$item_" + localizationName;
            sharedData.m_description = "$item_" + localizationName + "_description";
            Texture2D    texture      = AssetUtils.LoadTexture(PlanBuild.GetAssetPath(iconPath));
            StatusEffect statusEffect = ScriptableObject.CreateInstance(typeof(StatusEffect)) as StatusEffect;

            statusEffect.m_icon             = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
            statusEffect.m_startMessageType = MessageHud.MessageType.Center;
            statusEffect.m_startMessage     = "$message_plan_crystal_start";
            statusEffect.m_stopMessageType  = MessageHud.MessageType.Center;
            statusEffect.m_stopMessage      = "$message_plan_crystal_stop";
            statusEffect.m_startEffects     = new EffectList
            {
                m_effectPrefabs = new EffectList.EffectData[] {
                    new EffectList.EffectData()
                    {
                        m_enabled = true,
                        m_prefab  = startPlanCrystalEffectPrefab,
                        m_attach  = true
                    }
                }
            };
            statusEffect.m_stopEffects = new EffectList
            {
                m_effectPrefabs = new EffectList.EffectData[] {
                    new EffectList.EffectData()
                    {
                        m_enabled = true,
                        m_prefab  = stopPlanCrystalEffectPrefab,
                        m_attach  = true
                    }
                }
            };
            sharedData.m_equipStatusEffect = statusEffect;
            sharedData.m_itemType          = ItemDrop.ItemData.ItemType.Utility;
            sharedData.m_maxStackSize      = 1;
            sharedData.m_centerCamera      = true;
            if (texture == null)
            {
                logger.LogWarning($"planHammer icon not found at {iconPath}");
            }
            else
            {
                sharedData.m_icons = new Sprite[] { Sprite.Create(texture, new Rect(0f, 0f, texture.width, texture.height), Vector2.zero) };
            }
            sharedData.m_maxQuality = 1;
        }
Exemplo n.º 9
0
        public static GameObject Get(
            //string ownerName = "RRRN_Ashe",
            string weaponName     = "BowHuntsman",
            string projectileName = "bow_projectile_frost"
            )
        {
            //Increase scale of bows

            bool       alreadyExisted = false;
            GameObject clone          = RRRLateLoadPrefabs.CloneRepeatable(ref alreadyExisted, weaponName, "AsheBow", regOdb: true);

            if (alreadyExisted)
            {
                return(clone);
            }

            Transform transform = clone.transform;

            transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);

            ItemDrop component = clone.GetComponent <ItemDrop>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                throw new NullReferenceException("No ItemDrop component in prefab: " + weaponName);
            }
            ItemDrop.ItemData.SharedData shared = component.m_itemData.m_shared;

            shared.m_name          = "Ashe Bow";
            shared.m_description   = "Ashe's Mighty Volley Attack";
            shared.m_useDurability = false;
            shared.m_ammoType      = "";

            shared.m_damages.m_frost  = 12f;
            shared.m_damages.m_pierce = 15f;

            shared.m_aiAttackRange    = 40f;
            shared.m_aiAttackRangeMin = 10f;
            shared.m_aiAttackMaxAngle = 10f;
            shared.m_aiAttackInterval = 20f;

            shared.m_attackForce                    = 15f;
            shared.m_attack.m_projectileVel         = 40f;
            shared.m_attack.m_projectileAccuracy    = 75f;
            shared.m_attack.m_projectileAccuracyMin = 100f;
            shared.m_attack.m_projectiles           = 3;
            shared.m_attack.m_attackProjectile      = ZNetScene.instance.GetPrefab(projectileName);

            return(clone);
        }
Exemplo n.º 10
0
        private static GameObject DesignSkellyShield()
        {
            GameObject gameObject = RRRLateLoadPrefabs.Clone("ShieldWood", "skellyShield", true, true);

            Transform transform = gameObject.transform;

            transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

            ItemDrop.ItemData.SharedData shared = ((ItemDrop.ItemData)((ItemDrop)gameObject.GetComponent <ItemDrop>()).m_itemData).m_shared;
            shared.m_blockPower      = 7;
            shared.m_deflectionForce = 7;

            return(gameObject);
        }
Exemplo n.º 11
0
        private static GameObject DesignPunch(Character component)
        {
            GameObject gameObject = RRRLateLoadPrefabs.Clone("troll_punch", MobNames.Groot.ToString() + "_punch", true, true);

            ItemDrop.ItemData.SharedData shared = ((ItemDrop.ItemData)((ItemDrop)gameObject.GetComponent <ItemDrop>()).m_itemData).m_shared;
            shared.m_damages.m_blunt          = Groot.MeleeDmgBlunt;
            shared.m_damages.m_chop           = 0;
            shared.m_damages.m_pickaxe        = 0;
            shared.m_attack.m_attackRange     = 2.5f;
            shared.m_attack.m_attackAnimation = "punch";
            shared.m_aiAttackInterval         = 3.0f;
            shared.m_aiAttackRange            = 2.5f;

            return(gameObject);
        }
Exemplo n.º 12
0
        public static GameObject Get(
            //string ownerName = "RRRN_Ashe",
            string weapoName = "KnifeChitin"
            )
        {
            bool       alreadyExisted = false;
            GameObject clone          = RRRLateLoadPrefabs.CloneRepeatable(ref alreadyExisted, weapoName, "AsheKnife", regOdb: true);

            if (alreadyExisted)
            {
                return(clone);
            }

            ItemDrop component = clone.GetComponent <ItemDrop>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                throw new NullReferenceException("No ItemDrop component in prefab: " + weapoName);
            }

            ItemDrop.ItemData.SharedData shared = component.m_itemData.m_shared;

            shared.m_name          = "Ashe Knife";
            shared.m_description   = "Ashe's Mighty Knife";
            shared.m_useDurability = false;

            shared.m_damages.m_frost  = 5;
            shared.m_damages.m_pierce = 4;
            shared.m_damages.m_slash  = 4;

            shared.m_aiAttackRangeMin = 0f;
            shared.m_aiAttackRange    = 1.5f;
            shared.m_aiAttackInterval = 0.8f;

            /*
             * GameObject freezingVFX = RRRLateLoadPrefabs.Clone("vfx_Freezing", "newFreeze", true, true);
             * //GameObject arrowSFX = RRRLateLoadPrefabs.Clone("sfx_arrow_hit", "newHit", true, true);
             * //ZSFX zSFX = arrowSFX.GetComponent<ZSFX>();
             * //EffectList effectDatas = new EffectList(); // RRRLateLoadPrefabs.Clone("skeleton_sword", "newEffects", true, true).GetComponent<EffectList>();
             * //effectDatas.m_effectPrefabs[0].m_prefab = freezingVFX;
             * //effectDatas.m_effectPrefabs[1].m_prefab = arrowSFX;
             * shared.m_hitEffect.m_effectPrefabs[0].m_prefab = freezingVFX;
             */
            return(clone);
        }
Exemplo n.º 13
0
        private static GameObject DesignSkellySword()
        {
            GameObject gameObject = RRRLateLoadPrefabs.Clone("skeleton_sword", "skellySword", true, true);

            Transform transform = gameObject.transform;

            transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);

            ItemDrop.ItemData.SharedData shared = ((ItemDrop.ItemData)((ItemDrop)gameObject.GetComponent <ItemDrop>()).m_itemData).m_shared;
            shared.m_attackForce                  = 5f;
            shared.m_attack.m_speedFactor         = 0.35f;
            shared.m_attack.m_speedFactorRotation = 0.35f;
            shared.m_attack.m_attackHitNoise      = 20;
            shared.m_attack.m_attackStartNoise    = 5;
            shared.m_attack.m_attackHeight        = 0.9f;
            shared.m_attack.m_attackRange         = 1.5f;
            shared.m_damages.m_slash              = MiniSkelly.MeleeDmgSlash;
            shared.m_secondaryAttack              = shared.m_attack;

            return(gameObject);
        }
Exemplo n.º 14
0
        public void Register()
        {
            itemData = ItemDrop.m_itemData;
            itemData.m_shared.m_buildPieces = PieceManager.Instance.GetPieceTable(pieceTableName);
            sharedData = itemData.m_shared;

            sharedData.m_name               = itemName;
            sharedData.m_description        = "$item_" + localizationName + "_description";
            sharedData.m_useDurability      = false;
            sharedData.m_durabilityDrain    = 0f;
            sharedData.m_useDurabilityDrain = 0f;

            Texture2D texture = AssetUtils.LoadTexture(GetAssetPath(iconPath));

            if (texture == null)
            {
                logger.LogWarning($"PlanHammer icon not found at {iconPath}");
            }
            else
            {
                sharedData.m_icons[0] = Sprite.Create(texture, new Rect(0f, 0f, texture.width, texture.height), Vector2.zero);
            }
            sharedData.m_maxQuality = 1;
        }
Exemplo n.º 15
0
            //prefix end


            private static float CalculateAverageSpeedRatio(float baseWeight, float baseAttackForce, float speedMod, float speedModRatio, ref ItemDrop.ItemData.SharedData shared)
            {
                return(Mathf.Clamp((((speedMod + (baseWeight / baseAttackForce)) + (speedMod + (shared.m_weight / shared.m_attackForce))) / 2) * speedModRatio, minSpeedBonus, maxSpeedBonus));
            }
Exemplo n.º 16
0
 private static ItemDrop.ItemData.SharedData Clone(this ItemDrop.ItemData.SharedData sharedData) => (ItemDrop.ItemData.SharedData)memberwiseCloner.Invoke(sharedData, new object[] {});
Exemplo n.º 17
0
        public static GameObject Get(
            GameObject owner,
            string weaponName = "BowHuntsman",
            //string animationName = "spear_throw"
            string projectileName = "GoblinShaman_projectile_fireball"
            )
        {
            bool       alreadyExisted = false;
            GameObject clone          = RRRLateLoadPrefabs.CloneRepeatable(ref alreadyExisted, weaponName, "Fireball", regOdb: true);

            if (alreadyExisted)
            {
                return(clone);
            }

            /*
             * Transform transform = clone.transform;
             * transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);
             */
            ItemDrop component = clone.GetComponent <ItemDrop>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                throw new NullReferenceException("No ItemDrop component in prefab: " + weaponName);
            }
            ItemDrop.ItemData.SharedData shared = component.m_itemData.m_shared;

            shared.m_name          = "Fireball Bow";
            shared.m_description   = "A bow that shoots fireballs";
            shared.m_useDurability = false;
            shared.m_dodgeable     = true;
            shared.m_blockable     = true;
            shared.m_attackForce   = 2f;
            shared.m_ammoType      = "";

            /*
             * shared.m_attack.m_attackType = Attack.AttackType.Projectile;
             * shared.m_itemType = ItemDrop.ItemData.ItemType.Bow;
             * shared.m_animationState = ItemDrop.ItemData.AnimationState.Bow;
             */
            shared.m_skillType = Skills.SkillType.FireMagic;

            //shared.m_aiAttackRange = 40f;
            shared.m_aiAttackRangeMin = 0f;
            shared.m_aiAttackInterval = 4f;
            //shared.m_holdAnimationState = "";
            shared.m_damages.m_fire = 30f;
            //shared.m_attack.m_attackAnimation = "unarmed_punch0";
            GameObject ulty = RRRLateLoadPrefabs.Clone("bow_projectile", "newFire", true, true);

            Projectile projectile = ulty.GetComponent <Projectile>();

            projectile.m_gravity = 0f;
            projectile.m_aoe     = 1.5f;

            for (int index = 0; index < ulty.transform.childCount; ++index)
            {
                GameObject.Destroy(ulty.transform.GetChild(index).gameObject);
            }
            GameObject prefab = ZNetScene.instance.GetPrefab(projectileName);

            for (int index = 0; index < prefab.transform.childCount; ++index)
            {
                GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(prefab.transform.GetChild(index).gameObject, ulty.transform);
                gameObject.name = gameObject.name.TrimCloneTag();
            }

            shared.m_attack.m_attackProjectile = ulty;

            return(clone);
        }
Exemplo n.º 18
0
 public ItemData(ItemDrop.ItemData idd)
 {
     m_shared = idd.m_shared;
     m_stack  = idd.m_stack;
 }
Exemplo n.º 19
0
        public static GameObject Get(
            //string ownerName = "RRRN_Ashe",
            string weaponName     = "BowHuntsman",
            string projectileName = "bow_projectile_frost"
            )
        {
            bool       alreadyExisted = false;
            GameObject clone          = RRRLateLoadPrefabs.CloneRepeatable(ref alreadyExisted, weaponName, "AsheBow4", regOdb: true);

            if (alreadyExisted)
            {
                return(clone);
            }

            Transform transform = clone.transform;

            transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);

            ItemDrop component = clone.GetComponent <ItemDrop>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                throw new NullReferenceException("No ItemDrop component in prefab: " + weaponName);
            }
            ItemDrop.ItemData.SharedData shared = component.m_itemData.m_shared;

            shared.m_name          = "Ashe Bow";
            shared.m_description   = "Ashe's Mighty Ultimate!";
            shared.m_useDurability = false;
            shared.m_ammoType      = "";
            shared.m_attackForce   = 2f;

            shared.m_damages.m_frost  = 60f;
            shared.m_damages.m_pierce = 0;

            shared.m_aiAttackRange    = 50f;
            shared.m_aiAttackRangeMin = 16f;
            shared.m_aiAttackInterval = 40f;
            //shared.m_aiAttackInterval = 8f;
            shared.m_aiAttackMaxAngle = 13f;

            shared.m_attack.m_projectileVel = 4f;

            GameObject ulty       = RRRLateLoadPrefabs.Clone("bow_projectile_frost", "newFrosty", true, true);
            Projectile projectile = ulty.GetComponent <Projectile>();

            projectile.m_gravity = 0f;
            projectile.m_aoe     = 1.5f;
            projectile.m_hitEffects.m_effectPrefabs[0].m_scale = true;
            projectile.m_hitEffects.m_effectPrefabs[1].m_scale = true;


            GameObject boom = RRRLateLoadPrefabs.Clone("sfx_ice_destroyed", "newIce", true, true);
            ZSFX       zSFX = boom.GetComponent <ZSFX>();

            zSFX.m_minVol   = 20f;
            zSFX.m_maxVol   = 25f;
            zSFX.m_minPitch = 1.3f;
            zSFX.m_maxPitch = 1.5f;
            zSFX.m_useCustomReverbDistance = true;
            zSFX.m_customReverbDistance    = 50f;
            projectile.m_hitEffects.m_effectPrefabs[0].m_prefab = boom;

            shared.m_attack.m_attackProjectile = ulty;

            Transform transformProj = ulty.transform;

            transformProj.localScale = new Vector3(3.5f, 3.5f, 2f);

            return(clone);
        }
Exemplo n.º 20
0
        public static GameObject Get(
            GameObject owner,
            string weaponName
            )
        {
            //Fix showing up as Knife in NPC's hand

            bool       alreadyExisted = false;
            GameObject clone          = RRRLateLoadPrefabs.CloneRepeatable(ref alreadyExisted, weaponName, "AxeJump", regOdb: true);

            if (alreadyExisted)
            {
                return(clone);
            }

            ItemDrop component = clone.GetComponent <ItemDrop>();

            if ((UnityEngine.Object)component == (UnityEngine.Object)null)
            {
                throw new NullReferenceException("No ItemDrop component in prefab: " + weaponName);
            }

            /*
             * for (int index = 0; index < clone.transform.childCount; ++index)
             * {
             *  UnityEngine.Object.Destroy(clone.transform.GetChild(index).gameObject);
             * }
             * GameObject prefab = ZNetScene.instance.GetPrefab("AxeBlackMetal");
             * for (int index = 0; index < prefab.transform.childCount; ++index)
             * {
             *  UnityEngine.Object gameObject = UnityEngine.Object.Instantiate<GameObject>(prefab.transform.GetChild(index).gameObject, clone.transform);
             *  gameObject.name = gameObject.name.TrimCloneTag();
             * }
             */
            /*
             * Transform transform = clone.transform;
             * transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);
             *
             * ZSyncTransform zSync = clone.GetComponent<ZSyncTransform>();
             * zSync = prefab.GetComponent<ZSyncTransform>();
             * ZNetView zNet = clone.GetComponent<ZNetView>();
             * zNet = prefab.GetComponent<ZNetView>();
             * Rigidbody rigidbody = clone.GetComponent<Rigidbody>();
             * rigidbody = prefab.GetComponent<Rigidbody>();
             */

            ItemDrop.ItemData.SharedData shared = component.m_itemData.m_shared;

            if (!shared.m_attack.m_attackOriginJoint.IsNullOrWhiteSpace() && Utils.FindChild(owner.transform, shared.m_attack.m_attackOriginJoint) == null)
            {
                shared.m_attack.m_attackOriginJoint = "";
            }

            shared.m_name           = "Axe Jump";
            shared.m_description    = "jump with an axe";
            shared.m_useDurability  = false;
            shared.m_skillType      = Skills.SkillType.Axes;
            shared.m_animationState = ItemDrop.ItemData.AnimationState.OneHanded;

            shared.m_attackForce   = 50;
            shared.m_backstabBonus = 3;

            shared.m_damages.m_pierce = 0;
            shared.m_damages.m_slash  = 30;
            shared.m_damages.m_chop   = 40;

            shared.m_aiAttackRange    = 5f;
            shared.m_aiAttackRangeMin = 0f;
            shared.m_aiAttackInterval = 4f;

            shared.m_attack.m_attackAnimation = "knife_secondary";

            return(clone);
        }