public void AddWeapon(VehicleWeaponType Type, Objects.VehicleWeapon Weapon)
 {
     if (Weapon != null)
     {
         Weapons.TryAdd(Type, Weapon);
     }
 }
 public Objects.VehicleWeapon GetWeaponBy(string _code)
 {
     Objects.VehicleWeapon Weapon = null;
     VehicleWeapons.TryGetValue(_code, out Weapon);
     return(Weapon);
 }
Пример #3
0
        public virtual void OnObjectDamage(Networking.GameDataHandler handler)
        {
            bool _isPlayer        = handler.GetBool(2);
            byte _objectDamagedId = handler.GetByte(3);
            bool _isSubWeapon     = handler.GetBool(9);
            bool _isRadiusWeapon  = handler.GetBool(10);
            uint _radius          = handler.GetuInt(11); //vehicles don´t seem to have a hitbox

            string _weaponCode  = handler.GetString(22).ToUpper();
            short  _damageTaken = 0;

            Entities.Player      Attacker       = handler.Player;
            Entities.Vehicle     VehicleDamaged = null;
            Objects.Items.Weapon Weapon         = null;

            try { VehicleDamaged = Room.Vehicles[_objectDamagedId]; }

            catch { VehicleDamaged = null;
                    Log.Instance.WriteError("Unknown damaged object with ID: " + _objectDamagedId.ToString()); }

            if (VehicleDamaged != null && CanInFlictDamageTo(Attacker, VehicleDamaged))
            {
                if (_isPlayer)
                {
                    try { Weapon = (Objects.Items.Weapon)Managers.ItemManager.Instance.Items.Values.Where(n => n.Code == _weaponCode).First(); }
                    catch { Weapon = null; }

                    if (Weapon != null)
                    {
                        short _weaponMultiplier = 100;
                        switch (VehicleDamaged.VehicleClass)
                        {
                        case VehicleType.Surface:
                            _weaponMultiplier = Weapon.PowerSurface[0];
                            break;

                        case VehicleType.Air:
                            _weaponMultiplier = Weapon.PowerAir[0];
                            break;

                        case VehicleType.Ship:
                            _weaponMultiplier = Weapon.PowerShip[0];
                            break;

                        default:
                            _weaponMultiplier = Weapon.PowerPersonal[0];
                            break;
                        }

                        _damageTaken = DamageCalculator(Weapon.Power, _weaponMultiplier, _radius);
                    }
                }
                else   //Vehicle attaking other vehicle
                {
                    if (Attacker.VehicleId != -1)
                    {
                        Entities.Vehicle AttackerVehicle = Room.Vehicles[Attacker.VehicleId];

                        if (_weaponCode == AttackerVehicle.Code)     //dont trust the client
                        {
                            Objects.VehicleSeat   Seat      = AttackerVehicle.Seats[AttackerVehicle.GetSeatOf(Attacker)];
                            Objects.VehicleWeapon VehWeapon = null;

                            if (_isSubWeapon)     //he is shooting with the subCT
                            {
                                Seat.Weapons.TryGetValue(VehicleWeaponType.Sub, out VehWeapon);
                            }
                            else
                            {
                                Seat.Weapons.TryGetValue(VehicleWeaponType.Main, out VehWeapon);
                            }

                            if (VehWeapon != null)
                            {
                                _damageTaken = DamageCalculator((short)VehWeapon.Damage, VehWeapon.HitBox[(byte)VehicleDamaged.VehicleClass], _radius);
                            }
                        }
                    }
                    else     //maybe it´s an artillery attack
                    {
                        if (!isValidArtilleryAttack(Attacker))
                        {
                            Attacker.User.Disconnect();
                        }

                        Objects.VehicleWeapon Artillery = Managers.VehicleManager.Instance.GetWeaponBy(_weaponCode);

                        if (Artillery != null)
                        {
                            _damageTaken = DamageCalculator((short)Artillery.Damage, Artillery.HitBox[(byte)VehicleDamaged.VehicleClass], _radius);
                        }
                        else
                        {
                            Log.Instance.WriteError("Couldn´t find artillery weapon " + _weaponCode + " in the Manager");
                        }
                    }
                }

                DamageVehicle(handler, Attacker, VehicleDamaged, _damageTaken);
            }
        }
Пример #4
0
        private void OnVehicleAttackToPlayer(Networking.GameDataHandler handler, Entities.Player Attacker, Entities.Player Victim)
        {
            Entities.Vehicle AttackerVehicle = null;
            string           _vehicleId      = handler.GetString(22).ToUpper();

            try { AttackerVehicle = handler.Room.Vehicles[Attacker.VehicleId]; }
            catch { AttackerVehicle = null; }

            if (AttackerVehicle != null)
            {
                if (CanInFlictDamageTo(Attacker, Victim) && IsOperative(AttackerVehicle))
                {
                    if (_vehicleId == AttackerVehicle.Code)
                    {
                        Objects.VehicleSeat Seat = AttackerVehicle.Seats[Attacker.VehicleSeatId];

                        if (Seat.Weapons.Count > 0)
                        {
                            byte _weaponSlot             = handler.GetByte(9); //0 = main CT, 1 = subCT
                            Objects.VehicleWeapon Weapon = null;
                            Seat.Weapons.TryGetValue((VehicleWeaponType)_weaponSlot, out Weapon);

                            if (Weapon != null)
                            {
                                //Most vehicles uses Radius even for machineguns... yeah odd
                                short  _damageTaken      = 0;
                                double _hitboxMultiplier = 1.0;
                                bool   _useRadius        = handler.GetBool(10);
                                uint   _boneId           = handler.GetuInt(11);
                                uint   _radius           = _boneId;
                                uint   _realBoneId       = _boneId - handler.Player.User.SessionID;

                                //just to make sure...

                                if (!_useRadius)
                                {
                                    Enums.Hitbox Location;
                                    try { Location = (Hitbox)_realBoneId; }
                                    catch { Location = Hitbox.TorsoLimbs; }

                                    _hitboxMultiplier = GetHitBoxMultiplier(Location);
                                    _radius           = 100;
                                }
                                _damageTaken = DamageCalculator((short)Weapon.Damage, Weapon.HitBox[(byte)VehWeapDamType.Personal], _radius);
                                DamagePlayer(handler, Attacker, Victim, _damageTaken, false);
                            }
                        }
                    }
                }
            }
            else  //Artillery Attack?
            {
                Objects.VehicleWeapon Artillery = null;

                Artillery = Managers.VehicleManager.Instance.GetWeaponBy(handler.GetString(22).ToUpper());

                if (Artillery != null && isValidArtilleryAttack(Attacker))
                {
                    uint  _radius      = handler.GetuInt(11);
                    short _damageTaken = DamageCalculator((short)Artillery.Damage, Artillery.HitBox[(byte)VehWeapDamType.Personal], _radius);
                    DamagePlayer(handler, Attacker, Victim, _damageTaken, false);
                }

                else
                {
                    Attacker.User.Disconnect();
                }
            }
        }