Skip to content

Commit 46c6bf0

Browse files
committed
🐛 Fixed SyncReset() corrupting other actor's inter-beams.
PROBLEM: 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. SOLUTION: 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. CODECHANGES: * SimData.h: the ActorLinkingRequestType enum was merged with HookAction enum and got new fields: HOOK_FORCE_UNLOCK, TIE_FORCE_UNLOCK, ROPE_FORCE_UNLOCK * 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()` * All other files are just fallout from changes above.
1 parent 872ac4d commit 46c6bf0

File tree

9 files changed

+117
-177
lines changed

9 files changed

+117
-177
lines changed

source/main/GameContext.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -1362,21 +1362,20 @@ void GameContext::UpdateCommonInputEvents(float dt)
13621362
{
13631363
//m_player_actor->hookToggle(-1, HOOK_TOGGLE, -1);
13641364
ActorLinkingRequest* hook_rq = new ActorLinkingRequest();
1365-
hook_rq->alr_type = ActorLinkingRequestType::HOOK_ACTION;
1365+
hook_rq->alr_type = ActorLinkingRequestType::HOOK_TOGGLE;
13661366
hook_rq->alr_actor_instance_id = m_player_actor->ar_instance_id;
1367-
hook_rq->alr_hook_action = HOOK_TOGGLE;
13681367
App::GetGameContext()->PushMessage(Message(MSG_SIM_ACTOR_LINKING_REQUESTED, hook_rq));
13691368

13701369
//m_player_actor->toggleSlideNodeLock();
13711370
ActorLinkingRequest* slidenode_rq = new ActorLinkingRequest();
1372-
slidenode_rq->alr_type = ActorLinkingRequestType::SLIDENODE_ACTION;
1371+
slidenode_rq->alr_type = ActorLinkingRequestType::SLIDENODE_TOGGLE;
13731372
hook_rq->alr_actor_instance_id = m_player_actor->ar_instance_id;
13741373
App::GetGameContext()->PushMessage(Message(MSG_SIM_ACTOR_LINKING_REQUESTED, slidenode_rq));
13751374
}
13761375

13771376
if (App::GetInputEngine()->getEventBoolValueBounce(EV_COMMON_AUTOLOCK))
13781377
{
1379-
m_player_actor->hookToggle(-2, HOOK_UNLOCK, -1); //unlock all autolocks
1378+
m_player_actor->hookToggle(-2, ActorLinkingRequestType::HOOK_UNLOCK, -1); //unlock all autolocks
13801379
}
13811380

13821381
//strap

source/main/gameplay/SceneMouse.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,10 @@ bool SceneMouse::mouseMoved(const OIS::MouseEvent& _arg)
165165
{
166166
if (it->hk_hook_node->pos == minnode)
167167
{
168-
//grab_truck->hookToggle(it->hk_group, MOUSE_HOOK_TOGGLE, minnode);
168+
//grab_truck->hookToggle(it->hk_group, HOOK_MOUSE_TOGGLE, minnode);
169169
ActorLinkingRequest* rq = new ActorLinkingRequest();
170-
rq->alr_type = ActorLinkingRequestType::HOOK_ACTION;
170+
rq->alr_type = ActorLinkingRequestType::HOOK_MOUSE_TOGGLE;
171171
rq->alr_actor_instance_id = grab_truck->ar_instance_id;
172-
rq->alr_hook_action = MOUSE_HOOK_TOGGLE;
173172
rq->alr_hook_group = it->hk_group;
174173
rq->alr_hook_mousenode = minnode;
175174
App::GetGameContext()->PushMessage(Message(MSG_SIM_ACTOR_LINKING_REQUESTED, rq));

source/main/gui/panels/GUI_VehicleButtons.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1180,14 +1180,13 @@ void VehicleButtons::DrawLockButton(RoR::GfxActor* actorx)
11801180
{
11811181
//actorx->GetActor()->hookToggle(-1, HOOK_TOGGLE, -1);
11821182
ActorLinkingRequest* hook_rq = new ActorLinkingRequest();
1183-
hook_rq->alr_type = ActorLinkingRequestType::HOOK_ACTION;
1183+
hook_rq->alr_type = ActorLinkingRequestType::HOOK_TOGGLE;
11841184
hook_rq->alr_actor_instance_id = actorx->GetActor()->ar_instance_id;
1185-
hook_rq->alr_hook_action = HOOK_TOGGLE;
11861185
App::GetGameContext()->PushMessage(Message(MSG_SIM_ACTOR_LINKING_REQUESTED, hook_rq));
11871186

11881187
//actorx->GetActor()->toggleSlideNodeLock();
11891188
ActorLinkingRequest* slidenode_rq = new ActorLinkingRequest();
1190-
slidenode_rq->alr_type = ActorLinkingRequestType::SLIDENODE_ACTION;
1189+
slidenode_rq->alr_type = ActorLinkingRequestType::SLIDENODE_TOGGLE;
11911190
hook_rq->alr_actor_instance_id = actorx->GetActor()->ar_instance_id;
11921191
App::GetGameContext()->PushMessage(Message(MSG_SIM_ACTOR_LINKING_REQUESTED, slidenode_rq));
11931192
}

source/main/main.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -829,23 +829,26 @@ int main(int argc, char *argv[])
829829
{
830830
switch (request->alr_type)
831831
{
832-
case ActorLinkingRequestType::HOOK_ACTION:
833-
actor->hookToggle(request->alr_hook_group, request->alr_hook_action, request->alr_hook_mousenode);
834-
if (request->alr_hook_action == MOUSE_HOOK_TOGGLE)
835-
{
836-
TRIGGER_EVENT_ASYNC(SE_TRUCK_MOUSE_GRAB, request->alr_actor_instance_id);
837-
}
832+
case ActorLinkingRequestType::HOOK_LOCK:
833+
case ActorLinkingRequestType::HOOK_UNLOCK:
834+
case ActorLinkingRequestType::HOOK_TOGGLE:
835+
actor->hookToggle(request->alr_hook_group, request->alr_type);
836+
break;
837+
838+
case ActorLinkingRequestType::HOOK_MOUSE_TOGGLE:
839+
actor->hookToggle(request->alr_hook_group, request->alr_type, request->alr_hook_mousenode);
840+
TRIGGER_EVENT_ASYNC(SE_TRUCK_MOUSE_GRAB, request->alr_actor_instance_id);
838841
break;
839842

840-
case ActorLinkingRequestType::TIE_ACTION:
843+
case ActorLinkingRequestType::TIE_TOGGLE:
841844
actor->tieToggle(request->alr_tie_group);
842845
break;
843846

844-
case ActorLinkingRequestType::ROPE_ACTION:
847+
case ActorLinkingRequestType::ROPE_TOGGLE:
845848
actor->ropeToggle(request->alr_rope_group);
846849
break;
847850

848-
case ActorLinkingRequestType::SLIDENODE_ACTION:
851+
case ActorLinkingRequestType::SLIDENODE_TOGGLE:
849852
actor->toggleSlideNodeLock();
850853
break;
851854
}

0 commit comments

Comments
 (0)