public BasicProjectile CreateProjectile(ProjectileType type, bool _isEnemy, int damage, Vector3 startPos, BaseElementObject target, GameElement bulletType) { BasicProjectile bp = PrefabsManager.SpawnProjectile(type); bp = GameObject.Instantiate(bp); if (type == ProjectileType.Fire_Hero) { bp.Init(_isEnemy, damage, startPos, target.transform.position + new Vector3(Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f)) , target, bulletType); bp.isChaseBullet = false; } else { if (type == ProjectileType.Water_Hero) { bp.Init(_isEnemy, damage, startPos, target.transform.position, target, bulletType); } else { bp.Init(_isEnemy, damage, startPos, target.transform.position, target, bulletType); } } projectileList.Add(bp); return(bp); }
public override void EAction() { if (t == null) { if (CurrentCooldown != MaxCooldown) { return; } t = new CasterEMove(SpriteSource.SpriteRectangle.Right - (SpriteSource.SpriteRectangle.Width / 2), SpriteSource.SpriteRectangle.Top, BasicProjectile.GenerateVelocityVector(new Vector2(SpriteSource.SpriteRectangle.Center.X, SpriteSource.SpriteRectangle.Center.Y), MouseHandler.mousePos, 7)); // t.Velocity.Y = 0; RenderHandler.allProjectiles.Add(t); CurrentCooldown -= 0.01; } else { if (t.Colliding[2]) { SpriteSource.SpriteRectangle.X = t.ProjRect.Right - SpriteSource.SpriteRectangle.Width; SpriteSource.SpriteRectangle.Y = t.ProjRect.Y + 2; } else { SpriteSource.SpriteRectangle.X = t.ProjRect.X; SpriteSource.SpriteRectangle.Y = t.ProjRect.Y + 2; } t.Delete(); t = null; } }
protected override void CreateProjectile() { for (int i = 0; i <= projectilePelletCount; i++) { GameObject projectileObject = Instantiate(projectilePrefab); BasicProjectile projectile = projectileObject.GetComponent <BasicProjectile>(); if (this.person != null) { projectile.origin = this.person.gameObject; } //float rotation = transform.eulerAngles.z; float rotation = -spreadAngle / 2 + (i / (float)projectilePelletCount) * spreadAngle + transform.eulerAngles.z; Vector2 direction = VectorUtil.Deg2Vector2(rotation); float spawnX = transform.position.x + direction.x * projectileOffset; float spawnY = transform.position.y + direction.y * projectileOffset; Vector2 spawnPos = new Vector2(spawnX, spawnY); projectile.transform.position = spawnPos; projectile.transform.rotation = transform.rotation; projectile.transform.Rotate(0, 0, rotation); projectile.projectileRigidbody.velocity = direction * projectile.velocity; Destroy(projectileObject, livetime); } }
/// <summary>Patch for Rascal slingshot damage increase with travel time.</summary> private static bool BasicProjectileBehaviorOnCollisionWithMonsterPrefix(ref BasicProjectile __instance, ref NetBool ___damagesMonsters, ref NetCharacterRef ___theOneWhoFiredMe, ref int ___travelTime, NPC n, GameLocation location) { try { if (!___damagesMonsters || n is not Monster) { return(true); // run original logic } var who = ___theOneWhoFiredMe.Get(location) is Farmer ? ___theOneWhoFiredMe.Get(location) as Farmer : Game1.player; if (!Utility.SpecificPlayerHasProfession("Rascal", who)) { return(true); // run original logic } AwesomeProfessions.Reflection.GetMethod(__instance, name: "explosionAnimation")?.Invoke(location); var damageToMonster = (int)(__instance.damageToFarmer.Value * Utility.GetRascalBonusDamageForTravelTime(___travelTime)); location.damageMonster(n.GetBoundingBox(), damageToMonster, damageToMonster + 1, isBomb: false, who); return(false); // don't run original logic } catch (Exception ex) { Monitor.Log($"Failed in {nameof(BasicProjectileBehaviorOnCollisionWithMonsterPrefix)}:\n{ex}", LogLevel.Error); return(true); // default to original logic } }
public static GameObject SpawnBullet(Vector3 position, float offset, Vector2 direction, float speed = 1f, int ttl = 1000) { // create new game object GameObject bullet = new GameObject(); // add bullet image to it SpriteRenderer sr = bullet.AddComponent <SpriteRenderer> (); sr.sprite = Resources.Load <Sprite>("Sprites/Projectiles/Bullet"); // make it act like a projectile BasicProjectile projectile = bullet.AddComponent <BasicProjectile> (); projectile.direction = direction; projectile.speed = speed; projectile.lifeInFixedFrames = ttl; // add a collider CircleCollider2D collider = bullet.AddComponent <CircleCollider2D>(); collider.radius = .1f; // position the object Vector2 adjust = direction.normalized; adjust.x *= offset; adjust.y *= offset; Vector3 bulletPos = new Vector3(position.x + adjust.x, position.y + adjust.y, position.z); bullet.transform.position = bulletPos; return(bullet); }
public override bool Shoot() { if (CurrentShotCooldown <= 0.0f) { if (!base.Shoot()) { return(false); } GameObject obj = Instantiate(Projectile, child.position, Quaternion.identity); if (obj) { BasicProjectile prj = obj.GetComponent <BasicProjectile>(); if (prj) { prj.Damage = WeaponDamage; prj.Direction = transform.parent.forward; prj.ImpulseDirection = transform.parent.transform.forward; } else { EnemyProjectile eprj = obj.GetComponent <EnemyProjectile>(); if (eprj) { eprj.Damage = WeaponDamage; eprj.Direction = transform.parent.forward; eprj.ImpulseDirection = transform.parent.transform.forward; } } CurrentShotCooldown = ShotCooldown; bIsShooting = true; } } return(true); }
public override void Execute(PlayerScript pScript) { if (pScript.IsProjReady() && pScript.currentHP > 0) { if (pScript.IsBoosted()) { GameObject proj1 = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position + deviation, Quaternion.identity); BasicProjectile projScript1 = proj1.GetComponent <BasicProjectile>(); projScript1.SetSpeed(pScript.GetBaseProjSpeed()); projScript1.SetDamage(pScript.GetBaseProjDamage()); GameObject proj2 = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position - deviation, Quaternion.identity); BasicProjectile projScript2 = proj2.GetComponent <BasicProjectile>(); projScript2.SetSpeed(pScript.GetBaseProjSpeed()); projScript2.SetDamage(pScript.GetBaseProjDamage()); } else { GameObject proj = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position, Quaternion.identity); BasicProjectile projScript = proj.GetComponent <BasicProjectile>(); projScript.SetSpeed(pScript.GetBaseProjSpeed()); projScript.SetDamage(pScript.GetBaseProjDamage()); } pScript.PlayShotAudio(); pScript.SetProjReady(false); } }
public void FireGun() { BasicProjectile p = Instantiate(projPrefab, gunEnd.position, Quaternion.identity).GetComponent <BasicProjectile>(); p.InitializeProjectile(speed, gunEnd.position - initPos.position + Vector3.up * Random.Range(-accuracy, accuracy), 2); aud.PlayOneShot(gunSound); }
// Update is called once per frame void Update() { GameObject bullet = null; if (Input.GetKeyDown(KeyCode.UpArrow)) { bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.up); } if (Input.GetKeyDown(KeyCode.RightArrow)) { bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.right); } if (Input.GetKeyDown(KeyCode.DownArrow)) { bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.down); } if (Input.GetKeyDown(KeyCode.LeftArrow)) { bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.left); } if (bullet) { PlayerScript player = GetComponentInParent <PlayerScript> (); if (player) { BasicProjectile projectile = bullet.GetComponent <BasicProjectile> (); if (projectile) { projectile.damage = (int)((float)projectile.damage * player.damageMultiplier); //Debug.Log ("bullet damage set to " + projectile.damage); } } } }
protected override void _OnSwing(MeleeWeapon weapon, Farmer farmer) { base._OnSwing(weapon, farmer); Vector2 shot_velocity = default(Vector2); Vector2 shot_origin = farmer.getStandingPosition() - new Vector2(32f, 32f); float rotation_velocity = 0f; switch (farmer.facingDirection.Value) { case 0: shot_velocity.Y = -1f; break; case 1: shot_velocity.X = 1f; break; case 3: shot_velocity.X = -1f; break; case 2: shot_velocity.Y = 1f; break; } rotation_velocity = 32f; shot_velocity *= 10f; BasicProjectile projectile = new BasicProjectile((int)Math.Ceiling((float)weapon.minDamage.Value / 4f), 11, 0, 1, rotation_velocity * ((float)Math.PI / 180f), shot_velocity.X, shot_velocity.Y, shot_origin, "", "", explode: false, damagesMonsters: true, farmer.currentLocation, farmer); projectile.ignoreTravelGracePeriod.Value = true; projectile.ignoreMeleeAttacks.Value = true; projectile.maxTravelDistance.Value = 256; projectile.height.Value = 32f; farmer.currentLocation.projectiles.Add(projectile); }
public virtual void OnAttacked(Vector2 trajectory) { if (Game1.IsMasterGame && stackedSlimes.Value > 0) { stackedSlimes.Value--; if (trajectory.LengthSquared() == 0f) { trajectory = new Vector2(0f, -1f); } else { trajectory.Normalize(); } trajectory *= 16f; BasicProjectile projectile = new BasicProjectile(base.DamageToFarmer / 3 * 2, 13, 3, 0, (float)Math.PI / 16f, trajectory.X, trajectory.Y, base.Position, "", "", explode: true, damagesMonsters: false, base.currentLocation, this); projectile.height.Value = 24f; projectile.color.Value = color.Value; projectile.ignoreMeleeAttacks.Value = true; projectile.hostTimeUntilAttackable = 0.1f; if (Game1.random.NextDouble() < 0.5) { projectile.debuff.Value = 13; } base.currentLocation.projectiles.Add(projectile); } }
public void ShootTarget() { //spawn the projectile BasicProjectile proj = Instantiate(m_bulletPrefab, transform.position + (transform.forward * 2), Quaternion.identity); proj.Init(m_target.transform.position, transform); }
/// <summary>Patch to increase Desperado projectile velocity + allow Rascal projectile bounce.</summary> private static void BasicProjectileCtorPostfix(ref BasicProjectile __instance, ref NetInt ___bouncesLeft, float xVelocity, float yVelocity, Character firer) { if (firer is not Farmer) { return; } try { if (Utility.SpecificPlayerHasProfession("Desperado", (Farmer)firer)) { AwesomeProfessions.Reflection.GetField <NetFloat>(__instance, name: "xVelocity").GetValue().Set(xVelocity * 1.5f); AwesomeProfessions.Reflection.GetField <NetFloat>(__instance, name: "yVelocity").GetValue().Set(yVelocity * 1.5f); } if (AwesomeProfessions.Config.ModKey.IsDown() && Utility.SpecificPlayerHasProfession("Rascal", (Farmer)firer)) { ++___bouncesLeft.Value; } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(BasicProjectileCtorPostfix)}:\n{ex}", LogLevel.Error); } }
public static ActionResponse UpdateTick() { if (tick++ > 2) { return(ActionResponse.Retry); } else { tick = 0; } BNC_Core.Logger.Log($" fireballs {fireballsLeft} ", LogLevel.Debug); for (int i = 0; i < Game1.random.Next(20); i++) { if (FireballEvent.fireballsLeft-- <= 0) { FireballEvent.fireballsLeft = 0; return(ActionResponse.Retry); } BNC_Core.Logger.Log($" Try to spawn{fireballsLeft} ", LogLevel.Debug); Vector2 startPosition = getStartingLocation(); Vector2 trajectory2 = Utility.getVelocityTowardPoint(startPosition, new Vector2(Game1.player.GetBoundingBox().X, Game1.player.GetBoundingBox().Y) + new Vector2(Game1.random.Next(-128, 128)), 8f); BasicProjectile fireball = new BasicProjectile(15, 10, 8, 4, 0f, trajectory2.X, trajectory2.Y, startPosition, "", "", true, false, Game1.player.currentLocation, Game1.player); fireball.height.Value = 48f; Game1.player.currentLocation.projectiles.Add(fireball); Game1.player.currentLocation?.playSound("fireball"); } BNC_Core.Logger.Log($" Done {fireballsLeft} ", LogLevel.Debug); return(ActionResponse.Done); }
public static void Postfix(BasicProjectile __instance) { var r = ModEntry.BRGame.ModHelper.Reflection; r.GetField <NetBool>(__instance, "damagesMonsters").SetValue(new NetBool(false)); r.GetField <NetInt>(__instance, "damageToFarmer").SetValue(new NetInt(15)); }
public static bool Prefix(BasicProjectile __instance, GameLocation location, Farmer player) { bool damagesMonsters = ModEntry.BRGame.ModHelper.Reflection.GetField <NetBool>(__instance, "damagesMonsters").GetValue().Value; Console.WriteLine($"damage, m = {damagesMonsters}"); if (!damagesMonsters || true && SlingshotPatch5.GetFarmerBounds(player).Intersects(__instance.getBoundingBox())) //TODO: remove? { //TODO: modify slingshot damage here? int damage = __instance.damageToFarmer.Value; damage = Math.Min(damage, 10); if (player == Game1.player) { Console.WriteLine("sending slingshot damage to self"); ModEntry.BRGame.TakeDamage(damage); } else { Console.WriteLine("sending slingshot damage to other player"); NetworkUtility.SendDamageToPlayer(damage, player, Game1.player.UniqueMultiplayerID); } try { if (!HitShaker.IsPlayerFlashing(player.UniqueMultiplayerID)) { var r = ModEntry.BRGame.ModHelper.Reflection; r.GetMethod(__instance, "explosionAnimation", false)?.Invoke(location); } } catch (Exception) { } } return(false); }
public void SpawnProjectile() { BasicProjectile projScript = Instantiate(projectilePrefab, transform.position, Quaternion.identity).GetComponent <BasicProjectile>(); projScript.SetSpeed(-projectileSpeed); enemyController.PlayShotAudio(); }
/// <summary> /// Shoots a projectile. at the target. /// </summary> protected virtual void SpawnProjectile() { GameObject projectileGO = Instantiate(projectilePrefab, transform.position, Quaternion.identity); projectileGO.transform.parent = transform; BasicProjectile projectile = projectileGO.GetComponent <BasicProjectile>(); projectile.Seek(currentTarget, multiplier); }
void Shoot() { GameObject projectileObject = Instantiate(projectile, firePoint.position, firePoint.rotation); BasicProjectile projectileScript = projectileObject.GetComponent <BasicProjectile>(); if (projectileScript != null) { projectileScript.Seek(target.transform); } }
protected void FireProjectile(BasicProjectile.Owner owner, Vector3 shootVec) { GameObject newProjectile = Instantiate(projectile, transform.position, Quaternion.identity); BasicProjectile newProjectileScript = newProjectile.GetComponent <BasicProjectile> (); newProjectileScript.owner = owner; newProjectileScript.SetVelocity(shootVec.normalized * projectileSpeed * Time.fixedDeltaTime); projectiles.Add(newProjectile); }
public override void EAction() { if (CurrentCooldown != MaxCooldown) { return; } Game.PlayerCharacter.velocity = BasicProjectile.GenerateVelocityVector(new Vector2(Game.PlayerCharacter.SpriteRectangle.X, Game.PlayerCharacter.SpriteRectangle.Y), MouseHandler.mousePos, 1200); CurrentCooldown -= 0.01; }
private static void BasicProjectile_Postfix(BasicProjectile __instance, Character firer) { if (!Config.EnableMod || firer is not Farmer) { return; } var dam = GetStatMod(GetStatValue(firer as Farmer, "dex", Config.BaseStatValue)) * Config.DexRangedDamageBonus; SMonitor.Log($"Modifying projectile damage by {dam}"); __instance.damageToFarmer.Value = (int)Math.Max(0, Math.Round(__instance.damageToFarmer.Value * (1 + dam))); }
public override GameObject FireAmmo(IDamager damager, Ray damageRay, LayerMask layerMask, float damageMultiplier) { System.Action <Collision> onCollision = (collision) => { // calculate and dole out damage here }; BasicProjectile spear = BasicProjectile.pool.GetPrefabInstance(prefab); spear.LaunchToPosition(damageRay, mass, velocity, lifeTime, useGravityOnStart, useGravityOnCollision, onCollision); return(spear.gameObject); }
protected virtual void Shoot() { Vector3 dir = DirectionUtil.Convert(direction); GameObject go = ProjectileManager.CreateProjectile(projectile); BasicProjectile bp = go.GetComponent <BasicProjectile>(); go.transform.position = transform.position; // + dir go.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg); bp.direction = dir; bp.IgnoreCollision(GetComponent <Collider2D>()); }
private void UpdateShooting() { if (Mouse.GetButton() == Mouse.Button.Left) { if (fireRate <= 0 && Ammo != 0 && !moving) { Vector2 vec2 = Mouse.GetIsoCoordinate() - position; double angle = Math.Atan2(vec2.Y, vec2.X); Shoot(position + new Vector2(28, 28), angle); angle += Math.PI; if (angle < (Math.PI * 0.125) || angle > (Math.PI * 1.875)) { direction = Direction.West; } else if (angle < (Math.PI * 0.375)) { direction = Direction.NorthWest; } else if (angle < (Math.PI * 0.625)) { direction = Direction.North; } else if (angle < (Math.PI * 0.875)) { direction = Direction.NorthEast; } else if (angle < (Math.PI * 1.125)) { direction = Direction.East; } else if (angle < (Math.PI * 1.375)) { direction = Direction.SouthEast; } else if (angle < (Math.PI * 1.625)) { direction = Direction.South; } else if (angle < (Math.PI * 1.875)) { direction = Direction.SouthWest; } fireRate = BasicProjectile.GetRateOfFire(); Ammo--; attacking = true; } } else { attacking = false; } }
private void Attack(Vector3 dir) { // PlayerSegmentHealth h = seg.GetComponent<PlayerSegmentHealth>(); // if (h != null) // { // h.TakeDamage(damage); // } GameObject proj = ProjectileManager.CreateProjectile(bulletPrefab); BasicProjectile ep = proj.GetComponent <BasicProjectile>(); proj.transform.position = transform.position; proj.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg); ep.direction = dir; }
private void GameLoop_UpdateTicking(object sender, StardewModdingAPI.Events.UpdateTickingEventArgs e) { if (Game1.player?.currentLocation != null && firing) { if (ticks % 120 == 0 && Config.FireSound != "") { Game1.player.currentLocation.playSound(Config.FireSound, NetAudio.SoundContext.Default); } if (ticks++ % 3 != 0) { return; } float fire_angle = 0f; float mouthOffset = 16f; Vector2 shot_origin = new Vector2((float)Game1.player.GetBoundingBox().Center.X - 32f, (float)Game1.player.GetBoundingBox().Center.Y - 80f); switch (Game1.player.facingDirection.Value) { case 0: shot_origin.Y -= mouthOffset; fire_angle = 90f; break; case 1: shot_origin.X += mouthOffset; fire_angle = 0f; break; case 2: fire_angle = 270f; shot_origin.Y += mouthOffset; break; case 3: shot_origin.X -= mouthOffset; fire_angle = 180f; break; } fire_angle += (float)Math.Sin((double)((float)ticks * 16 / 1000f * 180f) * 3.1415926535897931 / 180.0) * 25f; Vector2 shot_velocity = new Vector2((float)Math.Cos((double)fire_angle * 3.1415926535897931 / 180.0), -(float)Math.Sin((double)fire_angle * 3.1415926535897931 / 180.0)); shot_velocity *= 10f; BasicProjectile projectile = new BasicProjectile((int)Math.Round(Config.FireDamage * (Config.ScaleWithSkill ? Game1.player.getEffectiveSkillLevel(4) / 10f : 1)), 10, 0, 1, 0.196349546f, shot_velocity.X, shot_velocity.Y, shot_origin, "", "", false, true, Game1.player.currentLocation, Game1.player, false, null); projectile.ignoreTravelGracePeriod.Value = true; projectile.maxTravelDistance.Value = (int)Math.Round(Config.FireDistance * (Config.ScaleWithSkill ? Game1.player.getEffectiveSkillLevel(4) / 10f : 1)); Game1.player.currentLocation.projectiles.Add(projectile); } else { ticks = 0; } }
protected virtual void Shoot() { //Create a projectile and assign fields GameObject projectileObject = Instantiate(projectile, firePoint.position, firePoint.rotation); BasicProjectile projectileScript = projectileObject.GetComponent <BasicProjectile>(); if (projectileScript != null) { //assign damage from tower projectileScript.Dmg = damage; projectileScript.Seek(target.transform); } fireTimer = 1f / fireRate; }
/// <summary> /// Anything that can fire a projectile is itself hittable. /// </summary> /// <param name="collider"></param> /// <param name="transform"></param> /// <param name="hit"></param> /// <param name="projectile"></param> /// <param name="firedFrom"></param> /// <returns></returns> public virtual void Hit(Transform collider, Transform transform, RaycastHit hit, BasicProjectile projectile) { HitPoints -= 1; if (HitPoints > 0) { _hitEffect?.Apply(); _hitAction?.Apply(collider, transform, hit, projectile); } else { DestroyHittable(); } }
protected void FireProjectile(Vector3 shootVec, GameObject projectile) { //spawn under player sprite Vector3 spawnVec = transform.position; spawnVec.y -= 1; GameObject projectileInstance = Instantiate(projectile, spawnVec, Quaternion.identity); BasicProjectile projectileScript = projectileInstance.GetComponent <BasicProjectile> (); projectileScript.owner = BasicProjectile.Owner.Player; projectileScript.SetVelocity(shootVec * ProjectileSpeed * Time.fixedDeltaTime); projectiles.Add(projectileInstance); }