Sanitäter-Team mit Patient aussteigen lassen

  • Sanitäter-Team mit Patient aussteigen lassen

    Hallo zusammen,
    gibt es eine Möglichkeit, wenn ein Sanitäter-Team mit einer verletzten Person im RTW sind, diese auch wieder aussteigen zulassen ?


    Habe es schon so versucht, aber ich nehme an, dass dort wie in dem ExitVehicleCommand sowas wie -> "Wenn du mit einer Injured Person gelinked bist, ist das Aussteigen nicht möglich" steht. Aus dem ExitVehicleCommand werde ich auch nicht so richtig schlau...

    Quellcode

    1. call->getComponent<qsf::ActionComponent>()->pushAction<em5::ExitVehicleAction>(100, qsf::action::APPEND_TO_BACK).init(pers->getId());


    Hoffe ihr könnt helfen.

    Danke im Vorraus
    Fabi
    Mein Schienbein hilft mir im dunkeln Meine Schränke zu finden.
  • aus dem Vehicle Component:

    -würde die UnloadPersonFromVehicleAction nehmen, habe aber hier die komplette Funktion angehängt, damit du ne Ahnung bekommst, wie die Position + Rotation bestimmt werden können
    -falls du über containerlinks an die Id's zum Aussteigen kommst, habe ich weiter unten noch einen fix angehängt, mit dem es auch mit der ExitVehicleAction klappen könnte

    C-Quellcode

    1. void VehicleComponent::personsFleeFromFire(bool allowSpawning)
    2. {
    3. const bool isSquadVehicle = nullptr != getEntity().getComponent<CommandableComponent>();
    4. // Cycle through all entities in the container
    5. // -> Do this in a separate step before actually handling the entities, so we don't run into problems because of manipulation of the iterated list
    6. std::vector<qsf::Entity*> personsToExit;
    7. for (auto& iterator : getLinks())
    8. {
    9. const qsf::ContainerLink& containerLink = *iterator.second;
    10. qsf::Entity& containedEntity = containerLink.getTargetEntity();
    11. // Don't allow vehicles to leave the container (eg the motorboat from the motorboat transporter)
    12. if (!EntityHelper(containedEntity).isEntityPerson())
    13. continue;
    14. // Only check for injured persons, when not a squad vehicle (otherwise a transported patient by the RTW would be "lost")
    15. if (!isSquadVehicle)
    16. {
    17. HealthComponent* healthComponent = containedEntity.getComponent<HealthComponent>();
    18. if (nullptr != healthComponent && healthComponent->isInjured())
    19. {
    20. // Person is injured (trapped before) and can't leave the vehicle by themself
    21. continue;
    22. }
    23. }
    24. personsToExit.push_back(&containedEntity);
    25. }
    26. if (allowSpawning && personsToExit.empty())
    27. {
    28. // In case there's no person inside, spawn one
    29. const qsf::TransformComponent& vehicleTransformComponent = getEntity().getComponentSafe<qsf::TransformComponent>();
    30. qsf::Entity* spawnedEntity = SpawnPointComponent::spawnRandomAt(vehicleTransformComponent.getTransform(), getEntity().getMap(), assets::SPAWNPOOL_DEFAULT_PERSON, false);
    31. if (nullptr != spawnedEntity)
    32. {
    33. // Set the person inside the vehicle
    34. EntityHelper(*spawnedEntity).enterContainer(getEntity(), container::CONTAINERTYPE_PASSENGER);
    35. personsToExit.push_back(spawnedEntity);
    36. }
    37. else
    38. {
    39. QSF_ERROR("Unable to spawn person exiting vehicle " << getEntityId(), QSF_REACT_NONE);
    40. }
    41. }
    42. qsf::Transform placeTransform;
    43. // Get the door position
    44. getFirstDoorTransformByType(DoorComponent::DOORTYPE_CODRIVER, placeTransform);
    45. // For leaving the vehicle, we rotate at 180°
    46. placeTransform.setRotation(placeTransform.getRotation() * qsf::Math::getRotationAroundAxis(qsf::CoordinateSystem::getUp(), glm::pi<float>()));
    47. // Exit the entities now
    48. qsf::TransformComponent* transformComponent = getEntity().getComponent<qsf::TransformComponent>();
    49. float placeOffset = 0;
    50. qsf::Time spawnDelay = qsf::Time::ZERO;
    51. for (qsf::Entity* containedEntity : personsToExit)
    52. {
    53. glm::vec3 newPosition = placeTransform.getPosition() + (transformComponent->getRotation() * qsf::CoordinateSystem::getIn() * placeOffset);
    54. placeOffset -= 1.5f; // TODO(mk) Dummy changing of the position, to avoid stacking on the same place
    55. // Move them 2 meters away from the vehicle (this avoids cliping when an injured person or the paramedic team is unloaded)
    56. newPosition += placeTransform.getRotation() * qsf::CoordinateSystem::getIn() * 2.0f;
    57. EntityHelper containedEntityHelper(*containedEntity);
    58. const bool isInjured = containedEntityHelper.isPersonInjured();
    59. // Let person exit ...
    60. qsf::ActionComponent& actionComponent = containedEntity->getOrCreateComponentSafe<qsf::ActionComponent>();
    61. actionComponent.clearPlan();
    62. actionComponent.pushAction<UnloadPersonFromVehicleAction>(action::DANGER_URGENT).init(getEntity(), newPosition, placeTransform.getRotation(), spawnDelay, !isInjured, true);
    63. if (!isInjured)
    64. {
    65. // ... and run for its life, but only for not injured persons
    66. actionComponent.pushAction<MoveAction>(action::DANGER_IMMINENT).init(new qsf::ai::AvoidThreatsGoal(20.0f, 1), MovementModes::MOVEMENT_MODE_RUN_PANIC);
    67. }
    68. else
    69. {
    70. // Update custom bounding box to lying again for injured persons
    71. actionComponent.pushAction<InjuredAction>(action::BLOCKING).init(containedEntity->getOrCreateComponentSafe<HealthComponent>().getState(), false, false);
    72. qsf::ai::NavigationComponent* navigationComponent = containedEntity->getComponent<qsf::ai::NavigationComponent>();
    73. if (nullptr != navigationComponent)
    74. {
    75. navigationComponent->setActive(false);
    76. }
    77. AnimationHelper(*containedEntity).clearAnimation();
    78. }
    79. // Handle civilists and gangster
    80. PersonComponent* personComponent = containedEntity->getComponent<PersonComponent>();
    81. if (nullptr != personComponent && personComponent->getHandcuffedFlag())
    82. {
    83. // Mark the person again as gangster so that the player can interact with him again (only gangster can be arrested)
    84. personComponent->setGangsterFlag(true);
    85. }
    86. else if (containedEntityHelper.isCivilPerson() && !isInjured)
    87. {
    88. containedEntity->getOrCreateComponentById("em5::MoveToDespawnComponent");
    89. }
    90. spawnDelay += qsf::Time::fromSeconds(0.2f); // Increase the spawnDelay for everyone after the first
    91. }
    92. }
    Alles anzeigen

    denke daran, dass der containerlink die falsche Adress zurück liefert. Nutze stattdessen den hier verwendeten fix wenn du mit Containerlink arbeitest (empfohlen)

    C-Quellcode

    1. void AmbulanceHandler::personPlacedInAmbulance(const qsf::MessageParameters& parameters)
    2. {
    3. uint64 car;
    4. parameters.getParameter < uint64>("vehicleId", car);
    5. qsf::Entity* AmbualanceCar = QSF_MAINMAP.getEntityById(car);
    6. if (AmbualanceCar != nullptr)
    7. {
    8. uint32 passengersinside = 0;
    9. em5::VehicleComponent* vehicleComponent = AmbualanceCar->getComponent<em5::VehicleComponent>();
    10. const qsf::LinkProxy* wrongLinkProxyPointer = &vehicleComponent->getLinkProxy();
    11. const qsf::LinkProxy* rightLinkProxyPointer = reinterpret_cast<const qsf::LinkProxy*>(reinterpret_cast<const char*>(wrongLinkProxyPointer) - 8);
    12. auto& links = reinterpret_cast<const boost::container::flat_map<qsf::LinkAnchorId, qsf::ContainerLink*>&>(rightLinkProxyPointer->getLinkConnectionMap());
    13. for (auto J : links)
    14. {
    15. qsf::ContainerLink& containerLink = *J.second;
    16. qsf::Entity* linkedEntity = &containerLink.getTargetEntity();
    17. if (em5::EntityHelper(linkedEntity).isPersonInjured())
    18. passengersinside++;
    19. }
    20. uint32 passengers = em5::EntityHelper(*AmbualanceCar).getOrderInfo()->getPassengerSpace();
    21. if (passengers <= passengersinside)
    22. {
    23. DriveBackRTWs.push_back(car);
    24. DriveBackRTWsJobs.registerAt(em5::Jobs::SIMULATION_LOGIC, boost::bind(&AmbulanceHandler::mDriveBackRTWsJobs, this, _1));
    25. }
    26. }
    27. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von KillerConsti ()

  • KillerConsti schrieb:

    aus dem Vehicle Component:

    -würde die UnloadPersonFromVehicleAction nehmen, habe aber hier die komplette Funktion angehängt, damit du ne Ahnung bekommst, wie die Position + Rotation bestimmt werden können
    Würde es nicht auch schon mit:


    Quellcode

    1. void init (qsf::Entity &exitVehicle, uint32 doorType)
    funktionieren ? Bzw. was wäre die genaue uint für welche Door ?

    DOORTYPE_UNDEFINED = 0
    DOORTYPE_MAIN_ENTRANCE = 1
    DOORTYPE_DRIVER = 2
    DOORTYPE_CODRIVER = 3
    DOORTYPE_PASSENGER = 4
    DOORTYPE_TRUNK = 5
    DOORTYPE_EQUIPMENTLEFT = 6
    DOORTYPE_EQUIPMENTRIGHT = 7 ?
    Mein Schienbein hilft mir im dunkeln Meine Schränke zu finden.
  • es muss anders rum sein (wollte ein paar Worte sparen) ,da das exitvehicle das Fahrzeug sein soll

    Quellcode

    1. void init (qsf::Entity &exitVehicle, uint32 doorType)


    Quellcode

    1. // Let person exit ...
    2. qsf::ActionComponent& actionComponent = containedEntity->getOrCreateComponentSafe<qsf::ActionComponent>();
    3. actionComponent.clearPlan();
    4. actionComponent.pushAction<UnloadPersonFromVehicleAction>(action::DANGER_URGENT).init(getEntity(),...)
  • KillerConsti schrieb:

    es muss anders rum sein (wollte ein paar Worte sparen) ,da das exitvehicle das Fahrzeug sein soll

    Quellcode

    1. void init (qsf::Entity &exitVehicle, uint32 doorType)
    Oh klar, hätte ich Dummerchen auch mal selber drauf kommen können... :D

    Jetzt muss ich nur noch dafür sorgen, dass der Verletzte wieder mit den Team gelinked wird, bis lang steigen die nämlich mit leerer Trage aus.
    Mein Schienbein hilft mir im dunkeln Meine Schränke zu finden.