internal Projectile PlayerShootProjectile(byte id, ProjectileDesc desc, ushort objType, Position position, float angle)
 {
     ProjectileId = id;
     return(CreateProjectile(desc, objType,
                             (int)StatsManager.GetAttackDamage(desc.MinDamage, desc.MaxDamage),
                             position, angle));
 }
        private void Handle(Player player, PlayerShootPacket packet)
        {
            if (player.Owner == null)
            {
                return;
            }

            Item           item    = player.Manager.GameData.Items[packet.ContainerType];
            ProjectileDesc prjDesc = item.Projectiles[0]; //Assume only one
            var            dmg     = (int)player.statsMgr.GetAttackDamage(prjDesc.MinDamage, prjDesc.MaxDamage, (player.Inventory.Data[0] != null ? player.Inventory.Data[0].DmgPercentage : 0));
            Projectile     prj     = player.PlayerShootProjectile(
                packet.BulletId, prjDesc, item.ObjectType,
                packet.Time, packet.Position, packet.Angle, dmg, player.Inventory.Data[0], 0);

            player.Owner.EnterWorld(prj);
            player.BroadcastSync(new AllyShootPacket
            {
                OwnerId       = player.Id,
                Angle         = packet.Angle,
                ContainerType = packet.ContainerType,
                BulletId      = packet.BulletId,
                Damage        = dmg
            }, p => p != player && player.Dist(p) < 25);
            player.FameCounter.Shoot(prj);
        }
        private void ActivateAbilityShoot(RealmTime time, Ability ability, Position target)
        {
            double         arcGap     = ability.ArcGap * Math.PI / 180;
            double         startAngle = Math.Atan2(target.Y - Y, target.X - X) - (ability.NumProjectiles - 1) / 2 * arcGap;
            ProjectileDesc prjDesc    = ability.Projectiles[0]; //Assume only one

            var batch = new Packet[ability.NumProjectiles];

            for (int i = 0; i < ability.NumProjectiles; i++)
            {
                Projectile proj = CreateProjectile(prjDesc, ObjectDesc.ObjectType,
                                                   (int)statsMgr.GetAttackDamage(prjDesc.MinDamage, prjDesc.MaxDamage),
                                                   time.tickTimes, new Position {
                    X = X, Y = Y
                }, (float)(startAngle + arcGap * i), 1);
                Owner.EnterWorld(proj);
                fames.Shoot(proj);
                batch[i] = new ShootPacket
                {
                    BulletId      = proj.ProjectileId,
                    OwnerId       = Id,
                    ContainerType = ability.AbilityType,
                    Position      = new Position {
                        X = X, Y = Y
                    },
                    Angle       = proj.Angle,
                    Damage      = (short)proj.Damage,
                    FromAbility = true
                };
            }
            BroadcastSync(batch, p => this.Dist(p) < 25);
        }
Example #4
0
 public Projectile(ProjectileDesc desc)
     : base(GameServer.Manager.GameData.IdToObjectType[desc.ObjectId])
 {
     ProjDesc     = desc;
     CheatHandler = new GodCheatHandler();
     CheatHandler.SetProjectile(this);
 }
Example #5
0
        public Projectile CreateProjectile(ProjectileDesc desc, short container, int dmg, long time, Position pos,
                                           float angle)
        {
            var ret = new Projectile(desc) //Assume only one
            {
                ProjectileOwner = this,
                ProjectileId    = projectileId++,
                Container       = container,
                Damage          = dmg,
                BeginTime       = time,
                BeginPos        = pos,
                Angle           = angle,
                X = pos.X,
                Y = pos.Y
            };

            if (this.HasConditionEffect(ConditionEffects.Damaging))
            {
                ret.Damage = ret.Damage * 2;
            }
            if (this.HasConditionEffect(ConditionEffects.Weak))
            {
                ret.Damage = ret.Damage / 2;
            }
            if (projectiles[ret.ProjectileId] != null)
            {
                projectiles[ret.ProjectileId].Destroy(true);
            }
            projectiles[ret.ProjectileId] = ret;
            return(ret);
        }
Example #6
0
        private void Handle(Player player, PlayerCheatPacket packet)
        {
            Item           item    = player.Inventory[0];
            ProjectileDesc prjDesc = item.Projectiles[0];

            bool CheaterPos =
                (packet.atk_ > player.statsMgr.GetStats(2) + 5 || packet.def_ > player.statsMgr.GetStats(3) + 5 || packet.spd_ > player.statsMgr.GetStats(4) + 5 || packet.vit_ > player.statsMgr.GetStats(5) + 5 || packet.wis_ > player.statsMgr.GetStats(6) + 5 || packet.dex_ > player.statsMgr.GetStats(7) + 5);
            bool CheaterNeg =
                (packet.atk_ < 0 || packet.def_ < -10 || packet.dex_ < 0 || packet.wis_ < 0 || packet.vit_ < 0 || packet.spd_ < 0);
            bool WeaponEdit =
                (packet.mindmg_ > (prjDesc.MinDamage * 1.20) || packet.maxdmg_ > (prjDesc.MaxDamage * 1.20));

            if (player.Owner == null || prjDesc == null || item == null)
            {
                return;
            }
            if (CheaterPos || CheaterNeg || WeaponEdit)
            {
                player.cheatCount++;
                player.Owner.Timers.Add(new WorldTimer(5500, (world, t) =>
                {
                    player.cheatCount--;
                    return;
                }));
            }
        }
Example #7
0
        public Projectile CreateProjectile(ProjectileDesc desc, ushort container, int dmg, int pen, long time, Position pos,
                                           float angle, ActivateAbility abil = null)
        {
            var ret = new Projectile(Manager, desc) //Assume only one
            {
                ProjectileOwner = this,
                ProjectileId    = projectileId++,
                abil            = abil,
                Container       = container,
                Damage          = dmg,
                Penetration     = pen,
                BeginTime       = time,
                BeginPos        = pos,
                Angle           = angle,
                X = pos.X,
                Y = pos.Y
            };

            if (projectiles[ret.ProjectileId] != null)
            {
                projectiles[ret.ProjectileId].Destroy(true);
            }
            projectiles[ret.ProjectileId] = ret;
            return(ret);
        }
Example #8
0
        public Projectile CreateProjectile(
            ProjectileDesc desc,
            ushort container,
            int dmg,
            long time,
            Position pos,
            float angle
            )
        {
            Projectile _projectile = new Projectile(desc)
            {
                ProjectileOwner = this,
                ProjectileId    = ProjectileId++,
                Container       = (short)container,
                Damage          = dmg,
                BeginTime       = time,
                BeginPos        = pos,
                Angle           = angle,
                X = pos.X,
                Y = pos.Y
            };

            if (Owner.Projectiles.TryGetValue(new KeyValuePair <int, byte>(Id, _projectile.ProjectileId), out Projectile _projectileSample))
            {
                if (_projectileSample != null)
                {
                    Owner.RemoveProjectileFromId(Id, _projectileSample.ProjectileId);
                }
            }

            Owner.AddProjectileFromId(Id, _projectile.ProjectileId, _projectile);

            return(_projectile);
        }
        protected override bool TickCore(RealmTime time)
        {
            int    remainingTick;
            object o;

            if (!Host.StateStorage.TryGetValue(Key, out o))
            {
                remainingTick = 0;
            }
            else
            {
                remainingTick = (int)o;
            }

            remainingTick -= time.thisTickTimes;
            bool ret;

            if (remainingTick <= 0)
            {
                double angle = 0;
                switch (Host.Self.ObjectType)
                {
                case 0x0802: angle = Math.PI / 2; break;

                case 0x0803: angle = Math.PI * 3 / 2; break;

                case 0x0804: angle = 0; break;

                case 0x0805: angle = Math.PI; break;
                }

                ProjectileDesc desc = Host.Self.ObjectDesc.Projectiles[0];
                Projectile     proj = Host.Self.CreateProjectile(desc, Host.Self.ObjectType,
                                                                 5, time.tickTimes, new Position()
                {
                    X = Host.Self.X, Y = Host.Self.Y
                },
                                                                 (float)angle);
                Host.Self.Owner.EnterWorld(proj);
                Host.Self.Owner.BroadcastPacket(new ShootPacket()
                {
                    BulletId      = proj.ProjectileId,
                    OwnerId       = Host.Self.Id,
                    ContainerType = Host.Self.ObjectType,
                    Position      = proj.BeginPos,
                    Angle         = proj.Angle,
                    Damage        = (short)proj.Damage
                }, null);

                remainingTick = rand.Next(2000, 3500);
                ret           = true;
            }
            else
            {
                ret = false;
            }
            Host.StateStorage[Key] = remainingTick;
            return(ret);
        }
Example #10
0
        protected override bool TickCore(RealmTime time)
        {
            if (Host.Self.HasConditionEffect(ConditionEffects.Stunned))
            {
                return(false);
            }
            float  dist   = radius;
            Entity entity = radius == 0 ? null : GetNearestEntity(ref dist, null);

            if (entity != null || radius == 0)
            {
                var chr = Host as Character;
                if (chr.Owner == null)
                {
                    return(false);
                }
                ProjectileDesc desc  = chr.ObjectDesc.Projectiles[projectileIndex];
                double         angle = entity == null ? 0 : Math.Atan2(entity.Y - chr.Y, entity.X - chr.X);
                angle = Predict(entity, desc);
                double angleInc = (2 * Math.PI) / this.count;

                int count = this.count;
                if (Host.Self.HasConditionEffect(ConditionEffects.Dazed))
                {
                    count = Math.Max(1, count / 2);
                }

                byte prjId  = 0;
                var  prjPos = new Position {
                    X = chr.X, Y = chr.Y
                };
                int dmg = chr.Random.Next(desc.MinDamage, desc.MaxDamage);
                for (int i = 0; i < count; i++)
                {
                    Projectile prj = chr.CreateProjectile(
                        desc, chr.ObjectType, dmg, time.tickTimes,
                        prjPos, (float)(angle + angleInc * i));
                    chr.Owner.EnterWorld(prj);
                    if (i == 0)
                    {
                        prjId = prj.ProjectileId;
                    }
                }
                chr.Owner.BroadcastPacket(new MultiShootPacket
                {
                    BulletId       = prjId,
                    OwnerId        = Host.Self.Id,
                    BulletType     = (byte)desc.BulletType,
                    Position       = prjPos,
                    Angle          = (float)angle,
                    Damage         = (short)dmg,
                    NumShots       = (byte)count,
                    AngleIncrement = (float)angleInc,
                }, null);
                return(true);
            }
            return(false);
        }
Example #11
0
        public GunDesc(TypeCollection collection, XElement e)
        {
            //Don't modify the original source when we inherit
            e       = new XElement(e);
            inherit = e.TryAtt(nameof(inherit), null);
            if (inherit != null)
            {
                var source = collection.sources[inherit].Element(Tag);
                e.InheritAttributes(source);
            }

            Dictionary <string, int> difficultyMap = new Dictionary <string, int> {
                { "none", 0 },
                { "easy", 20 },
                { "medium", 40 },
                { "hard", 60 },
                { "expert", 80 },
                { "master", 100 },
            };

            if (Enum.TryParse <WeaponDifficulty>(e.TryAtt(nameof(difficulty)), out var r))
            {
                difficulty = (int)r;
            }
            else
            {
                throw new Exception("Difficulty expected");
            }
            recoil     = e.TryAttInt(nameof(recoil), 0);
            noiseRange = e.TryAttInt(nameof(noiseRange), 0);

            projectileCount = e.TryAttInt(nameof(projectileCount), 1);
            knockback       = e.TryAttInt(nameof(knockback), 0);
            spread          = e.TryAttInt(nameof(spread), 0);
            fireTime        = e.TryAttInt(nameof(fireTime), 0);
            reloadTime      = e.TryAttInt(nameof(reloadTime), 0);

            critOnLastShot = e.TryAttBool(nameof(critOnLastShot), false);

            clipSize = e.TryAttInt(nameof(clipSize), 0);
            maxAmmo  = e.TryAttInt(nameof(maxAmmo), 0);

            initialClip = e.TryAttInt(nameof(initialClip), clipSize);
            initialAmmo = e.TryAttInt(nameof(initialAmmo), maxAmmo);

            if (e.HasElement("Bullet", out var bulletXml))
            {
                projectile = new BulletDesc(bulletXml);
            }
            else if (e.HasElement("Flame", out var flameXml))
            {
                projectile = new FlameDesc(flameXml);
            }
            else if (e.HasElement("Grenade", out var grenadeXml))
            {
                projectile = new GrenadeDesc(grenadeXml);
            }
        }
Example #12
0
 internal Projectile PlayerShootProjectile(
     byte id, ProjectileDesc desc, ushort objType,
     int time, Position position, float angle)
 {
     projectileId = id;
     return(CreateProjectile(desc, objType,
                             (int)statsMgr.GetAttackDamage(desc.MinDamage, desc.MaxDamage),
                             time + tickMapping, position, angle));
 }
 internal Projectile PlayerShootProjectile(
     byte id, ProjectileDesc desc, ushort objType,
     int time, Position position, float angle, int dmg, ItemData data, int slotId = -1)
 {
     projectileId = id;
     return CreateProjectile(desc, (ushort)objType,
         (int)statsMgr.GetAttackDamage(desc.MinDamage, desc.MaxDamage, data != null ? data.DmgPercentage : 0),
         time, position, angle, slotId);
 }
 internal Projectile PlayerShootProjectile(
     byte id, ProjectileDesc desc, ushort objType,
     int time, Position position, float angle)
 {
     projectileId = id;
     return CreateProjectile(desc, objType,
         (int)statsMgr.GetAttackDamage(desc.MinDamage, desc.MaxDamage),
         time + tickMapping, position, angle);
 }
 internal Projectile PlayerShootProjectile(
     byte id, ProjectileDesc desc, ushort objType,
     int time, Position position, float angle, int dmg, ItemData data, int slotId = -1)
 {
     projectileId = id;
     return(CreateProjectile(desc, (ushort)objType,
                             (int)statsMgr.GetAttackDamage(desc.MinDamage, desc.MaxDamage, data != null ? data.DmgPercentage : 0),
                             time, position, angle, slotId));
 }
Example #16
0
        protected override void HandlePacket(Client client, PlayerShootPacket packet)
        {
            client.Manager.Logic.AddPendingAction(t =>
            {
                if (client.Player.Owner == null)
                {
                    return;
                }

                Item item = client.Player.Manager.GameData.Items[(ushort)packet.ContainerType];
                int stype = 0;

                for (int i = 0; i < 4; i++)
                {
                    if (client.Player.Inventory[i]?.ObjectType == packet.ContainerType)
                    {
                        stype = i;
                        break;
                    }
                }

                /* var dex = client.Player.StatsManager.GetStats(7);
                 * if (!client.Player.HasConditionEffect(ConditionEffectIndex.Berserk) && (item.NumProjectiles > item.RateOfFire * (1.5f + 6.5f * (dex / 75f))))
                 * {
                 *     log.Error(client.Player.Name + " is shooting too fast. Ignored");
                 *     return;
                 * } */

                if (client.Player.SlotTypes[stype] != item.SlotType && client.Account.Rank < 2)
                {
                    log.FatalFormat("{0} is trying to cheat (Weapon doesnt match the slot type)", client.Player.Name);
                    client.Player.SendError("This cheating attempt has beed logged and a message was send to all online admins.");
                    client.Disconnect();
                    foreach (Player player in client.Player.Owner.Players.Values)
                    {
                        if (player.Client.Account.Rank >= 2)
                        {
                            player.SendInfo(String.Format("Player {0} is shooting with a weapon that doesnt match the class slot type.", client.Player.Name));
                        }
                    }
                    return;
                }
                ProjectileDesc prjDesc = item.Projectiles[0]; //Assume only one
                Projectile prj         = client.Player.PlayerShootProjectile(
                    packet.BulletId, prjDesc, item.ObjectType,
                    packet.Time, packet.Position, packet.Angle);
                client.Player.Owner.EnterWorld(prj);
                client.Player.BroadcastSync(new AllyShootPacket
                {
                    OwnerId       = client.Player.Id,
                    Angle         = packet.Angle,
                    ContainerType = packet.ContainerType,
                    BulletId      = packet.BulletId,
                }, p => p != client.Player && client.Player.Dist(p) < 25);
                client.Player.FameCounter.Shoot(prj);
            }, PendingPriority.Networking);
        }
Example #17
0
        internal Projectile PlayerShootProjectile(
            byte id, ProjectileDesc desc, ushort objType,
            int time, Position position, float angle)
        {
            projectileId = id;
            var dmg = (int)Stats.GetAttackDamage(Stats[8], Stats[9]);

            return(CreateProjectile(desc, objType, dmg,
                                    C2STime(time), position, angle));
        }
Example #18
0
        protected override void HandlePacket(Client client, PlayerShootPacket packet)
        {
            client.Manager.Logic.AddPendingAction(t =>
            {
                if (client.Player.Owner == null)
                {
                    return;
                }

                OldItem item = client.Player.Manager.GameData.Items[(ushort)packet.ContainerType];
                int stype    = 0;

                for (int i = 0; i < 4; i++)
                {
                    if (client.Player.Inventory[i]?.ObjectType == packet.ContainerType)
                    {
                        stype = i;
                        break;
                    }
                }

                if (item == Client.Player.SerialConvert(Client.Player.Inventory[1]))
                {
                    return; // ability shoot handled by useitem implement ability check
                }
                if (client.Player.SlotTypes[stype] != item.SlotType)
                {
                    Client.Player.kickforCheats(Player.possibleExploit.DIFF_WEAPON);
                    return;
                }
                if ((Client.Stage != ProtocalStage.Disconnected) && (!Client.Player.CheckShootSpeed(item)))
                {
                    return;
                }
                if (Client.Stage == ProtocalStage.Disconnected)
                {
                    return;
                }

                ProjectileDesc prjDesc = item.Projectiles[0]; //Assume only one

                Projectile prj = client.Player.PlayerShootProjectile(
                    packet.BulletId, prjDesc, item.ObjectType,
                    packet.Time, packet.Position, packet.Angle);
                client.Player.Owner.EnterWorld(prj);
                client.Player.BroadcastSync(new AllyShootPacket
                {
                    OwnerId       = client.Player.Id,
                    Angle         = packet.Angle,
                    ContainerType = packet.ContainerType,
                    BulletId      = packet.BulletId
                }, p => p != client.Player && client.Player.Dist(p) < 25);
                client.Player.FameCounter.Shoot(prj);
            }, PendingPriority.Networking);
        }
        protected override bool TickCore(RealmTime time)
        {
            if (Host.Self.HasConditionEffect(ConditionEffects.Stunned))
            {
                return(false);
            }
            int numShot = this.numShot;

            if (Host.Self.HasConditionEffect(ConditionEffects.Dazed))
            {
                numShot = Math.Max(1, numShot / 2);
            }

            float  dist   = radius;
            Entity player = GetNearestEntityPet(ref dist);

            if (player != null)
            {
                var    chr        = Host as Character;
                double startAngle = Math.Atan2(player.Y - chr.Y, player.X - chr.X)
                                    - angle * (numShot - 1) / 2
                                    + offset;
                ProjectileDesc desc = chr.ObjectDesc.Projectiles[projectileIndex];

                byte prjId  = 0;
                var  prjPos = new Position {
                    X = chr.X, Y = chr.Y
                };
                int dmg = chr.Random.Next(desc.MinDamage, desc.MaxDamage);
                for (int i = 0; i < numShot; i++)
                {
                    Projectile prj = chr.CreateProjectile(
                        desc, chr.ObjectType, dmg, time.tickTimes,
                        prjPos, (float)(startAngle + angle * i));
                    chr.Owner.EnterWorld(prj);
                    if (i == 0)
                    {
                        prjId = prj.ProjectileId;
                    }
                }
                chr.Owner.BroadcastPacket(new MultiShootPacket
                {
                    BulletId       = prjId,
                    OwnerId        = Host.Self.Id,
                    BulletType     = (byte)desc.BulletType,
                    Position       = prjPos,
                    Angle          = (float)startAngle,
                    Damage         = (short)dmg,
                    NumShots       = (byte)numShot,
                    AngleIncrement = angle,
                }, null);
                return(true);
            }
            return(false);
        }
Example #20
0
 public Projectile(Entity owner, ProjectileDesc desc, int id, int time, float angle, Position startPos, int damage)
 {
     Owner         = owner;
     Desc          = desc;
     Id            = id;
     Time          = time;
     Angle         = MathUtils.BoundToPI(angle);
     StartPosition = startPos;
     Damage        = damage;
     Hit           = new HashSet <int>();
 }
Example #21
0
        protected override bool TickCore(RealmTime time)
        {
            if (Host.Self.HasConditionEffect(ConditionEffects.Stunned))
            {
                return(false);
            }

            float  dist   = radius;
            Entity entity = GetNearestEntityPet(ref dist);

            if (entity != null)
            {
                var            chr   = Host as Character;
                ProjectileDesc desc  = chr.ObjectDesc.Projectiles[projectileIndex];
                double         angle = Math.Atan2(entity.Y - chr.Y, entity.X - chr.X) + Predict(entity, desc);

                Projectile prj = chr.CreateProjectile(
                    desc, chr.ObjectType, chr.Random.Next(desc.MinDamage, desc.MaxDamage),
                    time.tickTimes, new Position {
                    X = chr.X, Y = chr.Y
                }, (float)angle);
                chr.Owner.EnterWorld(prj);
                if (projectileIndex == 0) //(false)
                {
                    chr.Owner.BroadcastPacket(new ShootPacket
                    {
                        BulletId      = prj.ProjectileId,
                        OwnerId       = Host.Self.PlayerOwner.Id,
                        ContainerType = Host.Self.ObjectType,
                        Position      = prj.BeginPos,
                        Angle         = prj.Angle,
                        Damage        = (short)prj.Damage
                    }, null);
                }
                else
                {
                    chr.Owner.BroadcastPacket(new MultiShootPacket
                    {
                        BulletId       = prj.ProjectileId,
                        OwnerId        = Host.Self.Id,
                        Position       = prj.BeginPos,
                        Angle          = prj.Angle,
                        Damage         = (short)prj.Damage,
                        BulletType     = (byte)(desc.BulletType),
                        AngleIncrement = 0,
                        NumShots       = 1,
                    }, null);
                }
                return(true);
            }
            return(false);
        }
        private static double Predict(Entity host, Entity target, ProjectileDesc desc)
        {
            Position? history = target.TryGetHistory(100);
            if (history == null)
                return 0;

            double originalAngle = Math.Atan2(history.Value.Y - host.Y, history.Value.X - host.X);
            double newAngle = Math.Atan2(target.Y - host.Y, target.X - host.X);

            float bulletSpeed = desc.Speed / 100;
            double angularVelo = (newAngle - originalAngle) / (100 / 1000f);
            return angularVelo * bulletSpeed;
        }
        protected override bool TickCore(RealmTime time)
        {
            if (Host.Self.HasConditionEffect(ConditionEffects.Stunned))
            {
                return(false);
            }

            var chr = Host as Character;

            if (chr.Owner == null)
            {
                return(false);
            }
            ProjectileDesc desc = chr.ObjectDesc.Projectiles[projectileIndex];

            Projectile prj = chr.CreateProjectile(
                desc, chr.ObjectType, chr.Random.Next(desc.MinDamage, desc.MaxDamage),
                time.tickTimes, new Position {
                X = chr.X, Y = chr.Y
            }, angle);

            chr.Owner.EnterWorld(prj);
            if (projectileIndex == 0) //(false)
            {
                chr.Owner.BroadcastPacket(new ShootPacket
                {
                    BulletId      = prj.ProjectileId,
                    OwnerId       = Host.Self.Id,
                    ContainerType = Host.Self.ObjectType,
                    Position      = prj.BeginPos,
                    Angle         = prj.Angle,
                    Damage        = (short)prj.Damage
                }, null);
            }
            else
            {
                chr.Owner.BroadcastPacket(new MultiShootPacket
                {
                    BulletId       = prj.ProjectileId,
                    OwnerId        = Host.Self.Id,
                    Position       = prj.BeginPos,
                    Angle          = prj.Angle,
                    Damage         = (short)prj.Damage,
                    BulletType     = (byte)(desc.BulletType),
                    AngleIncrement = 0,
                    NumShots       = 1,
                }, null);
            }
            return(true);
        }
        private double Predict(Entity entity, ProjectileDesc desc)
        {
            var history = entity.TryGetHistory(100);
            if (history == null)
                return 0;

            var originalAngle = Math.Atan2(history.Value.Y - Host.Self.Y, history.Value.X - Host.Self.X);
            var newAngle = Math.Atan2(entity.Y - Host.Self.Y, entity.X - Host.Self.X);

            var bulletSpeed = desc.Speed / 100f;
            var dist = Dist(entity, Host.Self);
            var angularVelo = (newAngle - originalAngle) / (100 / 1000f);
            return angularVelo * bulletSpeed;
        }
        protected override void HandlePacket(Client client, PlayerShootPacket packet)
        {
            client.Manager.Logic.AddPendingAction(t =>
            {
                if (client.Player.Owner == null)
                {
                    return;
                }

                Item item = client.Player.Manager.GameData.Items[(ushort)packet.ContainerType];
                int stype = 0;

                for (int i = 0; i < 4; i++)
                {
                    if (client.Player.Inventory[i]?.ObjectType == packet.ContainerType)
                    {
                        stype = i;
                        break;
                    }
                }

                if (client.Player.SlotTypes[stype] != item.SlotType && client.Account.Rank < 2)
                {
                    Console.WriteLine($"{client.Player.Name} is trying to cheat (Weapon doesnt match the slot type)");
                    client.Player.SendError("This cheating attempt has been logged and a message was send to all online admins.");
                    client.Disconnect();
                    foreach (Player player in client.Player.Owner.Players.Values)
                    {
                        if (player.Client.Account.Rank >= 2)
                        {
                            player.SendInfo($"Player {client.Player.Name} is shooting with a weapon that doesnt match the class slot type.");
                        }
                    }
                    return;
                }
                ProjectileDesc prjDesc = item.Projectiles[0]; //Assume only one
                Projectile prj         = client.Player.PlayerShootProjectile(
                    packet.BulletId, prjDesc, item.ObjectType,
                    packet.Time, packet.Position, packet.Angle);
                client.Player.Owner.EnterWorld(prj);
                client.Player.BroadcastSync(new AllyShootPacket
                {
                    OwnerId       = client.Player.Id,
                    Angle         = packet.Angle,
                    ContainerType = packet.ContainerType,
                    BulletId      = packet.BulletId
                }, p => p != client.Player && client.Player.Dist(p) < 25);
                client.Player.FameCounter.Shoot(prj);
            }, PendingPriority.Networking);
        }
Example #26
0
        internal Projectile PlayerShootProjectile(
            byte id, ProjectileDesc desc, ushort objType,
            int time, Position position, float angle)
        {
            if (StatsManager.GetAttackDamage(desc.MinDamage, desc.MaxDamage) > 2100 && Client.Account.Rank < 2)
            {
                Client.Player.SendError(Client.Player.Name + " stop using modified client.");
                Client.Disconnect();
            }


            ProjectileId = id;
            return(CreateProjectile(desc, objType, (int)StatsManager.GetAttackDamage(desc.MinDamage, desc.MaxDamage), time, position, angle));
        }
Example #27
0
        private static float Predict(Entity host, Entity target, ProjectileDesc desc)
        {
            /*
             * // new test prediction method
             * const float msPast = 400;
             * const long ticks = 4; // ticks equivalent to 400 ms
             * var history = target.TryGetHistory(ticks);
             * if (history == null)
             *  return 0;
             *
             * var position = new Vector2(target.X - host.X, target.Y - host.Y);
             * var pastPosition = new Vector2(history.Value.X - host.X, history.Value.Y - host.Y);
             * var relativeVelocity = Vector2.Subtract(position / msPast, pastPosition / msPast);
             * var bulletSpeed = desc.Speed / 10000f;
             *
             * var futureHitTime = CollisionTime(position, relativeVelocity, bulletSpeed);
             * if (futureHitTime > 0f)
             * {
             *  var relativePosX = target.X + futureHitTime * relativeVelocity.X - host.X;
             *  var relativePosY = target.Y + futureHitTime * relativeVelocity.Y - host.Y;
             *
             *  return (float) Math.Atan2(relativePosY, relativePosX) -
             *         (float) Math.Atan2(position.Y, position.X);
             * }
             *
             * return 0;
             */

            // trying prod prediction

            const int PREDICT_NUM_TICKS = 4; // magic determined by experiement
            var       history           = target.TryGetHistory(1);

            if (history == null)
            {
                return((float)Math.Atan2(target.Y - host.Y, target.X - host.X));
            }

            var targetX = target.X + PREDICT_NUM_TICKS *
                          (target.X - history.Value.X);
            var targetY = target.Y + PREDICT_NUM_TICKS *
                          (target.Y - history.Value.Y);

            float angle = (float)Math.Atan2(targetY - host.Y, targetX - host.X);

            return(angle);
        }
Example #28
0
        private static double Predict(Entity host, Entity target, ProjectileDesc desc)
        {
            Position?history = target.TryGetHistory(100);

            if (history == null)
            {
                return(0);
            }

            double originalAngle = Math.Atan2(history.Value.Y - host.Y, history.Value.X - host.X);
            double newAngle      = Math.Atan2(target.Y - host.Y, target.X - host.X);

            float  bulletSpeed = desc.Speed / 100;
            double angularVelo = (newAngle - originalAngle) / (100 / 1000f);

            return(angularVelo * bulletSpeed);
        }
Example #29
0
        private void Shoot(RealmTime time, Item item, Position target)
        {
            double         arcGap     = item.ArcGap * Math.PI / 180;
            double         startAngle = Math.Atan2(target.Y - Y, target.X - X) - (item.NumProjectiles - 1) / 2 * arcGap;
            ProjectileDesc prjDesc    = item.Projectiles[0]; //Assume only one

            for (int i = 0; i < item.NumProjectiles; i++)
            {
                Projectile proj = CreateProjectile(prjDesc, item.ObjectType,
                                                   (int)StatsManager.GetAttackDamage(prjDesc.MinDamage, prjDesc.MaxDamage),
                                                   time.TotalElapsedMs, new Position {
                    X = X, Y = Y
                }, (float)(startAngle + arcGap * i));
                Owner?.EnterWorld(proj);
                FameCounter.Shoot(proj);
            }
        }
Example #30
0
        private double Predict(Entity entity, ProjectileDesc desc)
        {
            Position?history = entity.TryGetHistory(100);

            if (history == null)
            {
                return(0);
            }

            var originalAngle = Math.Atan2(history.Value.Y - Host.Self.Y, history.Value.X - Host.Self.X);
            var newAngle      = Math.Atan2(entity.Y - Host.Self.Y, entity.X - Host.Self.X);

            var bulletSpeed = desc.Speed / 100f;
            var dist        = Dist(entity, Host.Self);
            var angularVelo = (newAngle - originalAngle) / (100 / 1000f);

            return(angularVelo * bulletSpeed);
        }
Example #31
0
        private static double Predict(Entity host, Entity target, ProjectileDesc desc)
        {
            var history = target.TryGetHistory(100);

            if (history == null)
            {
                return(0);
            }

            var originalAngle = Math.Atan2(history.Value.Y - host.Y, history.Value.X - host.X);
            var newAngle      = Math.Atan2(target.Y - host.Y, target.X - host.X);

            var bulletSpeed = desc.Speed / 100f;
            var dist        = target.Dist(host);
            var angularVelo = (newAngle - originalAngle) / (100 / 1000f);

            return(angularVelo * bulletSpeed);
        }
Example #32
0
 public Projectile CreateProjectile(ProjectileDesc desc, ushort container, int dmg, long time, Position pos,
     float angle)
 {
     var ret = new Projectile(Manager, desc) //Assume only one
     {
         ProjectileOwner = this,
         ProjectileId = ProjectileId++,
         Container = (short)container,
         Damage = dmg,
         BeginTime = time,
         BeginPos = pos,
         Angle = angle,
         X = pos.X,
         Y = pos.Y
     };
     if (projectiles[ret.ProjectileId] != null)
         projectiles[ret.ProjectileId].Destroy(true);
     projectiles[ret.ProjectileId] = ret;
     return ret;
 }
Example #33
0
        protected override bool TickCore(RealmTime time)
        {
            if (Host.Self.HasConditionEffect(ConditionEffects.Stunned))
            {
                return(false);
            }

            var            chr        = Host as Character;
            float          startAngle = angle - projAngle * (numShot - 1) / 2;
            ProjectileDesc desc       = chr.ObjectDesc.Projectiles[projectileIndex];

            byte prjId  = 0;
            var  prjPos = new Position {
                X = chr.X, Y = chr.Y
            };
            int dmg = chr.Random.Next(desc.MinDamage, desc.MaxDamage);

            for (int i = 0; i < numShot; i++)
            {
                Projectile prj = chr.CreateProjectile(
                    desc, chr.ObjectType, dmg, time.tickTimes,
                    prjPos, startAngle + projAngle * i);
                chr.Owner.EnterWorld(prj);
                if (i == 0)
                {
                    prjId = prj.ProjectileId;
                }
            }
            chr.Owner.BroadcastPacket(new MultiShootPacket
            {
                BulletId       = prjId,
                OwnerId        = Host.Self.Id,
                BulletType     = (byte)desc.BulletType,
                Position       = prjPos,
                Angle          = startAngle,
                Damage         = (short)dmg,
                NumShots       = (byte)numShot,
                AngleIncrement = projAngle,
            }, null);
            return(true);
        }
Example #34
0
        protected override void BehaveCore(BehaviorCondition cond, RealmTime?time, object state)
        {
            float  dist   = 2;
            Entity entity = GetNearestEntity(ref dist, null);

            if (entity != null)
            {
                var            chr      = Host as Character;
                double         angleInc = (2 * Math.PI) / 12;
                ProjectileDesc desc     = chr.ObjectDesc.Projectiles[0];

                byte prjId  = 0;
                var  prjPos = new Position {
                    X = chr.X, Y = chr.Y
                };
                int dmg = chr.Random.Next(desc.MinDamage, desc.MaxDamage);
                for (int i = 0; i < 12; i++)
                {
                    Projectile prj = chr.CreateProjectile(
                        desc, chr.ObjectType, dmg, time.Value.tickTimes,
                        prjPos, (float)(angleInc * i));
                    chr.Owner.EnterWorld(prj);
                    if (i == 0)
                    {
                        prjId = prj.ProjectileId;
                    }
                }
                chr.Owner.BroadcastPacket(new MultiShootPacket
                {
                    BulletId       = prjId,
                    OwnerId        = Host.Self.Id,
                    BulletType     = (byte)desc.BulletType,
                    Position       = prjPos,
                    Angle          = 0,
                    Damage         = (short)dmg,
                    NumShots       = 12,
                    AngleIncrement = (float)angleInc,
                }, null);
                chr.Owner.LeaveWorld(chr);
            }
        }
 public Projectile(RealmManager manager, ProjectileDesc desc)
     : base(manager, manager.GameData.IdToObjectType[desc.ObjectId])
 {
     Descriptor = desc;
 }
Example #36
0
 public Projectile(ProjectileDesc desc)
     : base(XmlDatas.IdToType[desc.ObjectId])
 {
     this.Descriptor = desc;
 }
Example #37
0
        public Projectile CreateProjectile(ProjectileDesc desc, short container, int dmg, long time, Position pos, float angle)
        {
            var ret = new Projectile(desc) //Assume only one
            {
                ProjectileOwner = this,
                ProjectileId = projectileId++,
                Container = container,
                Damage = dmg,

                BeginTime = time,
                BeginPos = pos,
                Angle = angle,

                X = pos.X,
                Y = pos.Y
            };
            if (projectiles[ret.ProjectileId] != null)
                projectiles[ret.ProjectileId].Destroy(true);
            projectiles[ret.ProjectileId] = ret;
            return ret;
        }
Example #38
0
 public Projectile(ProjectileDesc desc)
     : base(XmlData.IdToObjectType[desc.ObjectId])
 {
     Descriptor = desc;
 }
Example #39
0
        static double Predict(Entity host, Entity target, ProjectileDesc desc)
        {
            Position? history = target.TryGetHistory(100);
            if (history == null)
                return 0;

            var originalAngle = Math.Atan2(history.Value.Y - host.Y, history.Value.X - host.X);
            var newAngle = Math.Atan2(target.Y - host.Y, target.X - host.X);

            var bulletSpeed = desc.Speed / 100f;
            var dist = BehaviorUtils.Dist(target, host);
            var angularVelo = (newAngle - originalAngle) / (100 / 1000f);
            return angularVelo * bulletSpeed;
        }