mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 05:47:42 +00:00
Implement CScriptDebris; EVNT POI fixes
This commit is contained in:
@@ -7,12 +7,12 @@ namespace urde
|
||||
{
|
||||
|
||||
CScriptGenerator::CScriptGenerator(TUniqueId uid, std::string_view name, const CEntityInfo& info, u32 spawnCount,
|
||||
bool reuseFollowers, const zeus::CVector3f& vec1, bool inheritXf, bool active,
|
||||
bool noReuseFollowers, const zeus::CVector3f& vec1, bool noInheritXf, bool active,
|
||||
float minScale, float maxScale)
|
||||
: CEntity(uid, info, active, name)
|
||||
, x34_spawnCount(spawnCount)
|
||||
, x38_24_reuseFollowers(reuseFollowers)
|
||||
, x38_25_inheritTransform(inheritXf)
|
||||
, x38_24_noReuseFollowers(noReuseFollowers)
|
||||
, x38_25_noInheritTransform(noInheritXf)
|
||||
, x3c_offset(vec1)
|
||||
, x48_minScale(minScale)
|
||||
, x4c_maxScale(maxScale)
|
||||
@@ -21,11 +21,15 @@ CScriptGenerator::CScriptGenerator(TUniqueId uid, std::string_view name, const C
|
||||
|
||||
void CScriptGenerator::Accept(IVisitor& visitor) { visitor.Visit(this); }
|
||||
|
||||
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
|
||||
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& stateMgr)
|
||||
{
|
||||
return;
|
||||
if (msg == EScriptObjectMessage::SetToZero && GetActive() && !x20_conns.empty())
|
||||
switch (msg)
|
||||
{
|
||||
case EScriptObjectMessage::SetToZero:
|
||||
{
|
||||
if (!GetActive())
|
||||
break;
|
||||
|
||||
std::vector<TUniqueId> follows;
|
||||
follows.reserve(x20_conns.size());
|
||||
for (const SConnection& conn : x20_conns)
|
||||
@@ -38,6 +42,9 @@ void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId
|
||||
follows.push_back(uid);
|
||||
}
|
||||
|
||||
if (follows.empty())
|
||||
follows.push_back(sender);
|
||||
|
||||
std::vector<std::pair<TUniqueId, TEditorId>> activates;
|
||||
activates.reserve(x20_conns.size());
|
||||
|
||||
@@ -47,21 +54,26 @@ void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId
|
||||
continue;
|
||||
|
||||
TUniqueId uid = stateMgr.GetIdForScript(conn.x8_objId);
|
||||
|
||||
if (conn.x4_msg != EScriptObjectMessage::Activate)
|
||||
{
|
||||
stateMgr.SendScriptMsgAlways(GetUniqueId(), uid, conn.x4_msg);
|
||||
if (uid == kInvalidUniqueId)
|
||||
continue;
|
||||
|
||||
if (conn.x4_msg == EScriptObjectMessage::Activate)
|
||||
{
|
||||
if (!stateMgr.GetObjectById(uid))
|
||||
continue;
|
||||
activates.emplace_back(uid, conn.x8_objId);
|
||||
}
|
||||
|
||||
if (stateMgr.GetObjectById(uid) != nullptr)
|
||||
activates.emplace_back(uid, conn.x8_objId);
|
||||
stateMgr.SendScriptMsgAlways(GetUniqueId(), uid, conn.x4_msg);
|
||||
}
|
||||
|
||||
if (activates.empty())
|
||||
break;
|
||||
|
||||
for (u32 i = 0; i < x34_spawnCount; ++i)
|
||||
{
|
||||
if (activates.size() == 0 || follows.size() == 0)
|
||||
return;
|
||||
break;
|
||||
|
||||
u32 activatesRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * activates.size());
|
||||
u32 followsRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * follows.size());
|
||||
@@ -84,54 +96,44 @@ void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId
|
||||
|
||||
if (objId.second != kInvalidUniqueId)
|
||||
{
|
||||
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(idPair.first));
|
||||
TCastToPtr<CActor> followActor(follow);
|
||||
TCastToPtr<CWallCrawlerSwarm> wallCrawlerSwarm(follow);
|
||||
|
||||
if (activateActor && wallCrawlerSwarm)
|
||||
if (CEntity* genObj = stateMgr.ObjectById(objId.second))
|
||||
{
|
||||
if (x38_25_inheritTransform)
|
||||
activateActor->SetTransform(wallCrawlerSwarm->GetTransform());
|
||||
activateActor->SetTranslation(wallCrawlerSwarm->GetLastKilledOffset() + x3c_offset);
|
||||
}
|
||||
else if (activateActor && followActor)
|
||||
{
|
||||
if (x38_25_inheritTransform)
|
||||
activateActor->SetTransform(followActor->GetTransform());
|
||||
activateActor->SetTranslation(followActor->GetTranslation() + x3c_offset);
|
||||
}
|
||||
else if (follow != nullptr)
|
||||
{
|
||||
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(objId.second));
|
||||
TCastToPtr<CActor> activateActor(genObj);
|
||||
TCastToPtr<CActor> followActor(follow);
|
||||
TCastToPtr<CWallCrawlerSwarm> wallCrawlerSwarm(follow);
|
||||
|
||||
if (activateActor && wallCrawlerSwarm)
|
||||
{
|
||||
if (x38_25_inheritTransform)
|
||||
if (!x38_25_noInheritTransform)
|
||||
activateActor->SetTransform(wallCrawlerSwarm->GetTransform());
|
||||
activateActor->SetTranslation(wallCrawlerSwarm->GetLastKilledOffset() + x3c_offset);
|
||||
}
|
||||
else if (activateActor && followActor)
|
||||
{
|
||||
if (x38_25_inheritTransform)
|
||||
if (!x38_25_noInheritTransform)
|
||||
activateActor->SetTransform(followActor->GetTransform());
|
||||
activateActor->SetTranslation(followActor->GetTranslation() + x3c_offset);
|
||||
}
|
||||
|
||||
float rnd = stateMgr.GetActiveRandom()->Range(x48_minScale, x4c_maxScale);
|
||||
CModelData* mData = followActor->ModelData();
|
||||
if (mData && (mData->AnimationData() || mData->GetNormalModel()))
|
||||
CModelData* mData = activateActor->ModelData();
|
||||
if (mData && !mData->IsNull())
|
||||
mData->SetScale(rnd * mData->GetScale());
|
||||
|
||||
stateMgr.SendScriptMsg(genObj, GetUniqueId(), EScriptObjectMessage::Activate);
|
||||
}
|
||||
|
||||
stateMgr.SendScriptMsg(activate, GetUniqueId(), EScriptObjectMessage::Activate);
|
||||
|
||||
activates.erase(std::find(activates.begin(), activates.end(), idPair));
|
||||
if (!x38_24_reuseFollowers)
|
||||
follows.erase(std::find(follows.begin(), follows.end(), follows[followsRand]));
|
||||
}
|
||||
|
||||
activates.erase(std::find(activates.begin(), activates.end(), idPair));
|
||||
if (x38_24_noReuseFollowers)
|
||||
follows.erase(std::find(follows.begin(), follows.end(), follows[followsRand]));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
||||
CEntity::AcceptScriptMsg(msg, sender, stateMgr);
|
||||
}
|
||||
} // namespace urde
|
||||
|
||||
Reference in New Issue
Block a user