public WeaponThrowEvent(BaseMelee weapon, BasePlayer basePlayer, ProjectileShoot projectileShoot, ProjectileShoot.Projectile projectile) { Weapon = weapon; Player = Server.GetPlayer(basePlayer); ProjectileShoot = projectileShoot; Projectile = projectile; Magnitude = projectile.startVel.magnitude; }
private void CLProject(BaseEntity.RPCMessage msg) { BasePlayer player = msg.player; if (!this.VerifyClientAttack(player)) { this.SendNetworkUpdate(BasePlayer.NetworkQueue.Update); } else { if (Object.op_Equality((Object)player, (Object)null) || player.IsHeadUnderwater()) { return; } if (!this.canThrowAsProjectile) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Not throwable (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "not_throwable"); } else { Item pickupItem = this.GetItem(); if (pickupItem == null) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item not found (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "item_missing"); } else { ItemModProjectile component1 = (ItemModProjectile)((Component)pickupItem.info).GetComponent <ItemModProjectile>(); if (Object.op_Equality((Object)component1, (Object)null)) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Item mod not found (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "mod_missing"); } else { ProjectileShoot projectileShoot = ProjectileShoot.Deserialize((Stream)msg.read); if (((List <ProjectileShoot.Projectile>)projectileShoot.projectiles).Count != 1) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Projectile count mismatch (" + this.ShortPrefabName + ")"); player.stats.combat.Log((AttackEntity)this, "count_mismatch"); } else { player.CleanupExpiredProjectiles(); using (List <ProjectileShoot.Projectile> .Enumerator enumerator = ((List <ProjectileShoot.Projectile>)projectileShoot.projectiles).GetEnumerator()) { while (enumerator.MoveNext()) { ProjectileShoot.Projectile current = enumerator.Current; if (player.HasFiredProjectile((int)current.projectileID)) { AntiHack.Log(player, AntiHackType.ProjectileHack, "Duplicate ID (" + (object)(int)current.projectileID + ")"); player.stats.combat.Log((AttackEntity)this, "duplicate_id"); } else if (this.ValidateEyePos(player, (Vector3)current.startPos)) { player.NoteFiredProjectile((int)current.projectileID, (Vector3)current.startPos, (Vector3)current.startVel, (AttackEntity)this, pickupItem.info, pickupItem); Effect effect = new Effect(); effect.Init(Effect.Type.Projectile, (Vector3)current.startPos, (Vector3)current.startVel, msg.connection); effect.scale = (__Null)1.0; effect.pooledString = component1.projectileObject.resourcePath; effect.number = current.seed; EffectNetwork.Send(effect); } } } pickupItem.SetParent((ItemContainer)null); Interface.CallHook("OnMeleeThrown", (object)player, (object)pickupItem); if (!this.canAiHearIt) { return; } float num = 0.0f; if (component1.projectileObject != null) { GameObject gameObject = component1.projectileObject.Get(); if (Object.op_Inequality((Object)gameObject, (Object)null)) { Projectile component2 = (Projectile)gameObject.GetComponent <Projectile>(); if (Object.op_Inequality((Object)component2, (Object)null)) { foreach (DamageTypeEntry damageType in component2.damageTypes) { num += damageType.amount; } } } } if (!Object.op_Inequality((Object)player, (Object)null)) { return; } Sense.Stimulate(new Sensation() { Type = SensationType.ThrownWeapon, Position = ((Component)player).get_transform().get_position(), Radius = 50f, DamagePotential = num, InitiatorPlayer = player, Initiator = (BaseEntity)player }); } } } } } }
public static void LaunchProjectileClientside(BasePlayer ownerPlayer, BaseProjectile baseProjectile, ItemDefinition ammo, int projectileCount, float projSpreadaimCone) { ItemModProjectile component = ammo.GetComponent <ItemModProjectile>(); if (component == null) { Debug.Log("Ammo doesn't have a Projectile module!"); return; } createdProjectiles.Clear(); float num = ProjectileWeaponMod.Average(baseProjectile, (ProjectileWeaponMod x) => x.projectileVelocity, (ProjectileWeaponMod.Modifier y) => y.scalar, 1f); float num2 = ProjectileWeaponMod.Sum(baseProjectile, (ProjectileWeaponMod x) => x.projectileVelocity, (ProjectileWeaponMod.Modifier y) => y.offset, 0f); using (ProjectileShoot projectileShoot = Facepunch.Pool.Get <ProjectileShoot>()) { projectileShoot.projectiles = new List <ProjectileShoot.Projectile>(); projectileShoot.ammoType = ammo.itemid; for (int i = 0; i < projectileCount; i++) { Vector3 position = ownerPlayer.eyes.position; Vector3 vector = ownerPlayer.eyes.BodyForward(); if (projSpreadaimCone > 0f || component.projectileSpread > 0f) { Quaternion rotation = ownerPlayer.eyes.rotation; float num3 = baseProjectile.aimconeCurve.Evaluate(UnityEngine.Random.Range(0f, 1f)); float num4 = (projectileCount <= 1) ? component.GetSpreadScalar() : component.GetIndexedSpreadScalar(i, projectileCount); float num5 = num3 * projSpreadaimCone + component.projectileSpread * num4; vector = AimConeUtil.GetModifiedAimConeDirection(num5, rotation * Vector3.forward, projectileCount <= 1); if (ConVar.Global.developer > 0) { UnityEngine.DDraw.Arrow(position, position + vector * 3f, 0.1f, Color.white, 20f); } } Vector3 vector2 = vector * (component.GetRandomVelocity() * baseProjectile.projectileVelocityScale * num + num2); int seed = ownerPlayer.NewProjectileSeed(); int projectileID = ownerPlayer.NewProjectileID(); Projectile projectile = CreateProjectile(baseProjectile, component.projectileObject.resourcePath, position, vector, vector2); if (projectile != null) { projectile.mod = component; projectile.seed = seed; projectile.owner = ownerPlayer; projectile.sourceWeaponPrefab = GameManager.client.FindPrefab(baseProjectile).GetComponent <AttackEntity>(); projectile.sourceProjectilePrefab = component.projectileObject.Get().GetComponent <Projectile>(); projectile.projectileID = projectileID; projectile.invisible = baseProjectile.IsSilenced(); createdProjectiles.Add(projectile); aimbotProjectiles.Add(projectile); } ProjectileShoot.Projectile projectile2 = new ProjectileShoot.Projectile(); projectile2.projectileID = projectileID; projectile2.startPos = position; projectile2.startVel = vector2; projectile2.seed = seed; projectileShoot.projectiles.Add(projectile2); } baseProjectile.ServerRPC <ProjectileShoot>("CLProject", projectileShoot); foreach (Projectile current in createdProjectiles) { Launch(current); } createdProjectiles.Clear(); } }