mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-13 19:58:21 +00:00
fix: not exiting shooting gallery when clicking activity close button
Fixes #436 Fixes crash when replaying as well
This commit is contained in:
parent
bf0ae6f181
commit
5af5b0f1c1
@ -1485,6 +1485,12 @@ void Entity::OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
||||||
|
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
||||||
|
script->OnRequestActivityExit(sender, player, canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
||||||
if (!m_PlayerIsReadyForUpdates) return;
|
if (!m_PlayerIsReadyForUpdates) return;
|
||||||
|
|
||||||
|
@ -207,6 +207,7 @@ public:
|
|||||||
|
|
||||||
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
||||||
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
||||||
|
void RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled);
|
||||||
|
|
||||||
void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u"");
|
void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u"");
|
||||||
void Kill(Entity* murderer = nullptr);
|
void Kill(Entity* murderer = nullptr);
|
||||||
|
@ -677,6 +677,9 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System
|
|||||||
case eGameMessageType::ZONE_SUMMARY_DISMISSED:
|
case eGameMessageType::ZONE_SUMMARY_DISMISSED:
|
||||||
GameMessages::HandleZoneSummaryDismissed(inStream, entity);
|
GameMessages::HandleZoneSummaryDismissed(inStream, entity);
|
||||||
break;
|
break;
|
||||||
|
case eGameMessageType::REQUEST_ACTIVITY_EXIT:
|
||||||
|
GameMessages::HandleRequestActivityExit(inStream, entity);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// Game::logger->Log("GameMessageHandler", "Unknown game message ID: %i", messageID);
|
// Game::logger->Log("GameMessageHandler", "Unknown game message ID: %i", messageID);
|
||||||
break;
|
break;
|
||||||
|
@ -91,6 +91,7 @@
|
|||||||
#include "eReplicaComponentType.h"
|
#include "eReplicaComponentType.h"
|
||||||
#include "eClientMessageType.h"
|
#include "eClientMessageType.h"
|
||||||
#include "eGameMessageType.h"
|
#include "eGameMessageType.h"
|
||||||
|
#include "ActivityManager.h"
|
||||||
|
|
||||||
#include "CDComponentsRegistryTable.h"
|
#include "CDComponentsRegistryTable.h"
|
||||||
#include "CDObjectsTable.h"
|
#include "CDObjectsTable.h"
|
||||||
@ -6204,3 +6205,18 @@ void GameMessages::SendShowBillboardInteractIcon(const SystemAddress& sysAddr, L
|
|||||||
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST
|
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) SEND_PACKET_BROADCAST
|
||||||
else SEND_PACKET
|
else SEND_PACKET
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameMessages::HandleRequestActivityExit(RakNet::BitStream* inStream, Entity* entity) {
|
||||||
|
bool canceled = false;
|
||||||
|
inStream->Read(canceled);
|
||||||
|
if (!canceled) return;
|
||||||
|
|
||||||
|
LWOOBJID player_id = LWOOBJID_EMPTY;
|
||||||
|
inStream->Read(player_id);
|
||||||
|
auto player = EntityManager::Instance()->GetEntity(player_id);
|
||||||
|
if (!entity || !player) return;
|
||||||
|
|
||||||
|
for (auto* shootingGallery : EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::SHOOTING_GALLERY)) {
|
||||||
|
shootingGallery->RequestActivityExit(entity, player_id, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -648,6 +648,7 @@ namespace GameMessages {
|
|||||||
void SendDeactivateBubbleBuffFromServer(LWOOBJID objectId, const SystemAddress& sysAddr);
|
void SendDeactivateBubbleBuffFromServer(LWOOBJID objectId, const SystemAddress& sysAddr);
|
||||||
|
|
||||||
void HandleZoneSummaryDismissed(RakNet::BitStream* inStream, Entity* entity);
|
void HandleZoneSummaryDismissed(RakNet::BitStream* inStream, Entity* entity);
|
||||||
|
void HandleRequestActivityExit(RakNet::BitStream* inStream, Entity* entity);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GAMEMESSAGES_H
|
#endif // GAMEMESSAGES_H
|
||||||
|
@ -349,6 +349,15 @@ namespace CppScripts {
|
|||||||
* @param itemObjId The items Object ID
|
* @param itemObjId The items Object ID
|
||||||
*/
|
*/
|
||||||
virtual void OnFactionTriggerItemUnequipped(Entity* itemOwner, LWOOBJID itemObjId) {};
|
virtual void OnFactionTriggerItemUnequipped(Entity* itemOwner, LWOOBJID itemObjId) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles exiting a scripted activity
|
||||||
|
*
|
||||||
|
* @param sender
|
||||||
|
* @param player the player to remove
|
||||||
|
* @param canceled if it was done via the cancel button
|
||||||
|
*/
|
||||||
|
virtual void OnRequestActivityExit(Entity* sender, LWOOBJID player, bool canceled){};
|
||||||
};
|
};
|
||||||
|
|
||||||
Script* GetScript(Entity* parent, const std::string& scriptName);
|
Script* GetScript(Entity* parent, const std::string& scriptName);
|
||||||
|
@ -135,38 +135,26 @@ void SGCannon::OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGCannon::OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier,
|
void SGCannon::OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) {
|
||||||
const std::u16string& userData) {
|
|
||||||
auto* player = EntityManager::Instance()->GetEntity(self->GetVar<LWOOBJID>(PlayerIDVariable));
|
auto* player = EntityManager::Instance()->GetEntity(self->GetVar<LWOOBJID>(PlayerIDVariable));
|
||||||
if (player != nullptr) {
|
if (!player) return;
|
||||||
if (button == 1 && identifier == u"Shooting_Gallery_Stop") {
|
|
||||||
|
if (identifier == u"Scoreboardinfo") {
|
||||||
|
GameMessages::SendDisplayMessageBox(player->GetObjectID(), true,
|
||||||
|
dZoneManager::Instance()->GetZoneControlObject()->GetObjectID(),
|
||||||
|
u"Shooting_Gallery_Retry", 2, u"Retry?",
|
||||||
|
u"", player->GetSystemAddress());
|
||||||
|
} else {
|
||||||
|
if ((button == 1 && (identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay")) || identifier == u"SG1" || button == 0) {
|
||||||
|
if (IsPlayerInActivity(self, player->GetObjectID())) return;
|
||||||
|
self->SetNetworkVar<bool>(ClearVariable, true);
|
||||||
|
StartGame(self);
|
||||||
|
} else if (button == 0 && ((identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay"))){
|
||||||
|
RemovePlayer(player->GetObjectID());
|
||||||
|
UpdatePlayer(self, player->GetObjectID(), true);
|
||||||
|
} else if (button == 1 && identifier == u"Shooting_Gallery_Exit") {
|
||||||
UpdatePlayer(self, player->GetObjectID(), true);
|
UpdatePlayer(self, player->GetObjectID(), true);
|
||||||
RemovePlayer(player->GetObjectID());
|
RemovePlayer(player->GetObjectID());
|
||||||
StopGame(self, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (identifier == u"Scoreboardinfo") {
|
|
||||||
GameMessages::SendDisplayMessageBox(player->GetObjectID(), true,
|
|
||||||
dZoneManager::Instance()->GetZoneControlObject()->GetObjectID(),
|
|
||||||
u"Shooting_Gallery_Retry?", 2, u"Retry?",
|
|
||||||
u"", player->GetSystemAddress());
|
|
||||||
} else {
|
|
||||||
if ((button == 1 && (identifier == u"Shooting_Gallery_Retry" || identifier == u"RePlay"))
|
|
||||||
|| identifier == u"SG1" || button == 0) {
|
|
||||||
|
|
||||||
if (identifier == u"RePlay") {
|
|
||||||
static_cast<Player*>(player)->SendToZone(1300);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->SetNetworkVar<bool>(ClearVariable, true);
|
|
||||||
StartGame(self);
|
|
||||||
} else if (button == 1 && identifier == u"Shooting_Gallery_Exit") {
|
|
||||||
UpdatePlayer(self, player->GetObjectID(), true);
|
|
||||||
RemovePlayer(player->GetObjectID());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,14 +255,13 @@ void SGCannon::OnActivityTimerDone(Entity* self, const std::string& name) {
|
|||||||
if (self->GetVar<bool>(GameStartedVariable)) {
|
if (self->GetVar<bool>(GameStartedVariable)) {
|
||||||
const auto spawnNumber = (uint32_t)std::stoi(name.substr(7));
|
const auto spawnNumber = (uint32_t)std::stoi(name.substr(7));
|
||||||
const auto& activeSpawns = self->GetVar<std::vector<SGEnemy>>(ActiveSpawnsVariable);
|
const auto& activeSpawns = self->GetVar<std::vector<SGEnemy>>(ActiveSpawnsVariable);
|
||||||
|
if (activeSpawns.size() < spawnNumber) {
|
||||||
|
Game::logger->Log("SGCannon", "Trying to spawn %i when spawns size is only %i", spawnNumber, activeSpawns.size());
|
||||||
|
return;
|
||||||
|
}
|
||||||
const auto& toSpawn = activeSpawns.at(spawnNumber);
|
const auto& toSpawn = activeSpawns.at(spawnNumber);
|
||||||
|
|
||||||
const auto pathIndex = GeneralUtils::GenerateRandomNumber<float_t>(0, toSpawn.spawnPaths.size() - 1);
|
const auto pathIndex = GeneralUtils::GenerateRandomNumber<float_t>(0, toSpawn.spawnPaths.size() - 1);
|
||||||
|
const auto* path = dZoneManager::Instance()->GetZone()->GetPath(toSpawn.spawnPaths.at(pathIndex));
|
||||||
const auto* path = dZoneManager::Instance()->GetZone()->GetPath(
|
|
||||||
toSpawn.spawnPaths.at(pathIndex)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!path) {
|
if (!path) {
|
||||||
Game::logger->Log("SGCannon", "Path %s at index %i is null", toSpawn.spawnPaths.at(pathIndex).c_str(), pathIndex);
|
Game::logger->Log("SGCannon", "Path %s at index %i is null", toSpawn.spawnPaths.at(pathIndex).c_str(), pathIndex);
|
||||||
return;
|
return;
|
||||||
@ -341,6 +328,7 @@ SGCannon::OnActivityTimerUpdate(Entity* self, const std::string& name, float_t t
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGCannon::StartGame(Entity* self) {
|
void SGCannon::StartGame(Entity* self) {
|
||||||
|
if (self->GetVar<bool>(GameStartedVariable)) return;
|
||||||
self->SetNetworkVar<uint32_t>(TimeLimitVariable, self->GetVar<uint32_t>(TimeLimitVariable));
|
self->SetNetworkVar<uint32_t>(TimeLimitVariable, self->GetVar<uint32_t>(TimeLimitVariable));
|
||||||
self->SetNetworkVar<bool>(AudioStartIntroVariable, true);
|
self->SetNetworkVar<bool>(AudioStartIntroVariable, true);
|
||||||
self->SetVar<LOT>(CurrentRewardVariable, LOT_NULL);
|
self->SetVar<LOT>(CurrentRewardVariable, LOT_NULL);
|
||||||
@ -447,6 +435,14 @@ void SGCannon::RemovePlayer(LWOOBJID playerID) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SGCannon::OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled){
|
||||||
|
if (canceled){
|
||||||
|
StopGame(self, canceled);
|
||||||
|
RemovePlayer(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SGCannon::StartChargedCannon(Entity* self, uint32_t optionalTime) {
|
void SGCannon::StartChargedCannon(Entity* self, uint32_t optionalTime) {
|
||||||
optionalTime = optionalTime == 0 ? constants.chargedTime : optionalTime;
|
optionalTime = optionalTime == 0 ? constants.chargedTime : optionalTime;
|
||||||
self->SetVar<bool>(SuperChargePausedVariable, false);
|
self->SetVar<bool>(SuperChargePausedVariable, false);
|
||||||
|
@ -63,12 +63,11 @@ public:
|
|||||||
void OnStartup(Entity* self) override;
|
void OnStartup(Entity* self) override;
|
||||||
void OnPlayerLoaded(Entity* self, Entity* player) override;
|
void OnPlayerLoaded(Entity* self, Entity* player) override;
|
||||||
void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) override;
|
void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) override;
|
||||||
void OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int32_t value1,
|
void OnActivityStateChangeRequest(Entity* self, LWOOBJID senderID, int32_t value1, int32_t value2, const std::u16string& stringValue) override;
|
||||||
int32_t value2, const std::u16string& stringValue) override;
|
void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) override;
|
||||||
void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier,
|
|
||||||
const std::u16string& userData) override;
|
|
||||||
void OnActivityTimerDone(Entity* self, const std::string& name) override;
|
void OnActivityTimerDone(Entity* self, const std::string& name) override;
|
||||||
void OnActivityTimerUpdate(Entity* self, const std::string& name, float_t timeRemaining, float_t elapsedTime) override;
|
void OnActivityTimerUpdate(Entity* self, const std::string& name, float_t timeRemaining, float_t elapsedTime) override;
|
||||||
|
void OnRequestActivityExit(Entity* self, LWOOBJID player, bool canceled);
|
||||||
private:
|
private:
|
||||||
static std::vector<std::vector<SGEnemy>> GetWaves();
|
static std::vector<std::vector<SGEnemy>> GetWaves();
|
||||||
static SGConstants GetConstants();
|
static SGConstants GetConstants();
|
||||||
|
Loading…
Reference in New Issue
Block a user