fix: add Nexus Tower missing scripts (#1349)

add final missing scripts for nt

also fix the turnin for the breadcrumb missions not showing the completion window.

Fix another missing script

Add another script

fix include guards

Fix dirt clouds not appearing on mission accept
This commit is contained in:
David Markowitz 2023-12-22 23:53:21 -08:00 committed by GitHub
parent c07c909a57
commit c1e8546d48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 334 additions and 17 deletions

View File

@ -269,6 +269,7 @@ set(INCLUDED_DIRECTORIES
"dScripts/ai/GENERAL"
"dScripts/ai/GF"
"dScripts/ai/MINIGAME"
"dScripts/ai/MINIGAME/Objects"
"dScripts/ai/NP"
"dScripts/ai/NS"
"dScripts/ai/PETS"

View File

@ -47,10 +47,6 @@ std::vector<LWOMAPID> EntityManager::m_GhostingExcludedZones = {
// Configure some exceptions for ghosting, nessesary for some special objects.
std::vector<LOT> EntityManager::m_GhostingExcludedLOTs = {
// NT - Pipes
9524,
12408,
// AG - Footrace
4967
};

View File

@ -621,3 +621,12 @@ bool MissionComponent::HasCollectible(int32_t collectibleID) {
bool MissionComponent::HasMission(uint32_t missionId) {
return GetMission(missionId) != nullptr;
}
void MissionComponent::ResetMission(const int32_t missionId) {
auto* mission = GetMission(missionId);
if (!mission) return;
m_Missions.erase(missionId);
GameMessages::SendResetMissions(m_Parent, m_Parent->GetSystemAddress(), missionId);
}

View File

@ -170,6 +170,7 @@ public:
*/
bool HasMission(uint32_t missionId);
void ResetMission(const int32_t missionId);
private:
/**
* All the missions owned by this entity, mapped by mission ID

View File

@ -29,11 +29,11 @@ uint32_t OfferedMission::GetMissionId() const {
return this->missionId;
}
bool OfferedMission::GetOfferMission() const {
bool OfferedMission::GetOffersMission() const {
return this->offersMission;
}
bool OfferedMission::GetAcceptMission() const {
bool OfferedMission::GetAcceptsMission() const {
return this->acceptsMission;
}
@ -203,7 +203,10 @@ void MissionOfferComponent::OfferMissions(Entity* entity, const uint32_t specifi
const auto selected = canAcceptPool[GeneralUtils::GenerateRandomNumber<int>(0, canAcceptPool.size() - 1)];
GameMessages::SendOfferMission(entity->GetObjectID(), entity->GetSystemAddress(), selected, m_Parent->GetObjectID());
} else if (std::find(offered.begin(), offered.end(), missionId) == offered.end() && offeredMission->GetOfferMission()) {
} else if (
std::find(offered.begin(), offered.end(), missionId) == offered.end()
&&
(offeredMission->GetOffersMission() || offeredMission->GetAcceptsMission())) {
GameMessages::SendOfferMission(entity->GetObjectID(), entity->GetSystemAddress(), missionId, m_Parent->GetObjectID());
}
}

View File

@ -30,13 +30,13 @@ struct OfferedMission {
* Returns if this mission is offered by the entity
* @return true if this mission is offered by the entity, false otherwise
*/
bool GetOfferMission() const;
bool GetOffersMission() const;
/**
* Returns if this mission may be accepted by the entity (currently unused)
* @return true if this mission may be accepted by the entity, false otherwise
*/
bool GetAcceptMission() const;
bool GetAcceptsMission() const;
private:

View File

@ -345,6 +345,19 @@ void GameMessages::SendStartPathing(Entity* entity) {
SEND_PACKET_BROADCAST;
}
void GameMessages::SendResetMissions(Entity* entity, const SystemAddress& sysAddr, const int32_t missionid) {
CBITSTREAM;
CMSGHEADER;
bitStream.Write(entity->GetObjectID());
bitStream.Write(eGameMessageType::RESET_MISSIONS);
bitStream.Write(missionid != -1);
if (missionid != -1) bitStream.Write(missionid);
SEND_PACKET;
}
void GameMessages::SendPlatformResync(Entity* entity, const SystemAddress& sysAddr, bool bStopAtDesiredWaypoint,
int iIndex, int iDesiredWaypointIndex, int nextIndex,
eMovementPlatformState movementState) {

View File

@ -74,6 +74,7 @@ namespace GameMessages {
int iIndex = 0, int iDesiredWaypointIndex = 1, int nextIndex = 1,
eMovementPlatformState movementState = eMovementPlatformState::Moving);
void SendResetMissions(Entity* entity, const SystemAddress& sysAddr, const int32_t missionid = -1);
void SendRestoreToPostLoadStats(Entity* entity, const SystemAddress& sysAddr);
void SendServerDoneLoadingAllObjects(Entity* entity, const SystemAddress& sysAddr);
void SendGMLevelBroadcast(const LWOOBJID& objectID, eGameMasterLevel level);

View File

@ -349,6 +349,17 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& command, Entit
});
}
if (chatCommand == "resetmission") {
uint32_t missionId;
if (!GeneralUtils::TryParse(args[0], missionId)) {
ChatPackets::SendSystemMessage(sysAddr, u"Invalid mission ID.");
return;
}
auto* missionComponent = entity->GetComponent<MissionComponent>();
if (!missionComponent) return;
missionComponent->ResetMission(missionId);
}
if (user->GetMaxGMLevel() == eGameMasterLevel::CIVILIAN || entity->GetGMLevel() >= eGameMasterLevel::CIVILIAN) {
if (chatCommand == "die") {
entity->Smash(entity->GetObjectID());

View File

@ -223,7 +223,7 @@ void AuthPackets::SendLoginResponse(dServer* server, const SystemAddress& sysAdd
server->Send(&packet, sysAddr, false);
//Inform the master server that we've created a session for this user:
{
if (responseCode == eLoginResponse::SUCCESS) {
CBITSTREAM;
BitStreamUtils::WriteHeader(bitStream, eConnectionType::MASTER, eMasterMessageType::SET_SESSION_KEY);
bitStream.Write(sessionKey);

View File

@ -3,6 +3,7 @@ set(DSCRIPTS_SOURCES_02_SERVER_MAP_GENERAL
"BaseInteractDropLootServer.cpp"
"Binoculars.cpp"
"ExplodingAsset.cpp"
"FrictionVolumeServer.cpp"
"ForceVolumeServer.cpp"
"GrowingFlower.cpp"
"ImaginationBackpackHealServer.cpp"
@ -17,6 +18,8 @@ set(DSCRIPTS_SOURCES_02_SERVER_MAP_GENERAL
"StoryBoxInteractServer.cpp"
"TokenConsoleServer.cpp"
"TouchMissionUpdateServer.cpp"
"VisToggleNotifierServer.cpp"
"NTNaomiDirtServer.cpp"
"WishingWellServer.cpp")
add_subdirectory(Ninjago)

View File

@ -0,0 +1,19 @@
#include "FrictionVolumeServer.h"
#include "PhantomPhysicsComponent.h"
#include "ePhysicsEffectType.h"
#include "Game.h"
#include "EntityManager.h"
void FrictionVolumeServer::OnStartup(Entity* self) {
auto frictionAmount = self->GetVar<float>(u"FrictionAmt");
if (frictionAmount == 0.0f) frictionAmount = DefaultFrictionAmount;
auto* phantomPhysicsComponent = self->GetComponent<PhantomPhysicsComponent>();
if (!phantomPhysicsComponent) return;
phantomPhysicsComponent->SetEffectType(ePhysicsEffectType::FRICTION);
phantomPhysicsComponent->SetDirectionalMultiplier(frictionAmount);
phantomPhysicsComponent->SetPhysicsEffectActive(true);
Game::entityManager->SerializeEntity(self);
}

View File

@ -0,0 +1,13 @@
#ifndef __FRICTIONVOLUMESERVER__H__
#define __FRICTIONVOLUMESERVER__H__
#include "CppScripts.h"
class FrictionVolumeServer : public CppScripts::Script {
public:
void OnStartup(Entity* self) override;
private:
const float DefaultFrictionAmount = 1.5f;
};
#endif //!__FRICTIONVOLUMESERVER__H__

View File

@ -0,0 +1,14 @@
#include "NTNaomiDirtServer.h"
namespace {
std::map<int32_t, std::string> VisibilityMissionTable = {
{1253, std::string("Dirt_Clouds_Sent")},
{1276, std::string("Dirt_Clouds_Assem")},
{1277, std::string("Dirt_Clouds_Para")},
{1283, std::string("Dirt_Clouds_Halls")}
};
};
void NTNaomiDirtServer::OnStartup(Entity* self) {
SetGameVariables(VisibilityMissionTable);
}

View File

@ -0,0 +1,11 @@
#ifndef __NTNAOMIDIRTSERVER__H__
#define __NTNAOMIDIRTSERVER__H__
#include "VisToggleNotifierServer.h"
class NTNaomiDirtServer : public VisToggleNotifierServer {
public:
void OnStartup(Entity* self) override;
};
#endif //!__NTNAOMIDIRTSERVER__H__

View File

@ -0,0 +1,23 @@
#include "VisToggleNotifierServer.h"
#include "eMissionState.h"
#include "Game.h"
#include "dZoneManager.h"
void VisToggleNotifierServer::OnMissionDialogueOK(Entity* self, Entity* target, int missionId, eMissionState missionState) {
auto itr = m_GameVariables.find(missionId);
if (itr != m_GameVariables.end()) {
bool visible = true;
if (missionState == eMissionState::READY_TO_COMPLETE || missionState == eMissionState::COMPLETE_READY_TO_COMPLETE) {
visible = false;
}
auto spawners = Game::zoneManager->GetSpawnersByName(itr->second);
if (spawners.empty()) return;
for (const auto spawner : spawners) {
auto spawnedObjIds = spawner->GetSpawnedObjectIDs();
for (const auto& objId : spawnedObjIds) {
GameMessages::SendNotifyClientObject(objId, u"SetVisibility", visible);
}
}
}
}

View File

@ -0,0 +1,15 @@
#ifndef __VISTOGGLENOTIFIERSERVER__H__
#define __VISTOGGLENOTIFIERSERVER__H__
#include "CppScripts.h"
class VisToggleNotifierServer : public CppScripts::Script {
public:
void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override;
protected:
void SetGameVariables(std::map<int32_t, std::string>& gameVariables) { m_GameVariables = gameVariables; }
private:
std::map<int32_t, std::string> m_GameVariables;
};
#endif //!__VISTOGGLENOTIFIERSERVER__H__

View File

@ -18,9 +18,12 @@ set(DSCRIPTS_SOURCES_02_SERVER_MAP_NT
"NtXRayServer.cpp"
"NtSleepingGuard.cpp"
"NtImagimeterVisibility.cpp"
"NTPipeVisibilityServer.cpp"
"NtSentinelWalkwayServer.cpp"
"NtDarkitectRevealServer.cpp"
"NtParadoxTeleServer.cpp"
"NtVentureSpeedPadServer.cpp"
"NtVentureCannonServer.cpp"
"NtBcSubmitServer.cpp"
"NtNaomiBreadcrumbServer.cpp"
PARENT_SCOPE)

View File

@ -0,0 +1,15 @@
#include "NTPipeVisibilityServer.h"
#include "Entity.h"
#include "Character.h"
void NTPipeVisibilityServer::OnRebuildComplete(Entity* self, Entity* target) {
const auto flag = self->GetVar<int32_t>(u"flag");
if (flag == 0) return;
auto* character = target->GetCharacter();
if (!character) return;
character->SetPlayerFlag(flag, true);
GameMessages::SendNotifyClientObject(self->GetObjectID(), u"PipeBuilt");
}

View File

@ -0,0 +1,11 @@
#ifndef __NTPIPEVISIBILITYSERVER__H__
#define __NTPIPEVISIBILITYSERVER__H__
#include "CppScripts.h"
class NTPipeVisibilityServer : public CppScripts::Script {
public:
void OnRebuildComplete(Entity* self, Entity* target) override;
};
#endif //!__NTPIPEVISIBILITYSERVER__H__

View File

@ -0,0 +1,34 @@
#include "NtBcSubmitServer.h"
#include <cstdint>
#include <map>
#include "Entity.h"
#include "MissionComponent.h"
// https://explorer.lu/missions/
// Key is the main mission, value is the breadcrumb mission to reset upon Mission Dialogue Ok.
// To see the actual missions, just append the number to the end of the URL.
namespace {
std::map<uint32_t, uint32_t> ResetMissionsTable = {
{999, 1335},
{1002, 1355},
{1006, 1349},
{1009, 1348},
{1379, 1335},
{1380, 1355},
{1378, 1349},
{1377, 1348},
};
}
void NtBcSubmitServer::OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) {
auto* missionComponent = target->GetComponent<MissionComponent>();
if (!missionComponent) return;
auto it = ResetMissionsTable.find(missionID);
if (it == ResetMissionsTable.end()) return;
const auto missionToReset = it->second;
missionComponent->ResetMission(missionToReset);
}

View File

@ -0,0 +1,11 @@
#ifndef __NTBCSUBMITSERVER__H__
#define __NTBCSUBMITSERVER__H__
#include "CppScripts.h"
class NtBcSubmitServer : public virtual CppScripts::Script {
public:
void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override;
};
#endif //!__NTBCSUBMITSERVER__H__

View File

@ -37,4 +37,5 @@ void NtDukeServer::OnMissionDialogueOK(Entity* self, Entity* target, int mission
inventoryComponent->RemoveItem(m_SwordLot, lotCount);
}
}
NtBcSubmitServer::OnMissionDialogueOK(self, target, missionID, missionState);
}

View File

@ -1,7 +1,8 @@
#pragma once
#include "NtFactionSpyServer.h"
#include "NtBcSubmitServer.h"
class NtDukeServer : public NtFactionSpyServer {
class NtDukeServer : public NtFactionSpyServer, public NtBcSubmitServer {
void SetVariables(Entity* self) override;
void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override;
const uint32_t m_SwordMissionID = 1448;

View File

@ -1,6 +1,7 @@
#pragma once
#include "NtFactionSpyServer.h"
#include "NtBcSubmitServer.h"
class NtHaelServer : public NtFactionSpyServer {
class NtHaelServer : public NtFactionSpyServer, public NtBcSubmitServer {
void SetVariables(Entity* self) override;
};

View File

@ -0,0 +1,43 @@
#include "NtNaomiBreadcrumbServer.h"
#include <map>
#include "eMissionState.h"
#include "MissionComponent.h"
// https://explorer.lu/missions/
// Key is the main mission, value is the breadcrumb mission to reset upon Mission Dialogue Ok.
// To see the actual missions, just append the number to the end of the URL.
namespace {
std::map<int32_t, std::vector<int32_t>> CompleteBcMissionTable = {
{1377, {1378, 1379, 1380, 1349, 1335, 1355}},
{1378, {1377, 1379, 1380, 1348, 1335, 1355}},
{1379, {1377, 1378, 1380, 1348, 1349, 1355}},
{1380, {1377, 1378, 1379, 1348, 1349, 1335}},
};
std::map<int32_t, int32_t> MatchingBCTable = {
{1377, 1348},
{1378, 1349},
{1379, 1335},
{1380, 1355}
};
}
void NtNaomiBreadcrumbServer::OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) {
auto* missionComponent = target->GetComponent<MissionComponent>();
if (!missionComponent) return;
auto itr = MatchingBCTable.find(missionID);
if (itr == MatchingBCTable.end()) return;
missionComponent->AcceptMission(itr->second);
auto it = CompleteBcMissionTable.find(missionID);
if (it == CompleteBcMissionTable.end()) return;
if (missionState == eMissionState::AVAILABLE || missionState == eMissionState::COMPLETE_AVAILABLE) {
for (const auto& bcMission : it->second) {
missionComponent->ResetMission(bcMission);
}
}
}

View File

@ -0,0 +1,11 @@
#ifndef __NTNAOMIBREADCRUMBSERVER__H__
#define __NTNAOMIBREADCRUMBSERVER__H__
#include "CppScripts.h"
class NtNaomiBreadcrumbServer : public CppScripts::Script {
public:
void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override;
};
#endif //!__NTNAOMIBREADCRUMBSERVER__H__

View File

@ -1,7 +1,8 @@
#pragma once
#include "NtFactionSpyServer.h"
#include "NtBcSubmitServer.h"
class NtOverbuildServer : public NtFactionSpyServer {
class NtOverbuildServer : public NtFactionSpyServer, public NtBcSubmitServer {
void SetVariables(Entity* self) override;
const std::u16string m_OtherEntitiesGroupVariable = u"SpyConvo2Group";
};

View File

@ -11,4 +11,5 @@ void NtVandaServer::OnMissionDialogueOK(Entity* self, Entity* target, int missio
inventoryComponent->RemoveItem(alienPartLot, 1);
}
}
NtBcSubmitServer::OnMissionDialogueOK(self, target, missionID, missionState);
}

View File

@ -1,7 +1,8 @@
#pragma once
#include "CppScripts.h"
#include "NtBcSubmitServer.h"
class NtVandaServer : public CppScripts::Script {
class NtVandaServer : public NtBcSubmitServer {
void OnMissionDialogueOK(Entity* self, Entity* target, int missionID, eMissionState missionState) override;
const uint32_t m_AlienPartMissionID = 1183;
const std::vector<LOT> m_AlienPartLots = { 12479, 12480, 12481 };

View File

@ -209,6 +209,11 @@
#include "NtXRayServer.h"
#include "NtSleepingGuard.h"
#include "NtImagimeterVisibility.h"
#include "FrictionVolumeServer.h"
#include "NTPipeVisibilityServer.h"
#include "NTNaomiDirtServer.h"
#include "MinigameBlueMark.h"
#include "NtNaomiBreadcrumbServer.h"
// DLU Scripts
#include "DLUVanityNPC.h"
@ -311,6 +316,7 @@
#include "WildNinjaStudent.h"
#include "WildNinjaSensei.h"
#include "WildNinjaBricks.h"
#include "VisToggleNotifierServer.h"
namespace {
InvalidScript* invalidToReturn = new InvalidScript();
@ -694,19 +700,30 @@ CppScripts::Script* CppScripts::GetScript(Entity* parent, const std::string& scr
script = new NtDukeServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_HAEL_SERVER.lua")
script = new NtHaelServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_FACTION_SPY_SERVER.lua")
script = new NtFactionSpyServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_OVERBUILD_SERVER.lua")
script = new NtOverbuildServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_VANDA_SERVER.lua")
script = new NtVandaServer();
else if (scriptName == "scripts\\02_server\\Map\\General\\L_FORCE_VOLUME_SERVER.lua")
script = new ForceVolumeServer();
else if (scriptName == "scripts\\02_server\\Map\\General\\L_FRICTION_VOLUME_SERVER.lua")
script = new FrictionVolumeServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_XRAY_SERVER.lua")
script = new NtXRayServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_SLEEPING_GUARD.lua")
script = new NtSleepingGuard();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_IMAGIMETER_VISIBILITY_SERVER.lua") {
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_IMAGIMETER_VISIBILITY_SERVER.lua")
script = new NTImagimeterVisibility();
}
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_PIPE_VISIBILITY_SERVER.lua")
script = new NTPipeVisibilityServer();
else if (scriptName == "scripts\\ai\\MINIGAME\\Objects\\MINIGAME_BLUE_MARK.lua")
script = new MinigameBlueMark();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_NAOMI_BREADCRUMB_SERVER.lua")
script = new NtNaomiBreadcrumbServer();
else if (scriptName == "scripts\\02_server\\Map\\NT\\L_NT_NAOMI_DIRT_SERVER.lua")
script = new NTNaomiDirtServer();
//AM:
else if (scriptName == "scripts\\02_server\\Map\\AM\\L_AM_CONSOLE_TELEPORT_SERVER.lua")

View File

@ -12,7 +12,7 @@ struct SpyData {
uint32_t missionID;
};
class NtFactionSpyServer : public CppScripts::Script {
class NtFactionSpyServer : public virtual CppScripts::Script {
void OnStartup(Entity* self) override;
void OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) override;
void OnCinematicUpdate(Entity* self, Entity* sender, eCinematicEvent event, const std::u16string& pathName, float_t pathTime, float_t totalTime, int32_t waypoint) override;

View File

@ -6,4 +6,10 @@ foreach(file ${DSCRIPTS_SOURCES_AI_MINIGAME_SG_GF})
set(DSCRIPTS_SOURCES_AI_MINIGAME ${DSCRIPTS_SOURCES_AI_MINIGAME} "SG_GF/${file}")
endforeach()
add_subdirectory(Objects)
foreach(file ${DSCRIPTS_SOURCES_AI_MINIGAME_OBJECTS})
set(DSCRIPTS_SOURCES_AI_MINIGAME ${DSCRIPTS_SOURCES_AI_MINIGAME} "Objects/${file}")
endforeach()
set(DSCRIPTS_SOURCES_AI_MINIGAME ${DSCRIPTS_SOURCES_AI_MINIGAME} PARENT_SCOPE)

View File

@ -0,0 +1,4 @@
SET(DSCRIPTS_SOURCES_AI_MINIGAME_OBJECTS
"MinigameBlueMark.cpp"
PARENT_SCOPE
)

View File

@ -0,0 +1,7 @@
#include "MinigameBlueMark.h"
#include "Game.h"
#include "dZoneManager.h"
void MinigameBlueMark::OnStartup(Entity* self) {
Game::zoneManager->GetZoneControlObject()->NotifyObject(self, "Blue_Mark");
}

View File

@ -0,0 +1,6 @@
#include "CppScripts.h"
class MinigameBlueMark : public CppScripts::Script {
public:
void OnStartup(Entity* self) override;
};

View File

@ -205,6 +205,15 @@ void Spawner::Update(const float deltaTime) {
}
}
std::vector<LWOOBJID> Spawner::GetSpawnedObjectIDs() const {
std::vector<LWOOBJID> ids;
ids.reserve(m_Entities.size());
for (const auto& [objId, spawnerNode] : m_Entities) {
ids.push_back(objId);
}
return ids;
}
void Spawner::NotifyOfEntityDeath(const LWOOBJID& objectID) {
for (std::function<void()> cb : m_SpawnedEntityDieCallbacks) {
cb();

View File

@ -66,6 +66,7 @@ public:
void SetRespawnTime(float time);
void SetNumToMaintain(int32_t value);
bool GetIsSpawnSmashGroup() const { return m_SpawnSmashFoundGroup; };
std::vector<LWOOBJID> GetSpawnedObjectIDs() const;
SpawnerInfo m_Info;
bool m_Active = true;