{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":28136359,"defaultBranch":"master","name":"rigs-of-rods","ownerLogin":"ohlidalp","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2014-12-17T12:29:00.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/491088?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1720386694.0","currentOid":""},"activityList":{"items":[{"before":"1244ef825d285168da9edd66c4cbb09ac7f4921c","after":null,"ref":"refs/heads/mswindows-unicode","pushedAt":"2024-07-07T21:11:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"0e4b5569d52eb37fdba4caf2306c39afc18adb3f","after":"b7cf315c9bdf219a7b4480980364f73fc606b55d","ref":"refs/heads/will_propanims","pushedAt":"2024-07-07T12:05:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":truck: New prop anim sources: `gear[reverse/neutral/#]`, `autoshifterlin`","shortMessageHtmlLink":"🚚 New prop anim sources: gear[reverse/neutral/#], autoshifterlin"}},{"before":null,"after":"de278f4a1bcb5c03f04c102843ab57f15e3c11e0","ref":"refs/heads/3162_Mike_invis-ties","pushedAt":"2024-07-04T18:20:41.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed ties failing to appear if invisible hooks are present\n\nFixes #3162\n\nProblem introduced by myself in 965d250ff983f0b184698c2ac869f2df6381bb83 - I named beam scene nodes explicitly, but the scheme I used allowed for repetition in case beam visuals were created and then destroyed again during spawn. Unfortunately, for 'hooks' we don't know the visibility flags beforehand so we must always create visuals and then delete them if not desirable.\n\nChanges:\n- ActorSpawner.cpp - function `CreateBeamVisuals()` - generate name based on unique beam number instead of the visual count.\n- GfxActor.cpp - function `RemoveBeam()` - properly dispose all OGRE objects when deleting beam visuals.","shortMessageHtmlLink":"🐛 Fixed ties failing to appear if invisible hooks are present"}},{"before":"79d9068ad9b79575f28c0dbb70a4178d43c038ee","after":"545a02049703dd07b391b6ea65e8aff93286baf3","ref":"refs/heads/freeforces","pushedAt":"2024-07-03T20:18:47.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":wrench: Scripting: removed dupl. code, using common helper.","shortMessageHtmlLink":"🔧 Scripting: removed dupl. code, using common helper."}},{"before":"7409958236b6b719edc02b931ce7e797e509baf4","after":"e0f8b62599bc4723cd6d688119eb82c124e21bde","ref":"refs/heads/3137_Miner34Dev_hydraxwaves","pushedAt":"2024-06-30T17:57:23.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed Basic water glitching out under Debug\n\nuninitialized variable :/","shortMessageHtmlLink":"🐛 Fixed Basic water glitching out under Debug"}},{"before":"62729bcd585011ab2e69fc9bb4bdef078c074e2c","after":null,"ref":"refs/heads/3145_extramodpath_fix","pushedAt":"2024-06-30T17:45:52.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":null,"after":"62729bcd585011ab2e69fc9bb4bdef078c074e2c","ref":"refs/heads/3145_extramodpath_fix","pushedAt":"2024-06-30T12:10:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed mods not loading from `app_extra_mod_path`\n\nFixes #3149\n\nProblem was caused by myself in 74ed1083cb9e53e38096ec96b6a7b1f0b237ce01 - apart from fixing the bug, I also made a cosmetic edit of resource group names - Instead of it being 'bundle $FULLPATH', I made it '{bundle $LOCALPATH}'. But I botched the code, causing exception \"invalid string position\" to be thrown.\n\nSolution: keep pretifying the resource group names, but account for all locations. I added a location-label to the name to avoid RG name clashes.\n* prepackaged mods, i.e. {bundle BIN:\\content\\simple2-terrain.zip}\n* extra mod path, i.e. {bundle EXTRA:\\DI_SportsCar.zip}\n* mod dirs under user profile, i.e. {bundle USER:\\mods\\vehicles\\Desperado.zip}","shortMessageHtmlLink":"🐛 Fixed mods not loading from app_extra_mod_path"}},{"before":"14017e13ec0b6ce91a1d57c066c596529a05105a","after":null,"ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-27T22:55:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"85116d294f8e73c3aab23ef4cafbbf191a0bde99","after":null,"ref":"refs/heads/193_Tscreen_commandlist","pushedAt":"2024-06-27T22:54:35.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"c0479026ce37944683692618bb65bbb889546efe","after":"14017e13ec0b6ce91a1d57c066c596529a05105a","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-23T22:36:44.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed 'L' not locking slidenodes.\n\nPROBLEM: typo (a copypaste derp) in GameContext.cpp\n\nADDITIONAL FIX: an assert() when loading Penguinville-TrolleyLine terrain. The blendmap info was incomplete (understandable since the terrain is meshed-only) and the game ended up reading bad memory. Fixed by adding a check for valid data which reports \"[RoR|Terrain] Page {}-{} has no blend layers defined, blendmap will not be set up.\" to RoR.log.","shortMessageHtmlLink":"🐛 Fixed 'L' not locking slidenodes."}},{"before":"58520dd7a5b3e1f46391f49fd35009e94d9d8a89","after":"c0479026ce37944683692618bb65bbb889546efe","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-23T22:34:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed 'L' not locking slidenodes.\n\nPROBLEM: typo (a copypaste derp) in GameContext.cpp\n\nADDITIONAL FIX: an assert() when loading Penguinville-TrolleyLine terrain. The blendmap info was incomplete (understandable since the game is meshed-only) and the game ended up reading bad memory. Fixed by adding a check for valid data which reports \"[RoR|Terrain] Page {}-{} has no blend layers defined, blendmap will not be set up.\" to RoR.log.","shortMessageHtmlLink":"🐛 Fixed 'L' not locking slidenodes."}},{"before":"2a6c7c60c95fd5c7df83d80e32a222c04b0547f2","after":"58520dd7a5b3e1f46391f49fd35009e94d9d8a89","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-23T21:35:22.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed hook/tie/rope glitches.\n\nPROBLEMS:\n* when you release a load from a hook (be it by pressing L or Hard-resetting), the skeletonview and physics paused states don't get reset. In 2022.12 it's the same except physicspause does get reset when unhooking by L (not by hardreset tho.).\n* when you release a load from ties using O key, skeleton view gets reset, but physics-pause does not. Also when you hard reset, everything remains dirty. 2022.12 behaves the same.\n* When you Hard-reset or delete a vehicle with hooks/ties attached, they are not removed correctly, causing a crash if re-attached. The `DisjoinInterActorBeams()` helper (used by SyncReset() and Actor destructor) was leaving data in inconsistent state - specifically, it properly removed the inter-beams themselves and linkage records (both the per-actor and global lists), but it didn't update the `tie_t/hook_t/rope_t` objects itself - these kept pointing to the deleted/reset actor.\n\nSOLUTIONS:\n* Remake the actor-linking code to track when 2 actors become linked/unlinked - and sync the sekeletonview & physicspause there.\n* Instead of employing custom code to do Hard-reset, extend the existing (old!) `hookToggle()/tieToggle()/ropeToggle()` funcs (used for regular locking/unlocking of those elements) to also do forced unlocking upon removing/SyncReset-ing an actor, and then modify `DisjoinInterActorBeams()` to use them.\n\nDEV NOTE:\nThis is quite a significant remake of actor-linking code; a direct follow-up to d36c4ecdd72d751f934b3a76b256578563bfb9d6 which introduced ✉✉ MSG_SIM_ACTOR_LINKING_REQUESTED. A remake was needed because there was no single spot to correctly reset the skeleton/physicspause on actor unlink - there was simply no concept of \"actors were just linked/unlinked\". While researching how to add it, I realized scripts may want to know when that happens, so I added a script event `SE_GENERIC_TRUCK_LINKING_CHANGED` for it. Keep in mind there can be multiple interlinking beams at the same time, so not every added/removed beam means linking changes. The new event also helps navigate the codebase and documents how stuff works.\n\nCODECHANGES:\n* SimData.h: the ActorLinkingRequestType enum was merged with HookAction enum and got new fields: HOOK_RESET, TIE_RESET, ROPE_RESET - the `DisjoinInterActorBeams()` function now uses these.\n* Actor.h: `hookToggle()/tieToggle()/ropeToggle()` funcs got new parameter `forceunlock_filter` and all now accept ActorLinkingRequestType param;\n* Actor.cpp: `SyncReset()` no longer manipulates beams/hooks/ties/ropes directly - that's all done by the extended `DisjoinInterActorBeams()`.\n* ScriptEvents.h - added SE_GENERIC_TRUCK_LINKING_CHANGED\n* All other files are just fallout from changes above.","shortMessageHtmlLink":"🐛 Fixed hook/tie/rope glitches."}},{"before":"767cb326e2057159c429bce3c3447b5eac634fe0","after":"2a6c7c60c95fd5c7df83d80e32a222c04b0547f2","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-23T21:20:19.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed hook/tie/rope glitches.\n\nPROBLEMS:\n* when you release a load from a hook (be it by pressing L or Hard-resetting), the skeletonview and physics paused states don't get reset. In 2022.12 it's the same except physicspause does get reset when unhooking by L (not by hardreset tho.).\n* when you release a load from ties using O key, skeleton view gets reset, but physics-pause does not. Also when you hard reset, everything remains dirty. 2022.12 behaves the same.\n* When you Hard-reset or delete a vehicle with hooks/ties attached, they are not removed correctly, causing a crash if re-attached. The `DisjoinInterActorBeams()` helper (used by SyncReset() and Actor destructor) was leaving data in inconsistent state - specifically, it properly removed the inter-beams themselves and linkage records (both the per-actor and global lists), but it didn't update the `tie_t/hook_t/rope_t` objects itself - these kept pointing to the deleted/reset actor.\n\nSOLUTIONS:\n* Remake the actor-linking code to track when 2 actors become linked/unlinked - and sync the sekeletonview & physicspause there.\n* Instead of employing custom code to do Hard-reset, extend the existing (old!) `hookToggle()/tieToggle()/ropeToggle()` funcs (used for regular locking/unlocking of those elements) to also do forced unlocking upon removing/SyncReset-ing an actor, and then modify `DisjoinInterActorBeams()` to use them.\n\nDEV NOTE:\nThis is quite a significant remake of actor-linking code; a direct follow-up to d36c4ecdd72d751f934b3a76b256578563bfb9d6 which introduced ✉✉ MSG_SIM_ACTOR_LINKING_REQUESTED. A remake was needed because there was no single spot to correctly reset the skeleton/physicspause on actor unlink - there was simply no concept of \"actors were just linked/unlinked\". While researching how to add it, I realized scripts may want to know when that happens, so I added a script event `SE_GENERIC_TRUCK_LINKING_CHANGED` for it. Keep in mind there can be multiple interlinking beams at the same time, so not every added/removed beam means linking changes. The new event also helps navigate the codebase and documents how stuff works.\n\nCODECHANGES:\n* SimData.h: the ActorLinkingRequestType enum was merged with HookAction enum and got new fields: HOOK_RESET, TIE_RESET, ROPE_RESET - the `DisjoinInterActorBeams()` function now uses these.\n* Actor.h: `hookToggle()/tieToggle()/ropeToggle()` funcs got new parameter `forceunlock_filter` and all now accept ActorLinkingRequestType param;\n* Actor.cpp: `SyncReset()` no longer manipulates beams/hooks/ties/ropes directly - that's all done by the extended `DisjoinInterActorBeams()`.\n* ScriptEvents.h - added SE_GENERIC_TRUCK_LINKING_CHANGED\n* All other files are just fallout from changes above.","shortMessageHtmlLink":"🐛 Fixed hook/tie/rope glitches."}},{"before":null,"after":"85116d294f8e73c3aab23ef4cafbbf191a0bde99","ref":"refs/heads/193_Tscreen_commandlist","pushedAt":"2024-06-21T17:46:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed #193 faulty/incomplete command list UI","shortMessageHtmlLink":"🐛 Fixed RigsOfRods#193 faulty/incomplete command list UI"}},{"before":"c017ad809d55423347c2cfefb9f7a905a6d89704","after":"767cb326e2057159c429bce3c3447b5eac634fe0","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-20T21:51:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed hook/tie/rope glitches.\n\nPROBLEMS:\n* when you release a load from a hook (be it by pressing L or Hard-resetting), the skeletonview and physics paused states don't get reset. In 2022.12 it's the same except physicspause does get reset when unhooking by L (not by hardreset tho.).\n* when you release a load from ties using O key, skeleton view gets reset, but physics-pause does not. Also when you hard reset, everything remains dirty. 2022.12 behaves the same.\n* When you Hard-reset or delete a vehicle with hooks/ties attached, they are not removed correctly, potentially causing a crash. The `DisjoinInterActorBeams()` helper (used by SyncReset() and Actor destructor) was leaving data in inconsistent state - specifically, it properly removed the inter-beams themselves and linkage records (both the per-actor and global lists), but it didn't update the `tie_t/hook_t/rope_t` objects itself - these kept pointing to the deleted/reset actor.\n\nSOLUTIONS:\n* Remake the actor-linking code to track when 2 actors become linked/unlinked - and sync the sekeletonview & physicspause there.\n* Instead of employing custom code to do Hard-reset, extend the existing (old!) `hookToggle()/tieToggle()/ropeToggle()` funcs (used for regular locking/unlocking of those elements) to also do forced unlocking upon removing/SyncReset-ing an actor, and then modify `DisjoinInterActorBeams()` to use them.\n\nDEV NOTE:\nThis is quite a significant remake of actor-linking code; a direct follow-up to d36c4ecdd72d751f934b3a76b256578563bfb9d6 which introduced ✉️ MSG_SIM_ACTOR_LINKING_REQUESTED. A remake was needed because there was no single spot to correctly reset the skeleton/physicspause on actor unlink - there was simply no concept of \"actors were just linked/unlinked\". While researching how to add it, I realized scripts may want to know when that happens, so I added a script event `SE_GENERIC_TRUCK_LINKING_CHANGED` for it. Keep in mind there can be multiple interlinking beams at the same time, so not every added/removed beam means linking changes. The new event also helps navigate the codebase and documents how stuff works.\n\nCODECHANGES:\n* Functions `[Add/Remove]InterActorBeam()` moved from Actor.cpp to ActorManager.cpp and signifficantly rewritten, adding a lot of safety checks.\n* SimData.h: the ActorLinkingRequestType enum was merged with HookAction enum and got new fields: HOOK_RESET, TIE_RESET, ROPE_RESET\n* Actor.h: `hookToggle()/tieToggle()/ropeToggle()` funcs got new parameter `forceunlock_filter` and all now accept ActorLinkingRequestType param; deleted func DetermineLinkedActors() as no longer needed for `DisjoinInterActorBeams()`\n* ScriptEvents.h - added SE_GENERIC_TRUCK_LINKING_CHANGED\n* All other files are just fallout from changes above.","shortMessageHtmlLink":"🐛 Fixed hook/tie/rope glitches."}},{"before":"ebfb60debc6ee2a22d7dd860e65e1b5c2d41ae01","after":"c017ad809d55423347c2cfefb9f7a905a6d89704","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-19T00:22:36.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":"Reverted the `SyncLinkedActors()` commit which caused #3105\n\nThis reverts commit 9431e1b508575c40498ed9becd8a0385a3b95463 where I tried to tidy-up duplicate syncing code but oversimplified the logic to reset unlinked actors. As result, the physics paused state and skeletonview state could only be active on player's actor and connected actor, not on any free standing one.","shortMessageHtmlLink":"Reverted the SyncLinkedActors() commit which caused RigsOfRods#3105"}},{"before":"46c6bf0758ab5f7ad085acea57bf6a5692664f58","after":"ebfb60debc6ee2a22d7dd860e65e1b5c2d41ae01","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-18T03:57:40.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed tied loads moving too fast in LiveRepair mode.\n\nMystery solved: why did this only manifest when using ties (Mike's scenario) and not hook (my initial scenario)? The reason is - by accident, the movement sync between the crane and the load was done once for each interconnecting beam, instead of once per actor pair. And because there's always just one hook beam, but there may be multiple ties (in this case 4), the load moved faster (4x in this case).\n\nFixed by adding a cache of unique actor pairs, and updating it each time linking changes.","shortMessageHtmlLink":"🐛 Fixed tied loads moving too fast in LiveRepair mode."}},{"before":null,"after":"79d9068ad9b79575f28c0dbb70a4178d43c038ee","ref":"refs/heads/freeforces","pushedAt":"2024-06-17T17:20:54.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":angel:Script: FreeForces :muscle:\n\nFreeForces are global, persistent forces which act upon one node of one actor each. They exist separately from actors and their existing hook/tie/rope interactions. This means they do not interfere with actor N/B or any of the existing linking logic. They're intended for creating special physics effects which aren't supported otherwise, like making party baloons float. They're intentionally only accessible from scripts to maximize their flexibility and limit maintenance of the codebase.\n\nKeep in mind that the physics simulation runs at 2khz (2000 steps per second), while scripts run in sync with FPS. That's why there's no option to add temporary/one-off force impulses from scripts - you are responsible for adding the persistent force, monitoring and adjusting it as needed, and then removing it when no longer necessary. You can create the forces as dummy and then change their type later as needed.\n\nTo manage FreeForces, you use `game.pushMessage()` with `MSG_SIM_ADD_FREEFORCE_REQUESTED`, `MSG_SIM_MODIFY_FREEFORCE_REQUESTED` or `MSG_SIM_REMOVE_FREEFORCE_REQUESTED`.\nParameters common to ADD/MODIFY requests:\n* 'id' (int) - unique ID of this freeforce, use `game.getFreeForceNextId()` to obtain an unique sequential ID.\n* 'type' (FreeForceType) - One of `FREEFORCETYPE_DUMMY`, `FREEFORCETYPE_CONSTANT`, `FREEFORCETYPE_TOWARDS_COORDS`, `FREEFORCETYPE_TOWARDS_NODE`\n* 'base_actor' (int) - Unique actor instance ID, obtain it by `game.getCurrentTruck().getInstanceId()`, or if you're in an actor-script, then you can do `thisActor.getInstanceId()` // `BeamClass@ thisActor`is automatic global variable for scripts bound to actors.\n* 'base_node' (int) - Node number (0 - 65535)\n* 'force_magnitude' (float) - the amount of force to apply, in Newton/meters\nParameters for `FREEFORCETYPE_CONSTANT`:\n* 'force_const_direction' (vector3) - constant force direction. Note that Y=up, so to make things float, use vector3(0, 1, 0).\nParameters for `FREEFORCETYPE_TOWARDS_COORDS`:\n* 'target_coords' (vector3) - world position to target. For example `game.getPersonPosition()` will target it at position where character is standing AT THE MOMENT.\nParameters for `FREEFORCETYPE_TOWARDS_NODE`:\n* 'target_actor' (int) - Unique actor instance ID.\n* 'target_node' (int) - Node number (0 - 65535).\n\nNote when any of the actors involved in a FreeForce (be it the base one or target one), the freeforce is deleted.\n\nExample from the PartyBaloon demo mod:\n```\n // Create the up-force\n upforce_assigned_id = game.getFreeForceNextId();\n game.pushMessage(MSG_SIM_ADD_FREEFORCE_REQUESTED, {\n {'id', upforce_assigned_id },\n {'type', FREEFORCETYPE_CONSTANT },\n {'base_actor', thisActor.getInstanceId() }, // `BeamClass@ thisActor`is automatic global variable for scripts bound to actors.\n {'base_node', UPFORCE_NODE },\n {'force_const_direction', vector3(0, 1, 0) }, // Y=up\n {'force_magnitude', 0.4f } // Newton/meters\n });\n```","shortMessageHtmlLink":"👼Script: FreeForces 💪"}},{"before":"4017d5d11721876269c54059497dd358847f0404","after":null,"ref":"refs/heads/exception_hardening","pushedAt":"2024-06-17T17:19:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"3302121d907555acb21101876209d82efcffd0f6","after":"4017d5d11721876269c54059497dd358847f0404","ref":"refs/heads/exception_hardening","pushedAt":"2024-06-16T22:15:00.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed crash when `MODIFY_ACTOR` targets nonexistent actor.\n\nThis crash happened to me repeatedly when I removed an actor which was constantly exploding and resetting - apparently the MODIFY_ACTOR was queued when DELETE_ACTOR was already in queue.","shortMessageHtmlLink":"🐛 Fixed crash when MODIFY_ACTOR targets nonexistent actor."}},{"before":"35f93cbbf559c67852ec3f09984841dfff0b72f3","after":"3302121d907555acb21101876209d82efcffd0f6","ref":"refs/heads/exception_hardening","pushedAt":"2024-06-15T14:37:31.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":"TopMenubar UI: fixed `assert()` in RapidJson (not an Array)","shortMessageHtmlLink":"TopMenubar UI: fixed assert() in RapidJson (not an Array)"}},{"before":"6aca7b3cf8923124bb681c18a47742eb071738ac","after":null,"ref":"refs/heads/cooldude7dev_rendermodes","pushedAt":"2024-06-15T10:53:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"13120c12ff514fec3483683fb286c243d33bfca9","after":"46c6bf0758ab5f7ad085acea57bf6a5692664f58","ref":"refs/heads/3105_Mike_physicsPaused","pushedAt":"2024-06-13T23:45:22.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":bug: Fixed `SyncReset()` corrupting other actor's inter-beams.\n\nPROBLEM: The `DisjoinInterActorBeams()` helper (used by SyncReset() and Actor destructor) was leaving data in inconsistent state - specifically, it properly removed the inter-beams themselves and linkage records (both the per-actor and global lists), but it didn't update the `tie_t/hook_t/rope_t` objects itself - these kept pointing to the deleted/reset actor.\n\nSOLUTION: Extend the existing (old!) `hookToggle()/tieToggle()/ropeToggle()` funcs (used for regular locking/unlocking of those elements) to also do forced unlocking upon removing/SyncReset-ing an actor, and then modify `DisjoinInterActorBeams()` to use them.\n\nCODECHANGES:\n* SimData.h: the ActorLinkingRequestType enum was merged with HookAction enum and got new fields: HOOK_FORCE_UNLOCK, TIE_FORCE_UNLOCK, ROPE_FORCE_UNLOCK\n* Actor.h: `hookToggle()/tieToggle()/ropeToggle()` funcs got new parameter `forceunlock_filter` and all now accept ActorLinkingRequestType param; deleted func DetermineLinkedActors() as no longer needed for `DisjoinInterActorBeams()`\n* All other files are just fallout from changes above.","shortMessageHtmlLink":"🐛 Fixed SyncReset() corrupting other actor's inter-beams."}},{"before":"4c5e0668746505fb8a96fb62d977247bcbccbdea","after":null,"ref":"refs/heads/anim_source_dashboard","pushedAt":"2024-06-01T20:43:37.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"f10863469c80bd07be4f5165b5940a20b5413456","after":null,"ref":"refs/heads/addon_API","pushedAt":"2024-06-01T20:35:15.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"082b63dcb73630171e2658044426447c195222d7","after":null,"ref":"refs/heads/example_nodehighlights","pushedAt":"2024-06-01T19:14:28.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"0282e92209a026dbe2dc165910ba2420488b1b52","after":null,"ref":"refs/heads/Mike_managed-mat-tweaks","pushedAt":"2024-06-01T17:12:19.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"}},{"before":"83cc783c9a16f11f61936b9983c1dfbc3214aae6","after":"082b63dcb73630171e2658044426447c195222d7","ref":"refs/heads/example_nodehighlights","pushedAt":"2024-05-30T11:49:42.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":":scroll: example_ImGui_nodeHighlight.as: added node selection.","shortMessageHtmlLink":"📜 example_ImGui_nodeHighlight.as: added node selection."}},{"before":"0d89042354b9bc2201043163217e48d79e6ddc2a","after":"0282e92209a026dbe2dc165910ba2420488b1b52","ref":"refs/heads/Mike_managed-mat-tweaks","pushedAt":"2024-05-30T08:55:53.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":"Code change: added missing MsgType text labels","shortMessageHtmlLink":"Code change: added missing MsgType text labels"}},{"before":"16abc89ccabb56538002ca7ff74e955645737a5e","after":"0d89042354b9bc2201043163217e48d79e6ddc2a","ref":"refs/heads/Mike_managed-mat-tweaks","pushedAt":"2024-05-30T08:36:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ohlidalp","name":"Petr Ohlídal","path":"/ohlidalp","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/491088?s=80&v=4"},"commit":{"message":"Tuning: Added 'OK' button to the conflicts doublecheck dialog.\n\nAlso moved the code from CacheSystem.cpp to AddonPartFileFormat.cpp, into a new func `DoubleCheckForAddonpartConflict()`\nAlso extended the GUI_MessageBox.cpp to always reprint the dialog to RoR.log","shortMessageHtmlLink":"Tuning: Added 'OK' button to the conflicts doublecheck dialog."}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEeQZPYQA","startCursor":null,"endCursor":null}},"title":"Activity · ohlidalp/rigs-of-rods"}