Rigs of Rods 2026.01
Soft-body Physics Simulation
Loading...
Searching...
No Matches
GameContext.cpp
Go to the documentation of this file.
1/*
2 This source file is part of Rigs of Rods
3 Copyright 2005-2012 Pierre-Michel Ricordel
4 Copyright 2007-2012 Thomas Fischer
5 Copyright 2013-2020 Petr Ohlidal
6
7 For more information, see http://www.rigsofrods.org/
8
9 Rigs of Rods is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 3, as
11 published by the Free Software Foundation.
12
13 Rigs of Rods is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "GameContext.h"
23
24#include "AppContext.h"
25#include "Actor.h"
26#include "AeroEngine.h"
27#include "CacheSystem.h"
28#include "Collisions.h"
29#include "Console.h"
30#include "DashBoardManager.h"
31#include "Engine.h"
32#include "GfxScene.h"
33#include "GUIManager.h"
35#include "GUI_MainSelector.h"
36#include "GUI_TopMenubar.h"
37#include "InputEngine.h"
38#include "OverlayWrapper.h"
39#include "Replay.h"
40#include "ScrewProp.h"
41#include "ScriptEngine.h"
42#include "SkyManager.h"
43#include "SkyXManager.h"
44#include "SoundScriptManager.h"
45#include "Terrain.h"
46#include "Terrn2FileFormat.h"
47#include "TuneupFileFormat.h"
48#include "Utils.h"
49#include "VehicleAI.h"
50
51using namespace RoR;
52
54{
55 // Constructs `ActorPtr` - doesn't compile without `#include Actor.h` - not pretty if in header (even if auto-generated by C++).
56}
57
59{
60 // Destructs `ActorPtr` - doesn't compile without `#include Actor.h` - not pretty if in header (even if auto-generated by C++).
61}
62
63// --------------------------------
64// Message queue
65
67{
68 std::lock_guard<std::mutex> lock(m_msg_mutex);
69 m_msg_queue.push(m);
71}
72
74{
75 std::lock_guard<std::mutex> lock(m_msg_mutex);
77 {
78
79 m_msg_chain_end->chain.push_back(m);
81 }
82 else
83 {
84 // Regular `PushMessage()`, just without the lock.
85 m_msg_queue.push(m);
87 }
88}
89
91{
92 std::lock_guard<std::mutex> lock(m_msg_mutex);
93 return !m_msg_queue.empty();
94}
95
97{
98 std::lock_guard<std::mutex> lock(m_msg_mutex);
99 ROR_ASSERT(m_msg_queue.size() > 0);
100 if (m_msg_chain_end == &m_msg_queue.front())
101 {
102 m_msg_chain_end = nullptr;
103 }
104 Message m = m_msg_queue.front();
105 m_msg_queue.pop();
106 return m;
107}
108
109// --------------------------------
110// Terrain
111
112bool GameContext::LoadTerrain(std::string const& filename_part)
113{
114 m_last_spawned_actor = nullptr;
115
116 // Find terrain in modcache
117 CacheEntryPtr terrn_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Terrain, /*partial=*/true, filename_part);
118 if (!terrn_entry)
119 {
120 Str<200> msg; msg << _L("Terrain not found: ") << filename_part;
121 RoR::Log(msg.ToCStr());
122 App::GetGuiManager()->ShowMessageBox(_L("Terrain loading error"), msg.ToCStr());
123 return false;
124 }
125
126 // Init resources
127 App::GetCacheSystem()->LoadResource(terrn_entry);
128
129 // Load the terrain def file
130 Terrn2DocumentPtr terrn2;
131 std::string const& filename = terrn_entry->fname;
132 try
133 {
134 Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename);
135 LOG(" ===== LOADING TERRAIN " + filename);
136 Terrn2Parser parser;
137 terrn2 = parser.LoadTerrn2(stream);
138 if (!terrn2)
139 {
140 return false; // Errors already logged to console
141 }
142 }
143 catch (Ogre::Exception& e)
144 {
145 App::GetGuiManager()->ShowMessageBox(_L("Terrain loading error"), e.getFullDescription().c_str());
146 return false;
147 }
148 terrn_entry->terrn2_def = terrn2;
149
150 for (std::string const& assetpack_filename: terrn2->assetpack_files)
151 {
152 App::GetCacheSystem()->LoadAssetPack(terrn_entry, assetpack_filename);
153 }
154
155 // CAUTION - the global instance must be set during init! Needed by:
156 // * GameScript::spawnObject()
157 // * ProceduralManager
158 // * Landusemap
159 // * SurveyMapTextureCreator
160 // * Collisions (debug visualization)
161 m_terrain = new RoR::Terrain(terrn_entry, terrn2);
162 if (!m_terrain->initialize())
163 {
164 m_terrain = nullptr; // release local reference - object will be deleted when all references are released.
165 return false; // Message box already displayed
166 }
167
168 // Initialize envmap textures by rendering center of map
169 Ogre::Vector3 center = m_terrain->getMaxTerrainSize() / 2;
170 center.y = m_terrain->getHeightAt(center.x, center.z) + 1.0f;
171 App::GetGfxScene()->GetEnvMap().UpdateEnvMap(center, /*gfx_actor:*/nullptr, /*full:*/true);
172
173 // Scan groundmodels
175
176 return true;
177}
178
180{
181 if (m_terrain != nullptr)
182 {
183 // dispose(), do not `delete` - script may still hold reference to the object.
185 // release local reference - object will be deleted when all references are released.
186 m_terrain = nullptr;
187 }
188}
189
190// --------------------------------
191// Actors (physics and netcode)
192
194{
196 {
201
202 if (rq.asr_spawnbox == nullptr)
203 {
204 if (m_player_actor != nullptr)
205 {
206 float h = m_player_actor->getMaxHeight(true);
207 rq.asr_rotation = Ogre::Quaternion(Ogre::Degree(270) - Ogre::Radian(m_player_actor->getRotation()), Ogre::Vector3::UNIT_Y);
210 rq.asr_position.y += m_player_actor->getHeightAboveGroundBelow(h, true); // retain height above ground
211 }
212 else
213 {
214 Character* player_character = this->GetPlayerCharacter();
215 rq.asr_rotation = Ogre::Quaternion(Ogre::Degree(180) - player_character->getRotation(), Ogre::Vector3::UNIT_Y);
216 rq.asr_position = player_character->getPosition();
217 }
218 }
219 }
220
221 LOG(" ===== LOADING VEHICLE: " + rq.asr_filename);
222
223 if (rq.asr_cache_entry)
224 {
226 }
227 else
228 {
230 }
231
233 if (def == nullptr)
234 {
235 return nullptr; // Error already reported
236 }
237
238 if (rq.asr_skin_entry)
239 {
240 App::GetCacheSystem()->LoadResource(rq.asr_skin_entry); // Also loads associated .skin file.
241 if (!rq.asr_skin_entry->skin_def) // Make sure .skin was loaded OK.
242 {
243 rq.asr_skin_entry = nullptr; // Error already logged
244 }
245 }
246
247 if (App::sim_tuning_enabled->getBool() && (App::mp_state->getEnum<MpState>() != MpState::CONNECTED))
248 {
249 if (rq.asr_tuneup_entry)
250 {
251 App::GetCacheSystem()->LoadResource(rq.asr_tuneup_entry); // Also loads associated .tuneup file.
253 {
254 rq.asr_tuneup_entry = nullptr; // Error already logged
255 }
256 }
257 }
258 else
259 {
260 rq.asr_working_tuneup = nullptr; // Make sure no tuneup is used
261 }
262
263#ifdef USE_SOCKETW
265 {
266 if (App::mp_state->getEnum<MpState>() == MpState::CONNECTED)
267 {
270 rq.asr_net_color = info.colournum;
271 }
272 }
273#endif //SOCKETW
274
275 ActorPtr fresh_actor = m_actor_manager.CreateNewActor(rq, def);
276 bool fresh_actor_seat_player = false;
277
278 // lock slide nodes after spawning the actor?
279 if (def->slide_nodes_connect_instantly)
280 {
281 fresh_actor->toggleSlideNodeLock(); // OK to invoke here - processing MSG_SIM_ACTOR_SPAWN_REQUESTED
282 }
283
285 {
286 m_last_spawned_actor = fresh_actor;
287 if (fresh_actor->ar_driveable != NOT_DRIVEABLE)
288 {
289 fresh_actor_seat_player = true;
290 }
291 if (rq.asr_spawnbox == nullptr)
292 {
293 // Try to resolve collisions with other actors
294 fresh_actor->resolveCollisions(50.0f, m_player_actor == nullptr);
295 }
296 }
298 {
299 if (fresh_actor->ar_driveable != NOT_DRIVEABLE &&
300 fresh_actor->ar_num_nodes > 0 &&
302 {
303 fresh_actor_seat_player = true;
304 }
305 }
307 {
308 if (rq.asr_terrn_machine)
309 {
310 fresh_actor->ar_driveable = MACHINE;
311 }
312 }
314 {
315 fresh_actor->ar_driveable = AI;
317
318 if (fresh_actor->ar_engine)
319 {
321 fresh_actor->ar_engine->autoShiftSet(Engine::DRIVE);
322 }
323
324 if (App::mp_state->getEnum<MpState>() == MpState::LOCAL_SCRIPT)
325 {
326 fresh_actor->ar_net_source_id = rq.net_source_id;
327 fresh_actor->ar_net_stream_id = rq.net_stream_id;
328
330 {
332 }
334 {
336 }
337 }
338 }
340 {
341 fresh_actor->ar_net_source_id = rq.net_source_id;
342 fresh_actor->ar_net_stream_id = rq.net_stream_id;
343
345 {
347 }
349 {
351 }
352 }
354 {
355 if (rq.asr_saved_state)
356 {
358 req->amr_actor = fresh_actor->ar_instance_id;
362 }
363 }
364 else
365 {
366 if (fresh_actor->ar_driveable != NOT_DRIVEABLE &&
368 rq.asr_enter)
369 {
370 fresh_actor_seat_player = true;
371 }
372 }
373
374 if (fresh_actor_seat_player)
375 {
377 // Loading all addonparts to resolve conflicts is slow and would cause huge UI lag if not forced now. Do it right after player was seated in the actor.
379 }
380
381 return fresh_actor;
382}
383
385{
387
388 if (!actor)
389 {
390 return;
391 }
392
394 {
395 actor->SoftReset();
396 }
398 {
399 actor->SyncReset(/*reset_position:*/false);
400 }
402 {
403 actor->SyncReset(/*reset_position:*/true);
404 }
406 {
408 }
411 {
413 actor->ar_sleep_counter = 0.0f;
414 }
416 {
417 if (actor->getUsedActorEntry()->deleted)
418 {
420 fmt::format(_LC("GameContext", "Cannot reload '{}' ({}) - the associated modcache entry was deleted."),
421 actor->getUsedActorEntry()->dname, actor->getUsedActorEntry()->fname));
422 return;
423 }
424
425 // Create spawn request while actor still exists
427 srq->asr_position = Ogre::Vector3(actor->getPosition().x, actor->getMinHeight(), actor->getPosition().z);
428 srq->asr_rotation = Ogre::Quaternion(Ogre::Degree(270) - Ogre::Radian(actor->getRotation()), Ogre::Vector3::UNIT_Y);
429 srq->asr_config = actor->getSectionConfig();
430 srq->asr_skin_entry = actor->getUsedSkinEntry();
432 srq->asr_cache_entry= actor->getUsedActorEntry();
433 srq->asr_debugview = (int)actor->GetGfxActor()->GetDebugView();
435
436 // This deletes all actors using the resource bundle, including the one we're reloading.
438
439 // Load our actor again, but only after all actors are deleted.
441 }
443 {
445 }
447 {
450 }
451}
452
454{
455 if (actor == m_player_actor)
456 {
457 Ogre::Vector3 center = m_player_actor->getRotationCenter();
458 this->ChangePlayerActor(nullptr); // Get out of the vehicle
459 this->GetPlayerCharacter()->setPosition(center);
460 // Update scene SimBuffer immediatelly to prevent having dangling pointer.
462 }
463
464 if (actor == m_prev_player_actor)
465 {
466 m_prev_player_actor = nullptr;
467 }
468
469 if (actor == m_last_spawned_actor)
470 {
471 m_last_spawned_actor = nullptr;
472 }
473
474 // Find linked actors and un-tie if tied
475 for (auto actorx : m_actor_manager.GetLocalActors())
476 {
477 if (actorx->isTied() && std::find(actor->ar_linked_actors.begin(), actor->ar_linked_actors.end(), actorx) != actor->ar_linked_actors.end())
478 {
479 actorx->tieToggle(); // OK to invoke here - processing MSG_SIM_DELETE_ACTOR_REQUESTED
480 }
481
482 if (actorx->isLocked() && std::find(actor->ar_linked_actors.begin(), actor->ar_linked_actors.end(), actorx) != actor->ar_linked_actors.end())
483 {
484 actorx->hookToggle(); // OK to invoke here - processing MSG_SIM_DELETE_ACTOR_REQUESTED
485 }
486 }
487
489
490#ifdef USE_SOCKETW
491 if (App::mp_state->getEnum<MpState>() == MpState::CONNECTED)
492 {
494 }
495#endif //SOCKETW
496
498
500}
501
503{
504 ActorPtr prev_player_actor = m_player_actor;
505 m_player_actor = actor;
506
507 // hide any old dashes
508 if (prev_player_actor && prev_player_actor->ar_dashboard)
509 {
510 prev_player_actor->ar_dashboard->setVisible3d(false);
511 }
512 // show new
514 {
516 }
517
518 if (prev_player_actor)
519 {
520 App::GetOverlayWrapper()->showDashboardOverlays(false, prev_player_actor);
521
522 SOUND_STOP(prev_player_actor, SS_TRIG_AIR);
523 SOUND_STOP(prev_player_actor, SS_TRIG_PUMP);
524 }
525
526 if (m_player_actor == nullptr)
527 {
528 // getting outside
529
530 if (prev_player_actor)
531 {
533 {
535 }
536
537 prev_player_actor->prepareInside(false);
538
539 // get player out of the vehicle
540 float h = prev_player_actor->getMinCameraRadius();
541 float rotation = prev_player_actor->getRotation() - Ogre::Math::HALF_PI;
542 Ogre::Vector3 position = prev_player_actor->getPosition();
543 if (prev_player_actor->ar_cinecam_node[0] != NODENUM_INVALID)
544 {
545 // actor has a cinecam (find optimal exit position)
546 Ogre::Vector3 l = position - 2.0f * prev_player_actor->GetCameraRoll();
547 Ogre::Vector3 r = position + 2.0f * prev_player_actor->GetCameraRoll();
548 float l_h = m_terrain->GetCollisions()->getSurfaceHeightBelow(l.x, l.z, l.y + h);
549 float r_h = m_terrain->GetCollisions()->getSurfaceHeightBelow(r.x, r.z, r.y + h);
550 position = std::abs(r.y - r_h) * 1.2f < std::abs(l.y - l_h) ? r : l;
551 }
552 position.y = m_terrain->GetCollisions()->getSurfaceHeightBelow(position.x, position.z, position.y + h);
553
554 Character* player_character = this->GetPlayerCharacter();
555 if (player_character)
556 {
557 player_character->SetActorCoupling(false, nullptr);
558 player_character->setRotation(Ogre::Radian(rotation));
559 player_character->setPosition(position);
560 }
561 }
562
564
565 TRIGGER_EVENT_ASYNC(SE_TRUCK_EXIT, prev_player_actor?prev_player_actor->ar_instance_id:-1);
566 }
567 else
568 {
569 // getting inside
571 !App::GetGuiManager()->IsGuiHidden(), m_player_actor);
572
574 {
576 }
577
578 // force feedback
580
581 // attach player to vehicle
582 Character* player_character = this->GetPlayerCharacter();
583 if (player_character)
584 {
585 player_character->SetActorCoupling(true, m_player_actor);
586 }
587
589
591 }
592
593 if (prev_player_actor != nullptr || m_player_actor != nullptr)
594 {
596 }
597
599}
600
605
610
615
616ActorPtr GameContext::FindActorByCollisionBox(std::string const & ev_src_instance_name, std::string const & box_name)
617{
619 ev_src_instance_name, box_name);
620}
621
634
635void GameContext::SpawnPreselectedActor(std::string const& preset_vehicle, std::string const& preset_veh_config)
636{
638 LT_AllBeam, /*partial=*/true, preset_vehicle);
639
640 if (!entry)
641 return;
642
644 rq->asr_cache_entry = entry;
646 rq->asr_rotation = Ogre::Quaternion(Ogre::Degree(180) - this->GetPlayerCharacter()->getRotation(), Ogre::Vector3::UNIT_Y);
648
649 RoR::LogFormat("[RoR|Diag] Preselected Truck: %s (%s)", entry->dname.c_str(), entry->fname.c_str());
650
651 // Section config lookup
652 if (!entry->sectionconfigs.empty())
653 {
654 if (std::find(entry->sectionconfigs.begin(), entry->sectionconfigs.end(),
655 preset_veh_config)
656 == entry->sectionconfigs.end())
657 {
658 // Preselected config doesn't exist -> use first available one
659 rq->asr_config = entry->sectionconfigs[0];
660 }
661 else
662 {
663 rq->asr_config = preset_veh_config;
664 }
665 RoR::LogFormat("[RoR|Diag] Preselected Truck Config: %s", rq->asr_config.c_str());
666 }
667
669}
670
671void GameContext::ShowLoaderGUI(int type, const Ogre::String& instance, const Ogre::String& box)
672{
673 // first, test if the place if clear, BUT NOT IN MULTIPLAYER
674 if (!(App::mp_state->getEnum<MpState>() == MpState::CONNECTED))
675 {
676 collision_box_t* spawnbox = m_terrain->GetCollisions()->getBox(instance, box);
677 for (ActorPtr& actor : this->GetActorManager()->GetActors())
678 {
679 for (int i = 0; i < actor->ar_num_nodes; i++)
680 {
681 if (m_terrain->GetCollisions()->isInside(actor->ar_nodes[i].AbsPosition, spawnbox))
682 {
683 App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("Please clear the place first"), "error.png");
684 return;
685 }
686 }
687 }
688 }
689
693
695 m.payload = reinterpret_cast<void*>(new LoaderType(LoaderType(type)));
697}
698
700{
702
703 if (App::GetGuiManager()->TopMenubar.ai_select)
704 {
707 }
708 if (App::GetGuiManager()->TopMenubar.ai_select2)
709 {
712 }
713}
714
715void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntryPtr entry, std::string sectionconfig)
716{
717 bool spawn_now = false;
718 switch (type)
719 {
720 case LT_AddonPart:
721 if (m_player_actor)
722 {
725 req->mpr_subject = entry->fname;
728 }
729 break;
730
731 case LT_Skin:
732 if (entry != m_dummy_cache_selection)
733 {
735 if (App::GetGuiManager()->TopMenubar.ai_select)
736 {
738 }
739 if (App::GetGuiManager()->TopMenubar.ai_select2)
740 {
742 }
743 }
744 spawn_now = true;
745 break;
746
747 case LT_Vehicle:
748 case LT_Truck:
749 case LT_Car:
750 case LT_Boat:
751 case LT_Airplane:
752 case LT_Trailer:
753 case LT_Train:
754 case LT_Load:
755 case LT_Extension:
756 case LT_AllBeam:
758 m_current_selection.asr_config = sectionconfig;
759 if (App::GetGuiManager()->TopMenubar.ai_select)
760 {
762 }
763 if (App::GetGuiManager()->TopMenubar.ai_select2)
764 {
766 }
768 // Look for extra skins
769 if (!entry->guid.empty())
770 {
771 CacheQuery skin_query;
772 skin_query.cqy_filter_guid = entry->guid;
773 skin_query.cqy_filter_type = LT_Skin;
774 size_t num_skins = App::GetCacheSystem()->Query(skin_query);
775 // Determine default skin
776 CacheEntryPtr default_skin_entry = nullptr;
777 if (entry->default_skin != "")
778 {
779 for (CacheQueryResult& res : skin_query.cqy_results)
780 {
781 if (res.cqr_entry->dname == entry->default_skin)
782 default_skin_entry = res.cqr_entry;
783 }
784 if (!default_skin_entry)
785 {
787 fmt::format(_L("Default skin '{}' for actor '{}' not found!"), entry->default_skin, entry->dname));
788 }
789 if (default_skin_entry && num_skins == 1)
790 {
791 m_current_selection.asr_skin_entry = default_skin_entry;
792 }
793 }
794 else
795 {
796 default_skin_entry = m_dummy_cache_selection;
797 default_skin_entry->dname = "Default skin";
798 default_skin_entry->description = "Original, unmodified skin";
799 }
800
801 if (!m_current_selection.asr_skin_entry && num_skins > 0)
802 {
803 App::GetGuiManager()->MainSelector.Show(LT_Skin, entry->guid, default_skin_entry); // Intentionally not using MSG_
804 }
805 else
806 {
807 spawn_now = true;
808 }
809 }
810 else
811 {
812 spawn_now = true;
813 }
814 break;
815
816 default:;
817 }
818
819 if (spawn_now)
820 {
821 if (App::GetGuiManager()->TopMenubar.ai_select)
822 {
827 }
828 else if (App::GetGuiManager()->TopMenubar.ai_select2)
829 {
834 }
835 else
836 {
840 }
841
843 }
844}
845
847
848// --------------------------------
849// Characters
850
852{
854
855 // Adjust character position and rotation
856 Ogre::Vector3 spawn_pos = m_terrain->getSpawnPos();
857 Ogre::Degree spawn_rot(0.f);
858
859 if (m_terrain->GetDef()->start_rotation_specified)
860 {
861 spawn_rot = m_terrain->GetDef()->start_rotation;
862 }
863 else if (!m_terrain->HasPredefinedActors())
864 {
865 // Classic behavior, retained for compatibility.
866 // Required for maps like N-Labs or F1 Track.
867 spawn_rot = 180.0f;
868 }
869
870 // Preset position - commandline has precedence
871 if (App::cli_preset_spawn_pos->getStr() != "")
872 {
873 spawn_pos = Ogre::StringConverter::parseVector3(App::cli_preset_spawn_pos->getStr(), spawn_pos);
875 }
876 else if (App::diag_preset_spawn_pos->getStr() != "")
877 {
878 spawn_pos = Ogre::StringConverter::parseVector3(App::diag_preset_spawn_pos->getStr(), spawn_pos);
880 }
881
882 // Preset rotation - commandline has precedence
883 if (App::cli_preset_spawn_rot->getStr() != "")
884 {
885 spawn_rot = Ogre::StringConverter::parseReal(App::cli_preset_spawn_rot->getStr(), spawn_rot.valueDegrees());
887 }
888 else if (App::diag_preset_spawn_rot->getStr() != "")
889 {
890 spawn_rot = Ogre::StringConverter::parseReal(App::diag_preset_spawn_rot->getStr(), spawn_rot.valueDegrees());
892 }
893
894 spawn_pos.y = m_terrain->GetCollisions()->getSurfaceHeightBelow(spawn_pos.x, spawn_pos.z, spawn_pos.y + 1.8f);
895
896 this->GetPlayerCharacter()->setPosition(spawn_pos);
897 this->GetPlayerCharacter()->setRotation(spawn_rot);
898
899 App::GetCameraManager()->GetCameraNode()->setPosition(this->GetPlayerCharacter()->getPosition());
900
901 // Small hack to improve the spawn experience
902 for (int i = 0; i < 100; i++)
903 {
905 }
906}
907
908Character* GameContext::GetPlayerCharacter() // Convenience ~ counterpart of `GetPlayerActor()`
909{
911}
912
913// --------------------------------
914// Gameplay feats
915
917{
919 if (!this->GetPlayerActor())
920 {
921 this->GetPlayerCharacter()->setPosition(Ogre::Vector3(x, y, z));
922 return;
923 }
924
925 TRIGGER_EVENT_ASYNC(SE_TRUCK_TELEPORT, this->GetPlayerActor()->ar_instance_id);
926
927 Ogre::Vector3 translation = Ogre::Vector3(x, y, z) - this->GetPlayerActor()->ar_nodes[0].AbsPosition;
928
929 std::vector<ActorPtr> actorsToBeamUp;
930 actorsToBeamUp.assign(this->GetPlayerActor()->ar_linked_actors.begin(), this->GetPlayerActor()->ar_linked_actors.end());
931 actorsToBeamUp.push_back(this->GetPlayerActor());
932
933 float src_agl = std::numeric_limits<float>::max();
934 float dst_agl = std::numeric_limits<float>::max();
935 for (ActorPtr& actor : actorsToBeamUp)
936 {
937 for (int i = 0; i < actor->ar_num_nodes; i++)
938 {
939 Ogre::Vector3 pos = actor->ar_nodes[i].AbsPosition;
940 src_agl = std::min(pos.y - m_terrain->GetCollisions()->getSurfaceHeight(pos.x, pos.z), src_agl);
941 pos += translation;
942 dst_agl = std::min(pos.y - m_terrain->GetCollisions()->getSurfaceHeight(pos.x, pos.z), dst_agl);
943 }
944 }
945
946 translation += Ogre::Vector3::UNIT_Y * (std::max(0.0f, src_agl) - dst_agl);
947
948 for (ActorPtr& actor : actorsToBeamUp)
949 {
950 actor->resetPosition(actor->ar_nodes[0].AbsPosition + translation, false);
951 }
952}
953
955{
956 // Generic escape key event
957 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_QUIT_GAME))
958 {
959 if (App::app_state->getEnum<AppState>() == AppState::MAIN_MENU)
960 {
961 if (App::GetGuiManager()->GameAbout.IsVisible())
962 {
964 }
965 else if (App::GetGuiManager()->MainSelector.IsVisible())
966 {
968 }
969 else if (App::GetGuiManager()->GameSettings.IsVisible())
970 {
972 }
973 else if (App::GetGuiManager()->GameControls.IsVisible())
974 {
976 }
977 else if (App::GetGuiManager()->MultiplayerSelector.IsVisible())
978 {
980 }
981 else if (App::GetGuiManager()->RepositorySelector.IsVisible())
982 {
984 }
985 else
986 {
988 }
989 }
990 else if (App::app_state->getEnum<AppState>() == AppState::SIMULATION)
991 {
992 if (App::GetGuiManager()->MainSelector.IsVisible())
993 {
995 }
996 else if (App::GetGuiManager()->GameControls.IsVisible())
997 {
999 }
1000 else if (App::sim_state->getEnum<SimState>() == SimState::RUNNING)
1001 {
1003 if (App::mp_state->getEnum<MpState>() != MpState::CONNECTED)
1004 {
1006 }
1007 }
1008 else if (App::sim_state->getEnum<SimState>() == SimState::PAUSED)
1009 {
1012 }
1013 }
1014 }
1015
1016 // screenshot
1017 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_SCREENSHOT, 0.25f))
1018 {
1020 }
1021
1022 // fullscreen toggle
1023 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_FULLSCREEN_TOGGLE, 2.0f))
1024 {
1025 if (App::GetAppContext()->GetRenderWindow()->isFullScreen())
1027 else
1029 }
1030
1031 // render mode
1032 switch (App::gfx_polygon_mode->getEnum<Ogre::PolygonMode>())
1033 {
1034 case 1: App::GetCameraManager()->GetCamera()->setPolygonMode(Ogre::PM_SOLID); break;
1035 case 2: App::GetCameraManager()->GetCamera()->setPolygonMode(Ogre::PM_WIREFRAME); break;
1036 case 3: App::GetCameraManager()->GetCamera()->setPolygonMode(Ogre::PM_POINTS); break;
1037 }
1038
1039 // Write player position to log
1040 if (App::app_state->getEnum<AppState>() == AppState::SIMULATION &&
1041 App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_OUTPUT_POSITION))
1042 {
1043 Ogre::Vector3 position(Ogre::Vector3::ZERO);
1044 Ogre::Radian rotation(0);
1045 if (this->GetPlayerActor() == nullptr)
1046 {
1047 position = this->GetPlayerCharacter()->getPosition();
1048 rotation = this->GetPlayerCharacter()->getRotation() + Ogre::Radian(Ogre::Math::PI);
1049 }
1050 else
1051 {
1052 position = this->GetPlayerActor()->getPosition();
1053 rotation = this->GetPlayerActor()->getRotation();
1054 }
1055 Ogre::String pos = Ogre::StringUtil::format("%8.3f, %8.3f, %8.3f" , position.x, position.y, position.z);
1056 Ogre::String rot = Ogre::StringUtil::format("% 6.1f, % 6.1f, % 6.1f", 0.0f, rotation.valueDegrees() , 0.0f);
1057 LOG("Position: " + pos + ", " + rot);
1058 }
1059
1060 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_TOGGLE_RESET_MODE))
1061 {
1065 (App::sim_soft_reset_mode->getBool()) ? _L("Enabled soft reset mode") : _L("Enabled hard reset mode"));
1066 }
1067}
1068
1070{
1071 // get new vehicle
1072 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_GET_NEW_VEHICLE))
1073 {
1075 m.payload = reinterpret_cast<void*>(new LoaderType(LT_AllBeam));
1077 }
1078
1079 // Enter/exit truck - With a toggle delay
1080 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_ENTER_OR_EXIT_TRUCK, 0.5f))
1081 {
1082 if (this->GetPlayerActor() == nullptr) // no vehicle
1083 {
1084 // find the nearest vehicle
1085 float mindist = 1000.0;
1086 ActorPtr nearest_actor = nullptr;
1087 for (ActorPtr& actor : this->GetActorManager()->GetActors())
1088 {
1089 if (!actor->ar_driveable)
1090 continue;
1091 if (actor->ar_cinecam_node[0] == NODENUM_INVALID)
1092 {
1093 LOG("cinecam missing, cannot enter the actor!");
1094 continue;
1095 }
1096 float len = 0.0f;
1097 if (this->GetPlayerCharacter())
1098 {
1099 len = actor->ar_nodes[actor->ar_cinecam_node[0]].AbsPosition.distance(this->GetPlayerCharacter()->getPosition() + Ogre::Vector3(0.0, 2.0, 0.0));
1100 }
1101 if (len < mindist)
1102 {
1103 mindist = len;
1104 nearest_actor = actor;
1105 }
1106 }
1107
1108 if (mindist < 20.0)
1109 {
1110 this->PushMessage(Message(MSG_SIM_SEAT_PLAYER_REQUESTED, static_cast<void*>(new ActorPtr(nearest_actor))));
1111 }
1112 }
1113 else // We're in a vehicle -> If moving slowly enough, get out
1114 {
1115 if (this->GetPlayerActor()->ar_nodes[0].Velocity.squaredLength() < 1.0f ||
1116 this->GetPlayerActor()->ar_state == ActorState::NETWORKED_OK || this->GetPlayerActor()->ar_state == ActorState::NETWORKED_HIDDEN ||
1117 this->GetPlayerActor()->ar_driveable == AI)
1118 {
1119 this->PushMessage(Message(MSG_SIM_SEAT_PLAYER_REQUESTED, static_cast<void*>(new ActorPtr())));
1120 }
1121 }
1122 }
1123
1124 // enter next truck
1125 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_ENTER_NEXT_TRUCK, 0.25f))
1126 {
1127 ActorPtr actor = this->FetchNextVehicleOnList();
1128 if (actor != this->GetPlayerActor())
1129 {
1130 this->PushMessage(Message(MSG_SIM_SEAT_PLAYER_REQUESTED, static_cast<void*>(new ActorPtr(actor))));
1131 }
1132 }
1133
1134 // enter previous truck
1135 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_ENTER_PREVIOUS_TRUCK, 0.25f))
1136 {
1137 ActorPtr actor = this->FetchPrevVehicleOnList();
1138 if (actor != this->GetPlayerActor())
1139 {
1140 this->PushMessage(Message(MSG_SIM_SEAT_PLAYER_REQUESTED, static_cast<void*>(new ActorPtr(actor))));
1141 }
1142 }
1143
1144 // respawn last truck
1145 if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_RESPAWN_LAST_TRUCK, 0.25f))
1146 {
1147 this->RespawnLastActor();
1148 }
1149
1150 // terrain editor toggle
1152 {
1154 }
1155
1156 // forward commands from character
1157 ActorPtr actor_to_reset_commandkeys;
1158 if (!m_player_actor)
1159 {
1160 // Find nearest actor
1161 const Ogre::Vector3 position = App::GetGameContext()->GetPlayerCharacter()->getPosition();
1162 ActorPtr nearest_actor = nullptr;
1163 float min_squared_distance = std::numeric_limits<float>::max();
1165 {
1166 float squared_distance = position.squaredDistance(actor->ar_nodes[0].AbsPosition);
1167 if (squared_distance < min_squared_distance)
1168 {
1169 min_squared_distance = squared_distance;
1170 nearest_actor = actor;
1171 }
1172 }
1173
1174 // Evaluate
1175 if (nearest_actor != nullptr &&
1176 nearest_actor->ar_import_commands &&
1177 min_squared_distance < (nearest_actor->getMinCameraRadius()*nearest_actor->getMinCameraRadius()))
1178 {
1179 if (nearest_actor != m_actor_remotely_receiving_commands)
1180 {
1181 actor_to_reset_commandkeys = m_actor_remotely_receiving_commands;
1182 }
1184
1185 // get commands
1186 for (int i = 1; i <= MAX_COMMANDS; i++) // BEWARE: commandkeys are indexed 1-MAX_COMMANDS!
1187 {
1188 int eventID = EV_COMMANDS_01 + (i - 1);
1189
1190 const float eventVal = RoR::App::GetInputEngine()->getEventValue(eventID);
1191 if (eventVal != nearest_actor->ar_command_key[i].playerInputValue
1192 && nearest_actor->ar_state == ActorState::LOCAL_SLEEPING)
1193 {
1194 // Wake up
1195 nearest_actor->ar_state = ActorState::LOCAL_SIMULATED;
1196 nearest_actor->ar_sleep_counter = 0.0f;
1197 }
1198
1199 nearest_actor->ar_command_key[i].playerInputValue = eventVal;
1200 }
1201 }
1202 else
1203 {
1205 {
1206 // Just left the vicinity of the actor, but still on foot
1207 actor_to_reset_commandkeys = m_actor_remotely_receiving_commands;
1209 }
1210 }
1211 }
1213 {
1214 // Just left the vicinity of the actor by entering vehicle
1215 actor_to_reset_commandkeys = m_actor_remotely_receiving_commands;
1217 }
1218
1219 if (actor_to_reset_commandkeys)
1220 {
1221 for (int i = 1; i <= MAX_COMMANDS; i++) // BEWARE: commandkeys are indexed 1-MAX_COMMANDS!
1222 {
1223 actor_to_reset_commandkeys->ar_command_key[i].playerInputValue = 0.f;
1224 }
1225 actor_to_reset_commandkeys = nullptr;
1226 }
1227
1228 // AI waypoint recording
1229 if (App::GetGuiManager()->TopMenubar.ai_rec)
1230 {
1231 if (m_timer.getMilliseconds() > 1000) // Don't spam it, record every 1 sec
1232 {
1233 if (App::GetGameContext()->GetPlayerActor()) // We are in vehicle
1234 {
1235 if (App::GetGameContext()->GetPlayerActor()->getPosition().distance(prev_pos) >= 5) // Skip very close positions
1236 {
1237 ai_events waypoint;
1239 waypoint.speed = App::GetGameContext()->GetPlayerActor()->getWheelSpeed() * 3.6;
1240 if (waypoint.speed < 5)
1241 {
1242 waypoint.speed = -1;
1243 }
1244 App::GetGuiManager()->TopMenubar.ai_waypoints.push_back(waypoint);
1245 }
1247 }
1248 else // We are in feet
1249 {
1250 if (App::GetGameContext()->GetPlayerCharacter()->getPosition() != prev_pos) // Skip same positions
1251 {
1252 ai_events waypoint;
1254 App::GetGuiManager()->TopMenubar.ai_waypoints.push_back(waypoint);
1255 }
1257 }
1258 m_timer.reset();
1259 }
1260 }
1261 else
1262 {
1263 prev_pos = Ogre::Vector3::ZERO;
1264 }
1265}
1266
1268{
1269#ifdef USE_CAELUM
1270 if (App::gfx_sky_mode->getEnum<GfxSkyMode>() == GfxSkyMode::CAELUM &&
1272 {
1273 float time_factor = 1.0f;
1274
1275 if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_INCREASE_TIME))
1276 {
1277 time_factor = 1000.0f;
1278 }
1279 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_INCREASE_TIME_FAST))
1280 {
1281 time_factor = 10000.0f;
1282 }
1283 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_DECREASE_TIME))
1284 {
1285 time_factor = -1000.0f;
1286 }
1287 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_DECREASE_TIME_FAST))
1288 {
1289 time_factor = -10000.0f;
1290 }
1291 else if (App::gfx_sky_time_cycle->getBool())
1292 {
1293 time_factor = App::gfx_sky_time_speed->getInt();
1294 }
1295
1296 if (m_terrain->getSkyManager()->GetSkyTimeFactor() != time_factor)
1297 {
1298 m_terrain->getSkyManager()->SetSkyTimeFactor(time_factor);
1299 Str<200> msg; msg << _L("Time set to ") << m_terrain->getSkyManager()->GetPrettyTime();
1301 }
1302 }
1303
1304#endif // USE_CAELUM
1305 if (App::gfx_sky_mode->getEnum<GfxSkyMode>() == GfxSkyMode::SKYX &&
1307 {
1308 if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_INCREASE_TIME))
1309 {
1311 }
1312 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_INCREASE_TIME_FAST))
1313 {
1315 }
1316 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_DECREASE_TIME))
1317 {
1319 }
1320 else if (RoR::App::GetInputEngine()->getEventBoolValue(EV_SKY_DECREASE_TIME_FAST))
1321 {
1323 }
1324 else
1325 {
1327 }
1328 }
1329}
1330
1332{
1333 ROR_ASSERT(actor);
1334
1335 // reload current truck
1337 {
1340 rq->amr_actor = actor->ar_instance_id;
1342 }
1343
1344 // remove current truck
1346 {
1348 }
1349
1350 // Front lights
1352 {
1354 // sync sidelights to lowbeams
1356 }
1358 {
1359 // Smart cycling:
1360 // 1) all lights off
1361 // 2) sidelights on but only if any installed, otherwise skip to 3).
1362 // 3) sidelights and lowbeams on.
1363 // 4) sidelights, lowbeams and highbeams on, but only if highbeams are installed, otherwise cycle to 1).
1364 if (actor->countFlaresByType(FlareType::SIDELIGHT) > 0 && !actor->getSideLightsVisible())
1365 {
1366 actor->setSideLightsVisible(true);
1367 }
1368 else if (!actor->getHeadlightsVisible())
1369 {
1370 actor->setSideLightsVisible(true);
1371 actor->setHeadlightsVisible(true);
1372 }
1373 else if (actor->countFlaresByType(FlareType::HIGH_BEAM) > 0 && !actor->getHighBeamsVisible())
1374 {
1375 actor->setSideLightsVisible(true);
1376 actor->setHeadlightsVisible(true);
1377 actor->setHighBeamsVisible(true);
1378 }
1379 else
1380 {
1381 actor->setSideLightsVisible(false);
1382 actor->setHeadlightsVisible(false);
1383 actor->setHighBeamsVisible(false);
1384 }
1385 }
1387 {
1388 actor->setHighBeamsVisible(!actor->getHighBeamsVisible());
1389 }
1391 {
1392 actor->setFogLightsVisible(!actor->getFogLightsVisible());
1393 }
1394
1395 // Beacons
1397 {
1398 actor->beaconsToggle();
1399 }
1400
1401 // blinkers
1404
1407
1410
1411 // custom lights
1412 for (int i = 0; i < MAX_CLIGHTS; i++)
1413 {
1415 actor->setCustomLightVisible(i, !actor->getCustomLightVisible(i));
1416 }
1417
1419 {
1421 }
1422
1424 {
1425 actor->ar_toggle_ropes = true;
1426 }
1427
1429 {
1430 //actor->hookToggle(-1, HOOK_TOGGLE, -1);
1433 hook_rq->alr_actor_instance_id = actor->ar_instance_id;
1435
1436 //actor->toggleSlideNodeLock();
1437 ActorLinkingRequest* slidenode_rq = new ActorLinkingRequest();
1439 slidenode_rq->alr_actor_instance_id = actor->ar_instance_id;
1441 }
1442
1444 {
1445 actor->hookToggle(-2, ActorLinkingRequestType::HOOK_UNLOCK, -1); //unlock all autolocks
1446 }
1447
1448 //strap
1450 {
1451 actor->ar_toggle_ties = true;
1452 }
1453
1455 {
1456 actor->toggleCustomParticles();
1457 }
1458
1460 {
1461 actor->GetGfxActor()->ToggleDebugView();
1462 for (ActorPtr& actor : actor->ar_linked_actors)
1463 {
1464 actor->GetGfxActor()->SetDebugView(actor->GetGfxActor()->GetDebugView());
1465 }
1466 }
1467
1469 {
1470 actor->GetGfxActor()->CycleDebugViews();
1471 for (ActorPtr& actor : actor->ar_linked_actors)
1472 {
1473 actor->GetGfxActor()->SetDebugView(actor->GetGfxActor()->GetDebugView());
1474 }
1475 }
1476
1479 actor->ar_driveable != AIRPLANE)
1480 {
1481 ActorPtr rescuer = nullptr;
1483 {
1484 if (actor->ar_rescuer_flag)
1485 {
1486 rescuer = actor;
1487 }
1488 }
1489 if (rescuer == nullptr)
1490 {
1492 }
1493 else
1494 {
1495 App::GetGameContext()->PushMessage(Message(MSG_SIM_SEAT_PLAYER_REQUESTED, static_cast<void*>(new ActorPtr(rescuer))));
1496 }
1497 }
1498
1499 // parking brake
1501 {
1502 if (actor->ar_driveable == TRUCK)
1504 else if (actor->ar_driveable == NOT_DRIVEABLE)
1505 actor->parkingbrakeToggle();
1506 }
1507
1508 // videocam
1510 {
1512 {
1514 }
1515 else
1516 {
1518 }
1519 }
1520
1521 // enter/exit truck - Without a delay: the vehicle must brake like braking normally
1523 {
1524 if (actor->ar_driveable != AI)
1525 {
1526 actor->ar_brake = 0.66f;
1527 }
1528 }
1529
1530 // toggle physics
1532 {
1533 for (ActorPtr& linked_actor : actor->ar_linked_actors)
1534 {
1535 linked_actor->ar_physics_paused = !linked_actor->ar_physics_paused;
1536 }
1537 actor->ar_physics_paused = !actor->ar_physics_paused;
1538 }
1539
1540 // reset truck
1542 {
1547 }
1548
1549 // Commandkeys: process controller input for all commands
1550 for (int i = 1; i <= MAX_COMMANDS; i++) // BEWARE: commandkeys are indexed 1-MAX_COMMANDS!
1551 {
1552 int eventID = EV_COMMANDS_01 + (i - 1);
1553
1554 actor->ar_command_key[i].playerInputValue = actor->getEventValue(eventID);
1555 }
1556
1557 // Commandkeys: Apply command buttons in T-screen
1558 if (actor == m_player_actor &&
1560 {
1562 }
1563
1565 {
1567 if (actor->ar_forward_commands)
1568 {
1569 RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("forwardcommands enabled"), "information.png");
1570 }
1571 else
1572 {
1573 RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("forwardcommands disabled"), "information.png");
1574 }
1575 }
1576
1578 {
1579 actor->ar_import_commands = !actor->ar_import_commands;
1580 if (actor->ar_import_commands)
1581 {
1582 RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("importcommands enabled"), "information.png");
1583 }
1584 else
1585 {
1586 RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, _L("importcommands disabled"), "information.png");
1587 }
1588 }
1589
1590 if (actor == m_player_actor &&
1592 {
1594 }
1595}
1596
1597// Internal heper for UpdateAirplaneInputEvents()
1598void smoothValue(float& ref, float value, float rate)
1599{
1600 if (value < -1)
1601 value = -1;
1602 if (value > 1)
1603 value = 1;
1604 // smooth!
1605 if (ref > value)
1606 {
1607 ref -= rate;
1608 if (ref < value)
1609 ref = value;
1610 }
1611 else if (ref < value)
1612 ref += rate;
1613}
1614
1616{
1617 if (airplane->isBeingReset() || airplane->ar_physics_paused)
1618 return;
1619
1620 // autopilot
1621 if (airplane->ar_autopilot && airplane->ar_autopilot->wantsdisconnect)
1622 {
1623 airplane->ar_autopilot->disconnect();
1624 }
1625
1626 float commandrate = 4.0;
1627
1628 // steer
1629 float tmp_left = airplane->getEventValue(EV_AIRPLANE_STEER_LEFT);
1630 float tmp_right = airplane->getEventValue(EV_AIRPLANE_STEER_RIGHT);
1631 float sum_steer = -tmp_left + tmp_right;
1633
1634 // pitch
1635 float tmp_pitch_up = airplane->getEventValue(EV_AIRPLANE_ELEVATOR_UP);
1636 float tmp_pitch_down = airplane->getEventValue(EV_AIRPLANE_ELEVATOR_DOWN);
1637 float sum_pitch = tmp_pitch_down - tmp_pitch_up;
1638
1639 // rudder
1640 float tmp_rudder_left = airplane->getEventValue(EV_AIRPLANE_RUDDER_LEFT);
1641 float tmp_rudder_right = airplane->getEventValue(EV_AIRPLANE_RUDDER_RIGHT);
1642 float sum_rudder = tmp_rudder_left - tmp_rudder_right;
1643
1644 // Simulated inputs at actor level shouldn't be smoothed. We'll let
1645 // the code that added simulated values do its own smoothing
1646 // if needed.
1649 {
1650 airplane->ar_aileron = sum_steer;
1651 }
1652 else
1653 {
1654 smoothValue(airplane->ar_aileron, sum_steer, dt * commandrate);
1655 airplane->ar_hydro_dir_command = airplane->ar_aileron;
1656 }
1659 {
1660 airplane->ar_elevator = sum_pitch;
1661 }
1662 else
1663 {
1664 smoothValue(airplane->ar_elevator, sum_pitch, dt * commandrate);
1665 }
1668 {
1669 airplane->ar_rudder = sum_rudder;
1670 }
1671 else
1672 {
1673 smoothValue(airplane->ar_rudder, sum_rudder, dt * commandrate);
1674 }
1675
1676 // brakes
1677 if (!airplane->ar_parking_brake)
1678 {
1679 airplane->ar_brake = airplane->getEventValue(EV_AIRPLANE_BRAKE) * 0.66f;
1680 }
1681
1683 {
1684 airplane->parkingbrakeToggle();
1685 }
1686
1687 // reverse
1689 {
1690 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1691 {
1692 airplane->ar_aeroengines[i]->toggleReverse();
1693 }
1694 }
1695
1696 // engines
1698 {
1699 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1700 {
1701 airplane->ar_aeroengines[i]->flipStart();
1702 }
1703 }
1704
1705 // flaps
1707 {
1708 if (airplane->ar_aerial_flap > 0)
1709 {
1710 airplane->ar_aerial_flap = 0;
1711 }
1712 }
1713
1715 {
1716 if (airplane->ar_aerial_flap < 5)
1717 {
1718 airplane->ar_aerial_flap = 5;
1719 }
1720 }
1721
1723 {
1724 if (airplane->ar_aerial_flap > 0)
1725 {
1726 airplane->ar_aerial_flap = (airplane->ar_aerial_flap) - 1;
1727 }
1728 }
1729
1731 {
1732 if (airplane->ar_aerial_flap < 5)
1733 {
1734 airplane->ar_aerial_flap = (airplane->ar_aerial_flap) + 1;
1735 }
1736 }
1737
1738 // airbrakes
1740 {
1741 if (airplane->ar_airbrake_intensity > 0)
1742 {
1743 airplane->setAirbrakeIntensity(0);
1744 }
1745 }
1746
1748 {
1749 if (airplane->ar_airbrake_intensity < 5)
1750 {
1751 airplane->setAirbrakeIntensity(5);
1752 }
1753 }
1754
1756 {
1757 if (airplane->ar_airbrake_intensity > 0)
1758 {
1759 airplane->setAirbrakeIntensity((airplane->ar_airbrake_intensity) - 1);
1760 }
1761 }
1762
1764 {
1765 if (airplane->ar_airbrake_intensity < 5)
1766 {
1767 airplane->setAirbrakeIntensity((airplane->ar_airbrake_intensity) + 1);
1768 }
1769 }
1770
1771 // throttle
1773 {
1774 float f = airplane->getEventValue(EV_AIRPLANE_THROTTLE_AXIS);
1775 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1776 {
1777 airplane->ar_aeroengines[i]->setThrottle(f);
1778 }
1779 }
1780 else
1781 {
1782 float tmp_throttle = airplane->getEventBoolValue(EV_AIRPLANE_THROTTLE);
1783 if (tmp_throttle > 0)
1784 {
1785 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1786 {
1787 airplane->ar_aeroengines[i]->setThrottle(tmp_throttle);
1788 }
1789 }
1790 }
1791
1793 {
1794 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1795 {
1796 airplane->ar_aeroengines[i]->setThrottle(airplane->ar_aeroengines[i]->getThrottle() - 0.05);
1797 }
1798 }
1799
1801 {
1802 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1803 {
1804 airplane->ar_aeroengines[i]->setThrottle(airplane->ar_aeroengines[i]->getThrottle() + 0.05);
1805 }
1806 }
1807
1809 {
1810 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1811 {
1812 airplane->ar_aeroengines[i]->setThrottle(0);
1813 }
1814 }
1815
1817 {
1818 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1819 {
1820 airplane->ar_aeroengines[i]->setThrottle(1);
1821 }
1822 }
1823
1824 // autopilot
1825 if (airplane->ar_autopilot)
1826 {
1827 for (int i = 0; i < airplane->ar_num_aeroengines; i++)
1828 {
1829 airplane->ar_aeroengines[i]->setThrottle(airplane->ar_autopilot->getThrottle(airplane->ar_aeroengines[i]->getThrottle(), dt));
1830 }
1831 }
1832}
1833
1835{
1836 // throttle
1838 {
1839 float f = boat->getEventValue(EV_BOAT_THROTTLE_AXIS);
1840 // use negative values also!
1841 f = f * 2 - 1;
1842 for (int i = 0; i < boat->ar_num_screwprops; i++)
1843 boat->ar_screwprops[i]->setThrottle(-f);
1844 }
1845
1847 {
1848 for (int i = 0; i < boat->ar_num_screwprops; i++)
1849 boat->ar_screwprops[i]->setThrottle(boat->ar_screwprops[i]->getThrottle() - 0.05);
1850 }
1851
1853 {
1854 for (int i = 0; i < boat->ar_num_screwprops; i++)
1855 boat->ar_screwprops[i]->setThrottle(boat->ar_screwprops[i]->getThrottle() + 0.05);
1856 }
1857
1858 // steer
1859 float tmp_steer_left = boat->getEventValue(EV_BOAT_STEER_LEFT);
1860 float tmp_steer_right = boat->getEventValue(EV_BOAT_STEER_RIGHT);
1862 float sum_steer = (tmp_steer_left - tmp_steer_right) * dt;
1863 // do not center the rudder!
1864 if (fabs(sum_steer) > 0 && stime <= 0)
1865 {
1866 for (int i = 0; i < boat->ar_num_screwprops; i++)
1867 boat->ar_screwprops[i]->setRudder(boat->ar_screwprops[i]->getRudder() + sum_steer);
1868 }
1869
1871 {
1872 tmp_steer_left = boat->getEventValue(EV_BOAT_STEER_LEFT_AXIS);
1873 tmp_steer_right = boat->getEventValue(EV_BOAT_STEER_RIGHT_AXIS);
1874 sum_steer = (tmp_steer_left - tmp_steer_right);
1875 for (int i = 0; i < boat->ar_num_screwprops; i++)
1876 boat->ar_screwprops[i]->setRudder(sum_steer);
1877 }
1878
1879 // rudder
1881 {
1882 for (int i = 0; i < boat->ar_num_screwprops; i++)
1883 boat->ar_screwprops[i]->setRudder(0);
1884 }
1885
1886 // reverse
1888 {
1889 for (int i = 0; i < boat->ar_num_screwprops; i++)
1890 boat->ar_screwprops[i]->toggleReverse();
1891 }
1892}
1893
1895{
1896 if (truck->isBeingReset() || truck->ar_physics_paused)
1897 return;
1898#ifdef USE_ANGELSCRIPT
1899 if (truck->ar_vehicle_ai && truck->ar_vehicle_ai->isActive())
1900 return;
1901#endif // USE_ANGELSCRIPT
1902
1904 truck->ar_left_mirror_angle -= 0.001;
1905
1907 truck->ar_left_mirror_angle += 0.001;
1908
1910 truck->ar_right_mirror_angle -= 0.001;
1911
1913 truck->ar_right_mirror_angle += 0.001;
1914
1915 // steering
1916 float tmp_left_digital = truck->getEventValue(EV_TRUCK_STEER_LEFT , false, InputSourceType::IST_DIGITAL);
1917 float tmp_right_digital = truck->getEventValue(EV_TRUCK_STEER_RIGHT, false, InputSourceType::IST_DIGITAL);
1918 float tmp_left_analog = truck->getEventValue(EV_TRUCK_STEER_LEFT , false, InputSourceType::IST_ANALOG);
1919 float tmp_right_analog = truck->getEventValue(EV_TRUCK_STEER_RIGHT, false, InputSourceType::IST_ANALOG);
1920
1921 float sum = -std::max(tmp_left_digital, tmp_left_analog) + std::max(tmp_right_digital, tmp_right_analog);
1922
1923 truck->ar_hydro_dir_command = Ogre::Math::Clamp(sum, -1.0f, 1.0f);
1924
1925 truck->ar_hydro_speed_coupling_active = (tmp_left_digital >= tmp_left_analog) && (tmp_right_digital >= tmp_right_analog);
1926
1927 if (truck->ar_engine)
1928 {
1929 truck->ar_engine->UpdateInputEvents(dt);
1930 }
1931
1932 if (truck->ar_brake > 1.0f / 6.0f)
1933 {
1934 SOUND_START(truck, SS_TRIG_BRAKE);
1935 }
1936 else
1937 {
1938 SOUND_STOP(truck, SS_TRIG_BRAKE);
1939 }
1940
1942 {
1943 truck->toggleAxleDiffMode();
1944 truck->displayAxleDiffMode();
1945 }
1946
1948 {
1949 truck->toggleWheelDiffMode();
1950 truck->displayWheelDiffMode();
1951 }
1952
1954 {
1955 truck->toggleTransferCaseMode();
1956 truck->displayTransferCaseMode();
1957 }
1958
1960 {
1962 truck->displayTransferCaseMode();
1963 }
1964
1965 if (truck->ar_is_police)
1966 {
1968 {
1969 SOUND_TOGGLE(truck, SS_TRIG_HORN); // Police siren
1970 }
1971 }
1972 else
1973 {
1976 {
1977 SOUND_START(truck, SS_TRIG_HORN);
1978 }
1979 else
1980 {
1981 SOUND_STOP(truck, SS_TRIG_HORN);
1982 }
1983 }
1984
1987 {
1988 truck->parkingbrakeToggle();
1989 }
1990
1992 {
1993 truck->antilockbrakeToggle();
1994 }
1995
1997 {
1998 truck->tractioncontrolToggle();
1999 }
2000
2002 {
2003 truck->cruisecontrolToggle();
2004 }
2005
2006 if (truck->getTyrePressure().IsEnabled())
2007 {
2009 }
2010}
2011
System integration layer; inspired by OgreBites::ApplicationContext.
#define ROR_ASSERT(_EXPR)
Definition Application.h:40
void LOG(const char *msg)
Legacy alias - formerly a macro.
#define BITMASK_IS_1(VAR, FLAGS)
Definition BitFlags.h:14
A database of user-installed content alias 'mods' (vehicles, terrains...)
#define _L
void smoothValue(float &ref, float value, float rate)
Game state manager and message-queue provider.
Handles controller inputs from player.
#define _LC(ctx, str)
Definition Language.h:38
static const int MAX_CLIGHTS
See RoRnet::Lightmask and enum events in InputEngine.h.
static const int MAX_COMMANDS
maximum number of commands per actor
#define SOUND_TOGGLE(_ACTOR_, _TRIG_)
#define SOUND_START(_ACTOR_, _TRIG_)
#define SOUND_STOP(_ACTOR_, _TRIG_)
The vehicle tuning system; applies addonparts and user overrides to vehicles.
Simple waypoint AI.
bool ar_parking_brake
Definition Actor.h:509
int ar_num_screwprops
Definition Actor.h:426
void setHighBeamsVisible(bool val)
Definition Actor.h:256
bool ar_import_commands
Sim state.
Definition Actor.h:606
bool isEventDefined(int eventID)
Definition Actor.cpp:3119
bool getEventBoolValueBounce(int eventID, float time=0.2f)
Definition Actor.cpp:3034
EnginePtr ar_engine
Definition Actor.h:467
int ar_airbrake_intensity
Physics state; values 0-5.
Definition Actor.h:520
void toggleTransferCaseGearRatio()
Definition Actor.cpp:1522
bool ar_forward_commands
Sim state.
Definition Actor.h:605
void toggleSlideNodeLock()
CacheEntryPtr & getUsedSkinEntry()
Definition Actor.cpp:5030
void antilockbrakeToggle()
Definition Actor.cpp:3967
bool hasEventSimulatedValue(int eventID)
Definition Actor.cpp:3053
CmdKeyArray ar_command_key
BEWARE: commandkeys are indexed 1-MAX_COMMANDS!
Definition Actor.h:404
void hookToggle(int group=-1, ActorLinkingRequestType mode=ActorLinkingRequestType::HOOK_TOGGLE, NodeNum_t mousenode=NODENUM_INVALID, ActorInstanceID_t forceunlock_filter=ACTORINSTANCEID_INVALID)
Definition Actor.cpp:3813
DashBoardManagerPtr ar_dashboard
Gfx state; Dashboard manager (HUD element manager)
Definition Actor.h:563
void prepareInside(bool inside)
Prepares vehicle for in-cabin camera use.
Definition Actor.cpp:3159
void displayTransferCaseMode()
Gets the current transfer case mode name (4WD Hi, ...)
Definition Actor.cpp:1477
bool getEventBoolValue(int eventID)
Definition Actor.cpp:3029
float getWheelSpeed() const
Definition Actor.h:107
float getMaxHeight(bool skip_virtual_nodes=true)
Definition Actor.cpp:1581
node_t * ar_nodes
Definition Actor.h:365
int ar_aerial_flap
Sim state; state of aircraft flaps (values: 0-5)
Definition Actor.h:516
void beaconsToggle()
Definition Actor.cpp:3985
GfxActor * GetGfxActor()
Definition Actor.h:344
float getRotation()
Definition Actor.cpp:355
bool getHighBeamsVisible() const
Definition Actor.h:255
float ar_sleep_counter
Sim state; idle time counter.
Definition Actor.h:507
float getEventBounceTime(int eventID)
Definition Actor.cpp:3124
Replay * getReplay()
Definition Actor.cpp:4815
float getMinHeight(bool skip_virtual_nodes=true)
Definition Actor.cpp:1568
void toggleWheelDiffMode()
Definition Actor.cpp:1407
ScrewpropPtr ar_screwprops[MAX_SCREWPROPS]
Definition Actor.h:425
void tieToggle(int group=-1, ActorLinkingRequestType mode=ActorLinkingRequestType::TIE_TOGGLE, ActorInstanceID_t forceunlock_filter=ACTORINSTANCEID_INVALID)
Definition Actor.cpp:3619
void setAirbrakeIntensity(float intensity)
Definition Actor.cpp:2974
Ogre::Vector3 getRotationCenter()
Definition Actor.cpp:1550
bool ar_is_police
Gfx/sfx attr.
Definition Actor.h:603
bool getSideLightsVisible() const
Definition Actor.h:251
bool ar_physics_paused
Actor physics individually paused by user.
Definition Actor.h:570
float ar_left_mirror_angle
Sim state; rear view mirror angle.
Definition Actor.h:511
void toggleBlinkType(BlinkType blink)
Definition Actor.cpp:3289
Ogre::Vector3 getPosition()
Definition Actor.cpp:370
void toggleTransferCaseMode()
Definition Actor.cpp:1491
bool ar_toggle_ropes
Sim state.
Definition Actor.h:607
float ar_hydro_dir_command
Definition Actor.h:498
float ar_elevator
Sim state; aircraft elevator.
Definition Actor.h:513
void displayAxleDiffMode()
Cycles through the available inter axle diff modes.
Definition Actor.cpp:1423
void displayWheelDiffMode()
Cycles through the available inter wheel diff modes.
Definition Actor.cpp:1451
int ar_net_source_id
Unique ID of remote player who spawned this actor.
Definition Actor.h:521
void setHeadlightsVisible(bool val)
Definition Actor.h:254
int countFlaresByType(FlareType type)
Definition Actor.cpp:4750
float ar_right_mirror_angle
Sim state; rear view mirror angle.
Definition Actor.h:512
void setSideLightsVisible(bool val)
Definition Actor.h:252
ActorState ar_state
Definition Actor.h:567
bool getCustomLightVisible(int number)
Definition Actor.cpp:4691
float getHeightAboveGroundBelow(float height, bool skip_virtual_nodes=true)
Definition Actor.cpp:1608
float getEventValue(int eventID, bool pure=false, InputSourceType valueSource=InputSourceType::IST_ANY)
Definition Actor.cpp:3015
AeroEnginePtr ar_aeroengines[MAX_AEROENGINES]
Definition Actor.h:423
bool isBeingReset() const
Definition Actor.h:348
int ar_num_aeroengines
Definition Actor.h:424
void SoftReset()
Definition Actor.cpp:1633
void toggleAxleDiffMode()
Definition Actor.cpp:1415
bool isEventAnalog(int eventID)
Definition Actor.cpp:3109
ActorInstanceID_t ar_instance_id
Static attr; session-unique ID.
Definition Actor.h:464
void setCustomLightVisible(int number, bool visible)
Definition Actor.cpp:4713
float ar_rudder
Sim state; aircraft rudder (boat rudders are controlled in RoR::Screwprop)
Definition Actor.h:514
ActorPtrVec ar_linked_actors
BEWARE: Includes indirect links, see DetermineLinkedActors(); Other actors linked using 'hooks/ties/r...
Definition Actor.h:568
void SyncReset(bool reset_position)
this one should be called only synchronously (without physics running in background)
Definition Actor.cpp:1657
Ogre::Real ar_brake
Physics state; braking intensity.
Definition Actor.h:494
TyrePressure & getTyrePressure()
Definition Actor.h:294
void parkingbrakeToggle()
Definition Actor.cpp:3952
int ar_num_nodes
Definition Actor.h:380
float getMinCameraRadius()
Definition Actor.h:331
VehicleAIPtr ar_vehicle_ai
Definition Actor.h:485
Ogre::String getSectionConfig()
Definition Actor.h:305
float ar_aileron
Sim state; aircraft aileron.
Definition Actor.h:515
AutopilotPtr ar_autopilot
Definition Actor.h:470
void resolveCollisions(Ogre::Vector3 direction)
Moves the actor at most 'direction.length()' meters towards 'direction' to resolve any collisions.
Definition Actor.cpp:1108
bool ar_rescuer_flag
Gameplay attr; defined in truckfile. TODO: Does anybody use this anymore?
Definition Actor.h:604
bool getFogLightsVisible() const
Definition Actor.h:257
void tractioncontrolToggle()
Definition Actor.cpp:3976
CacheEntryPtr & getUsedActorEntry()
The actor entry itself.
Definition Actor.cpp:5025
Ogre::Vector3 GetCameraRoll()
Definition Actor.h:342
NodeNum_t ar_cinecam_node[MAX_CAMERAS]
Sim attr; Cine-camera node indexes.
Definition Actor.h:468
void toggleCustomParticles()
Definition Actor.cpp:3393
bool ar_hydro_speed_coupling_active
Definition Actor.h:600
void softRespawn(Ogre::Vector3 spawnpos, Ogre::Quaternion spawnrot)
Use MSG_SIM_MODIFY_ACTOR_REQUESTED with type SOFT_RESPAWN; Resets the actor to given position as if s...
Definition Actor.cpp:1376
void setFogLightsVisible(bool val)
Definition Actor.h:258
bool ar_trailer_parking_brake
Definition Actor.h:510
bool ar_toggle_ties
Sim state.
Definition Actor.h:608
TuneupDefPtr & getWorkingTuneupDef()
Definition Actor.cpp:5045
ActorType ar_driveable
Sim attr; marks vehicle type and features.
Definition Actor.h:466
int ar_net_stream_id
Definition Actor.h:522
void cruisecontrolToggle()
Defined in 'gameplay/CruiseControl.cpp'.
bool getHeadlightsVisible() const
Definition Actor.h:253
ActorPtrVec & GetActors()
void UpdateSleepingState(ActorPtr player_actor, float dt)
RigDef::DocumentPtr FetchActorDef(RoR::ActorSpawnRequest &rq)
void RestoreSavedState(ActorPtr actor, rapidjson::Value const &j_entry)
Definition Savegame.cpp:787
void DeleteActorInternal(ActorPtr actor)
Do not call directly; use GameContext::DeleteActor()
const ActorPtr & FetchNextVehicleOnList(ActorPtr player, ActorPtr prev_player)
const ActorPtr & FetchPreviousVehicleOnList(ActorPtr player, ActorPtr prev_player)
ActorPtr FindActorInsideBox(Collisions *collisions, const Ogre::String &inst, const Ogre::String &box)
void UpdateActors(ActorPtr player_actor)
const ActorPtr & GetActorById(ActorInstanceID_t actor_id)
ActorPtr CreateNewActor(ActorSpawnRequest rq, RigDef::DocumentPtr def)
std::vector< ActorPtr > GetLocalActors()
virtual void toggleReverse()=0
virtual void setThrottle(float val)=0
virtual void flipStart()=0
virtual float getThrottle()=0
RoR::ForceFeedback & GetForceFeedback()
Definition AppContext.h:71
bool wantsdisconnect
Definition AutoPilot.h:55
void disconnect()
Definition AutoPilot.cpp:71
float getThrottle(float thrtl, float dt)
T getEnum() const
Definition CVar.h:99
bool getBool() const
Definition CVar.h:98
void setStr(std::string const &str)
Definition CVar.h:83
void setVal(T val)
Definition CVar.h:72
int getInt() const
Definition CVar.h:97
Terrn2DocumentPtr terrn2_def
Cached terrain definition document.
Definition CacheSystem.h:95
std::vector< Ogre::String > sectionconfigs
Ogre::String fname
filename
Definition CacheSystem.h:67
Ogre::String description
Ogre::String dname
name parsed from the file
Definition CacheSystem.h:70
SkinDocumentPtr skin_def
Cached skin info, added on first use or during cache rebuild.
Definition CacheSystem.h:92
TuneupDefPtr tuneup_def
Cached tuning info, added on first use or during cache rebuild.
Definition CacheSystem.h:93
std::string default_skin
bool deleted
is this mod deleted?
Definition CacheSystem.h:84
Ogre::String guid
global unique id; Type "addonpart" leaves this empty and uses addonpart_guids; Always lowercase.
Definition CacheSystem.h:77
void LoadAssetPack(CacheEntryPtr &t_dest, Ogre::String const &assetpack_filename)
Adds asset pack to the requesting cache entry's resource group.
CacheEntryPtr FindEntryByFilename(RoR::LoaderType type, bool partial, const std::string &_filename_maybe_bundlequalified)
Returns NULL if none found; "Bundle-qualified" format also specifies the ZIP/directory in modcache,...
size_t Query(CacheQuery &query)
void LoadResource(CacheEntryPtr &t)
Loads the associated resource bundle if not already done.
void NotifyVehicleChanged(ActorPtr new_vehicle)
void UpdateInputEvents(float dt)
Ogre::SceneNode * GetCameraNode()
Ogre::Camera * GetCamera()
Character * CreateLocalCharacter()
void UndoRemoteActorCoupling(ActorPtr actor)
Character * GetLocalCharacter()
void setPosition(Ogre::Vector3 position)
Definition Character.cpp:85
Ogre::Vector3 getPosition()
Definition Character.cpp:92
void setRotation(Ogre::Radian rotation)
Definition Character.cpp:98
void SetActorCoupling(bool enabled, ActorPtr actor)
Ogre::Radian getRotation() const
Definition Character.h:53
collision_box_t * getBox(const Ogre::String &inst, const Ogre::String &box)
float getSurfaceHeightBelow(float x, float z, float height)
Ogre::Vector3 getPosition(const Ogre::String &inst, const Ogre::String &box)
Ogre::Quaternion getDirection(const Ogre::String &inst, const Ogre::String &box)
float getSurfaceHeight(float x, float z)
bool isInside(Ogre::Vector3 pos, const Ogre::String &inst, const Ogre::String &box, float border=0)
@ CONSOLE_MSGTYPE_ACTOR
Parsing/spawn/simulation messages for actors.
Definition Console.h:63
@ CONSOLE_MSGTYPE_INFO
Generic message.
Definition Console.h:60
void putMessage(MessageArea area, MessageType type, std::string const &msg, std::string icon="")
Definition Console.cpp:103
@ CONSOLE_SYSTEM_ERROR
Definition Console.h:52
@ CONSOLE_SYSTEM_NOTICE
Definition Console.h:51
@ CONSOLE_SYSTEM_WARNING
Definition Console.h:53
void setVisible3d(bool visibility)
void autoShiftSet(int mode)
Definition Engine.cpp:1164
void UpdateInputEvents(float dt)
Definition Engine.cpp:1270
void setAutoMode(SimGearboxMode mode)
Definition Engine.cpp:857
void SetEnabled(bool v)
void AnalyzeFlexbodies()
populates the combobox
void SetVisible(bool visible)
void Show(LoaderType type, std::string const &filter_guid="", CacheEntryPtr advertised_entry=nullptr)
Ogre::String ai_sectionconfig
Ogre::String ai_sectionconfig2
std::vector< ai_events > ai_waypoints
CommandkeyID_t GetActiveCommandKey() const
GUI::RepositorySelector RepositorySelector
Definition GUIManager.h:131
GUI::MultiplayerSelector MultiplayerSelector
Definition GUIManager.h:124
GUI::GameAbout GameAbout
Definition GUIManager.h:119
GUI::MainSelector MainSelector
Definition GUIManager.h:125
GUI::GameSettings GameSettings
Definition GUIManager.h:120
GUI::VehicleInfoTPanel VehicleInfoTPanel
Definition GUIManager.h:121
GUI::TopMenubar TopMenubar
Definition GUIManager.h:134
void ShowMessageBox(const char *title, const char *text, bool allow_close=true, const char *btn1_text="OK", const char *btn2_text=nullptr)
GUI::FrictionSettings FrictionSettings
Definition GUIManager.h:128
GUI::GameControls GameControls
Definition GUIManager.h:130
GUI::FlexbodyDebug FlexbodyDebug
Definition GUIManager.h:138
void SetPrevPlayerActor(ActorPtr actor)
Message * m_msg_chain_end
ActorPtr m_last_spawned_actor
Last actor spawned by user and still alive.
TerrainPtr m_terrain
void UpdateGlobalInputEvents()
std::mutex m_msg_mutex
ActorPtr SpawnActor(ActorSpawnRequest &rq)
void UpdateBoatInputEvents(float dt, ActorPtr boat)
void UpdateCommonInputEvents(float dt, ActorPtr actor)
ActorPtr FindActorByCollisionBox(std::string const &ev_src_instance_name, std::string const &box_name)
Ogre::Vector3 prev_pos
Message PopMessage()
void UpdateSkyInputEvents(float dt)
ActorSpawnRequest m_current_selection
Context of the loader UI.
const ActorPtr & FetchNextVehicleOnList()
ActorPtr m_player_actor
Actor (vehicle or machine) mounted and controlled by player.
void OnLoaderGuiApply(RoR::LoaderType type, CacheEntryPtr entry, std::string sectionconfig)
GUI callback.
const ActorPtr & FetchPrevVehicleOnList()
CacheEntryPtr m_last_skin_selection
CharacterFactory m_character_factory
Character * GetPlayerCharacter()
const ActorPtr & GetPlayerActor()
void ShowLoaderGUI(int type, const Ogre::String &instance, const Ogre::String &box)
ActorManager m_actor_manager
Ogre::String m_last_section_config
void UpdateAirplaneInputEvents(float dt, ActorPtr airplane)
CacheEntryPtr m_last_tuneup_selection
void ChangePlayerActor(ActorPtr actor)
void PushMessage(Message m)
Doesn't guarantee order! Use ChainMessage() if order matters.
void SpawnPreselectedActor(std::string const &preset_vehicle, std::string const &preset_veh_config)
needs Character to exist
bool LoadTerrain(std::string const &filename_part)
CacheEntryPtr m_dummy_cache_selection
Ogre::Timer m_timer
void CreatePlayerCharacter()
Terrain must be loaded.
ActorPtr m_actor_remotely_receiving_commands
Actor close enough to import command keys.
void UpdateSimInputEvents(float dt)
void ChainMessage(Message m)
Add to last pushed message's chain.
void DeleteActor(ActorPtr actor)
void ModifyActor(ActorModifyRequest &rq)
void TeleportPlayer(float x, float z)
GameMsgQueue m_msg_queue
void UpdateTruckInputEvents(float dt, ActorPtr truck)
ActorPtr m_prev_player_actor
Previous actor (vehicle or machine) mounted and controlled by player.
ActorManager * GetActorManager()
CacheEntryPtr m_last_cache_selection
Vehicle/load.
void OnLoaderGuiCancel()
GUI callback.
void SetVideoCamState(VideoCamState state)
Definition GfxActor.cpp:440
void UpdateSimDataBuffer()
Copies sim. data from Actor to GfxActor for later update.
VideoCamState GetVideoCamState() const
Definition GfxActor.h:141
void SetDebugView(DebugViewType dv)
void CycleDebugViews()
void ToggleDebugView()
DebugViewType GetDebugView() const
Definition GfxActor.h:142
void UpdateEnvMap(Ogre::Vector3 center, GfxActor *gfx_actor, bool full=false)
void ForceUpdateSingleGfxActor(RoR::GfxActor *gfx_actor)
Definition GfxScene.cpp:339
GfxEnvmap & GetEnvMap()
Definition GfxScene.h:81
void RemoveGfxActor(RoR::GfxActor *gfx_actor)
Definition GfxScene.cpp:330
GameContextSB & GetSimDataBuffer()
Definition GfxScene.h:80
float getEventValue(int eventID, bool pure=false, InputSourceType valueSource=InputSourceType::IST_ANY)
valueSource: IST_ANY=digital and analog devices, IST_DIGITAL=only digital, IST_ANALOG=only analog
RoRnet::UserInfo GetLocalUserData()
Definition Network.cpp:708
void showDashboardOverlays(bool show, ActorPtr actor)
void UpdateInputEvents()
Definition Replay.cpp:251
void toggleReverse()
float getRudder()
void setRudder(float val)
Definition ScrewProp.cpp:94
float getThrottle()
void setThrottle(float val)
Definition ScrewProp.cpp:81
SkyX::SkyX * GetSkyX()
Definition SkyXManager.h:52
Wrapper for classic c-string (local buffer) Refresher: strlen() excludes '\0' terminator; strncat() A...
Definition Str.h:36
const char * ToCStr() const
Definition Str.h:46
SkyXManager * getSkyXManager()
Definition Terrain.h:83
Ogre::Vector3 getMaxTerrainSize()
Definition Terrain.cpp:504
bool initialize()
Definition Terrain.cpp:150
bool HasPredefinedActors()
Definition Terrain.cpp:546
SkyManager * getSkyManager()
Definition Terrain.cpp:521
float getHeightAt(float x, float z)
Definition Terrain.cpp:511
Collisions * GetCollisions()
Definition Terrain.h:86
void dispose()
Definition Terrain.cpp:78
Ogre::Vector3 getSpawnPos()
Definition Terrain.cpp:593
Terrn2DocumentPtr GetDef()
Definition Terrain.cpp:583
Terrn2DocumentPtr LoadTerrn2(Ogre::DataStreamPtr &ds)
void UpdateInputEvents(float dt)
bool IsEnabled() const
bool isActive()
Returns the status of the AI.
Definition VehicleAI.cpp:58
void setTimeMultiplier(const Ogre::Real &TimeMultiplier)
Set time multiplier.
Definition SkyX.h:166
@ LOCAL_SCRIPT
Not actually connected to network, but running server script locally.
@ BLINK_RIGHT
Definition SimData.h:117
@ BLINK_LEFT
Definition SimData.h:116
@ BLINK_WARN
Definition SimData.h:118
@ MACHINE
its a machine
Definition SimData.h:88
@ TRUCK
its a truck (or other land vehicle)
Definition SimData.h:85
@ NOT_DRIVEABLE
not drivable at all
Definition SimData.h:84
@ AIRPLANE
its an airplane
Definition SimData.h:86
@ AI
machine controlled by an Artificial Intelligence
Definition SimData.h:89
@ EV_BOAT_CENTER_RUDDER
center the rudder
@ EV_AIRPLANE_THROTTLE
Definition InputEngine.h:93
@ EV_COMMON_TOGGLE_RESET_MODE
toggle truck reset truck mode (soft vs. hard)
@ EV_COMMANDS_01
Command 1.
@ EV_COMMON_ROPELOCK
connect hook node to a node in close proximity
@ EV_TRUCK_TOGGLE_PHYSICS
toggle physics simulation
@ EV_TRUCK_HORN
truck horn
@ EV_AIRPLANE_THROTTLE_FULL
full thrust
Definition InputEngine.h:96
@ EV_TRUCK_TOGGLE_VIDEOCAMERA
toggle videocamera update
@ EV_AIRPLANE_THROTTLE_UP
increase the airplane thrust
Definition InputEngine.h:98
@ EV_TRUCK_TOGGLE_TCASE_GEAR_RATIO
toggle the transfer case gear ratio
@ EV_AIRPLANE_BRAKE
normal brake for an aircraft.
Definition InputEngine.h:80
@ EV_COMMON_LOCK
connect hook node to a node in close proximity
@ EV_TRUCK_BLINK_RIGHT
toggle right direction indicator (blinker)
@ EV_AIRPLANE_THROTTLE_AXIS
throttle axis. Only use this if you have fitting hardware :) (i.e. a Slider)
Definition InputEngine.h:94
@ EV_TRUCK_TOGGLE_INTER_AXLE_DIFF
toggle the inter axle differential mode
@ EV_TRUCK_LEFT_MIRROR_LEFT
@ EV_BOAT_THROTTLE_UP
increase throttle
@ EV_AIRPLANE_STEER_RIGHT
steer right
Definition InputEngine.h:92
@ EV_AIRPLANE_AIRBRAKES_LESS
Definition InputEngine.h:77
@ EV_COMMON_OUTPUT_POSITION
write current position to log (you can open the logfile and reuse the position)
@ EV_COMMON_TOGGLE_TRUCK_FOG_LIGHTS
toggle truck fog lights (on/off); doesn't need low beams, doesn't use 't' lights.
@ EV_SKY_INCREASE_TIME
increase day-time
@ EV_AIRPLANE_PARKING_BRAKE
airplane parking brake.
Definition InputEngine.h:87
@ EV_BOAT_STEER_LEFT_AXIS
steer left (analog value!)
@ EV_COMMON_REMOVE_CURRENT_TRUCK
remove current truck
@ EV_TRUCK_BLINK_LEFT
toggle left direction indicator (blinker)
@ EV_COMMON_TOGGLE_TRUCK_HIGH_BEAMS
toggle truck high beams (on/off); doesn't need low beams, doesn't use 't' lights.
@ EV_AIRPLANE_REVERSE
reverse the turboprops
Definition InputEngine.h:88
@ EV_TRUCK_PARKING_BRAKE
toggle parking brake
@ EV_BOAT_THROTTLE_DOWN
decrease throttle
@ EV_AIRPLANE_FLAPS_MORE
one step more flaps.
Definition InputEngine.h:85
@ EV_AIRPLANE_TOGGLE_ENGINES
switch all engines on / off
Definition InputEngine.h:99
@ EV_BOAT_THROTTLE_AXIS
throttle axis. Only use this if you have fitting hardware :) (i.e. a Slider)
@ EV_BOAT_STEER_RIGHT_AXIS
steer right (analog value!)
@ EV_AIRPLANE_RUDDER_RIGHT
rudder right
Definition InputEngine.h:90
@ EV_TRUCK_TRACTION_CONTROL
toggle antilockbrake system
@ EV_AIRPLANE_FLAPS_NONE
no flaps.
Definition InputEngine.h:86
@ EV_BOAT_STEER_RIGHT
steer right a step
@ EV_AIRPLANE_ELEVATOR_DOWN
pull the elevator down in an aircraft.
Definition InputEngine.h:81
@ EV_COMMON_CYCLE_DEBUG_VIEWS
cycle debug view mode
@ EV_TRUCK_BLINK_WARN
toggle all direction indicators
@ EV_TRUCK_RIGHT_MIRROR_LEFT
@ EV_COMMON_SCREENSHOT
take a screenshot
@ EV_COMMON_RESCUE_TRUCK
teleport to rescue truck
@ EV_AIRPLANE_FLAPS_FULL
full flaps in an aircraft.
Definition InputEngine.h:83
@ EV_AIRPLANE_FLAPS_LESS
one step less flaps.
Definition InputEngine.h:84
@ EV_AIRPLANE_AIRBRAKES_MORE
Definition InputEngine.h:78
@ EV_COMMON_SECURE_LOAD
tie a load to the truck
@ EV_COMMON_QUIT_GAME
exit the game
@ EV_TRUCK_TRAILER_PARKING_BRAKE
toggle trailer parking brake
@ EV_SKY_DECREASE_TIME_FAST
decrease day-time a lot faster
@ EV_AIRPLANE_THROTTLE_DOWN
decreases the airplane thrust
Definition InputEngine.h:95
@ EV_AIRPLANE_ELEVATOR_UP
pull the elevator up in an aircraft.
Definition InputEngine.h:82
@ EV_COMMON_GET_NEW_VEHICLE
get new vehicle
@ EV_SKY_DECREASE_TIME
decrease day-time
@ EV_TRUCK_STEER_LEFT
steer left
@ EV_SKY_INCREASE_TIME_FAST
increase day-time a lot faster
@ EV_BOAT_STEER_LEFT
steer left a step
@ EV_COMMON_RESET_TRUCK
reset truck to original starting position
@ EV_BOAT_REVERSE
no thrust
@ EV_COMMON_TOGGLE_TRUCK_BEACONS
toggle truck beacons
@ EV_COMMON_ENTER_PREVIOUS_TRUCK
enter previous truck
@ EV_TRUCK_RIGHT_MIRROR_RIGHT
@ EV_COMMON_ENTER_NEXT_TRUCK
enter next truck
@ EV_TRUCK_TOGGLE_FORWARDCOMMANDS
toggle forwardcommands
@ EV_AIRPLANE_THROTTLE_NO
no thrust
Definition InputEngine.h:97
@ EV_AIRPLANE_AIRBRAKES_NONE
Definition InputEngine.h:79
@ EV_TRUCK_CRUISE_CONTROL
toggle cruise control
@ EV_COMMON_FULLSCREEN_TOGGLE
@ EV_TRUCK_TOGGLE_TCASE_4WD_MODE
toggle the transfer case 4wd mode
@ EV_COMMON_CYCLE_TRUCK_LIGHTS
cycle truck front light mode (off -> running light -> low beams -> off).
@ EV_TRUCK_STEER_RIGHT
steer right
@ EV_COMMON_TOGGLE_TRUCK_LOW_BEAMS
toggle truck low beams (on/off); also toggles running lights.
@ EV_AIRPLANE_STEER_LEFT
steer left
Definition InputEngine.h:91
@ EV_COMMON_AUTOLOCK
unlock autolock hook node
@ EV_AIRPLANE_RUDDER_LEFT
rudder left
Definition InputEngine.h:89
@ EV_COMMON_TOGGLE_CUSTOM_PARTICLES
toggle particle cannon
@ EV_COMMON_RESPAWN_LAST_TRUCK
respawn last truck
@ EV_TRUCK_ANTILOCK_BRAKE
toggle antilockbrake system
@ EV_TRUCK_TOGGLE_IMPORTCOMMANDS
toggle importcommands
@ EV_TRUCK_LIGHTTOGGLE01
toggle custom light 1
@ EV_COMMON_ENTER_OR_EXIT_TRUCK
enter or exit a truck
@ EV_COMMON_TOGGLE_TERRAIN_EDITOR
toggle terrain editor
@ EV_TRUCK_LEFT_MIRROR_RIGHT
@ EV_TRUCK_TOGGLE_INTER_WHEEL_DIFF
toggle the inter wheel differential mode
@ EV_AIRPLANE_AIRBRAKES_FULL
Definition InputEngine.h:76
@ EV_TRUCKEDIT_RELOAD
@ EV_COMMON_TRUCK_REMOVE
@ EV_COMMON_TOGGLE_DEBUG_VIEW
toggle debug view mode
@ MSG_GUI_OPEN_MENU_REQUESTED
@ MSG_GUI_CLOSE_MENU_REQUESTED
@ MSG_SIM_PAUSE_REQUESTED
@ MSG_SIM_UNPAUSE_REQUESTED
@ MSG_SIM_HIDE_NET_ACTOR_REQUESTED
Payload = ActorPtr* (owner)
@ MSG_GUI_REFRESH_TUNING_MENU_REQUESTED
@ MSG_APP_DISPLAY_WINDOWED_REQUESTED
Definition Application.h:90
@ MSG_EDI_ENTER_TERRN_EDITOR_REQUESTED
@ MSG_SIM_ACTOR_LINKING_REQUESTED
Payload = RoR::ActorLinkingRequest* (owner)
@ MSG_SIM_SPAWN_ACTOR_REQUESTED
Payload = RoR::ActorSpawnRequest* (owner)
@ MSG_GUI_OPEN_SELECTOR_REQUESTED
Payload = LoaderType* (owner), Description = GUID | empty.
@ MSG_SIM_SEAT_PLAYER_REQUESTED
Payload = RoR::ActorPtr (owner) | nullptr.
@ MSG_APP_SHUTDOWN_REQUESTED
Definition Application.h:87
@ MSG_APP_DISPLAY_FULLSCREEN_REQUESTED
Definition Application.h:89
@ MSG_SIM_MUTE_NET_ACTOR_REQUESTED
Payload = ActorPtr* (owner)
@ MSG_EDI_MODIFY_PROJECT_REQUESTED
Payload = RoR::UpdateProjectRequest* (owner)
@ MSG_SIM_DELETE_ACTOR_REQUESTED
Payload = RoR::ActorPtr* (owner)
@ MSG_SIM_MODIFY_ACTOR_REQUESTED
Payload = RoR::ActorModifyRequest* (owner)
@ MSG_APP_SCREENSHOT_REQUESTED
Definition Application.h:88
@ MSG_EDI_RELOAD_BUNDLE_REQUESTED
Payload = RoR::CacheEntryPtr* (owner)
@ LOCAL_SIMULATED
simulated (local) actor
@ LOCAL_SLEEPING
sleeping (local) actor
@ NETWORKED_OK
not simulated (remote) actor
@ NETWORKED_HIDDEN
not simulated, not updated (remote)
void TRIGGER_EVENT_ASYNC(scriptEvents type, int arg1, int arg2ex=0, int arg3ex=0, int arg4ex=0, std::string arg5ex="", std::string arg6ex="", std::string arg7ex="", std::string arg8ex="")
Asynchronously (via MSG_SIM_SCRIPT_EVENT_TRIGGERED) invoke script function eventCallbackEx(),...
@ AUTO
Automatic shift.
std::shared_ptr< Document > DocumentPtr
CVar * gfx_sky_mode
CVar * gfx_polygon_mode
AppContext * GetAppContext()
CVar * gfx_sky_time_cycle
CVar * sim_state
OverlayWrapper * GetOverlayWrapper()
InputEngine * GetInputEngine()
CVar * gfx_sky_time_speed
CameraManager * GetCameraManager()
CVar * diag_preset_spawn_pos
GUIManager * GetGuiManager()
GameContext * GetGameContext()
CVar * sim_tuning_enabled
CVar * sim_soft_reset_mode
GfxScene * GetGfxScene()
CVar * app_state
CVar * cli_preset_spawn_pos
CVar * mp_state
CVar * diag_preset_spawn_rot
Console * GetConsole()
CacheSystem * GetCacheSystem()
CVar * diag_preset_veh_enter
CVar * cli_preset_spawn_rot
Network * GetNetwork()
static const NodeNum_t NODENUM_INVALID
void Log(const char *msg)
The ultimate, application-wide logging function. Adds a line (any length) in 'RoR....
LoaderType
< Search mode for ModCache::Query() & Operation mode for GUI::MainSelector
@ LT_Airplane
@ LT_Boat
@ LT_Train
@ LT_AddonPart
@ LT_Skin
@ LT_Truck
@ LT_Car
@ LT_Load
@ LT_Terrain
@ LT_Trailer
@ LT_Vehicle
@ LT_Extension
@ LT_AllBeam
@ TUNEUP_USE_ADDONPART_SET
'subject' is addonpart filename.
std::shared_ptr< Terrn2Document > Terrn2DocumentPtr
void LogFormat(const char *format,...)
Improved logging utility. Uses fixed 2Kb buffer.
RefCountingObjectPtr< Actor > ActorPtr
@ SE_TRUCK_TELEPORT
triggered when the user teleports the truck, the argument refers to the actor ID of the vehicle
@ SE_TRUCK_EXIT
triggered when switching from vehicle mode to person mode, the argument refers to the actor ID of the...
@ SE_TRUCK_ENTER
triggered when switching from person mode to vehicle mode, the argument refers to the actor ID of the...
@ SE_GENERIC_DELETED_TRUCK
triggered when the user deletes an actor, the argument refers to the actor ID
@ CAELUM
Caelum (best looking, slower)
@ SKYX
SkyX (best looking, slower)
std::string tryConvertUTF(const char *buffer)
Definition Utils.cpp:61
RefCountingObjectPtr< CacheEntry > CacheEntryPtr
static const CommandkeyID_t COMMANDKEYID_INVALID
@ PEEROPT_HIDE_ACTORS
Spawn actors hidden and immediatelly hide existing actors.
Definition RoRnet.h:133
@ PEEROPT_MUTE_ACTORS
Spawn actors muted and immediatelly mute existing actors.
Definition RoRnet.h:132
Estabilishing a physics linkage between 2 actors modifies a global linkage table and triggers immedia...
Definition SimData.h:909
ActorLinkingRequestType alr_type
Definition SimData.h:911
ActorInstanceID_t alr_actor_instance_id
Definition SimData.h:910
ActorInstanceID_t amr_actor
Definition SimData.h:875
Ogre::Quaternion amr_softrespawn_rotation
Rotation to use with SOFT_RESPAWN; use TObjParser::CalcRotation() to calculate quaternion from XYZ li...
Definition SimData.h:882
Ogre::Vector3 amr_softrespawn_position
Position to use with SOFT_RESPAWN.
Definition SimData.h:881
std::shared_ptr< rapidjson::Document > amr_saved_state
Definition SimData.h:878
@ RELOAD
Full reload from filesystem, requested by user.
@ SOFT_RESPAWN
Like hard reset, but positions the actor like spawn process does - using the relative positions from ...
@ REFRESH_VISUALS
Forces a synchronous update of visuals from any context - i.e. from terrain editor mode or with sleep...
std::string asr_net_username
Definition SimData.h:845
Ogre::String asr_config
Definition SimData.h:836
CacheEntryPtr asr_cache_entry
Optional, overrides 'asr_filename' and 'asr_cache_entry_num'.
Definition SimData.h:834
TuneupDefPtr asr_working_tuneup
Only filled when editing tuneup via Tuning menu.
Definition SimData.h:842
bool asr_terrn_machine
This is a fixed machinery.
Definition SimData.h:852
Ogre::Vector3 asr_position
Definition SimData.h:837
CacheEntryPtr asr_skin_entry
Definition SimData.h:840
std::string asr_filename
Can be in "Bundle-qualified" format, i.e. "mybundle.zip:myactor.truck".
Definition SimData.h:835
Ogre::Quaternion asr_rotation
Definition SimData.h:838
@ CONFIG_FILE
'Preselected vehicle' in RoR.cfg or command line
@ NETWORK
Remote controlled.
@ USER
Direct selection by user via GUI.
@ SAVEGAME
User spawned and part of a savegame.
@ TERRN_DEF
Preloaded with terrain.
BitMask_t asr_net_peeropts
RoRnet::PeerOptions to be applied after spawn.
Definition SimData.h:847
collision_box_t * asr_spawnbox
Definition SimData.h:839
CacheEntryPtr asr_tuneup_entry
Only filled when user selected a saved/downloaded .tuneup mod in SelectorUI.
Definition SimData.h:841
std::shared_ptr< rapidjson::Document > asr_saved_state
Pushes msg MODIFY_ACTOR (type RESTORE_SAVED) after spawn.
Definition SimData.h:854
std::string cqy_filter_guid
Exact match (case-insensitive); leave empty to disable.
std::vector< CacheQueryResult > cqy_results
RoR::LoaderType cqy_filter_type
ActorPtr simbuf_player_actor
Definition SimBuffers.h:204
Unified game event system - all requests and state changes are reported using a message.
Definition GameContext.h:52
void * payload
Definition GameContext.h:59
std::vector< Message > chain
Posted after the message is processed.
Definition GameContext.h:60
ModifyProjectRequestType mpr_type
Ogre::Vector3 AbsPosition
absolute position in the world (shaky)
Definition SimData.h:267
char username[RORNET_MAX_USERNAME_LEN]
the nickname of the user (UTF-8)
Definition RoRnet.h:196
int32_t colournum
colour set by server
Definition RoRnet.h:194
Ogre::Vector3 position