RigsofRods
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
GameScript.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 "GameScript.h"
23 #include "ScriptUtils.h"
24 
25 #ifdef USE_CURL
26 # include <curl/curl.h>
27 # include <curl/easy.h>
28 #endif //USE_CURL
29 
30 // AS addons start
31 #include "scriptany/scriptany.h"
32 #include "scriptarray/scriptarray.h"
33 #include "scripthelper/scripthelper.h"
34 #include "scriptmath/scriptmath.h"
35 #include "scriptstdstring/scriptstdstring.h"
36 // AS addons end
37 
38 #include "AppContext.h"
39 #include "Actor.h"
40 #include "ActorManager.h"
41 #include "CacheSystem.h"
42 #include "Character.h"
43 #include "ChatSystem.h"
44 #include "Collisions.h"
45 #include "Console.h"
46 #include "CurlHelpers.h"
47 #include "Engine.h"
48 #include "GameContext.h"
49 #include "GfxScene.h"
50 #include "GUIManager.h"
51 #include "GUI_TopMenubar.h"
52 #include "Language.h"
53 #include "PlatformUtils.h"
54 #include "Network.h"
55 #include "RoRVersion.h"
56 #include "ScriptEngine.h"
57 #include "ScriptUtils.h"
58 #include "SkyManager.h"
59 #include "SoundScriptManager.h"
60 #include "Terrain.h"
61 #include "TerrainGeometryManager.h"
62 #include "TerrainObjectManager.h"
63 #include "Utils.h"
64 #include "VehicleAI.h"
65 #include "Water.h"
66 
67 #include <rapidjson/document.h>
68 #include <rapidjson/writer.h>
69 
70 using namespace Ogre;
71 using namespace RoR;
72 using namespace AngelScript;
73 
74 // GUIDELINE: Make functions safe from invoking in wrong circumstances,
75 // i.e. when server script calls function using SimController while in main menu.
76 // --> Getter functions should silently return zero/empty value.
77 // --> Functions performing simulation changes should log warning and do nothing.
78 
79 
80 
81 void GameScript::log(const String& msg)
82 {
83  App::GetScriptEngine()->SLOG(msg);
84 }
85 
86 void GameScript::logFormat(const char* format, ...)
87 {
88  char buffer[4000] = {};
89  sprintf(buffer, "[RoR|Script] "); // Length: 13 characters
90  char* buffer_pos = buffer + 13;
91 
92  va_list args;
93  va_start(args, format);
94  vsprintf(buffer_pos, format, args);
95  va_end(args);
96 
97  App::GetScriptEngine()->SLOG(buffer);
98 }
99 
100 void GameScript::activateAllVehicles()
101 {
103 }
104 
105 void GameScript::setTrucksForcedAwake(bool forceActive)
106 {
108 }
109 
110 float GameScript::getTime()
111 {
113 }
114 
115 void GameScript::setPersonPosition(const Vector3& vec)
116 {
117  if (!this->HavePlayerAvatar(__FUNCTION__))
118  return;
119 
121 }
122 
123 void GameScript::loadTerrain(const String& terrain)
124 {
126 }
127 
128 Vector3 GameScript::getPersonPosition()
129 {
130  Vector3 result(Vector3::ZERO);
131  if (App::GetGameContext()->GetPlayerCharacter())
133  return result;
134 }
135 
136 void GameScript::movePerson(const Vector3& vec)
137 {
138  if (!this->HavePlayerAvatar(__FUNCTION__))
139  return;
140 
142 }
143 
144 void GameScript::setPersonRotation(const Radian& rot)
145 {
146  if (!this->HavePlayerAvatar(__FUNCTION__))
147  return;
148 
150 }
151 
152 Radian GameScript::getPersonRotation()
153 {
154  Radian result(0);
155  if (App::GetGameContext()->GetPlayerCharacter())
157  return result;
158 }
159 
160 String GameScript::getCaelumTime()
161 {
162  String result = "";
163 #ifdef USE_CAELUM
164  if (App::GetGameContext()->GetTerrain())
165  {
166  result = App::GetGameContext()->GetTerrain()->getSkyManager()->GetPrettyTime();
167  }
168 #endif // USE_CAELUM
169  return result;
170 }
171 
172 void GameScript::setCaelumTime(float value)
173 {
174 #ifdef USE_CAELUM
175  if (!this->HaveSimTerrain(__FUNCTION__))
176  return;
177 
178  App::GetGameContext()->GetTerrain()->getSkyManager()->SetSkyTimeFactor(value);
179 #endif // USE_CAELUM
180 }
181 
182 bool GameScript::getCaelumAvailable()
183 {
184  bool result = false;
185 #ifdef USE_CAELUM
186  if (App::GetGameContext()->GetTerrain())
187  result = App::GetGameContext()->GetTerrain()->getSkyManager() != 0;
188 #endif // USE_CAELUM
189  return result;
190 }
191 
192 void GameScript::stopTimer()
193 {
195 }
196 
197 void GameScript::startTimer(int id)
198 {
200 }
201 
202 void GameScript::setTimeDiff(float diff)
203 {
205 }
206 
207 void GameScript::setBestLapTime(float time)
208 {
210 }
211 
212 void GameScript::setWaterHeight(float value)
213 {
214  if (!this->HaveSimTerrain(__FUNCTION__))
215  return;
216 
217  if (App::GetGameContext()->GetTerrain()->getWater())
218  {
220  water->SetStaticWaterHeight(value);
221  water->UpdateWater();
222  }
223 }
224 
225 float GameScript::getGroundHeight(Vector3& v)
226 {
227  float result = -1.0f;
228  if (App::GetGameContext()->GetTerrain())
229  result = App::GetGameContext()->GetTerrain()->getHeightAt(v.x, v.z);
230  return result;
231 }
232 
233 float GameScript::getWaterHeight()
234 {
235  float result = 0.0f;
236  if (App::GetGameContext()->GetTerrain() && App::GetGameContext()->GetTerrain()->getWater())
238  return result;
239 }
240 
241 ActorPtr GameScript::getCurrentTruck()
242 {
244 }
245 
246 float GameScript::getGravity()
247 {
248  float result = 0.f;
249  if (App::GetGameContext()->GetTerrain())
250  {
251  result = App::GetGameContext()->GetTerrain()->getGravity();
252  }
253  return result;
254 }
255 
256 void GameScript::setGravity(float value)
257 {
258  if (!this->HaveSimTerrain(__FUNCTION__))
259  return;
260 
262 }
263 
264 ActorPtr GameScript::getTruckByNum(int num)
265 {
267 }
268 
269 int GameScript::getNumTrucksByFlag(int flag)
270 {
271  int result = 0;
272  for (ActorPtr& actor : App::GetGameContext()->GetActorManager()->GetActors())
273  {
274  if (!flag || static_cast<int>(actor->ar_state) == flag)
275  result++;
276  }
277  return result;
278 }
279 
280 int GameScript::getCurrentTruckNumber()
281 {
283  return (actor != nullptr) ? actor->ar_instance_id : -1;
284 }
285 
286 ActorPtr GameScript::getTruckRemotelyReceivingCommands()
287 {
289 
290 }
291 
292 void GameScript::registerForEvent(int eventValue)
293 {
294  if (App::GetScriptEngine())
295  {
296  ScriptUnitID_t unit_id = App::GetScriptEngine()->getCurrentlyExecutingScriptUnit();
297  if (unit_id != SCRIPTUNITID_INVALID)
298  {
299  App::GetScriptEngine()->getScriptUnit(unit_id).eventMask |= eventValue;
300  }
301  }
302 }
303 
304 void GameScript::unRegisterEvent(int eventValue)
305 {
306  if (App::GetScriptEngine())
307  {
308  ScriptUnitID_t unit_id = App::GetScriptEngine()->getCurrentlyExecutingScriptUnit();
309  if (unit_id != SCRIPTUNITID_INVALID)
310  {
311  App::GetScriptEngine()->getScriptUnit(unit_id).eventMask &= ~eventValue;
312  }
313  }
314 }
315 
316 BitMask_t GameScript::getRegisteredEventsMask(ScriptUnitID_t nid)
317 {
318  if (App::GetScriptEngine()->scriptUnitExists(nid))
320  else
321  return BitMask_t(0);
322 }
323 
324 void GameScript::setRegisteredEventsMask(ScriptUnitID_t nid, BitMask_t eventMask)
325 {
326  if (App::GetScriptEngine()->scriptUnitExists(nid))
327  App::GetScriptEngine()->getScriptUnit(nid).eventMask = eventMask;
328 }
329 
330 void GameScript::flashMessage(String& txt, float time, float charHeight)
331 {
332  RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_SCRIPT, Console::CONSOLE_SYSTEM_NOTICE, txt, "script_code_red.png");
333 }
334 
335 void GameScript::message(String& txt, String& icon)
336 {
337  RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_SCRIPT, Console::CONSOLE_SYSTEM_NOTICE, txt, icon);
338 }
339 
340 void GameScript::updateDirectionArrow(String& text, Vector3& vec)
341 {
342  App::GetGameContext()->GetRaceSystem().UpdateDirectionArrow(const_cast<char*>(text.c_str()), Vector3(vec.x, vec.y, vec.z));
343 }
344 
345 int GameScript::getChatFontSize()
346 {
347  return 0; //NETCHAT.getFontSize();
348 }
349 
350 void GameScript::setChatFontSize(int size)
351 {
352  //NETCHAT.setFontSize(size);
353 }
354 
355 void GameScript::showChooser(const String& type, const String& instance, const String& box)
356 {
357  LoaderType ntype = LT_None;
358 
359  if (type == "airplane")
360  ntype = LT_Airplane;
361  if (type == "all")
362  ntype = LT_AllBeam;
363  if (type == "boat")
364  ntype = LT_Boat;
365  if (type == "car")
366  ntype = LT_Car;
367  if (type == "extension")
368  ntype = LT_Extension;
369  if (type == "heli")
370  ntype = LT_Airplane;
371  if (type == "load")
372  ntype = LT_Load;
373  if (type == "trailer")
374  ntype = LT_Trailer;
375  if (type == "train")
376  ntype = LT_Train;
377  if (type == "truck")
378  ntype = LT_Truck;
379  if (type == "vehicle")
380  ntype = LT_Vehicle;
381 
382  if (ntype != LT_None)
383  {
385  }
386 
387 }
388 
389 void GameScript::repairVehicle(const String& instance, const String& box, bool keepPosition)
390 {
391  App::GetGameContext()->GetActorManager()->RepairActor(App::GetGameContext()->GetTerrain()->GetCollisions(), instance, box, keepPosition);
392 }
393 
394 void GameScript::removeVehicle(const String& event_source_instance_name, const String& event_source_box_name)
395 {
396  ActorPtr actor = App::GetGameContext()->FindActorByCollisionBox(event_source_instance_name, event_source_box_name);
397  if (actor)
398  {
400  }
401 }
402 
403 AngelScript::CScriptArray* GameScript::getEditorObjects()
404 {
405  if (!this->HaveSimTerrain(__FUNCTION__))
406  return nullptr;
407 
408  if (!App::GetGameContext()->GetTerrain()->getObjectManager())
409  return nullptr;
410 
411  // Adopted from `VectorToScriptArray()` in file 'ScriptUtils.h'
412  std::string arraydecl = fmt::format("array<{}>", "TerrainEditorObjectClass@");
413  AngelScript::asITypeInfo* typeinfo = App::GetScriptEngine()->getEngine()->GetTypeInfoByDecl(arraydecl.c_str());
414  TerrainEditorObjectPtrVec& vec = App::GetGameContext()->GetTerrain()->getObjectManager()->GetEditorObjects(); AngelScript::CScriptArray* arr = AngelScript::CScriptArray::Create(typeinfo, vec.size());
415 
416  for (AngelScript::asUINT i = 0; i < arr->GetSize(); i++)
417  {
418  // Set the value of each element
419  TerrainEditorObject* ref = vec[i].GetRef();
420  arr->SetValue(i, &ref);
421  }
422 
423  return arr;
424 
425 }
426 
427 void GameScript::destroyObject(const String& instanceName)
428 {
429  if (!this->HaveSimTerrain(__FUNCTION__))
430  return;
431 
432  if (App::GetGameContext()->GetTerrain()->getObjectManager())
433  {
435  }
436 }
437 
438 void GameScript::moveObjectVisuals(const String& instanceName, const Vector3& pos)
439 {
440  if (!this->HaveSimTerrain(__FUNCTION__))
441  return;
442 
443  if (App::GetGameContext()->GetTerrain()->getObjectManager())
444  {
446  }
447 }
448 
449 void GameScript::spawnObject(const String& objectName, const String& instanceName, const Vector3& pos, const Vector3& rot, const String& eventhandler, bool uniquifyMaterials)
450 {
451  if (!this->HaveSimTerrain(__FUNCTION__))
452  return;
453 
454  if ((App::GetGameContext()->GetTerrain()->getObjectManager() == nullptr))
455  {
456  this->logFormat("spawnObject(): Cannot spawn object, no terrain loaded!");
457  return;
458  }
459 
460  if (App::GetScriptEngine()->getTerrainScriptUnit() == -1)
461  {
462  this->logFormat("spawnObject(): Cannot spawn object, no terrain script loaded!");
463  return;
464  }
465 
466  try
467  {
468  AngelScript::asIScriptModule* module = App::GetScriptEngine()->getScriptUnit(App::GetScriptEngine()->getTerrainScriptUnit()).scriptModule;
469  if (module == nullptr)
470  {
471  this->logFormat("spawnObject(): Failed to fetch/create script module");
472  return;
473  }
474 
475  int handler_func_id = -1; // no function
476  if (!eventhandler.empty())
477  {
478  // Let script author know (via Angelscript.log) there's a better alternative.
480  App::GetScriptEngine()->SLOG(
481  "spawnObject(): Specifying event handler function in `game.spawnObject()` (or .TOBJ file) is obsolete and only works with terrain scripts;"
482  " Use `eventCallbackEx()` with event `SE_EVENTBOX_ENTER` instead, it does the same job and works with any script."
483  " Just pass an empty string to the `game.spawnObject()` parameter.");
485 
486  // Look up the function and log if not found or found with bad arguments (probably a typo).
487  AngelScript::asIScriptFunction* handler_func = App::GetScriptEngine()->getFunctionByDeclAndLogCandidates(
488  App::GetScriptEngine()->getTerrainScriptUnit(), GETFUNCFLAG_REQUIRED,
490  if (handler_func != nullptr)
491  {
492  handler_func_id = handler_func->GetId();
493  }
494  }
495 
496  const String type = "";
497  App::GetGameContext()->GetTerrain()->getObjectManager()->LoadTerrainObject(objectName, pos, rot, instanceName, type, /*rendering_distance=*/0, true, handler_func_id, uniquifyMaterials);
498  }
499  catch (...)
500  {
501  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::spawnObject()");
502  return;
503  }
504 }
505 
506 void GameScript::hideDirectionArrow()
507 {
509 }
510 
511 bool GameScript::getScreenPosFromWorldPos(Ogre::Vector3 const& world_pos, Ogre::Vector2& out_screen)
512 {
513  ImVec2 screen_size = ImGui::GetIO().DisplaySize;
514  World2ScreenConverter world2screen(
515  App::GetCameraManager()->GetCamera()->getViewMatrix(true), App::GetCameraManager()->GetCamera()->getProjectionMatrix(), Ogre::Vector2(screen_size.x, screen_size.y));
516  Ogre::Vector3 pos_xyz = world2screen.Convert(world_pos);
517  if (pos_xyz.z < 0.f)
518  {
519  out_screen.x = pos_xyz.x;
520  out_screen.y = pos_xyz.y;
521  return true;
522  }
523  return false;
524 }
525 
526 Ogre::Vector2 GameScript::getDisplaySize()
527 {
528  ImVec2 size = ImGui::GetIO().DisplaySize;
529  return Vector2(size.x, size.y);
530 }
531 
532 Ogre::Vector2 GameScript::getMouseScreenPosition()
533 {
534  ImVec2 pos = ImGui::GetIO().MousePos;
535  return Vector2(pos.x, pos.y);
536 }
537 
538 int GameScript::setMaterialAmbient(const String& materialName, float red, float green, float blue)
539 {
540  try
541  {
542  MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
543  if (!m)
544  return 0;
545  m->setAmbient(red, green, blue);
546  }
547  catch (...)
548  {
549  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialAmbient()");
550  return 0;
551  }
552  return 1;
553 }
554 
555 int GameScript::setMaterialDiffuse(const String& materialName, float red, float green, float blue, float alpha)
556 {
557  try
558  {
559  MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
560  if (!m)
561  return 0;
562  m->setDiffuse(red, green, blue, alpha);
563  }
564  catch (...)
565  {
566  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialDiffuse()");
567  return 0;
568  }
569  return 1;
570 }
571 
572 int GameScript::setMaterialSpecular(const String& materialName, float red, float green, float blue, float alpha)
573 {
574  try
575  {
576  MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
577  if (!m)
578  return 0;
579  m->setSpecular(red, green, blue, alpha);
580  }
581  catch (...)
582  {
583  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialSpecular()");
584  return 0;
585  }
586  return 1;
587 }
588 
589 int GameScript::setMaterialEmissive(const String& materialName, float red, float green, float blue)
590 {
591  try
592  {
593  MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
594  if (!m)
595  return 0;
596  m->setSelfIllumination(red, green, blue);
597  }
598  catch (...)
599  {
600  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialEmissive()");
601  return 0;
602  }
603  return 1;
604 }
605 
606 int GameScript::getTextureUnitState(TextureUnitState** tu, const String materialName, int techniqueNum, int passNum, int textureUnitNum)
607 {
608  // Internal helper - propagate exceptions outside so that correct function names appear in exception-events
609  // ========================================================================================================
610 
611  MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
612  if (!m)
613  return 1;
614 
615  // verify technique
616  if (techniqueNum < 0 || techniqueNum > m->getNumTechniques())
617  return 2;
618  Technique* t = m->getTechnique(techniqueNum);
619  if (!t)
620  return 2;
621 
622  //verify pass
623  if (passNum < 0 || passNum > t->getNumPasses())
624  return 3;
625  Pass* p = t->getPass(passNum);
626  if (!p)
627  return 3;
628 
629  //verify texture unit
630  if (textureUnitNum < 0 || textureUnitNum > p->getNumTextureUnitStates())
631  return 4;
632  TextureUnitState* tut = p->getTextureUnitState(textureUnitNum);
633  if (!tut)
634  return 4;
635 
636  *tu = tut;
637  return 0;
638 }
639 
640 int GameScript::setMaterialTextureName(const String& materialName, int techniqueNum, int passNum, int textureUnitNum, const String& textureName)
641 {
642  try
643  {
644  TextureUnitState* tu = 0;
645  int res = getTextureUnitState(&tu, materialName, techniqueNum, passNum, textureUnitNum);
646  if (res == 0 && tu != 0)
647  {
648  // finally, set it
649  tu->setTextureName(textureName);
650  }
651  return res;
652  }
653  catch (...)
654  {
655  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialTextureName()");
656  return 0;
657  }
658 }
659 
660 int GameScript::setMaterialTextureRotate(const String& materialName, int techniqueNum, int passNum, int textureUnitNum, float rotation)
661 {
662  try
663  {
664  TextureUnitState* tu = 0;
665  int res = getTextureUnitState(&tu, materialName, techniqueNum, passNum, textureUnitNum);
666  if (res == 0 && tu != 0)
667  {
668  tu->setTextureRotate(Degree(rotation));
669  }
670  return res;
671  }
672  catch (...)
673  {
674  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialTextureRotate()");
675  return 0;
676  }
677 }
678 
679 int GameScript::setMaterialTextureScroll(const String& materialName, int techniqueNum, int passNum, int textureUnitNum, float sx, float sy)
680 {
681  try
682  {
683  TextureUnitState* tu = 0;
684  int res = getTextureUnitState(&tu, materialName, techniqueNum, passNum, textureUnitNum);
685  if (res == 0 && tu != 0)
686  {
687  tu->setTextureScroll(sx, sy);
688  }
689  return res;
690  }
691  catch (...)
692  {
693  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialTextureScroll()");
694  return 0;
695  }
696 }
697 
698 int GameScript::setMaterialTextureScale(const String& materialName, int techniqueNum, int passNum, int textureUnitNum, float u, float v)
699 {
700  try
701  {
702  TextureUnitState* tu = 0;
703  int res = getTextureUnitState(&tu, materialName, techniqueNum, passNum, textureUnitNum);
704  if (res == 0 && tu != 0)
705  {
706  tu->setTextureScale(u, v);
707  }
708  return res;
709  }
710  catch (...)
711  {
712  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialTextureScale()");
713  return 0;
714  }
715 }
716 
717 float GameScript::rangeRandom(float from, float to)
718 {
719  return Math::RangeRandom(from, to);
720 }
721 
722 int GameScript::getLoadedTerrain(String& result)
723 {
724  String terrainName = "";
725 
726  if (App::GetGameContext()->GetTerrain())
727  {
728  terrainName = App::GetGameContext()->GetTerrain()->getTerrainName();
729  result = terrainName;
730  }
731 
732  return !terrainName.empty();
733 }
734 
735 RoR::TerrainPtr GameScript::getTerrain()
736 {
737  return App::GetGameContext()->GetTerrain();
738 }
739 
740 void GameScript::clearEventCache()
741 {
742  if (!this->HaveSimTerrain(__FUNCTION__))
743  return;
744 
745  if (App::GetGameContext()->GetTerrain()->GetCollisions() == nullptr)
746  {
747  this->logFormat("Cannot execute '%s', collisions not ready", __FUNCTION__);
748  return;
749  }
750 
752 }
753 
754 void GameScript::setCameraPosition(const Vector3& pos)
755 {
756  if (!this->HaveMainCamera(__FUNCTION__))
757  return;
758 
759  App::GetCameraManager()->GetCameraNode()->setPosition(Vector3(pos.x, pos.y, pos.z));
760 }
761 
762 void GameScript::setCameraDirection(const Vector3& rot)
763 {
764  if (!this->HaveMainCamera(__FUNCTION__))
765  return;
766 
767  App::GetCameraManager()->GetCameraNode()->setDirection(Vector3(rot.x, rot.y, rot.z), Ogre::Node::TS_WORLD);
768 }
769 
770 void GameScript::setCameraOrientation(const Quaternion& q)
771 {
772  if (!this->HaveMainCamera(__FUNCTION__))
773  return;
774 
775  App::GetCameraManager()->GetCameraNode()->setOrientation(Quaternion(q.w, q.x, q.y, q.z));
776 }
777 
778 void GameScript::setCameraYaw(float rotX)
779 {
780  if (!this->HaveMainCamera(__FUNCTION__))
781  return;
782 
783  App::GetCameraManager()->GetCameraNode()->yaw(Degree(rotX), Ogre::Node::TS_WORLD);
784 }
785 
786 void GameScript::setCameraPitch(float rotY)
787 {
788  if (!this->HaveMainCamera(__FUNCTION__))
789  return;
790 
791  App::GetCameraManager()->GetCameraNode()->pitch(Degree(rotY));
792 }
793 
794 void GameScript::setCameraRoll(float rotZ)
795 {
796  if (!this->HaveMainCamera(__FUNCTION__))
797  return;
798 
799  App::GetCameraManager()->GetCameraNode()->roll(Degree(rotZ));
800 }
801 
802 Vector3 GameScript::getCameraPosition()
803 {
804  Vector3 result(Vector3::ZERO);
805  if (App::GetCameraManager()->GetCameraNode())
806  result = App::GetCameraManager()->GetCameraNode()->getPosition();
807  return result;
808 }
809 
810 Vector3 GameScript::getCameraDirection()
811 {
812  Vector3 result(Vector3::ZERO);
813  if (App::GetCameraManager()->GetCameraNode())
814  {
815  // Direction points down -Z by default (adapted from Ogre::Camera)
816  result = App::GetCameraManager()->GetCameraNode()->getOrientation() * -Ogre::Vector3::UNIT_Z;
817  }
818  return result;
819 }
820 
821 Quaternion GameScript::getCameraOrientation()
822 {
823  Quaternion result(Quaternion::ZERO);
824  if (App::GetCameraManager()->GetCameraNode())
825  result = App::GetCameraManager()->GetCameraNode()->getOrientation();
826  return result;
827 }
828 
829 void GameScript::cameraLookAt(const Vector3& pos)
830 {
831  if (!this->HaveMainCamera(__FUNCTION__))
832  return;
833 
834  App::GetCameraManager()->GetCameraNode()->lookAt(Vector3(pos.x, pos.y, pos.z), Ogre::Node::TS_WORLD);
835 }
836 
837 int GameScript::useOnlineAPI(const String& apiquery, const AngelScript::CScriptDictionary& dict, String& result)
838 {
839  if (App::app_disable_online_api->getBool())
840  return 0;
841 
842  ScriptUnitID_t unit_id = App::GetScriptEngine()->getCurrentlyExecutingScriptUnit();
843  if (unit_id == SCRIPTUNITID_INVALID)
844  return 2;
845 
846  ActorPtr player_actor = App::GetGameContext()->GetPlayerActor();
847 
848  if (player_actor == nullptr)
849  return 1;
850 
851  std::string hashtok = Sha1Hash(App::mp_player_name->getStr());
852  std::string url = App::mp_api_url->getStr() + apiquery;
853  std::string user = std::string("RoR-Api-User: ") + App::mp_player_name->getStr();
854  std::string token = std::string("RoR-Api-User-Token: ") + hashtok;
855 
856  std::string terrain_name = App::GetGameContext()->GetTerrain()->getTerrainName();
857 
858  std::string script_name = App::GetScriptEngine()->getScriptUnit(unit_id).scriptName;
859  std::string script_hash = App::GetScriptEngine()->getScriptUnit(unit_id).scriptHash;
860 
861  rapidjson::Document j_doc;
862  j_doc.SetObject();
863 
864  j_doc.AddMember("user-name", rapidjson::StringRef(App::mp_player_name->getStr().c_str()), j_doc.GetAllocator());
865  j_doc.AddMember("user-country", rapidjson::StringRef(App::app_country->getStr().c_str()), j_doc.GetAllocator());
866  j_doc.AddMember("user-token", rapidjson::StringRef(hashtok.c_str()), j_doc.GetAllocator());
867 
868  j_doc.AddMember("terrain-name", rapidjson::StringRef(terrain_name.c_str()), j_doc.GetAllocator());
869  j_doc.AddMember("terrain-filename", rapidjson::StringRef(App::sim_terrain_name->getStr().c_str()), j_doc.GetAllocator());
870 
871  j_doc.AddMember("script-name", rapidjson::StringRef(script_name.c_str()), j_doc.GetAllocator());
872  j_doc.AddMember("script-hash", rapidjson::StringRef(script_hash.c_str()), j_doc.GetAllocator());
873 
874  j_doc.AddMember("actor-name", rapidjson::StringRef(player_actor->ar_design_name.c_str()), j_doc.GetAllocator());
875  j_doc.AddMember("actor-filename", rapidjson::StringRef(player_actor->ar_filename.c_str()), j_doc.GetAllocator());
876  j_doc.AddMember("actor-hash", rapidjson::StringRef(player_actor->ar_filehash.c_str()), j_doc.GetAllocator());
877 
878  rapidjson::Value j_linked_actors(rapidjson::kArrayType);
879  for (ActorPtr& actor : player_actor->ar_linked_actors)
880  {
881  rapidjson::Value j_actor(rapidjson::kObjectType);
882  j_actor.AddMember("actor-name", rapidjson::StringRef(actor->ar_design_name.c_str()), j_doc.GetAllocator());
883  j_actor.AddMember("actor-filename", rapidjson::StringRef(actor->ar_filename.c_str()), j_doc.GetAllocator());
884  j_actor.AddMember("actor-hash", rapidjson::StringRef(actor->ar_filehash.c_str()), j_doc.GetAllocator());
885  j_linked_actors.PushBack(j_actor, j_doc.GetAllocator());
886  }
887  j_doc.AddMember("linked-actors", j_linked_actors, j_doc.GetAllocator());
888 
889  j_doc.AddMember("avg-fps", getAvgFPS(), j_doc.GetAllocator());
890  j_doc.AddMember("ror-version", rapidjson::StringRef(ROR_VERSION_STRING), j_doc.GetAllocator());
891 
892  for (auto item : dict)
893  {
894  const std::string& key = item.GetKey();
895  const std::string* value = (std::string *)item.GetAddressOfValue();
896  j_doc.AddMember(rapidjson::StringRef(key.c_str()), rapidjson::StringRef(value->c_str()), j_doc.GetAllocator());
897  }
898 
899  rapidjson::StringBuffer buffer;
900  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
901  j_doc.Accept(writer);
902  std::string json = buffer.GetString();
903 
904 #if USE_CURL
905  RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE,
906  _L("using Online API..."), "information.png");
907 
908  LOG("[RoR|GameScript] Submitting race results to '" + url + "'");
909 
910  std::thread([url, user, token, json]()
911  {
912  long response_code = 0;
913 
914  struct curl_slist *slist = NULL;
915  slist = curl_slist_append(slist, "Accept: application/json");
916  slist = curl_slist_append(slist, "Content-Type: application/json");
917  slist = curl_slist_append(slist, user.c_str());
918  slist = curl_slist_append(slist, token.c_str());
919 
920  CURL *curl = curl_easy_init();
921  curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
922  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
923  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str());
924 
925  CURLcode curl_result = curl_easy_perform(curl);
926  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
927 
928  if (curl_result != CURLE_OK || response_code != 200)
929  {
930  Ogre::LogManager::getSingleton().stream()
931  << "[RoR|GameScript] `useOnlineAPI()` failed to submit data;"
932  << " Error: '" << curl_easy_strerror(curl_result) << "'; HTTP status code: " << response_code;
933  }
934 
935  curl_easy_cleanup(curl);
936  curl = nullptr;
937  curl_slist_free_all(slist);
938  slist = NULL;
939  }).detach();
940 #else // USE_CURL
941  RoR::App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING,
942  _L("Cannot use Online API in this build (CURL not available)"));
943 #endif // USE_CURL
944 
945  return 0;
946 }
947 
948 void GameScript::openUrlInDefaultBrowser(const std::string& url)
949 {
950  RoR::OpenUrlInDefaultBrowser(url); // PlatformUtils.h
951 }
952 
953 void GameScript::fetchUrlAsStringAsync(const std::string& url, const std::string& display_filename)
954 {
955 #if defined(USE_CURL)
956  CurlTaskContext task;
957  task.ctc_url = url;
958  task.ctc_displayname = display_filename;
959  // Messages to post // See `RoR::angelScriptThreadStatus`
960  task.ctc_msg_progress = MSG_APP_SCRIPT_THREAD_STATUS; // `RoR::ASTHREADSTATUS_CURLSTRING_PROGRESS`
961  task.ctc_msg_success = MSG_APP_SCRIPT_THREAD_STATUS; // `RoR::ASTHREADSTATUS_CURLSTRING_SUCCESS`
962  task.ctc_msg_failure = MSG_APP_SCRIPT_THREAD_STATUS; // `RoR::ASTHREADSTATUS_CURLSTRING_FAILURE`
963 
964  std::packaged_task<void(CurlTaskContext)> pktask(GetUrlAsStringMQ);
965  std::thread(std::move(pktask), task).detach();
966 #endif // defined(USE_CURL)
967 }
968 
969 void GameScript::boostCurrentTruck(float factor)
970 {
972  if (actor && actor->ar_engine)
973  {
974  float rpm = actor->ar_engine->getRPM();
975  rpm += 2000.0f * factor;
976  actor->ar_engine->setRPM(rpm);
977  }
978 }
979 
980 int GameScript::addScriptFunction(const String& arg, ScriptUnitID_t nid)
981 {
982  return App::GetScriptEngine()->addFunction(arg, nid);
983 }
984 
985 int GameScript::scriptFunctionExists(const String& arg, ScriptUnitID_t nid)
986 {
987  return App::GetScriptEngine()->functionExists(arg, nid);
988 }
989 
990 int GameScript::deleteScriptFunction(const String& arg, ScriptUnitID_t nid)
991 {
992  return App::GetScriptEngine()->deleteFunction(arg, nid);
993 }
994 
995 int GameScript::addScriptVariable(const String& arg, ScriptUnitID_t nid)
996 {
997  return App::GetScriptEngine()->addVariable(arg, nid);
998 }
999 
1000 int GameScript::scriptVariableExists(const String& arg, ScriptUnitID_t nid)
1001 {
1002  return App::GetScriptEngine()->variableExists(arg, nid);
1003 }
1004 
1005 int GameScript::deleteScriptVariable(const String& arg, ScriptUnitID_t nid)
1006 {
1007  return App::GetScriptEngine()->deleteVariable(arg, nid);
1008 }
1009 
1010 int GameScript::getScriptVariable(const Ogre::String& varName, void *ref, int refTypeId, ScriptUnitID_t nid)
1011 {
1012  return App::GetScriptEngine()->getVariable(varName, ref, refTypeId, nid);
1013 }
1014 
1015 int GameScript::sendGameCmd(const String& message)
1016 {
1017 #ifdef USE_SOCKETW
1018  if (RoR::App::mp_state->getEnum<MpState>() == RoR::MpState::CONNECTED)
1019  {
1020  App::GetNetwork()->AddPacket(0, RoRnet::MSG2_GAME_CMD, (int)message.size(), const_cast<char*>(message.c_str()));
1021  return 0;
1022  }
1023 #endif // USE_SOCKETW
1024 
1025  return -11;
1026 }
1027 
1028 AngelScript::CScriptArray* GameScript::getRunningScripts()
1029 {
1030  std::vector<ScriptUnitID_t> ids;
1031  for (auto& pair: App::GetScriptEngine()->getScriptUnits())
1032  ids.push_back(pair.first);
1033 
1034  return VectorToScriptArray(ids, "int");
1035 }
1036 
1037 
1038 AngelScript::CScriptDictionary* GameScript::getScriptDetails(ScriptUnitID_t nid)
1039 {
1040  if (!App::GetScriptEngine()->scriptUnitExists(nid))
1041  return nullptr;
1042 
1044  AngelScript::CScriptDictionary* dict = AngelScript::CScriptDictionary::Create(App::GetScriptEngine()->getEngine());
1045  int stringTypeid = App::GetScriptEngine()->getEngine()->GetTypeIdByDecl("string");
1046  int scriptCategoryTypeid = App::GetScriptEngine()->getEngine()->GetTypeIdByDecl("ScriptCategory");
1047 
1048  dict->Set("uniqueId", (asINT64)info.uniqueId);
1049  dict->Set("scriptName", new std::string(info.scriptName), stringTypeid);
1050  dict->Set("scriptCategory", &info.scriptCategory, scriptCategoryTypeid);
1051  dict->Set("eventMask", (asINT64)info.eventMask);
1052  dict->Set("scriptBuffer", new std::string(info.scriptBuffer), stringTypeid);
1053 
1054  // TBD Some other time...
1055  //AngelScript::asIScriptModule* scriptModule = nullptr;
1056  //AngelScript::asIScriptFunction* frameStepFunctionPtr = nullptr; //!< script function pointer to the frameStep function
1057  //AngelScript::asIScriptFunction* eventCallbackFunctionPtr = nullptr; //!< script function pointer to the event callback function
1058  //AngelScript::asIScriptFunction* eventCallbackExFunctionPtr = nullptr; //!< script function pointer to the event callback function
1059  //AngelScript::asIScriptFunction* defaultEventCallbackFunctionPtr = nullptr; //!< script function pointer for spawner events
1060  //ActorPtr associatedActor; //!< For ScriptCategory::ACTOR
1061  //Ogre::String scriptHash;
1062 
1063  return dict;
1064 }
1065 
1066 VehicleAIPtr GameScript::getCurrentTruckAI()
1067 {
1068  VehicleAIPtr result = nullptr;
1069  if (App::GetGameContext()->GetPlayerActor())
1070  {
1072  }
1073  return result;
1074 }
1075 
1076 VehicleAIPtr GameScript::getTruckAIByNum(int num)
1077 {
1078  VehicleAIPtr result = nullptr;
1080  if (actor != nullptr)
1081  {
1082  result = actor->ar_vehicle_ai;
1083  }
1084  return result;
1085 }
1086 
1087 ActorPtr GameScript::spawnTruck(Ogre::String& truckName, Ogre::Vector3& pos, Ogre::Vector3& rot)
1088 {
1089  ActorSpawnRequest rq;
1090  rq.asr_position = pos;
1091  rq.asr_rotation = Quaternion(Degree(rot.x), Vector3::UNIT_X) * Quaternion(Degree(rot.y), Vector3::UNIT_Y) * Quaternion(Degree(rot.z), Vector3::UNIT_Z);
1092  rq.asr_filename = truckName;
1093  return App::GetGameContext()->SpawnActor(rq);
1094 }
1095 
1096 ActorPtr GameScript::spawnTruckAI(Ogre::String& truckName, Ogre::Vector3& pos, Ogre::String& truckSectionConfig, std::string& truckSkin, int x)
1097 {
1098  try
1099  {
1100  ActorSpawnRequest rq;
1101  rq.asr_position = pos;
1102 
1103  // Set rotation based on first two waypoints
1104  std::vector<Ogre::Vector3> waypoints;
1105  for (int i = 0; i < App::GetGuiManager()->TopMenubar.ai_waypoints.size(); i++)
1106  {
1107  waypoints.push_back(App::GetGuiManager()->TopMenubar.ai_waypoints[i].position);
1108  }
1109  if (App::GetGuiManager()->TopMenubar.ai_mode == 3 && x == 1) // Crash driving mode
1110  {
1111  std::reverse(waypoints.begin(), waypoints.end());
1112  }
1113 
1114  // Check if we have enough waypoints
1115  Ogre::Vector3 dir = Ogre::Vector3::ZERO;
1116  if (waypoints.size() >= 2)
1117  dir = waypoints[0] - waypoints[1];
1118  else if (waypoints.size() >= 1)
1119  dir = waypoints[0];
1120  dir.y = 0;
1121  rq.asr_rotation = Ogre::Vector3::UNIT_X.getRotationTo(dir, Ogre::Vector3::UNIT_Y);
1122 
1123  rq.asr_filename = truckName;
1124  rq.asr_config = truckSectionConfig;
1127  return App::GetGameContext()->SpawnActor(rq);
1128  }
1129  catch (...)
1130  {
1131  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::setMaterialTextureScale()");
1132  return ActorPtr();
1133  }
1134 }
1135 
1136 AngelScript::CScriptArray* GameScript::getWaypoints(int x)
1137 {
1138  std::vector<Ogre::Vector3> vec;
1139  for (int i = 0; i < App::GetGuiManager()->TopMenubar.ai_waypoints.size(); i++)
1140  {
1141  vec.push_back(App::GetGuiManager()->TopMenubar.ai_waypoints[i].position);
1142  }
1143  if (App::GetGuiManager()->TopMenubar.ai_mode == 3 && x == 1) // Crash driving mode
1144  {
1145  std::reverse(vec.begin(), vec.end());
1146  }
1147 
1148  AngelScript::CScriptArray* arr = AngelScript::CScriptArray::Create(AngelScript::asGetActiveContext()->GetEngine()->GetTypeInfoByDecl("array<vector3>"), vec.size());
1149 
1150  for(AngelScript::asUINT i = 0; i < arr->GetSize(); i++)
1151  {
1152  // Set the value of each element
1153  arr->SetValue(i, &vec[i]);
1154  }
1155 
1156  return arr;
1157 }
1158 
1159 AngelScript::CScriptArray* GameScript::getAllTrucks()
1160 {
1162  AngelScript::CScriptArray* arr = AngelScript::CScriptArray::Create(AngelScript::asGetActiveContext()->GetEngine()->GetTypeInfoByDecl("array<BeamClass@>"), actors.size());
1163 
1164  for (AngelScript::asUINT i = 0; i < arr->GetSize(); i++)
1165  {
1166  // Set the value of each element
1167  arr->SetValue(i, &actors[i]);
1168  }
1169 
1170  return arr;
1171 }
1172 
1173 void GameScript::addWaypoint(const Ogre::Vector3& pos)
1174 {
1175  std::vector<Ogre::Vector3> waypoints;
1176  for (int i = 0; i < App::GetGuiManager()->TopMenubar.ai_waypoints.size(); i++)
1177  {
1178  waypoints.push_back(App::GetGuiManager()->TopMenubar.ai_waypoints[i].position);
1179  }
1180 }
1181 
1182 AngelScript::CScriptArray* GameScript::getWaypointsSpeed()
1183 {
1184  std::vector<int> vec;
1185  for (int i = 0; i < App::GetGuiManager()->TopMenubar.ai_waypoints.size(); i++)
1186  {
1187  vec.push_back(App::GetGuiManager()->TopMenubar.ai_waypoints[i].speed);
1188  }
1189 
1190  AngelScript::CScriptArray* arr = AngelScript::CScriptArray::Create(AngelScript::asGetActiveContext()->GetEngine()->GetTypeInfoByDecl("array<int>"), vec.size());
1191 
1192  for(AngelScript::asUINT i = 0; i < arr->GetSize(); i++)
1193  {
1194  // Set the value of each element
1195  arr->SetValue(i, &vec[i]);
1196  }
1197 
1198  return arr;
1199 }
1200 
1201 int GameScript::getAIVehicleCount()
1202 {
1203  int num = App::GetGuiManager()->TopMenubar.ai_num;
1204  return num;
1205 }
1206 
1207 int GameScript::getAIVehicleDistance()
1208 {
1210  return dist;
1211 }
1212 
1213 int GameScript::getAIVehiclePositionScheme()
1214 {
1216  return scheme;
1217 }
1218 
1219 int GameScript::getAIVehicleSpeed()
1220 {
1221  int speed = App::GetGuiManager()->TopMenubar.ai_speed;
1222  return speed;
1223 }
1224 
1225 Ogre::String GameScript::getAIVehicleName(int x)
1226 {
1227  if ((App::GetGuiManager()->TopMenubar.ai_mode == 2 || App::GetGuiManager()->TopMenubar.ai_mode == 3) && x == 1) // Drag Race or Crash driving mode
1228  {
1229  Ogre::String name = App::GetGuiManager()->TopMenubar.ai_fname2;
1230  return name;
1231  }
1232  else
1233  {
1234  Ogre::String name = App::GetGuiManager()->TopMenubar.ai_fname;
1235  return name;
1236  }
1237 }
1238 
1239 Ogre::String GameScript::getAIVehicleSectionConfig(int x)
1240 {
1241  if ((App::GetGuiManager()->TopMenubar.ai_mode == 2 || App::GetGuiManager()->TopMenubar.ai_mode == 3) && x == 1) // Drag Race or Crash driving mode
1242  {
1243  Ogre::String config = App::GetGuiManager()->TopMenubar.ai_sectionconfig2;
1244  return config;
1245  }
1246  else
1247  {
1248  Ogre::String config = App::GetGuiManager()->TopMenubar.ai_sectionconfig;
1249  return config;
1250  }
1251 }
1252 
1253 std::string GameScript::getAIVehicleSkin(int x)
1254 {
1255  if ((App::GetGuiManager()->TopMenubar.ai_mode == 2 || App::GetGuiManager()->TopMenubar.ai_mode == 3) && x == 1) // Drag Race or Crash driving mode
1256  {
1257  std::string skin = App::GetGuiManager()->TopMenubar.ai_skin2;
1258  return skin;
1259  }
1260  else
1261  {
1262  std::string skin = App::GetGuiManager()->TopMenubar.ai_skin;
1263  return skin;
1264  }
1265 }
1266 
1267 int GameScript::getAIRepeatTimes()
1268 {
1269  int times = App::GetGuiManager()->TopMenubar.ai_times;
1270  return times;
1271 }
1272 
1273 int GameScript::getAIMode()
1274 {
1275  int mode = App::GetGuiManager()->TopMenubar.ai_mode;
1276  return mode;
1277 }
1278 
1279 // AI: set
1280 
1281 void GameScript::setAIVehicleCount(int num)
1282 {
1284 }
1285 
1286 void GameScript::setAIVehicleDistance(int dist)
1287 {
1289 }
1290 
1291 void GameScript::setAIVehiclePositionScheme(int scheme)
1292 {
1294 }
1295 
1296 void GameScript::setAIVehicleSpeed(int speed)
1297 {
1299 }
1300 
1301 void GameScript::setAIVehicleName(int x, std::string name)
1302 {
1303  if ((App::GetGuiManager()->TopMenubar.ai_mode == 2 || App::GetGuiManager()->TopMenubar.ai_mode == 3) && x == 1) // Drag Race or Crash driving mode
1304  {
1306  }
1307  else
1308  {
1310  }
1311 }
1312 
1313 void GameScript::setAIVehicleSectionConfig(int x, std::string config)
1314 {
1315  switch (x)
1316  {
1317  case 0:
1319  break;
1320  case 1:
1322  break;
1323  default:
1324  this->log(fmt::format("setAIVehicleSectionConfig: ERROR, valid 'x' is 0 or 1, got {}", x));
1325  break;
1326  }
1327 }
1328 
1329 void GameScript::setAIVehicleSkin(int x, std::string skin)
1330 {
1331  switch (x)
1332  {
1333  case 0:
1335  break;
1336  case 1:
1338  break;
1339  default:
1340  this->log(fmt::format("setAIVehicleSkin: ERROR, valid 'x' is 0 or 1, got {}", x));
1341  break;
1342  }
1343 }
1344 
1345 void GameScript::setAIRepeatTimes(int times)
1346 {
1348 }
1349 
1350 void GameScript::setAIMode(int mode)
1351 {
1353 }
1354 
1355 void GameScript::showMessageBox(Ogre::String& title, Ogre::String& text, bool use_btn1, Ogre::String& btn1_text, bool allow_close, bool use_btn2, Ogre::String& btn2_text)
1356 {
1357  // Sanitize inputs
1358  const char* btn1_cstr = nullptr; // = Button disabled
1359  const char* btn2_cstr = nullptr;
1360 
1361  if (use_btn1)
1362  {
1363  btn1_cstr = (btn1_text.empty() ? "~1~" : btn1_text.c_str());
1364  }
1365  if (use_btn2)
1366  {
1367  btn2_cstr = (btn2_text.empty() ? "~2~" : btn2_text.c_str());
1368  }
1369 
1370  RoR::App::GetGuiManager()->ShowMessageBox(title.c_str(), text.c_str(), allow_close, btn1_cstr, btn2_cstr);
1371 }
1372 
1373 void GameScript::backToMenu()
1374 {
1377 }
1378 
1379 void GameScript::quitGame()
1380 {
1382 }
1383 
1384 float GameScript::getFPS()
1385 {
1386  return App::GetAppContext()->GetRenderWindow()->getStatistics().lastFPS;
1387 }
1388 
1389 float GameScript::getAvgFPS()
1390 {
1391  return App::GetAppContext()->GetRenderWindow()->getStatistics().avgFPS;
1392 }
1393 
1394 bool GameScript::getMousePositionOnTerrain(Ogre::Vector3& out_pos)
1395 {
1396  if (!HaveSimTerrain(__FUNCTION__))
1397  return false;
1398 
1399  Ogre::Vector2 mouse_npos = App::GetInputEngine()->getMouseNormalizedScreenPos();
1400  Ogre::Ray ray = App::GetCameraManager()->GetCamera()->getCameraToViewportRay(mouse_npos.x, mouse_npos.y);
1401  Ogre::TerrainGroup::RayResult ray_result = App::GetGameContext()->GetTerrain()->getGeometryManager()->getTerrainGroup()->rayIntersects(ray);
1402  if (ray_result.hit)
1403  {
1404  out_pos = ray_result.position;
1405  }
1406  return ray_result.hit;
1407 }
1408 
1409 class ScriptRayQueryListener : public Ogre::RaySceneQueryListener
1410 {
1411 public:
1412  Ogre::Ray ray;
1413  std::vector<Ogre::MovableObject*> results_array;
1414 
1415  bool queryResult(MovableObject* obj, Real distance) override
1416  {
1417  results_array.push_back(obj);
1418  return true; // Continue query
1419  }
1420 
1421  bool queryResult(SceneQuery::WorldFragment* fragment, Real distance) override
1422  {
1423  return true; // Continue query
1424  }
1425 };
1426 
1427 CScriptArray* GameScript::getMousePointedMovableObjects()
1428 {
1429  if (!HaveSimTerrain(__FUNCTION__))
1430  return nullptr;
1431 
1432  Ogre::Vector2 mouse_npos = App::GetInputEngine()->getMouseNormalizedScreenPos();
1433  Ogre::Ray ray = App::GetCameraManager()->GetCamera()->getCameraToViewportRay(mouse_npos.x, mouse_npos.y);
1434  Ogre::DefaultRaySceneQuery query(App::GetGfxScene()->GetSceneManager());
1435  query.setRay(ray);
1436  query.setSortByDistance(true);
1438  qlis.ray = ray;
1439  query.execute(&qlis);
1440  return VectorToScriptArray(qlis.results_array, "Ogre::MovableObject@");
1441 }
1442 
1443 Ogre::SceneManager* GameScript::getSceneManager()
1444 {
1445  return App::GetGfxScene()->GetSceneManager();
1446 }
1447 
1448 bool GameScript::pushMessage(MsgType type, AngelScript::CScriptDictionary* dict)
1449 {
1450  Message m(type);
1451  std::string log_msg = fmt::format("`pushMessage({})`", MsgTypeToString(type));
1452 
1453  switch (type)
1454  {
1455  // -- NOT ALLOWED --
1456 
1457  // Application
1459  // Networking
1464  case MSG_NET_SERVER_KICK:
1466  case MSG_NET_RECV_ERROR:
1474  // GUI
1479  // Editing
1481  this->log(fmt::format("{} is not allowed.", log_msg));
1482  return false;
1483 
1484 
1485  // -- SOME ASSEMBLY REQUIRED --
1486 
1487  // Application
1489  {
1491  bool has_filename = GetValueFromScriptDict(log_msg, dict, /*required:*/false, "filename", "string", rq->lsr_filename);
1492  bool has_buffer = GetValueFromScriptDict(log_msg, dict, /*required:*/false, "buffer", "string", rq->lsr_buffer);
1493  if (!has_filename && !has_buffer)
1494  {
1495  this->log(fmt::format("{}: ERROR, either 'filename' or 'buffer' must be set!", log_msg));
1496  delete rq;
1497  return false;
1498  }
1499  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "category", "ScriptCategory", rq->lsr_category);
1500  if (rq->lsr_category == ScriptCategory::ACTOR)
1501  {
1502  int64_t instance_id; // AngelScript's `Dictionary` converts all ints int `int64`
1503  if (!GetValueFromScriptDict(log_msg, dict, /*required:*/true, "associated_actor", "int64", instance_id))
1504  {
1505  this->log(fmt::format("{}: WARNING, category 'ACTOR' specified but 'associated_actor' not given.", log_msg, rq->lsr_filename));
1506  delete rq;
1507  return false;
1508  }
1509  }
1510  m.payload = rq;
1511  break;
1512  }
1513 
1515  {
1516  int64_t id; // AngelScript's `Dictionary` converts all ints int `int64`
1517  if (!GetValueFromScriptDict(log_msg, dict, /*required:*/true, "id", "int64", id))
1518  {
1519  return false;
1520  }
1521  m.payload = new ScriptUnitID_t(static_cast<ScriptUnitID_t>(id));
1522  break;
1523  }
1524 
1525  // Simulation
1527  if (!GetValueFromScriptDict(log_msg, dict, /*required:*/true, "filename", "string", m.description))
1528  {
1529  return false;
1530  }
1531  break;
1532 
1534  if (!GetValueFromScriptDict(log_msg, dict, /*required:*/true, "filename", "string", m.description))
1535  {
1536  return false;
1537  }
1538  break;
1539 
1541  {
1543 
1544  // Get required params
1545  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "filename", "string", rq->asr_filename) &&
1546  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "position", "vector3", rq->asr_position) &&
1547  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "rotation", "quaternion", rq->asr_rotation))
1548  {
1550  if (!rq->asr_cache_entry)
1551  {
1552  this->log(fmt::format("{}: WARNING, vehicle '{}' is not installed.", log_msg, rq->asr_filename));
1553  delete rq;
1554  return false;
1555  }
1556 
1557  // Set instance ID if specified
1558  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "instance_id", "int", rq->asr_instance_id);
1559 
1560  // Set sectionconfig
1561  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "config", "string", rq->asr_config);
1562  // Make sure config exists
1563  if (rq->asr_config != "")
1564  {
1565  auto result = std::find(rq->asr_cache_entry->sectionconfigs.begin(), rq->asr_cache_entry->sectionconfigs.end(), rq->asr_config);
1566  if (result == rq->asr_cache_entry->sectionconfigs.end())
1567  {
1568  this->log(fmt::format("{}: WARNING, configuration '{}' does not exist in '{}'.", log_msg, rq->asr_config, rq->asr_filename));
1569  rq->asr_config = "";
1570  }
1571  }
1572  // If no config given (or was invalid), use the first available (classic behavior).
1573  if (rq->asr_config == "" && rq->asr_cache_entry->sectionconfigs.size() > 0)
1574  {
1576  }
1577 
1578  // Enter or not?
1579  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "enter", "bool", rq->asr_enter);
1580 
1581  // Get skin
1582  std::string skin_name;
1583  if (GetValueFromScriptDict(log_msg, dict, /*required:*/false, "skin", "string", skin_name))
1584  {
1586  if (!rq->asr_skin_entry)
1587  this->log(fmt::format("{}: WARNING, skin '{}' is not installed.", log_msg, skin_name));
1588  }
1589 
1590  m.payload = rq;
1591  }
1592  else
1593  {
1594  delete rq;
1595  return false;
1596  }
1597  break;
1598  }
1599 
1601  {
1602  ActorModifyRequest::Type modify_type;
1603  // `dictionary` converts all primitives to `double` or `int64`, see 'scriptdictionary.cpp', function `Set()`
1604  int64_t instance_id = -1;
1605  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "type", "ActorModifyRequestType", modify_type) &&
1606  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "instance_id", "int64", instance_id))
1607  {
1609  rq->amr_type = modify_type;
1610  rq->amr_actor = static_cast<ActorInstanceID_t>(instance_id);
1611  m.payload = rq;
1612  }
1613  else
1614  {
1615  return false;
1616  }
1617  break;
1618  }
1619 
1623  {
1624  // `dictionary` converts all primitives to `double` or `int64`, see 'scriptdictionary.cpp', function `Set()`
1625  int64_t instance_id = -1;
1626  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "instance_id", "int64", instance_id))
1627  {
1628  ActorPtr actor = App::GetGameContext()->GetActorManager()->GetActorById(instance_id);
1629  if (actor)
1630  {
1631  m.payload = new ActorPtr(actor);
1632  }
1633  else
1634  {
1635  this->log(fmt::format("{}: Actor with instance ID '{}' not found!", log_msg, instance_id));
1636  return false;
1637  }
1638  }
1639  else
1640  {
1641  return false;
1642  }
1643  break;
1644  }
1645 
1647  {
1648  // `dictionary` converts all primitives to `double` or `int64`, see 'scriptdictionary.cpp', function `Set()`
1649  int64_t instance_id = -1;
1650  ActorPtr actor;
1651  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "instance_id", "int64", instance_id)
1652  && instance_id > -1)
1653  {
1654  actor = App::GetGameContext()->GetActorManager()->GetActorById(instance_id);
1655  }
1656  m.payload = new ActorPtr(actor);
1657  break;
1658  }
1659 
1661  {
1662  Ogre::Vector3 position;
1663  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "position", "vector3", position))
1664  {
1665  m.payload = new Ogre::Vector3(position);
1666  }
1667  else
1668  {
1669  return false;
1670  }
1671  break;
1672  }
1673 
1676  {
1677  // `dictionary` converts all primitives to `double` or `int64`, see 'scriptdictionary.cpp', function `Set()`
1678  FreeForceRequest* rq = new FreeForceRequest();
1679  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "id", "int64", rq->ffr_id) &&
1680  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "type", "FreeForceType", rq->ffr_type) &&
1681  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "force_magnitude", "double", rq->ffr_force_magnitude) &&
1682  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "base_actor", "int64", rq->ffr_base_actor) &&
1683  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "base_node", "int64", rq->ffr_base_node))
1684  {
1685  switch (rq->ffr_type)
1686  {
1687  case (int64_t)FreeForceType::CONSTANT:
1688  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "force_const_direction", "vector3", rq->ffr_force_const_direction))
1689  {
1690  m.payload = rq;
1691  }
1692  else
1693  {
1694  delete rq;
1695  return false;
1696  }
1697  break;
1698 
1699  case (int64_t)FreeForceType::TOWARDS_COORDS:
1700  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "target_coords", "vector3", rq->ffr_target_coords))
1701  {
1702  m.payload = rq;
1703  }
1704  else
1705  {
1706  delete rq;
1707  return false;
1708  }
1709  break;
1710 
1711  case (int64_t)FreeForceType::TOWARDS_NODE:
1712  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "target_actor", "int64", rq->ffr_target_actor) &&
1713  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "target_node", "int64", rq->ffr_target_node))
1714  {
1715  m.payload = rq;
1716  }
1717  else
1718  {
1719  delete rq;
1720  return false;
1721  }
1722  break;
1723 
1724  default:
1725  this->log(fmt::format("{}: ERROR, invalid 'free force type' value '{}'", log_msg, rq->ffr_type));
1726  delete rq;
1727  return false;
1728  }
1729  m.payload = rq;
1730  }
1731  else
1732  {
1733  delete rq;
1734  return false;
1735  }
1736  break;
1737  }
1738 
1740  {
1741  // `dictionary` converts all primitives to `double` or `int64`, see 'scriptdictionary.cpp', function `Set()`
1742  int64_t id = -1;
1743  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "id", "int64", id))
1744  {
1745  m.payload = new FreeForceID_t(id);
1746  }
1747  else
1748  {
1749  return false;
1750  }
1751  break;
1752  }
1753 
1757  {
1758  CacheEntryPtr entry;
1759  if (GetValueFromScriptDict(log_msg, dict, /*required*/true, "cache_entry", "CacheEntryClass@", entry))
1760  {
1761  m.payload = new CacheEntryPtr(entry);
1762  }
1763  else
1764  {
1765  return false;
1766  }
1767  break;
1768  }
1769 
1771  {
1772  CreateProjectRequest* request = new CreateProjectRequest();
1773  if (GetValueFromScriptDict(log_msg, dict, /*required:*/true, "name", "string", request->cpr_name) &&
1774  GetValueFromScriptDict(log_msg, dict, /*required:*/true, "source_entry", "CacheEntryClass@", request->cpr_source_entry))
1775  {
1776  m.payload = request;
1777  }
1778  else
1779  {
1780  delete request;
1781  return false;
1782  }
1783  break;
1784  }
1785 
1786  default:;
1787  }
1788 
1790  return true;
1791 }
1792 
1793 FreeForceID_t GameScript::getFreeForceNextId()
1794 {
1795  return App::GetGameContext()->GetActorManager()->GetFreeForceNextId();
1796 }
1797 
1798 ActorInstanceID_t GameScript::getActorNextInstanceId()
1799 {
1800  return App::GetGameContext()->GetActorManager()->GetActorNextInstanceId();
1801 }
1802 
1803 // --------------------------------
1804 // Audio
1805 
1806 CScriptArray* GameScript::getAllSoundScriptTemplates()
1807 {
1808  return MapToScriptArray(App::GetSoundScriptManager()->getAllTemplates(), "SoundScriptTemplateClass@");
1809 }
1810 
1811 SoundScriptTemplatePtr GameScript::getSoundScriptTemplate(const std::string& name)
1812 {
1813  return App::GetSoundScriptManager()->getTemplate(name);
1814 }
1815 
1816 AngelScript::CScriptArray* GameScript::getAllSoundScriptInstances()
1817 {
1818  return VectorToScriptArray(App::GetSoundScriptManager()->getAllInstances(), "SoundScriptInstanceClass@");
1819 }
1820 
1821 SoundPtr GameScript::createSoundFromResource(const std::string& filename, const std::string& resource_group_name)
1822 {
1823  return App::GetSoundScriptManager()->getSoundManager()->createSound(filename, resource_group_name);
1824 }
1825 
1826 SoundScriptInstancePtr GameScript::createSoundScriptInstance(const std::string& template_name, int actor_instance_id = SoundScriptInstance::ACTOR_ID_UNKNOWN)
1827 {
1828  return App::GetSoundScriptManager()->createInstance(template_name, actor_instance_id);
1829 }
1830 
1831 bool GameScript::checkResourceExists(const std::string& filename, const std::string& resource_group)
1832 {
1833  try
1834  {
1835  std::string resource_name = this->CheckFileAccess("checkResourceExists()", filename, resource_group);
1836  if (resource_name == "")
1837  return false; // Access denied - error already logged
1838 
1839  // Actually check for the resource
1840  return Ogre::ResourceGroupManager::getSingleton().resourceExists(resource_group, resource_name);
1841  }
1842  catch (...)
1843  {
1844  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::checkResourceExists()");
1845  return false;
1846  }
1847 }
1848 
1849 bool GameScript::deleteResource(const std::string& filename, const std::string& resource_group)
1850 {
1851  try
1852  {
1853  std::string resource_name = this->CheckFileAccess("deleteResource()", filename, resource_group);
1854  if (resource_name == "")
1855  return false; // Access denied - error already logged
1856 
1857  // Actually delete the resource
1858  Ogre::ResourceGroupManager::getSingleton().deleteResource(resource_name, resource_group);
1859  return true;
1860  }
1861  catch (...)
1862  {
1863  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::deleteResource()");
1864  return false;
1865  }
1866 }
1867 
1868 std::string GameScript::loadTextResourceAsString(const std::string& filename, const std::string& resource_group)
1869 {
1870  try
1871  {
1872  std::string resource_name = this->CheckFileAccess("loadTextResourceAsString()", filename, resource_group);
1873  if (resource_name == "")
1874  return ""; // Access denied - error already logged
1875 
1876  Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(resource_name, resource_group);
1877 
1878  if (!stream || !stream->isReadable())
1879  {
1880  App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_SCRIPT, Console::CONSOLE_SYSTEM_ERROR,
1881  fmt::format("loadTextResourceAsString() could not read resource '{}' in group '{}'",
1882  resource_name, resource_group));
1883  return "";
1884  }
1885 
1886 #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX
1887  // WORKAROUND: apparently `getAsString()` has some Linux-x64 issues (`eof()` triggers SIGINT):
1888  // https://discord.com/channels/136544456244461568/189904947649708032/1155952230130778262
1889  // Observed with OGRE 1.11.6
1890  std::string str;
1891  const size_t BUF_LEN = 4000;
1892  char buf[BUF_LEN] = {};
1893  bool eof = false;
1894  while (!eof)
1895  {
1896  size_t read_len = stream->read(buf, BUF_LEN);
1897  if (read_len < BUF_LEN)
1898  {
1899  buf[read_len] = 0;
1900  eof = true;
1901  }
1902  str.append(buf, read_len);
1903  }
1904  return str;
1905 #else
1906  return stream->getAsString();
1907 #endif
1908  }
1909  catch (...)
1910  {
1911  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::loadTextResourceAsString()");
1912  return "";
1913  }
1914 }
1915 
1916 bool GameScript::createTextResourceFromString(const std::string& data, const std::string& filename, const std::string& resource_group, bool overwrite/*=false*/)
1917 {
1918  try
1919  {
1920  std::string resource_name = this->CheckFileAccess("createTextResourceFromString()", filename, resource_group);
1921  if (resource_name == "")
1922  return false; // Access denied - error already logged
1923 
1924  Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().createResource(resource_name, resource_group, overwrite);
1925 
1926  if (!stream || !stream->isWriteable())
1927  {
1928  App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_SCRIPT, Console::CONSOLE_SYSTEM_ERROR,
1929  fmt::format("createTextResourceFromString() could not create resource '{}' in group '{}'",
1930  resource_name, resource_group));
1931  return false;
1932  }
1933 
1934  stream->write(data.data(), data.size());
1935  return true;
1936  }
1937  catch (...)
1938  {
1939  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::createTextResourceFromString()");
1940  return false;
1941  }
1942 }
1943 
1944 AngelScript::CScriptArray* GameScript::findResourceFileInfo(const std::string& resource_group, const std::string& pattern, bool dirs /*= false*/)
1945 {
1946  try
1947  {
1948  // Search the file system
1949  Ogre::FileInfoListPtr fileInfoList
1950  = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(resource_group, pattern, dirs);
1951 
1952  // Put results to array
1953  AngelScript::asITypeInfo* typeinfo = App::GetScriptEngine()->getEngine()->GetTypeInfoByDecl("array<dictionary>");
1954  AngelScript::CScriptArray* arr = AngelScript::CScriptArray::Create(typeinfo);
1955  int stringTypeid = App::GetScriptEngine()->getEngine()->GetTypeIdByDecl("string");
1956  for (const Ogre::FileInfo& fileinfo: *fileInfoList)
1957  {
1958  AngelScript::CScriptDictionary* dict = AngelScript::CScriptDictionary::Create(App::GetScriptEngine()->getEngine());
1959  dict->Set("filename", new std::string(fileinfo.filename), stringTypeid);
1960  dict->Set("basename", new std::string(fileinfo.basename), stringTypeid);
1961  dict->Set("compressedSize", (asINT64)fileinfo.compressedSize);
1962  dict->Set("uncompressedSize", (asINT64)fileinfo.uncompressedSize);
1963 
1964  arr->InsertLast(dict);
1965  }
1966  return arr;
1967  }
1968  catch (...)
1969  {
1970  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::findResourceFileInfo()");
1971  return nullptr;
1972  }
1973 }
1974 
1975 Ogre::Image GameScript::loadImageResource(const std::string& filename, const std::string& resource_group)
1976 {
1977  try
1978  {
1979  std::string resource_name = this->CheckFileAccess("loadImageResource()", filename, resource_group);
1980  if (resource_name == "")
1981  return Ogre::Image(); // Access denied - error already logged
1982 
1983  Ogre::Image img;
1984  return img.load(resource_name, resource_group);
1985  }
1986  catch (...)
1987  {
1988  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::loadImageResource()");
1989  return Ogre::Image();
1990  }
1991 }
1992 
1993 bool GameScript::serializeMeshResource(const std::string& filename, const std::string& resource_group, const Ogre::MeshPtr& mesh)
1994 {
1995  try
1996  {
1997  std::string resource_name = this->CheckFileAccess("serializeMeshResource()", filename, resource_group);
1998  if (resource_name == "")
1999  return false; // Access denied - error already logged
2000 
2001  Ogre::MeshSerializer ser;
2002  Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().createResource(resource_name, resource_group);
2003  ser.exportMesh(mesh.get(), stream);
2004  return true;
2005  }
2006  catch (...)
2007  {
2008  App::GetScriptEngine()->forwardExceptionAsScriptEvent("GameScript::serializeMeshResource()");
2009  return false;
2010  }
2011 }
2012 
2013 // ------------------------
2014 // Helpers:
2015 
2016 bool GameScript::HaveSimTerrain(const char* func_name)
2017 {
2018  if (App::GetGameContext()->GetTerrain() == nullptr)
2019  {
2020  this->logFormat("Cannot execute '%s', terrain not ready", func_name);
2021  return false;
2022  }
2023  return true;
2024 }
2025 
2026 bool GameScript::HavePlayerAvatar(const char* func_name)
2027 {
2028  if (App::GetGameContext()->GetPlayerCharacter() == nullptr)
2029  {
2030  this->logFormat("Cannot execute '%s', player avatar not ready", func_name);
2031  return false;
2032  }
2033  return true;
2034 }
2035 
2036 bool GameScript::HaveMainCamera(const char* func_name)
2037 {
2038  if (App::GetCameraManager()->GetCamera() == nullptr)
2039  {
2040  this->logFormat("Cannot execute '%s', main camera not ready", func_name);
2041  return false;
2042  }
2043  return true;
2044 }
2045 
2046 std::string GameScript::CheckFileAccess(const char* func_name, const std::string& filename, const std::string& resource_group)
2047 {
2048  // Extract filename and extension from the input, because OGRE allows absolute paths in resource system.
2049  // -----------------------------------------------------------------------------------------------------
2050 
2051  std::string basename, extension, path;
2052  Ogre::StringUtil::splitFullFilename(filename, basename, extension, path);
2053  if (path != "")
2054  {
2055  App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_SCRIPT, Console::CONSOLE_SYSTEM_ERROR,
2056  fmt::format("{}: access denied to '{}' with group '{}' - file paths are not allowed",
2057  func_name, filename, resource_group));
2058  return "";
2059  }
2060  else
2061  {
2062  return basename + "." + extension;
2063  }
2064 }
RoR::ScriptUnit
Represents a loaded script and all associated resources/handles.
Definition: ScriptEngine.h:70
GameContext.h
Game state manager and message-queue provider.
RoR::MSG_SIM_LOAD_TERRN_REQUESTED
@ MSG_SIM_LOAD_TERRN_REQUESTED
Definition: Application.h:118
RoR::Character::getRotation
Ogre::Radian getRotation() const
Definition: Character.h:53
ScriptRayQueryListener
Definition: GameScript.cpp:1409
RoR::IWater::GetStaticWaterHeight
virtual float GetStaticWaterHeight()=0
Returns static water level configured in 'terrn2'.
RoR::App::GetNetwork
Network * GetNetwork()
Definition: Application.cpp:288
RoR::MSG_SIM_REMOVE_FREEFORCE_REQUESTED
@ MSG_SIM_REMOVE_FREEFORCE_REQUESTED
Payload = RoR::FreeForceID_t* (owner)
Definition: Application.h:135
RoR::Character::setPosition
void setPosition(Ogre::Vector3 position)
Definition: Character.cpp:85
RoR::LoadScriptRequest::lsr_filename
std::string lsr_filename
Load from resource ('.as' file or '.gadget' file); If buffer is supplied, use this as display name on...
Definition: ScriptEngine.h:94
RoR::App::GetSoundScriptManager
SoundScriptManager * GetSoundScriptManager()
Definition: Application.cpp:281
Script2Game::log
void log(const string message)
This is an alias for game.log(string message).
RoR::MSG_GUI_SHOW_MESSAGE_BOX_REQUESTED
@ MSG_GUI_SHOW_MESSAGE_BOX_REQUESTED
Payload = MessageBoxConfig* (owner)
Definition: Application.h:142
RoR::GUI::TopMenubar::ai_fname2
Ogre::String ai_fname2
Definition: GUI_TopMenubar.h:89
RoR::Actor::ar_vehicle_ai
VehicleAIPtr ar_vehicle_ai
Definition: Actor.h:397
RoR::VectorToScriptArray
AngelScript::CScriptArray * VectorToScriptArray(const std::vector< T > &vec, const std::string &decl)
Definition: ScriptUtils.h:43
RoR::GUI::TopMenubar::ai_fname
Ogre::String ai_fname
Definition: GUI_TopMenubar.h:78
RoR::GUI::TopMenubar::ai_num
int ai_num
Definition: GUI_TopMenubar.h:72
RoR::MSG_SIM_MODIFY_ACTOR_REQUESTED
@ MSG_SIM_MODIFY_ACTOR_REQUESTED
Payload = RoR::ActorModifyRequest* (owner)
Definition: Application.h:122
RoR::MSG_EDI_RELOAD_BUNDLE_REQUESTED
@ MSG_EDI_RELOAD_BUNDLE_REQUESTED
Payload = RoR::CacheEntryPtr* (owner)
Definition: Application.h:153
RoR::FreeForceRequest::ffr_target_node
int64_t ffr_target_node
Definition: SimData.h:798
RoR::OpenUrlInDefaultBrowser
void OpenUrlInDefaultBrowser(std::string const &url)
Definition: PlatformUtils.cpp:199
RoR::Actor::ar_filename
std::string ar_filename
Attribute; filled at spawn.
Definition: Actor.h:423
RoR::MpState::CONNECTED
@ CONNECTED
RoR::CurlTaskContext::ctc_msg_progress
MsgType ctc_msg_progress
Definition: CurlHelpers.h:39
RoR::RaceSystem::UpdateDirectionArrow
void UpdateDirectionArrow(char *text, Ogre::Vector3 position)
Definition: RaceSystem.cpp:31
RoR::SCRIPTUNITID_INVALID
static const ScriptUnitID_t SCRIPTUNITID_INVALID
Definition: ForwardDeclarations.h:42
RoR::MSG_NET_USER_DISCONNECT
@ MSG_NET_USER_DISCONNECT
Definition: Application.h:104
RoR::App::GetCameraManager
CameraManager * GetCameraManager()
Definition: Application.cpp:279
RoR::ActorSpawnRequest::asr_origin
Origin asr_origin
Definition: SimData.h:838
RoR::CacheEntryPtr
RefCountingObjectPtr< CacheEntry > CacheEntryPtr
Definition: ForwardDeclarations.h:226
VehicleAI.h
Simple waypoint AI.
RoR::App::GetGuiManager
GUIManager * GetGuiManager()
Definition: Application.cpp:273
RoR::App::mp_api_url
CVar * mp_api_url
Definition: Application.cpp:126
RoR::MSG_EDI_CREATE_PROJECT_REQUESTED
@ MSG_EDI_CREATE_PROJECT_REQUESTED
Payload = RoR::CreateProjectRequest* (owner)
Definition: Application.h:155
RoR::ScriptUnit::eventMask
unsigned int eventMask
filter mask for script events
Definition: ScriptEngine.h:77
RoR::GUI::TopMenubar::ai_position_scheme
int ai_position_scheme
Definition: GUI_TopMenubar.h:77
RoR::Actor::ar_linked_actors
ActorPtrVec ar_linked_actors
BEWARE: Includes indirect links, see DetermineLinkedActors(); Other actors linked using 'hooks/ties/r...
Definition: Actor.h:465
RoR::MSG_EDI_UNLOAD_BUNDLE_REQUESTED
@ MSG_EDI_UNLOAD_BUNDLE_REQUESTED
Payload = RoR::CacheEntryPtr* (owner)
Definition: Application.h:154
RoR::App::mp_player_name
CVar * mp_player_name
Definition: Application.cpp:124
RoR::Actor::ar_instance_id
ActorInstanceID_t ar_instance_id
Static attr; session-unique ID.
Definition: Actor.h:376
SkyManager.h
RoR::ScriptEngine::deleteVariable
ScriptRetCode_t deleteVariable(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Deletes a global variable from the script.
Definition: ScriptEngine.cpp:656
ScriptRayQueryListener::queryResult
bool queryResult(MovableObject *obj, Real distance) override
Definition: GameScript.cpp:1415
RoR::MSG_SIM_UNLOAD_TERRN_REQUESTED
@ MSG_SIM_UNLOAD_TERRN_REQUESTED
Definition: Application.h:120
GUI_TopMenubar.h
RoR::AppContext::GetRenderWindow
Ogre::RenderWindow * GetRenderWindow()
Definition: AppContext.h:67
RoR::App::GetAppContext
AppContext * GetAppContext()
Definition: Application.cpp:270
RoR::GUI::TopMenubar::ai_skin2
std::string ai_skin2
Definition: GUI_TopMenubar.h:92
format
Truck file format(technical spec)
RoR::Terrain::getObjectManager
TerrainObjectManager * getObjectManager()
Definition: Terrain.h:79
RoR::RaceSystem::SetRaceBestTime
void SetRaceBestTime(float time)
Definition: RaceSystem.h:44
RoR::Terrain::getSkyManager
SkyManager * getSkyManager()
Definition: Terrain.cpp:515
RoR::MSG_NET_CONNECT_STARTED
@ MSG_NET_CONNECT_STARTED
Definition: Application.h:98
RoR::MSG_GUI_DOWNLOAD_PROGRESS
@ MSG_GUI_DOWNLOAD_PROGRESS
Definition: Application.h:144
TerrainGeometryManager.h
RoR::Collisions::clearEventCache
void clearEventCache()
Definition: Collisions.h:201
RoR::GameContext::GetPlayerCharacter
Character * GetPlayerCharacter()
Definition: GameContext.cpp:897
RoR::Terrain::setGravity
void setGravity(float value)
Definition: Terrain.cpp:483
RoR::ScriptEngine::addFunction
ScriptRetCode_t addFunction(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Adds a global function to the script.
Definition: ScriptEngine.cpp:519
RoR::SoundScriptManager::getSoundManager
SoundManager * getSoundManager()
Definition: SoundScriptManager.h:336
RoR::IWater
< TODO: Mixed gfx+physics (waves) - must be separated ~ only_a_ptr, 02/2018
Definition: IWater.h:32
RoR::MsgTypeToString
const char * MsgTypeToString(MsgType type)
Definition: Application.cpp:573
RoR::CurlTaskContext::ctc_msg_failure
MsgType ctc_msg_failure
Sent on failure; Payload: RoR::ScriptEventArgs (see 'gameplay/ScriptEvents.h') with args for RoR::SE_...
Definition: CurlHelpers.h:41
RoR::TerrainEditorObjectPtrVec
std::vector< TerrainEditorObjectPtr > TerrainEditorObjectPtrVec
Definition: ForwardDeclarations.h:244
AppContext.h
System integration layer; inspired by OgreBites::ApplicationContext.
RoR::MSG_NET_REFRESH_SERVERLIST_FAILURE
@ MSG_NET_REFRESH_SERVERLIST_FAILURE
Payload = RoR::CurlFailInfo* (owner)
Definition: Application.h:107
Console.h
RoR::ScriptEngine::getEngine
AngelScript::asIScriptEngine * getEngine()
Definition: ScriptEngine.h:291
RoR::Console::putMessage
void putMessage(MessageArea area, MessageType type, std::string const &msg, std::string icon="")
Definition: Console.cpp:103
RoR::LoadScriptRequest::lsr_buffer
std::string lsr_buffer
Load from memory buffer.
Definition: ScriptEngine.h:95
RoR::MSG_NET_RECV_ERROR
@ MSG_NET_RECV_ERROR
Definition: Application.h:105
RoR::GetValueFromScriptDict
bool GetValueFromScriptDict(const std::string &log_msg, AngelScript::CScriptDictionary *dict, bool required, std::string const &key, const char *decl, T &out_value)
Definition: ScriptUtils.h:109
RoR::LT_Load
@ LT_Load
Definition: Application.h:317
RoR::ActorManager::GetActors
ActorPtrVec & GetActors()
Definition: ActorManager.h:118
RoR::LT_Airplane
@ LT_Airplane
Definition: Application.h:314
RoR::ScriptEngine::setForwardScriptLogToConsole
void setForwardScriptLogToConsole(bool doForward)
Definition: ScriptEngine.cpp:1084
RoR::ScriptEngine::forwardExceptionAsScriptEvent
void forwardExceptionAsScriptEvent(const std::string &from)
Forwards useful info from C++ try{}catch{} exceptions to script in the form of game event.
Definition: ScriptEngine.cpp:247
RoR::TerrainObjectManager::destroyObject
void destroyObject(const Ogre::String &instancename)
Definition: TerrainObjectManager.cpp:504
RoR::GetUrlAsStringMQ
bool GetUrlAsStringMQ(CurlTaskContext task)
Definition: CurlHelpers.cpp:106
RoR::MSG_APP_LOAD_SCRIPT_REQUESTED
@ MSG_APP_LOAD_SCRIPT_REQUESTED
Payload = RoR::LoadScriptRequest* (owner)
Definition: Application.h:92
RoR::GUI::TopMenubar::ai_waypoints
std::vector< ai_events > ai_waypoints
Definition: GUI_TopMenubar.h:68
RoR::App::app_country
CVar * app_country
Definition: Application.cpp:81
RoR::TerrainObjectManager::LoadTerrainObject
bool LoadTerrainObject(const Ogre::String &name, const Ogre::Vector3 &pos, const Ogre::Vector3 &rot, const Ogre::String &instancename, const Ogre::String &type, float rendering_distance=0, bool enable_collisions=true, int scripthandler=-1, bool uniquifyMaterial=false)
Definition: TerrainObjectManager.cpp:600
RoR::LT_Car
@ LT_Car
Definition: Application.h:312
Engine.h
RoR::CacheEntry::sectionconfigs
std::vector< Ogre::String > sectionconfigs
Definition: CacheSystem.h:142
RoR::CameraManager::GetCameraNode
Ogre::SceneNode * GetCameraNode()
Definition: CameraManager.h:63
Utils.h
RoR::App::app_disable_online_api
CVar * app_disable_online_api
Definition: Application.cpp:90
RoR::ActorSpawnRequest::asr_filename
std::string asr_filename
Can be in "Bundle-qualified" format, i.e. "mybundle.zip:myactor.truck".
Definition: SimData.h:830
Language.h
RoR::FreeForceRequest::ffr_base_actor
int64_t ffr_base_actor
Definition: SimData.h:792
RoR::LT_Extension
@ LT_Extension
Definition: Application.h:318
TerrainObjectManager.h
RoR::SoundScriptManager::getTemplate
SoundScriptTemplatePtr getTemplate(Ogre::String name)
Definition: SoundScriptManager.h:308
RefCountingObjectPtr< Actor >
RoR::World2ScreenConverter::Convert
Ogre::Vector3 Convert(Ogre::Vector3 world_pos)
Definition: Utils.h:90
RoR::MSG_NET_SERVER_KICK
@ MSG_NET_SERVER_KICK
Definition: Application.h:102
GUIManager.h
RoR::CreateProjectRequest::cpr_source_entry
CacheEntryPtr cpr_source_entry
The original mod to copy files from.
Definition: CacheSystem.h:211
ActorManager.h
Actor.h
RoR::CreateProjectRequest::cpr_name
std::string cpr_name
Directory and also the mod file (without extension).
Definition: CacheSystem.h:209
RoR::App::GetScriptEngine
ScriptEngine * GetScriptEngine()
Definition: Application.cpp:283
RoR::Terrain::getTerrainName
std::string getTerrainName() const
Definition: Terrain.cpp:579
RoR::GfxScene::GetSceneManager
Ogre::SceneManager * GetSceneManager()
Definition: GfxScene.h:69
RoR::ScriptEngine::getFunctionByDeclAndLogCandidates
AngelScript::asIScriptFunction * getFunctionByDeclAndLogCandidates(ScriptUnitID_t nid, GetFuncFlags_t flags, const std::string &funcName, const std::string &fmtFuncDecl)
Finds a function by full declaration, and if not found, finds candidates by name and logs them to Ang...
Definition: ScriptEngine.cpp:759
RoR::ActorSpawnRequest
Definition: SimData.h:812
RoR::GameContext::GetRaceSystem
RaceSystem & GetRaceSystem()
Definition: GameContext.h:169
RoR::SoundManager::createSound
SoundPtr createSound(Ogre::String filename, Ogre::String resource_group_name="")
Definition: SoundManager.cpp:354
RoR::ActorManager::GetTotalTime
float GetTotalTime() const
Definition: ActorManager.h:95
RoR::GameContext::SpawnActor
ActorPtr SpawnActor(ActorSpawnRequest &rq)
Definition: GameContext.cpp:193
RoR::IWater::UpdateWater
virtual void UpdateWater()=0
RoR::LT_Boat
@ LT_Boat
Definition: Application.h:313
RoR::MSG_NET_REFRESH_SERVERLIST_SUCCESS
@ MSG_NET_REFRESH_SERVERLIST_SUCCESS
Payload = GUI::MpServerInfoVec* (owner)
Definition: Application.h:106
RoR::App::mp_state
CVar * mp_state
Definition: Application.cpp:115
RoR::FreeForceRequest::ffr_force_const_direction
Ogre::Vector3 ffr_force_const_direction
Definition: SimData.h:795
RoR::MSG_GUI_DOWNLOAD_FINISHED
@ MSG_GUI_DOWNLOAD_FINISHED
Definition: Application.h:145
RoR::GUI::TopMenubar::ai_speed
int ai_speed
Definition: GUI_TopMenubar.h:73
RoR::ActorModifyRequest::amr_actor
ActorInstanceID_t amr_actor
Definition: SimData.h:870
RoR::LT_Truck
@ LT_Truck
Definition: Application.h:311
RoR::LoadScriptRequest::lsr_category
ScriptCategory lsr_category
Definition: ScriptEngine.h:96
RoR::MSG_NET_FETCH_AI_PRESETS_FAILURE
@ MSG_NET_FETCH_AI_PRESETS_FAILURE
Description = message.
Definition: Application.h:112
RoR::ActorSpawnRequest::asr_config
Ogre::String asr_config
Definition: SimData.h:831
RoR::MapToScriptArray
AngelScript::CScriptArray * MapToScriptArray(std::map< T, U > &map, const std::string &decl)
Definition: ScriptUtils.h:60
RoR::CameraManager::GetCamera
Ogre::Camera * GetCamera()
Definition: CameraManager.h:64
RoR::InputEngine::getMouseNormalizedScreenPos
Ogre::Vector2 getMouseNormalizedScreenPos()
Returns XY position in range from 0 (top/left) to 1 (bottom/right)
Definition: InputEngine.cpp:1714
RoR::ActorInstanceID_t
int ActorInstanceID_t
Unique sequentially generated ID of an actor in session. Use ActorManager::GetActorById()
Definition: ForwardDeclarations.h:38
RoR::RaceSystem::StopRaceTimer
void StopRaceTimer()
Definition: RaceSystem.cpp:53
RoRnet::MSG2_GAME_CMD
@ MSG2_GAME_CMD
Script message. Can be sent in both directions.
Definition: RoRnet.h:56
RoR::CVar::getStr
std::string const & getStr() const
Definition: CVar.h:95
RoR::ScriptEngine::variableExists
ScriptRetCode_t variableExists(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Adds a global variable to the script.
Definition: ScriptEngine.cpp:640
RoR::FreeForceRequest::ffr_base_node
int64_t ffr_base_node
Definition: SimData.h:793
RoR::CacheSystem::FindEntryByFilename
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,...
Definition: CacheSystem.cpp:186
ScriptRayQueryListener::ray
Ogre::Ray ray
Definition: GameScript.cpp:1412
RoR::Actor::ar_engine
EnginePtr ar_engine
Definition: Actor.h:379
RoR::Terrain::getHeightAt
float getHeightAt(float x, float z)
Definition: Terrain.cpp:505
RoR::Character::move
void move(Ogre::Vector3 offset)
Definition: Character.cpp:401
RoR::ActorModifyRequest
Definition: SimData.h:852
RoR::Engine::getRPM
float getRPM()
Definition: Engine.h:94
RoR::ScriptUnit::scriptName
Ogre::String scriptName
Name of the '.as' file exclusively.
Definition: ScriptEngine.h:85
RoR::MSG_SIM_SEAT_PLAYER_REQUESTED
@ MSG_SIM_SEAT_PLAYER_REQUESTED
Payload = RoR::ActorPtr (owner) | nullptr.
Definition: Application.h:124
CacheSystem.h
A database of user-installed content alias 'mods' (vehicles, terrains...)
RoR::ActorPtrVec
std::vector< ActorPtr > ActorPtrVec
Definition: ForwardDeclarations.h:243
CurlHelpers.h
RoR::GUI::TopMenubar::ai_times
int ai_times
Definition: GUI_TopMenubar.h:74
RoR::ActorSpawnRequest::asr_cache_entry
CacheEntryPtr asr_cache_entry
Optional, overrides 'asr_filename' and 'asr_cache_entry_num'.
Definition: SimData.h:829
ScriptEngine.h
RoR::World2ScreenConverter
< Keeps data close for faster access.
Definition: Utils.h:82
RoR::ScriptUnit::scriptCategory
ScriptCategory scriptCategory
Definition: ScriptEngine.h:76
RoR::GameContext::PushMessage
void PushMessage(Message m)
Doesn't guarantee order! Use ChainMessage() if order matters.
Definition: GameContext.cpp:66
RoR::Terrain::getGeometryManager
TerrainGeometryManager * getGeometryManager()
Definition: Terrain.h:78
ChatSystem.h
RoR::App::sim_terrain_name
CVar * sim_terrain_name
Definition: Application.cpp:97
RoR::FreeForceID_t
int FreeForceID_t
Unique sequentially generated ID of FreeForce; use ActorManager::GetFreeForceNextId().
Definition: ForwardDeclarations.h:67
RoR::Terrain::GetCollisions
Collisions * GetCollisions()
Definition: Terrain.h:85
RoR::FreeForceRequest::ffr_target_coords
Ogre::Vector3 ffr_target_coords
Definition: SimData.h:796
GfxScene.h
PlatformUtils.h
Platform-specific utilities. We use narrow UTF-8 encoded strings as paths. Inspired by http://utf8eve...
RoR::MSG_NET_REFRESH_REPOLIST_FAILURE
@ MSG_NET_REFRESH_REPOLIST_FAILURE
Payload = RoR::CurlFailInfo* (owner)
Definition: Application.h:110
Character.h
RoR::MSG_GUI_OPEN_SELECTOR_REQUESTED
@ MSG_GUI_OPEN_SELECTOR_REQUESTED
Payload = LoaderType* (owner), Description = GUID | empty.
Definition: Application.h:139
RoR::LT_Vehicle
@ LT_Vehicle
Definition: Application.h:310
RoR::LT_Trailer
@ LT_Trailer
Definition: Application.h:315
RoR::MSG_SIM_HIDE_NET_ACTOR_REQUESTED
@ MSG_SIM_HIDE_NET_ACTOR_REQUESTED
Payload = ActorPtr* (owner)
Definition: Application.h:126
RoR::SoundScriptManager::createInstance
SoundScriptInstancePtr createInstance(Ogre::String templatename, int actor_id, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1)
Definition: SoundScriptManager.cpp:356
RoR::LoaderType
LoaderType
< Search mode for ModCache::Query() & Operation mode for GUI::MainSelector
Definition: Application.h:306
RoR::MSG_SIM_ADD_FREEFORCE_REQUESTED
@ MSG_SIM_ADD_FREEFORCE_REQUESTED
Payload = RoR::FreeForceRequest* (owner)
Definition: Application.h:133
RoR::MsgType
MsgType
Global gameplay message loop, see struct Message in GameContext.h.
Definition: Application.h:74
RoR::GUI::TopMenubar::ai_skin
std::string ai_skin
Definition: GUI_TopMenubar.h:81
RoR::App::GetConsole
Console * GetConsole()
Definition: Application.cpp:274
RoR::MSG_NET_OPEN_RESOURCE_SUCCESS
@ MSG_NET_OPEN_RESOURCE_SUCCESS
Payload = GUI::ResourcesCollection* (owner)
Definition: Application.h:109
SoundScriptManager.h
RoR::MSG_APP_MODCACHE_LOAD_REQUESTED
@ MSG_APP_MODCACHE_LOAD_REQUESTED
Definition: Application.h:89
RoR::Message::payload
void * payload
Definition: GameContext.h:59
RoR::GameContext::GetActorRemotelyReceivingCommands
const ActorPtr & GetActorRemotelyReceivingCommands()
Definition: GameContext.h:137
RoR::App::GetGameContext
GameContext * GetGameContext()
Definition: Application.cpp:284
GameScript.h
RoR::Character::getPosition
Ogre::Vector3 getPosition()
Definition: Character.cpp:92
RoR::FreeForceRequest::ffr_force_magnitude
double ffr_force_magnitude
Definition: SimData.h:791
RoR::MSG_NET_REFRESH_REPOLIST_SUCCESS
@ MSG_NET_REFRESH_REPOLIST_SUCCESS
Payload = GUI::ResourcesCollection* (owner)
Definition: Application.h:108
RoRVersion.h
RoR::TerrainObjectManager::GetEditorObjects
TerrainEditorObjectPtrVec & GetEditorObjects()
Definition: TerrainObjectManager.h:66
RoR::ActorSpawnRequest::asr_skin_entry
CacheEntryPtr asr_skin_entry
Definition: SimData.h:835
RoR::LoadScriptRequest
Definition: ScriptEngine.h:92
ROR_VERSION_STRING
const char *const ROR_VERSION_STRING
RoR::MSG_SIM_TELEPORT_PLAYER_REQUESTED
@ MSG_SIM_TELEPORT_PLAYER_REQUESTED
Payload = Ogre::Vector3* (owner)
Definition: Application.h:125
RoR::Message::description
std::string description
Definition: GameContext.h:58
RoR::RaceSystem::StartRaceTimer
void StartRaceTimer(int id)
Definition: RaceSystem.cpp:46
RoR::CurlTaskContext::ctc_url
std::string ctc_url
Definition: CurlHelpers.h:37
RoR::GUIManager::TopMenubar
GUI::TopMenubar TopMenubar
Definition: GUIManager.h:131
RoR::GUI::TopMenubar::ai_sectionconfig2
Ogre::String ai_sectionconfig2
Definition: GUI_TopMenubar.h:91
RoR::MSG_EDI_LOAD_BUNDLE_REQUESTED
@ MSG_EDI_LOAD_BUNDLE_REQUESTED
Payload = RoR::CacheEntryPtr* (owner)
Definition: Application.h:152
RoR::GUIManager::ShowMessageBox
void ShowMessageBox(const char *title, const char *text, bool allow_close=true, const char *btn1_text="OK", const char *btn2_text=nullptr)
Definition: GUIManager.cpp:454
RoR::MSG_NET_CONNECT_SUCCESS
@ MSG_NET_CONNECT_SUCCESS
Definition: Application.h:100
RoR::CreateProjectRequest
Creates subdirectory in 'My Games\Rigs of Rods\projects', pre-populates it with files and adds modcac...
Definition: CacheSystem.h:204
RoR::ScriptUnit::scriptHash
Ogre::String scriptHash
Definition: ScriptEngine.h:86
RoR::MSG_NET_FETCH_AI_PRESETS_SUCCESS
@ MSG_NET_FETCH_AI_PRESETS_SUCCESS
Description = JSON string.
Definition: Application.h:111
RoR::App::GetCacheSystem
CacheSystem * GetCacheSystem()
Definition: Application.cpp:276
RoR::GETFUNC_DEFAULTEVENTCALLBACK_SIGFMT
const std::string GETFUNC_DEFAULTEVENTCALLBACK_SIGFMT
Definition: ScriptEngine.h:114
RoR::Sha1Hash
std::string Sha1Hash(std::string const &data)
Definition: Utils.cpp:141
RoR::CacheSystem::FetchSkinByName
CacheEntryPtr FetchSkinByName(std::string const &skin_name)
Definition: CacheSystem.cpp:1673
RoR::GUI::TopMenubar::ai_mode
int ai_mode
Definition: GUI_TopMenubar.h:84
RoR::CurlTaskContext::ctc_displayname
std::string ctc_displayname
Definition: CurlHelpers.h:36
instance
or anywhere else will not be considered a but parsed as regular data ! Each line is treated as values separated by separators Possible i e animators Multiline description Single instance
Definition: ReadMe.txt:53
RoR::FreeForceRequest
Common for ADD and MODIFY requests; tailored for use with AngelScript thru GameScript::pushMessage().
Definition: SimData.h:784
RoR::ScriptEngine::getVariable
ScriptRetCode_t getVariable(const Ogre::String &varName, void *ref, int typeID, ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Retrieves a global variable from any running script.
Definition: ScriptEngine.cpp:676
RoR::GETFUNCFLAG_REQUIRED
const GetFuncFlags_t GETFUNCFLAG_REQUIRED
Always logs warning that function was not found.
Definition: ScriptEngine.h:110
RoR::ScriptEngine::addVariable
ScriptRetCode_t addVariable(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Adds a global variable to the script.
Definition: ScriptEngine.cpp:624
RoR::Message
Unified game event system - all requests and state changes are reported using a message.
Definition: GameContext.h:51
RoR::ScriptEngine::getScriptUnit
ScriptUnit & getScriptUnit(ScriptUnitID_t unique_id)
Definition: ScriptEngine.cpp:1102
RoR::MSG_GUI_OPEN_MENU_REQUESTED
@ MSG_GUI_OPEN_MENU_REQUESTED
Definition: Application.h:137
_L
#define _L
Definition: ErrorUtils.cpp:35
RoR::LT_None
@ LT_None
Definition: Application.h:308
RoR::ScriptUnit::uniqueId
ScriptUnitID_t uniqueId
Definition: ScriptEngine.h:75
RoR::ActorManager::SetTrucksForcedAwake
void SetTrucksForcedAwake(bool forced)
Definition: ActorManager.h:89
RoR::TerrainObjectManager::moveObjectVisuals
void moveObjectVisuals(const Ogre::String &instancename, const Ogre::Vector3 &pos)
Definition: TerrainObjectManager.cpp:489
RoR::MSG_SIM_SPAWN_ACTOR_REQUESTED
@ MSG_SIM_SPAWN_ACTOR_REQUESTED
Payload = RoR::ActorSpawnRequest* (owner)
Definition: Application.h:121
RoR::App::GetInputEngine
InputEngine * GetInputEngine()
Definition: Application.cpp:275
ScriptRayQueryListener::results_array
std::vector< Ogre::MovableObject * > results_array
Definition: GameScript.cpp:1413
RoR::Engine::setRPM
void setRPM(float rpm)
Definition: Engine.cpp:918
RoR::ActorPtr
RefCountingObjectPtr< Actor > ActorPtr
Definition: ForwardDeclarations.h:225
RoR::MSG_NET_CONNECT_FAILURE
@ MSG_NET_CONNECT_FAILURE
Definition: Application.h:101
RoR::MSG_SIM_DELETE_ACTOR_REQUESTED
@ MSG_SIM_DELETE_ACTOR_REQUESTED
Payload = RoR::ActorPtr* (owner)
Definition: Application.h:123
RoR::Terrain::getGravity
float getGravity() const
Definition: Terrain.h:99
RoR::LT_AllBeam
@ LT_AllBeam
Definition: Application.h:320
RoR::MSG_APP_SCRIPT_THREAD_STATUS
@ MSG_APP_SCRIPT_THREAD_STATUS
Payload = RoR::ScriptEventArgs* (owner)
Definition: Application.h:94
RoR::ScriptEngine::functionExists
ScriptRetCode_t functionExists(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Checks if a global function exists.
Definition: ScriptEngine.cpp:568
RoR::MSG_EDI_MODIFY_GROUNDMODEL_REQUESTED
@ MSG_EDI_MODIFY_GROUNDMODEL_REQUESTED
Payload = RoR::ground_model_t* (weak)
Definition: Application.h:149
Terrain.h
RoR::GameContext::ShowLoaderGUI
void ShowLoaderGUI(int type, const Ogre::String &instance, const Ogre::String &box)
Definition: GameContext.cpp:660
BitMask_t
uint32_t BitMask_t
Definition: BitFlags.h:7
Ogre
Definition: ExtinguishableFireAffector.cpp:35
ScriptUtils.h
RoR::CurlTaskContext
Definition: CurlHelpers.h:34
RoR::Actor::ar_design_name
Ogre::String ar_design_name
Name of the vehicle/machine/object this actor represents.
Definition: Actor.h:353
RoR::MSG_SIM_UNHIDE_NET_ACTOR_REQUESTED
@ MSG_SIM_UNHIDE_NET_ACTOR_REQUESTED
Payload = ActorPtr* (owner)
Definition: Application.h:127
RoR::ActorManager::RepairActor
void RepairActor(Collisions *collisions, const Ogre::String &inst, const Ogre::String &box, bool keepPosition=false)
Definition: ActorManager.cpp:828
RoR::MSG_APP_UNLOAD_SCRIPT_REQUESTED
@ MSG_APP_UNLOAD_SCRIPT_REQUESTED
Payload = RoR::ScriptUnitId_t* (owner)
Definition: Application.h:93
RoR::ScriptUnitID_t
int ScriptUnitID_t
Unique sequentially generated ID of a loaded and running scriptin session. Use ScriptEngine::getScrip...
Definition: ForwardDeclarations.h:41
RoR::FreeForceRequest::ffr_id
int64_t ffr_id
Definition: SimData.h:789
RoR::ActorSpawnRequest::asr_position
Ogre::Vector3 asr_position
Definition: SimData.h:832
RoR::IWater::SetStaticWaterHeight
virtual void SetStaticWaterHeight(float value)=0
RoR::Actor::ar_filehash
std::string ar_filehash
Attribute; filled at spawn.
Definition: Actor.h:424
RoR::GUI::TopMenubar::ai_sectionconfig
Ogre::String ai_sectionconfig
Definition: GUI_TopMenubar.h:80
RoR::ActorManager::WakeUpAllActors
void WakeUpAllActors()
Definition: ActorManager.cpp:785
RoR::MSG_NET_CONNECT_PROGRESS
@ MSG_NET_CONNECT_PROGRESS
Definition: Application.h:99
Collisions.h
RoR::MSG_SIM_MODIFY_FREEFORCE_REQUESTED
@ MSG_SIM_MODIFY_FREEFORCE_REQUESTED
Payload = RoR::FreeForceRequest* (owner)
Definition: Application.h:134
RoR::ScriptUnit::scriptBuffer
Ogre::String scriptBuffer
Definition: ScriptEngine.h:87
RoR::ScriptUnit::scriptModule
AngelScript::asIScriptModule * scriptModule
Definition: ScriptEngine.h:78
RoR::GameContext::GetPlayerActor
const ActorPtr & GetPlayerActor()
Definition: GameContext.h:134
RoR::AI
@ AI
machine controlled by an Artificial Intelligence
Definition: SimData.h:96
RoR::ActorSpawnRequest::asr_instance_id
ActorInstanceID_t asr_instance_id
Optional; see ActorManager::GetActorNextInstanceID();.
Definition: SimData.h:828
ScriptRayQueryListener::queryResult
bool queryResult(SceneQuery::WorldFragment *fragment, Real distance) override
Definition: GameScript.cpp:1421
RoR::MSG_SIM_LOAD_SAVEGAME_REQUESTED
@ MSG_SIM_LOAD_SAVEGAME_REQUESTED
Definition: Application.h:119
RoR::Network::AddPacket
void AddPacket(int streamid, int type, int len, const char *content)
Definition: Network.cpp:608
RoR::ActorModifyRequest::amr_type
Type amr_type
Definition: SimData.h:871
RoR::ActorSpawnRequest::asr_rotation
Ogre::Quaternion asr_rotation
Definition: SimData.h:833
RoR::RaceSystem::SetRaceTimeDiff
void SetRaceTimeDiff(float diff)
Definition: RaceSystem.h:41
RoR::FreeForceRequest::ffr_type
int64_t ffr_type
Definition: SimData.h:790
RoR::TerrainEditorObject
Represents an instance of static terrain object (.ODEF file format)
Definition: TerrainEditor.h:35
RoR
Definition: AppContext.h:36
RoR::ScriptEngine::deleteFunction
ScriptRetCode_t deleteFunction(const Ogre::String &arg, const ScriptUnitID_t nid=SCRIPTUNITID_DEFAULT)
Deletes a global function from the script.
Definition: ScriptEngine.cpp:581
Network.h
RoR::ActorManager::GetActorById
const ActorPtr & GetActorById(ActorInstanceID_t actor_id)
Definition: ActorManager.cpp:1132
x
float x
Definition: (ValueTypes) quaternion.h:5
RoR::CurlTaskContext::ctc_msg_success
MsgType ctc_msg_success
Definition: CurlHelpers.h:40
RoR::ActorSpawnRequest::asr_enter
bool asr_enter
Definition: SimData.h:846
Water.h
RoR::App::GetGfxScene
GfxScene * GetGfxScene()
Definition: Application.cpp:280
RoR::GameContext::GetActorManager
ActorManager * GetActorManager()
Definition: GameContext.h:127
RoR::ActorModifyRequest::Type
Type
Definition: SimData.h:857
RoR::GameContext::FindActorByCollisionBox
ActorPtr FindActorByCollisionBox(std::string const &ev_src_instance_name, std::string const &box_name)
Definition: GameContext.cpp:605
RoR::LT_Train
@ LT_Train
Definition: Application.h:316
RoR::MSG_APP_SHUTDOWN_REQUESTED
@ MSG_APP_SHUTDOWN_REQUESTED
Definition: Application.h:85
RoR::GUI::TopMenubar::ai_distance
int ai_distance
Definition: GUI_TopMenubar.h:76
RoR::Terrain::getWater
IWater * getWater()
Definition: Terrain.h:86
RoR::TerrainGeometryManager::getTerrainGroup
Ogre::TerrainGroup * getTerrainGroup()
Definition: TerrainGeometryManager.h:46
RoR::Character::setRotation
void setRotation(Ogre::Radian rotation)
Definition: Character.cpp:98
RoR::FreeForceRequest::ffr_target_actor
int64_t ffr_target_actor
Definition: SimData.h:797
RoR::GameContext::GetTerrain
const TerrainPtr & GetTerrain()
Definition: GameContext.h:117