Skip to content

Commit 40d44d5

Browse files
committed
🚚 New section 'flaregroups_no_import <type> <controlnumber>'
Prevents actor from importing flare states when linked (locked/tied). Suggested on Discord by DarthCain: * https://discord.com/channels/136544456244461568/189904947649708032/1313301325538136147 * https://discord.com/channels/136544456244461568/189904947649708032/1313542914747662397 Syntax: ``` ;flaregroups_no_import ; <flaretype> <controlnumber 1-10> ``` Testing: There are 2 RoR.log messages specifically for testers (`{}` is where values are filled) - these may be removed later: * `[RoR|RigDef::Parser] parsed FlaregroupNoImport ({} {})` * `[RoR|ActorSpawner] processing FlaregroupNoImport ({} {})`
1 parent 6b92362 commit 40d44d5

11 files changed

+87
-1
lines changed

source/main/physics/Actor.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -3176,6 +3176,16 @@ void Actor::setLightStateMask(BitMask_t lightmask)
31763176
m_lightmask = lightmask;
31773177
}
31783178

3179+
void Actor::importLightStateMask(BitMask_t lightmask)
3180+
{
3181+
// Override incoming '0' bits where "no import" is set.
3182+
BITMASK_SET_1(lightmask, m_lightmask & m_flaregroups_no_import);
3183+
// Override incoming '1' bits where "no import" is set.
3184+
BITMASK_SET_0(lightmask, ~m_lightmask & m_flaregroups_no_import);
3185+
3186+
this->setLightStateMask(lightmask);
3187+
}
3188+
31793189
void Actor::toggleCustomParticles()
31803190
{
31813191
if (ar_state == ActorState::DISPOSED)

source/main/physics/Actor.h

+2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class Actor : public RefCountingObject<Actor>
182182
void toggleHeadlights();
183183
BitMask_t getLightStateMask() const { return m_lightmask; }
184184
void setLightStateMask(BitMask_t lightmask); //!< Does all the necessary toggling.
185+
void importLightStateMask(BitMask_t lightmask); //!< Only for linked (locked/tied) actors forwarding flare states; see 'flaregroups_no_import' in .truck format.
185186
bool getSideLightsVisible() const { return m_lightmask & RoRnet::LIGHTMASK_SIDELIGHTS; }
186187
void setSideLightsVisible(bool val) { BITMASK_SET(m_lightmask, RoRnet::LIGHTMASK_SIDELIGHTS, val); }
187188
bool getHeadlightsVisible() const { return m_lightmask & RoRnet::LIGHTMASK_HEADLIGHT; }
@@ -614,6 +615,7 @@ class Actor : public RefCountingObject<Actor>
614615
/// @{
615616
GfxFlaresMode m_flares_mode = GfxFlaresMode::NONE; //!< Snapshot of cvar 'gfx_flares_mode' on spawn.
616617
BitMask_t m_lightmask = 0; //!< RoRnet::Lightmask
618+
BitMask_t m_flaregroups_no_import = 0; //!< RoRnet::Lightmask
617619
bool m_blinker_autoreset = false; //!< When true, we're steering and blinker will turn off automatically.
618620
bool m_blinker_left_lit = false; //!< Blinking state of left turn signal
619621
bool m_blinker_right_lit = false; //!< Blinking state of right turn signal

source/main/physics/ActorManager.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ void ActorManager::ForwardCommands(ActorPtr source_actor)
712712
}
713713

714714
// forward lights
715-
hook.hk_locked_actor->setLightStateMask(source_actor->getLightStateMask());
715+
hook.hk_locked_actor->importLightStateMask(source_actor->getLightStateMask());
716716
}
717717
}
718718
}

source/main/physics/ActorSpawner.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -2358,6 +2358,41 @@ void ActorSpawner::ProcessFlare2(RigDef::Flare2 & def)
23582358
m_actor->ar_flares.push_back(flare);
23592359
}
23602360

2361+
void ActorSpawner::ProcessFlaregroupNoImport(RigDef::FlaregroupNoImport& def)
2362+
{
2363+
LOG(fmt::format("[RoR|ActorSpawner] processing FlaregroupNoImport ({} {})", (char)def.type, def.control_number));
2364+
switch (def.type)
2365+
{
2366+
case FlareType::HEADLIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_HEADLIGHT); break;
2367+
case FlareType::HIGH_BEAM: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_HIGHBEAMS); break;
2368+
case FlareType::FOG_LIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_FOGLIGHTS); break;
2369+
case FlareType::SIDELIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_SIDELIGHTS); break;
2370+
case FlareType::TAIL_LIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_HEADLIGHT); break;
2371+
case FlareType::BRAKE_LIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_BRAKES); break;
2372+
case FlareType::REVERSE_LIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_REVERSE); break;
2373+
case FlareType::BLINKER_LEFT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_BLINK_LEFT); break;
2374+
case FlareType::BLINKER_RIGHT: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_BLINK_RIGHT); break;
2375+
//case FlareType::DASHBOARD: ~ Not subject to syncing between linked actors.
2376+
case FlareType::USER:
2377+
switch (def.control_number - 1)
2378+
{
2379+
case 0: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM1); break;
2380+
case 1: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM2); break;
2381+
case 2: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM3); break;
2382+
case 3: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM4); break;
2383+
case 4: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM5); break;
2384+
case 5: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM6); break;
2385+
case 6: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM7); break;
2386+
case 7: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM8); break;
2387+
case 8: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM9); break;
2388+
case 9: BITMASK_SET_1(m_actor->m_flaregroups_no_import, RoRnet::LIGHTMASK_CUSTOM10);break;
2389+
default: break;
2390+
}
2391+
break;
2392+
default: break;
2393+
}
2394+
}
2395+
23612396
Ogre::MaterialPtr ActorSpawner::InstantiateManagedMaterial(const Ogre::String& rg_name, Ogre::String const & source_name, Ogre::String const & clone_name)
23622397
{
23632398
Ogre::MaterialPtr src_mat = Ogre::MaterialManager::getSingleton().getByName(source_name, rg_name);

source/main/physics/ActorSpawner.h

+1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class ActorSpawner
173173
void ProcessFixedNode(RigDef::Node::Ref node_ref); // 'fixes'
174174
void ProcessFlare2(RigDef::Flare2 & def);
175175
void ProcessFlare3(RigDef::Flare3 & def);
176+
void ProcessFlaregroupNoImport(RigDef::FlaregroupNoImport & def);
176177
void ProcessFlexbody(RigDef::Flexbody& def);
177178
void ProcessFlexBodyWheel(RigDef::FlexBodyWheel & def);
178179
void ProcessFusedrag(RigDef::Fusedrag & def);

source/main/physics/ActorSpawnerFlow.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ void ActorSpawner::ProcessNewActor(ActorPtr actor, ActorSpawnRequest rq, RigDef:
178178
PROCESS_ELEMENT(RigDef::Keyword::ANTILOCKBRAKES, antilockbrakes, ProcessAntiLockBrakes);
179179
PROCESS_ELEMENT(RigDef::Keyword::FLARES2, flares2, ProcessFlare2);
180180
PROCESS_ELEMENT(RigDef::Keyword::FLARES3, flares3, ProcessFlare3);
181+
PROCESS_ELEMENT(RigDef::Keyword::FLAREGROUPS_NO_IMPORT, flaregroups_no_import, ProcessFlaregroupNoImport);
181182
PROCESS_ELEMENT(RigDef::Keyword::AXLES, axles, ProcessAxle);
182183
PROCESS_ELEMENT(RigDef::Keyword::TRANSFERCASE, transfercase, ProcessTransferCase);
183184
PROCESS_ELEMENT(RigDef::Keyword::INTERAXLES, interaxles, ProcessInterAxle);

source/main/resources/rig_def_fileformat/RigDef_File.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ const char * KeywordToString(Keyword keyword)
214214
case Keyword::FLARES: return "flares";
215215
case Keyword::FLARES2: return "flares2";
216216
case Keyword::FLARES3: return "flares3";
217+
case Keyword::FLAREGROUPS_NO_IMPORT:return "flaregroups_no_import";
217218
case Keyword::FLEXBODIES: return "flexbodies";
218219
case Keyword::FLEXBODY_CAMERA_MODE: return "flexbody_camera_mode";
219220
case Keyword::FLEXBODYWHEELS: return "flexbodywheels";

source/main/resources/rig_def_fileformat/RigDef_File.h

+8
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ enum class Keyword
107107
FLARES,
108108
FLARES2,
109109
FLARES3,
110+
FLAREGROUPS_NO_IMPORT,
110111
FLEXBODIES,
111112
FLEXBODY_CAMERA_MODE,
112113
FLEXBODYWHEELS,
@@ -892,6 +893,12 @@ struct Flare3: public Flare2
892893
std::shared_ptr<Inertia> inertia_defaults;
893894
};
894895

896+
struct FlaregroupNoImport
897+
{
898+
RoR::FlareType type = RoR::FlareType::NONE;
899+
int control_number = -1; //!< Only 'u' type flares.
900+
};
901+
895902
struct Flexbody
896903
{
897904
Node::Ref reference_node;
@@ -1510,6 +1517,7 @@ struct Document
15101517
std::vector<Fileinfo> fileinfo;
15111518
std::vector<Flare2> flares2; // 'flares' are auto-imported as 'flares2' (only 1 extra argument)
15121519
std::vector<Flare3> flares3;
1520+
std::vector<FlaregroupNoImport> flaregroups_no_import;
15131521
std::vector<Flexbody> flexbodies;
15141522
std::vector<FlexBodyWheel> flexbodywheels;
15151523
std::vector<Fusedrag> fusedrag;

source/main/resources/rig_def_fileformat/RigDef_Parser.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ void Parser::ProcessCurrentLine()
256256
case Keyword::FLARES:
257257
case Keyword::FLARES2: this->ParseFlaresUnified(); return;
258258
case Keyword::FLARES3: this->ParseFlares3(); return;
259+
case Keyword::FLAREGROUPS_NO_IMPORT:this->ParseFlaregroupsNoImport(); return;
259260
case Keyword::FLEXBODIES: this->ParseFlexbody(); return;
260261
case Keyword::FLEXBODYWHEELS: this->ParseFlexBodyWheel(); return;
261262
case Keyword::FUSEDRAG: this->ParseFusedrag(); return;
@@ -2064,6 +2065,31 @@ void Parser::ParseDirectiveSetDefaultMinimass()
20642065
m_set_default_minimass->min_mass_Kg = this->GetArgFloat(1);
20652066
}
20662067

2068+
void Parser::ParseFlaregroupsNoImport()
2069+
{
2070+
// ;flare_groups_no_import
2071+
// ; <flaretype> <controlnumber 1-10>
2072+
if (!this->CheckNumArguments(1)) { return; }
2073+
2074+
FlaregroupNoImport fni;
2075+
fni.type = this->GetArgFlareType(0);
2076+
if (m_num_args > 1)
2077+
{
2078+
fni.control_number = this->GetArgInt(1);
2079+
if (fni.control_number < 1)
2080+
{
2081+
this->LogMessage(Console::CONSOLE_SYSTEM_WARNING, fmt::format("flaregroup_no_import: parameter <control_number> must be 1-10; got {}, clamping to 1", fni.control_number));
2082+
}
2083+
if (fni.control_number > 10)
2084+
{
2085+
this->LogMessage(Console::CONSOLE_SYSTEM_WARNING, fmt::format("flaregroup_no_import: parameter <control_number> must be 1-10; got {}, clamping to 10", fni.control_number));
2086+
}
2087+
}
2088+
2089+
LOG(fmt::format("[RoR|RigDef::Parser] parsed FlaregroupNoImport ({} {})", (char)fni.type, fni.control_number));
2090+
m_current_module->flaregroups_no_import.push_back(fni);
2091+
}
2092+
20672093
void Parser::ParseDirectiveSetInertiaDefaults()
20682094
{
20692095
if (! this->CheckNumArguments(2)) { return; }

source/main/resources/rig_def_fileformat/RigDef_Parser.h

+1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class Parser
141141
void ParseFixes();
142142
void ParseFlaresUnified();
143143
void ParseFlares3();
144+
void ParseFlaregroupsNoImport();
144145
void ParseFlexbody();
145146
void ParseFlexBodyWheel();
146147
void ParseFusedrag();

source/main/resources/rig_def_fileformat/RigDef_Regexes.h

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ namespace Regexes
159159
E_KEYWORD_BLOCK("flares") \
160160
E_KEYWORD_BLOCK("flares2") \
161161
E_KEYWORD_BLOCK("flares3") \
162+
E_KEYWORD_BLOCK("flaregroups_no_import") \
162163
E_KEYWORD_BLOCK("flexbodies") \
163164
E_KEYWORD_INLINE("flexbody_camera_mode") \
164165
E_KEYWORD_BLOCK("flexbodywheels") \

0 commit comments

Comments
 (0)