public static void Add() { Gun gun = ETGMod.Databases.Items.NewGun("March Gun", "marchgun"); Game.Items.Rename("outdated_gun_mods:march_gun", "nn:march_gun"); gun.gameObject.AddComponent <MarchGun>(); gun.SetShortDescription("Direct To The Point"); gun.SetLongDescription("Deals bonus damage when fired in the same direction the user is moving." + "\n\nBrought to the Gungeon by notorious tapdancer Tom Toe Tucker."); gun.SetupSprite(null, "marchgun_idle_001", 8); gun.SetAnimationFPS(gun.shootAnimation, 12); gun.gunSwitchGroup = (PickupObjectDatabase.GetById(732) as Gun).gunSwitchGroup; gun.AddProjectileModuleFrom(PickupObjectDatabase.GetById(86) as Gun, true, false); //GUN STATS gun.DefaultModule.ammoCost = 1; gun.DefaultModule.shootStyle = ProjectileModule.ShootStyle.SemiAutomatic; gun.DefaultModule.sequenceStyle = ProjectileModule.ProjectileSequenceStyle.Random; gun.reloadTime = 1f; gun.DefaultModule.cooldownTime = 0.1f; gun.DefaultModule.numberOfShotsInClip = 9; gun.barrelOffset.transform.localPosition = new Vector3(1.37f, 0.63f, 0f); gun.SetBaseMaxAmmo(222); gun.gunClass = GunClass.PISTOL; gun.muzzleFlashEffects = (PickupObjectDatabase.GetById(18) as Gun).muzzleFlashEffects; //BULLET STATS Projectile projectile = UnityEngine.Object.Instantiate <Projectile>(gun.DefaultModule.projectiles[0]); projectile.gameObject.SetActive(false); FakePrefab.MarkAsFakePrefab(projectile.gameObject); UnityEngine.Object.DontDestroyOnLoad(projectile); gun.DefaultModule.projectiles[0] = projectile; projectile.baseData.damage = 7.5f; projectile.baseData.speed *= 1f; projectile.baseData.range *= 1f; projectile.hitEffects.overrideMidairDeathVFX = EasyVFXDatabase.SmoothLightBlueLaserCircleVFX; projectile.hitEffects.alwaysUseMidair = true; projectile.SetProjectileSpriteRight("march_none_projectile", 9, 9, false, tk2dBaseSprite.Anchor.MiddleCenter, 7, 7); GunTools.SetupDefinitionForProjectileSprite("march_left_projectile", ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName("march_left_projectile"), 17, 11, false, 15, 9, 0, 0, null); GunTools.SetupDefinitionForProjectileSprite("march_right_projectile", ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName("march_right_projectile"), 17, 11, false, 15, 9, 0, 0, null); GunTools.SetupDefinitionForProjectileSprite("march_up_projectile", ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName("march_up_projectile"), 11, 17, false, 9, 15, 0, 0, null); GunTools.SetupDefinitionForProjectileSprite("march_down_projectile", ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName("march_down_projectile"), 11, 17, false, 9, 15, 0, 0, null); projectile.gameObject.AddComponent <MarchGunBulletController>(); projectile.transform.parent = gun.barrelOffset; gun.DefaultModule.ammoType = GameUIAmmoType.AmmoType.CUSTOM; gun.DefaultModule.customAmmoType = CustomClipAmmoTypeToolbox.AddCustomAmmoType("March gun Bullets", "NevernamedsItems/Resources/CustomGunAmmoTypes/marchgun_clipfull", "NevernamedsItems/Resources/CustomGunAmmoTypes/marchgun_clipempty"); gun.quality = PickupObject.ItemQuality.C; //C ETGMod.Databases.Items.Add(gun, null, "ANY"); DemolitionistID = gun.PickupObjectId; }
public static void AnimateProjectile(this Projectile proj, List <string> names, int fps, bool loops, List <IntVector2> pixelSizes, List <bool> lighteneds, List <tk2dBaseSprite.Anchor> anchors, List <bool> anchorsChangeColliders, List <bool> fixesScales, List <Vector3?> manualOffsets, List <IntVector2?> overrideColliderPixelSizes, List <IntVector2?> overrideColliderOffsets, List <Projectile> overrideProjectilesToCopyFrom) { tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip(); clip.name = "idle"; clip.fps = fps; List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>(); for (int i = 0; i < names.Count; i++) { string name = names[i]; IntVector2 pixelSize = pixelSizes[i]; IntVector2?overrideColliderPixelSize = overrideColliderPixelSizes[i]; IntVector2?overrideColliderOffset = overrideColliderOffsets[i]; Vector3? manualOffset = manualOffsets[i]; bool anchorChangesCollider = anchorsChangeColliders[i]; bool fixesScale = fixesScales[i]; if (!manualOffset.HasValue) { manualOffset = new Vector2?(Vector2.zero); } tk2dBaseSprite.Anchor anchor = anchors[i]; bool lightened = lighteneds[i]; Projectile overrideProjectileToCopyFrom = overrideProjectilesToCopyFrom[i]; tk2dSpriteAnimationFrame frame = new tk2dSpriteAnimationFrame(); frame.spriteId = ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName(name); frame.spriteCollection = ETGMod.Databases.Items.ProjectileCollection; frames.Add(frame); int?overrideColliderPixelWidth = null; int?overrideColliderPixelHeight = null; if (overrideColliderPixelSize.HasValue) { overrideColliderPixelWidth = overrideColliderPixelSize.Value.x; overrideColliderPixelHeight = overrideColliderPixelSize.Value.y; } int?overrideColliderOffsetX = null; int?overrideColliderOffsetY = null; if (overrideColliderOffset.HasValue) { overrideColliderOffsetX = overrideColliderOffset.Value.x; overrideColliderOffsetY = overrideColliderOffset.Value.y; } tk2dSpriteDefinition def = GunTools.SetupDefinitionForProjectileSprite(name, frame.spriteId, pixelSize.x, pixelSize.y, lightened, overrideColliderPixelWidth, overrideColliderPixelHeight, overrideColliderOffsetX, overrideColliderOffsetY, overrideProjectileToCopyFrom); def.ConstructOffsetsFromAnchor(anchor, def.position3, fixesScale, anchorChangesCollider); def.position0 += manualOffset.Value; def.position1 += manualOffset.Value; def.position2 += manualOffset.Value; def.position3 += manualOffset.Value; if (i == 0) { proj.GetAnySprite().SetSprite(frame.spriteCollection, frame.spriteId); } } clip.wrapMode = loops ? tk2dSpriteAnimationClip.WrapMode.Loop : tk2dSpriteAnimationClip.WrapMode.Once; clip.frames = frames.ToArray(); if (proj.sprite.spriteAnimator == null) { proj.sprite.spriteAnimator = proj.sprite.gameObject.AddComponent <tk2dSpriteAnimator>(); } proj.sprite.spriteAnimator.playAutomatically = true; bool flag = proj.sprite.spriteAnimator.Library == null; if (flag) { proj.sprite.spriteAnimator.Library = proj.sprite.spriteAnimator.gameObject.AddComponent <tk2dSpriteAnimation>(); proj.sprite.spriteAnimator.Library.clips = new tk2dSpriteAnimationClip[0]; proj.sprite.spriteAnimator.Library.enabled = true; } proj.sprite.spriteAnimator.Library.clips = proj.sprite.spriteAnimator.Library.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray(); proj.sprite.spriteAnimator.DefaultClipId = proj.sprite.spriteAnimator.Library.GetClipIdByName("idle"); proj.sprite.spriteAnimator.deferNextStartClip = false; }