PreviousWeapon

Table of Contents

1. About

Provides a key to select a previous weapon.

To use (besides ZScript code):
- add event handlers in mapinfo:

  GameInfo
  {
    EventHandlers =
      "NAMESPACE_PreviousWeaponStorage",
      "NAMESPACE_PreviousWeaponEventHandler"
  }

- add an alias and a key in keyconf:

  Alias NAMESPACE_prev_weapon "netevent NAMESPACE_prev_weapon"

  AddKeySection "Previous weapon" PreviousWeaponKeys
  AddMenuKey "Previous weapon" NAMESPACE_prev_weapon

2. License

BSD-3-Clause

SPDX-FileCopyrightText: © 2021 Alexander Kromm <mmaulwurff@gmail.com>
SPDX-License-Identifier: BSD-3-Clause

3. Source

// SPDX-FileCopyrightText: © 2021 Alexander Kromm <mmaulwurff@gmail.com>
// SPDX-License-Identifier: BSD-3-Clause

// 
// Provides a key to select a previous weapon.
// 
// To use (besides ZScript code):
// - add event handlers in mapinfo:
//   
//   GameInfo
//   {
//     EventHandlers =
//       "NAMESPACE_PreviousWeaponStorage",
//       "NAMESPACE_PreviousWeaponEventHandler"
//   }
// 
// - add an alias and a key in keyconf:
//   
//   Alias NAMESPACE_prev_weapon "netevent NAMESPACE_prev_weapon"
//   
//   AddKeySection "Previous weapon" PreviousWeaponKeys
//   AddMenuKey "Previous weapon" NAMESPACE_prev_weapon

// To save data into savegame.
class NAMESPACE_PreviousWeaponStorage : EventHandler
{
  Weapon mCurrentWeapon;
  Weapon mPreviousWeapon;
  bool   mIsHolstered;
}

// Main event handler is static so data is carried over to next level.
class NAMESPACE_PreviousWeaponEventHandler : StaticEventHandler
{
  override void playerEntered(PlayerEvent event)
  {
    mStorage = NAMESPACE_PreviousWeaponStorage(EventHandler
                                               .find("NAMESPACE_PreviousWeaponStorage"));
    if (event.playerNumber == consolePlayer) updatePreviousWeapon();
  }

  override void worldLoaded(WorldEvent event)
  {
    if (!event.isSaveGame) return;

    mStorage = NAMESPACE_PreviousWeaponStorage(EventHandler
                                               .find("NAMESPACE_PreviousWeaponStorage"));

    if (mStorage == NULL) return;

    mCurrentWeapon  = mStorage.mCurrentWeapon;
    mPreviousWeapon = mStorage.mPreviousWeapon;
    mIsHolstered    = mStorage.mIsHolstered;
  }

  override void worldTick()
  {
    if (mStorage == NULL) return;

    updatePreviousWeapon();

    mStorage.mCurrentWeapon  = mCurrentWeapon;
    mStorage.mPreviousWeapon = mPreviousWeapon;
    mStorage.mIsHolstered    = mIsHolstered;
  }

  override void networkProcess(ConsoleEvent event)
  {
    if (mStorage == NULL) return;

    if (event.name == "NAMESPACE_prev_weapon"
        && mPreviousWeapon != NULL
        && mPreviousWeapon != players[event.player].ReadyWeapon)
    {
      players[event.player].PendingWeapon = mPreviousWeapon;
    }
  }

  private void updatePreviousWeapon()
  {
    Weapon ready = players[consolePlayer].readyWeapon;

    if (ready == NULL || ready.getClassName() == "mg_Holstered")
    {
      if (!mIsHolstered)
      {
        // swap
        let tmp         = mCurrentWeapon;
        mCurrentWeapon  = mPreviousWeapon;
        mPreviousWeapon = tmp;
      }
      mIsHolstered = true;
      return;
    }

    mIsHolstered = false;

    if (mCurrentWeapon != ready)
    {
      mPreviousWeapon = mCurrentWeapon;
    }

    mCurrentWeapon = ready;
  }

  private NAMESPACE_PreviousWeaponStorage mStorage;
  private Weapon mCurrentWeapon;
  private Weapon mPreviousWeapon;
  private bool   mIsHolstered;
}

4. Test

Basic check that this code can be loaded.

wait 2; map map01; wait 2; netevent NAMESPACE_prev_weapon; wait 2; quit
GameInfo
{
  EventHandlers =
    "NAMESPACE_PreviousWeaponStorage",
    "NAMESPACE_PreviousWeaponEventHandler"
}
Alias NAMESPACE_prev_weapon "netevent NAMESPACE_prev_weapon"

AddKeySection "Previous weapon" PreviousWeaponKeys
AddMenuKey "Previous weapon" NAMESPACE_prev_weapon
version 4.14.3

#include "PreviousWeapon.zs"

Created: 2026-04-14 Tue 16:11