private void DamageVehicle(Networking.GameDataHandler handler, Entities.Player Attacker, Entities.Vehicle DamagedVehicle, short _damageTaken) { DamagedVehicle.Damage((ushort)_damageTaken); if (DamagedVehicle.IsAlive) //vehicle is still ok { handler.type = GameSubs.ObjectDamage; handler.Set(12, DamagedVehicle.Health); handler.Set(13, _damageTaken); handler.respond = true; } else //vehicle has been destroyed { if (DamagedVehicle.Team != Team.None) { //Creating the death packet from the original buffer foreach (Objects.VehicleSeat Seat in DamagedVehicle.Seats) { Entities.Player Victim = Seat.UsedBy; if (Victim != null && Victim.IsAlive) { Networking.GameDataHandler DeathHandler = Managers.PacketManager.Instance.GetHandler((ushort)GameSubs.PlayerDeath); if (DeathHandler != null) { try { DeathHandler.Process(Victim.User, handler.GetIncPacket()); if (!isFriendlyFire(Attacker, Victim)) { Victim.AddDeaths(); Attacker.AddKill(false); } else { Attacker.SubtractKill(); Attacker.AddFakeDeath(); } OnDeath(Attacker, Victim); } catch { ServerLogger.Instance.Append(ServerLogger.AlertLevel.ServerError, string.Concat("Could not kill player ", Victim.User.Displayname, " on vehicle ", DamagedVehicle.Code)); } } } } } //Destroying veh handler.type = GameSubs.ObjectDestroy; handler.Set(12, DamagedVehicle.Health); handler.Set(13, _damageTaken); handler.Set(14, 15); handler.respond = true; if (!isFriendlyFire(Attacker, DamagedVehicle)) { Attacker.VehiclesDestroyed++; Attacker.User.VehiclesDestroyed++; } ServerLogger.Instance.Append(ServerLogger.AlertLevel.Gaming, string.Concat(Attacker.User.Displayname, " destroyed a vehicle: ", DamagedVehicle.Code)); } }
protected override void Handle() { if (Room.State != RoomState.Playing) { Player.User.Disconnect(); } //Packet info: byte _entityType = GetByte(2); //player = 1, Veh seems to be 0. Other types??? byte _targetVehicle = GetByte(4); ushort _totalDamage = GetUShort(5); long _outOfPlayableZone = GetLong(6); if (_totalDamage == 0) { return; } if (_entityType == 1) //player { if (!Player.IsAlive) { return; } if (Player.Health > _totalDamage) { Player.Health -= _totalDamage; } else { Player.AddDeaths(); Player.Health = 0; type = GameSubs.Suicide; Set(2, Player.User.RoomSlot); if (Player.Team != Team.None) { Room.CurrentGameMode.OnPlayerSuicide(Player); } } Set(7, _totalDamage); Set(8, Player.Health); respond = true; } else { Entities.Vehicle TargetVehicle = Room.Vehicles[_targetVehicle]; if (_outOfPlayableZone != 1) { TargetVehicle.Damage(_totalDamage); } else { TargetVehicle.Damage((ushort)TargetVehicle.Health); } if (!TargetVehicle.IsAlive) { //kill players string[] _buffer = new string[this.packet.Blocks.Length + 5]; foreach (Objects.VehicleSeat Seat in TargetVehicle.Seats) { Entities.Player Driver = Seat.UsedBy; if (Driver != null) { Driver.AddDeaths(); Driver.Health = 0; _buffer[0] = "1"; _buffer[1] = Player.Id.ToString(); _buffer[2] = Room.ID.ToString(); _buffer[3] = this.packet.Blocks[2]; _buffer[4] = "157"; Array.Copy(this.packet.Blocks, 0, _buffer, 5, this.packet.Blocks.Length); _buffer[2] = Driver.User.RoomSlot.ToString(); _buffer[23] = "$"; Room.Send(new Packets.GameData(_buffer).BuildEncrypted()); Room.CurrentGameMode.OnPlayerSuicide(Driver); //ur team lost points u idiot } } Room.Send(new Packets.VehicleExplode(Room, TargetVehicle).BuildEncrypted()); } else { Set(7, _totalDamage); Set(8, TargetVehicle.Health); Set(23, "$"); respond = true; } } }