diff --git a/lib/plugins/entities.js b/lib/plugins/entities.js index 86dd361e7..a43e20cd5 100644 --- a/lib/plugins/entities.js +++ b/lib/plugins/entities.js @@ -380,12 +380,9 @@ function inject (bot) { // attach entity const entity = fetchEntity(packet.entityId) if (packet.vehicleId === -1) { - const vehicle = entity.vehicle - delete entity.vehicle - bot.emit('entityDetach', entity, vehicle) + bot.emit('entityDetach', entity, entity.vehicle) } else { - entity.vehicle = fetchEntity(packet.vehicleId) - bot.emit('entityAttach', entity, entity.vehicle) + bot.emit('entityAttach', entity, fetchEntity(packet.vehicleId)) } }) @@ -806,41 +803,55 @@ function inject (bot) { const passenger = fetchEntity(packet.entityId) const vehicle = packet.vehicleId === -1 ? null : fetchEntity(packet.vehicleId) - const originalVehicle = passenger.vehicle - if (originalVehicle !== null) { - const index = originalVehicle.passengers.indexOf(passenger) - originalVehicle.passengers = originalVehicle.passengers.splice(index, 1) + if (!passenger || passenger.vehicle?.id === vehicle?.id) return + + // Handle detachment from previous vehicle + if (passenger.vehicle) { + const prevVehicle = passenger.vehicle + const index = prevVehicle.passengers.indexOf(passenger) + if (index !== -1) prevVehicle.passengers.splice(index, 1) + + passenger.vehicle = null } - passenger.vehicle = vehicle - vehicle.passengers.push(passenger) - if (packet.entityId === bot.entity.id) { - const vehicle = bot.vehicle - if (packet.vehicleId === -1) { - bot.vehicle = null - bot.emit('dismount', vehicle) - } else { - bot.vehicle = bot.entities[packet.vehicleId] - bot.emit('mount') - } + // Handle attachment to new vehicle + if (vehicle) { + if (!vehicle.passengers.includes(passenger)) vehicle.passengers.push(passenger) + + passenger.vehicle = vehicle } }) bot._client.on('set_passengers', ({ entityId, passengers }) => { - const passengerEntities = passengers.map((passengerId) => fetchEntity(passengerId)) const vehicle = entityId === -1 ? null : bot.entities[entityId] - - for (const passengerEntity of passengerEntities) { - const originalVehicle = passengerEntity.vehicle - if (originalVehicle !== null) { - const index = originalVehicle.passengers.indexOf(passengerEntity) - originalVehicle.passengers = originalVehicle.passengers.splice(index, 1) + const passengerEntities = passengers.map(fetchEntity) + + Object.values(bot.entities).forEach((passengerEntity) => { + if (passengerEntity && passengerEntity.vehicle === vehicle) { + if (!passengerEntities.includes(passengerEntity.id)) { + const index = vehicle.passengers.indexOf(passengerEntity) + if (index !== -1) vehicle.passengers.splice(index, 1) + passengerEntity.vehicle = null + } } - passengerEntity.vehicle = vehicle - if (vehicle !== null) { - vehicle.passengers.push(passengerEntity) + }) + + passengerEntities.forEach((passengerEntity) => { + if (passengerEntity.vehicle !== vehicle) { + const originalVehicle = passengerEntity.vehicle + if (originalVehicle) { + const index = originalVehicle.passengers.indexOf(passengerEntity) + if (index !== -1) originalVehicle.passengers.splice(index, 1) + } + + passengerEntity.vehicle = vehicle + if (vehicle && !vehicle.passengers.includes(passengerEntity)) { + vehicle.passengers.push(passengerEntity) + } } - } + }) + + if (vehicle) vehicle.passengers = passengerEntities if (passengers.includes(bot.entity.id)) { const originalVehicle = bot.vehicle