コード例 #1
0
        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;
        }
コード例 #2
0
    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
                            });
                        }
                    }
                }
            }
        }
    }
コード例 #3
0
        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();
            }
        }