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); }
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); } }
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(); } } }