public void FireProjectile(BasePlayer player, Vector3 position, Vector3 velocity) { //var item = ItemManager.CreateByName("ammo.rifle.incendiary"); var itemModProjectile = item.info.GetComponent <ItemModProjectile>(); var projectile = itemModProjectile.projectileObject.Get().GetComponent <Projectile>(); //Puts($"itemModProjectile.projectileVelocity: {itemModProjectile.projectileVelocity}"); FiredProjectile firedProjectile = new FiredProjectile { itemDef = item.info, itemMod = itemModProjectile, projectilePrefab = projectile, firedTime = UnityEngine.Time.realtimeSinceStartup, travelTime = 0f, position = position, velocity = velocity, initialPosition = position, initialVelocity = velocity }; Add(firedProjectile); Effect effect = new Effect(); effect.Clear(); effect.Init(global::Effect.Type.Projectile, position, velocity, null); effect.scale = 2; effect.pooledString = itemModProjectile.projectileObject.resourcePath; effect.number = 1; EffectNetwork.Send(effect); }
private static float GetTimeout(FiredProjectile projectile, float distance) { double maxVelocity = OpCodes.GetMaxVelocity(projectile.AmmoType); if (projectile.AmmoType > 0) { maxVelocity *= OpCodes.GetProjectileVelocityScale((EPrefabUID)projectile.PrefabID); } double y = projectile.FiredTime + 1f; double z = maxVelocity; double w = OpCodes.GetProjectileInitialDistance(projectile.AmmoType); double f = distance; double x = (-w + f + 1.5f * y * z - 0.09799f * z); return((float)((x / (1.5f * z)) - GetCurrentTime())); }
// Token: 0x06000128 RID: 296 RVA: 0x0000A06C File Offset: 0x0000826C private static float GetTimeout(FiredProjectile projectile, float distance) { double maxVelocity = (double)OpCodes.GetMaxVelocity(projectile.AmmoType); bool flag = projectile.AmmoType > 0; if (flag) { maxVelocity *= (double)OpCodes.GetProjectileVelocityScale((EPrefabUID)projectile.PrefabID); } double y = (double)(projectile.FiredTime + 1f); double z = maxVelocity; double w = (double)OpCodes.GetProjectileInitialDistance(projectile.AmmoType); double f = (double)distance; double chisl = -w + f + 1.5 * y * z - 0.0979899987578392 * z; double znam = 1.5 * z; double drob = chisl / znam; double normDrob = drob - (double)RangeAim.GetCurrentTime(); return((float)normDrob); }
bool SimulateProjectile(FiredProjectile firedProjectile, float dt) { if (firedProjectile.travelTime == 0) { dt = Time.realtimeSinceStartup - firedProjectile.firedTime; } else if (firedProjectile.travelTime > 8.0f) { return(false); } Vector3 gravity = UnityEngine.Physics.gravity * firedProjectile.projectilePrefab.gravityModifier; Vector3 oldPosition = firedProjectile.position; firedProjectile.position += firedProjectile.velocity * dt; firedProjectile.velocity += gravity * dt; firedProjectile.velocity -= firedProjectile.velocity * firedProjectile.projectilePrefab.drag * dt; firedProjectile.travelTime += dt; //Line(andrew, oldPosition, firedProjectile.position, (toggle) ? Color.red : Color.blue, 1); toggle = !toggle; Vector3 vec = firedProjectile.position - oldPosition; var list = new List <RaycastHit>(); GamePhysics.TraceAll(new Ray(oldPosition, vec), 0f, list, vec.magnitude, 1219701521, QueryTriggerInteraction.Ignore); bool didntHit = true; foreach (var hit in list) { BaseEntity ent = hit.GetEntity(); didntHit = false; HitInfo hitInfo = new HitInfo(); hitInfo.ProjectilePrefab = firedProjectile.projectilePrefab; hitInfo.Initiator = firedProjectile.owner.Get(true); hitInfo.HitEntity = ent; hitInfo.HitPositionWorld = hit.point; hitInfo.HitNormalWorld = hit.normal; hitInfo.PointStart = firedProjectile.initialPosition; hitInfo.ProjectileDistance = (firedProjectile.position - firedProjectile.initialPosition).magnitude; hitInfo.ProjectilePrefab.CalculateDamage(hitInfo, firedProjectile.projectileModifier, 1); firedProjectile.itemMod.ServerProjectileHit(hitInfo); Effect.server.ImpactEffect(hitInfo); if (ent == null) { return(false); } ent.OnAttacked(hitInfo); if (ent.ShouldBlockProjectiles()) { break; } } return(didntHit); }
public void Add(FiredProjectile firedProjectile) { firedProjectiles.Add(firedProjectile); }