Skip to content

Commit 3a57338

Browse files
committed
Fixed crash on level change if more than 4 players, fixed dizziness after death, ignore hooks when frozen, added /set kills, /set laps and /set treasure commands
1 parent b9f74db commit 3a57338

File tree

6 files changed

+77
-20
lines changed

6 files changed

+77
-20
lines changed

Sources/Jazz2/Actors/Player.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2243,7 +2243,7 @@ namespace Jazz2::Actors
22432243
}
22442244
}
22452245

2246-
if (newSuspendState != SuspendType::None && _playerType != PlayerType::Frog) {
2246+
if (newSuspendState != SuspendType::None && _playerType != PlayerType::Frog && _frozenTimeLeft <= 0.0f) {
22472247
if (_currentSpecialMove == SpecialMoveType::None) {
22482248
_suspendType = newSuspendState;
22492249
SetState(ActorState::ApplyGravitation, false);
@@ -2675,8 +2675,8 @@ namespace Jazz2::Actors
26752675
_keepRunningTime = 0.0f;
26762676
_invulnerableTime = 0.0f;
26772677
_lastPoleTime = 0.0f;
2678-
_dizzyTime = 0.0f;
26792678
_isAttachedToPole = false;
2679+
SetDizzy(0.0f);
26802680
SetModifier(Modifier::None);
26812681
SetShield(ShieldType::None, 0.0f);
26822682

Sources/Jazz2/LevelHandler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1625,7 +1625,8 @@ namespace Jazz2
16251625
levelInit.LastEpisodeName = p[0];
16261626
levelInit.ElapsedMilliseconds = _elapsedMillisecondsBegin + (std::uint64_t)(_elapsedFrames * FrameTimer::SecondsPerFrame * 1000.0f);
16271627

1628-
for (std::int32_t i = 0; i < _players.size(); i++) {
1628+
std::int32_t playerCount = (std::int32_t)std::min(_players.size(), arraySize(levelInit.PlayerCarryOvers));
1629+
for (std::int32_t i = 0; i < playerCount; i++) {
16291630
levelInit.PlayerCarryOvers[i] = _players[i]->PrepareLevelCarryOver();
16301631
}
16311632
}

Sources/Jazz2/LevelInitialization.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "WeaponType.h"
77

88
#include <Containers/ArrayView.h>
9+
#include <Containers/StaticArray.h>
910
#include <Containers/String.h>
1011

1112
using namespace Death::Containers;
@@ -33,11 +34,11 @@ namespace Jazz2
3334
/** @brief Score */
3435
std::int32_t Score;
3536
/** @brief Gems collected */
36-
std::int32_t Gems[4];
37+
StaticArray<4, std::int32_t> Gems;
3738
/** @brief Weapon ammo */
38-
std::uint16_t Ammo[WeaponCount];
39+
StaticArray<WeaponCount, std::uint16_t> Ammo;
3940
/** @brief Weapon upgrades */
40-
std::uint8_t WeaponUpgrades[WeaponCount];
41+
StaticArray<WeaponCount, std::uint8_t> WeaponUpgrades;
4142
};
4243

4344
/** @brief Level initialization parameters */
@@ -71,7 +72,7 @@ namespace Jazz2
7172
std::uint64_t ElapsedMilliseconds;
7273

7374
/** @brief Player carry over descriptions */
74-
PlayerCarryOver PlayerCarryOvers[MaxPlayerCount];
75+
StaticArray<MaxPlayerCount, PlayerCarryOver> PlayerCarryOvers;
7576

7677
LevelInitialization();
7778

Sources/Jazz2/Multiplayer/MpLevelHandler.cpp

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2214,6 +2214,28 @@ namespace Jazz2::Multiplayer
22142214
serverConfig.GameMode = value;
22152215

22162216
ApplyGameModeToAllPlayers(serverConfig.GameMode);
2217+
SynchronizeGameMode();
2218+
2219+
if (serverConfig.GameMode != MpGameMode::Cooperation) {
2220+
_levelState = LevelState::Countdown3;
2221+
_gameTimeLeft = FrameTimer::FramesPerSecond;
2222+
SetControllableToAllPlayers(false);
2223+
WarpAllPlayersToStart();
2224+
ResetAllPlayerStats();
2225+
static_cast<UI::Multiplayer::MpHUD*>(_hud.get())->ShowCountdown(3);
2226+
SendLevelStateToAllPlayers();
2227+
}
2228+
2229+
return true;
2230+
}
2231+
2232+
bool MpLevelHandler::SynchronizeGameMode()
2233+
{
2234+
if (!_isServer) {
2235+
return false;
2236+
}
2237+
2238+
auto& serverConfig = _networkManager->GetServerConfiguration();
22172239

22182240
std::uint8_t flags = 0;
22192241
if (_isReforged) {
@@ -2244,18 +2266,6 @@ namespace Jazz2::Multiplayer
22442266

22452267
_networkManager->SendTo(peer, NetworkChannel::Main, (std::uint8_t)ServerPacketType::LevelSetProperty, packet);
22462268
}
2247-
2248-
if (serverConfig.GameMode != MpGameMode::Cooperation) {
2249-
_levelState = LevelState::Countdown3;
2250-
_gameTimeLeft = FrameTimer::FramesPerSecond;
2251-
SetControllableToAllPlayers(false);
2252-
WarpAllPlayersToStart();
2253-
ResetAllPlayerStats();
2254-
static_cast<UI::Multiplayer::MpHUD*>(_hud.get())->ShowCountdown(3);
2255-
SendLevelStateToAllPlayers();
2256-
}
2257-
2258-
return true;
22592269
}
22602270

22612271
MpPlayer* MpLevelHandler::GetWeaponOwner(Actors::ActorBase* actor)
@@ -2456,6 +2466,48 @@ namespace Jazz2::Multiplayer
24562466
std::size_t length = formatInto(infoBuffer, "Spawning set to \f[w:80]\f[c:#707070]{}\f[/c]\f[/w]", _enableSpawning ? "Enabled"_s : "Disabled"_s);
24572467
SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length });
24582468
return true;
2469+
} else if (variableName == "kills"_s) {
2470+
value = value.trimmed();
2471+
auto intValue = stou32(value.data(), value.size());
2472+
if (intValue <= 0 || intValue > INT32_MAX) {
2473+
SendMessage(peer, UI::MessageLevel::Confirm, "Value out of range"_s);
2474+
return true;
2475+
}
2476+
2477+
auto& serverConfig = _networkManager->GetServerConfiguration();
2478+
2479+
serverConfig.TotalKills = intValue;
2480+
SynchronizeGameMode();
2481+
SendMessage(peer, UI::MessageLevel::Confirm, "Value changed successfully"_s);
2482+
return true;
2483+
} else if (variableName == "laps"_s) {
2484+
value = value.trimmed();
2485+
auto intValue = stou32(value.data(), value.size());
2486+
if (intValue <= 0 || intValue > INT32_MAX) {
2487+
SendMessage(peer, UI::MessageLevel::Confirm, "Value out of range"_s);
2488+
return true;
2489+
}
2490+
2491+
auto& serverConfig = _networkManager->GetServerConfiguration();
2492+
2493+
serverConfig.TotalLaps = intValue;
2494+
SynchronizeGameMode();
2495+
SendMessage(peer, UI::MessageLevel::Confirm, "Value changed successfully"_s);
2496+
return true;
2497+
} else if (variableName == "treasure"_s) {
2498+
value = value.trimmed();
2499+
auto intValue = stou32(value.data(), value.size());
2500+
if (intValue <= 0 || intValue > INT32_MAX) {
2501+
SendMessage(peer, UI::MessageLevel::Confirm, "Value out of range"_s);
2502+
return true;
2503+
}
2504+
2505+
auto& serverConfig = _networkManager->GetServerConfiguration();
2506+
2507+
serverConfig.TotalTreasureCollected = intValue;
2508+
SynchronizeGameMode();
2509+
SendMessage(peer, UI::MessageLevel::Confirm, "Value changed successfully"_s);
2510+
return true;
24592511
}
24602512
}
24612513
} else if (line == "/refresh"_s) {

Sources/Jazz2/Multiplayer/MpLevelHandler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ namespace Jazz2::Multiplayer
143143
MpGameMode GetGameMode() const;
144144
/** @brief Sets current game mode */
145145
bool SetGameMode(MpGameMode value);
146+
/** @brief Synchronizes current game mode with all peers without restarting round */
147+
bool SynchronizeGameMode();
146148

147149
/** @brief Returns owner of the specified object or the player itself */
148150
static Actors::Multiplayer::MpPlayer* GetWeaponOwner(Actors::ActorBase* actor);

Sources/Shared/Containers/StaticArray.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,8 @@ namespace Death { namespace Containers {
770770

771771
#ifndef DOXYGEN_GENERATING_OUTPUT
772772
template<std::size_t size_, class T> template<class U, typename std::enable_if<std::is_convertible<U, std::size_t>::value, int>::type> constexpr const T& StaticArray<size_, T>::operator[](const U i) const {
773-
return DEATH_DEBUG_CONSTEXPR_ASSERT(std::size_t(i) < size_, ("Index {} out of range for {} elements", std::size_t(i), size_)), this->_data[i];
773+
return DEATH_DEBUG_CONSTEXPR_ASSERT(std::size_t(i) < size_,
774+
("Index {} out of range for {} elements", std::size_t(i), size_)), this->_data[i];
774775
}
775776

776777
template<std::size_t size_, class T> template<class U, typename std::enable_if<std::is_convertible<U, std::size_t>::value, int>::type> T& StaticArray<size_, T>::operator[](const U i) {

0 commit comments

Comments
 (0)