openmohaa/code/client/cl_inv.cpp

1181 lines
25 KiB
C++
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
2023-12-31 13:32:46 +01:00
Copyright (C) 2023 the OpenMoHAA team
2016-03-27 11:49:47 +02:00
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#include "cl_ui.h"
2023-12-31 14:19:57 +01:00
typedef struct {
2024-06-07 20:34:13 +02:00
const char *string;
int value;
2023-12-31 14:19:57 +01:00
} equipment_event_table_t;
static equipment_event_table_t s_equipTable[] = {
{"left", 1 },
{"right", 2 },
{"dual", 4 },
{"use", 8 },
{"none", 16},
{NULL, 0 }
};
2023-12-31 13:32:46 +01:00
Event evi_inv_changesound
(
"inv_changesound",
EV_DEFAULT,
"s",
"soundname",
"Set the sound to play when the inventory changes items"
);
Event evi_inv_selectsound
(
"inv_selectsound",
EV_DEFAULT,
"s",
"soundname",
"Set the sound to play when an inventory item is selected"
);
Event evi_inv_rejectsound
(
"inv_rejectsound",
EV_DEFAULT,
"s",
"soundname",
"Set the sound to play when an invalid inventory item is selected"
);
Event evi_inv_width
(
"inv_width",
EV_DEFAULT,
"i",
"width",
"Specifies the width of each of the main inv buttons"
);
Event evi_inv_height
(
"inv_height",
EV_DEFAULT,
"i",
"height",
"Specifies the height of each of the main inv buttons"
);
Event evi_inv_vertical_offset
(
"inv_vert_offset",
EV_DEFAULT,
"i",
"offset",
"Specifies the vertical offset from the top of the screen for the inventory"
);
Event evi_inv_horizontal_offset
(
"inv_horiz_offset",
EV_DEFAULT,
"i",
"offset",
"Specifies the horizontal offset from the right of the screen for the inventory"
);
Event evi_inv_align
(
"inv_align",
EV_DEFAULT,
"s",
"side",
"Specifies the horizontal offset from the right of the screen for the inventory"
);
Event evi_inv_cascade
(
"inv_cascade",
EV_DEFAULT,
"s",
"side",
"Specifies the side which to cascade inventory items"
);
Event evi_typedef
(
"typedef",
EV_DEFAULT,
"s",
"type",
"Specifies which class of item you're editing"
);
Event evi_openbrace
(
"{", EV_DEFAULT,
NULL,
NULL,
"Open brace, useless"
);
Event evi_closebrace
(
"}", EV_DEFAULT,
NULL,
NULL,
"Close brace, useless"
);
Event evi_button_shader
(
"button_shader",
EV_DEFAULT,
"s",
"shader",
"The shader for the class button"
);
Event evi_hover_shader
(
"hover_shader",
EV_DEFAULT,
"s",
"shader",
"The shader for the class button when hovering"
);
Event evi_sel_shader
(
"sel_shader",
EV_DEFAULT,
"s",
"shader",
"The shader for the class button when selected"
);
Event evi_bg
(
"bg",
EV_DEFAULT,
"s",
"shader",
"Shader for the background of the class submenu"
);
Event evi_bg_tile
(
"bg_tile",
EV_DEFAULT,
NULL,
NULL,
"Specifies to tile the background of the class submenu"
);
Event evi_width
(
"width",
EV_DEFAULT,
"i",
"width",
"The width of the current item, or default width of all items depending on context"
);
Event evi_height
(
"height",
EV_DEFAULT,
"i",
"height",
"The height of the current item, or default width of all items depending on context"
);
Event evi_barwidth
(
"barwidth",
EV_DEFAULT,
"i",
"width",
"The width of the current item's ammo bar or default width of all items bar's depending on context"
);
Event evi_barheight(
"barheight",
EV_DEFAULT,
"i",
"barheight",
"The height of the current item's ammo bar, or default width of all items bar's depending on context"
);
Event evi_baroffsetx
(
"baroffsetx",
EV_DEFAULT,
"i",
"width",
"The x offset used to calculate ammo bar"
);
Event evi_baroffsety
(
"baroffsety",
EV_DEFAULT,
"i",
"width",
"The y offset used to calculate ammo bar"
);
Event evi_item
(
"item",
EV_DEFAULT,
"s",
"item_name",
"The name of the current item"
);
Event evi_ammo
(
"ammo",
EV_DEFAULT,
"s",
"ammo_name",
"The name of the current item's ammo"
);
Event evi_equip
(
"equip",
EV_DEFAULT,
"sSSSSSSSSS",
"use use use use use use use use use use",
"Which ways you can use this item"
);
Event evi_checkammo
(
"checkammo",
EV_DEFAULT,
"b",
"bool",
"Check if the weapon has ammo before using it"
);
Event evi_command
(
"command",
EV_DEFAULT,
"s",
"command",
"Command to execute"
);
Event evi_model
(
"invmodel",
EV_DEFAULT,
"s",
"name",
"Which model this item is"
);
Event evi_anim
(
"invanim",
EV_DEFAULT,
"s",
"anim",
"Which anim this item uses"
);
Event evi_scale
(
"invscale",
EV_DEFAULT,
"f",
"scale",
"How much to scale the model"
);
Event evi_angles
(
"invangles",
EV_DEFAULT,
"v",
"angles",
"The orientation of the model"
);
Event evi_angledeltas
(
"invangledeltas",
EV_DEFAULT,
"v",
"angles",
"How to spin or bob the model"
);
Event evi_move
(
"invmove",
EV_DEFAULT,
"s",
"movetype",
"How to move the model when selected.\n either bob or spin"
);
Event evi_rotateoffset
(
"invrotateoffset",
EV_DEFAULT,
"v",
"offset",
"Offsets the origin of the model for rotation"
);
Event evi_offset
(
"invoffset",
EV_DEFAULT,
"v",
"offset",
"Offsets the origin of the model for moving"
);
Event evi_hudmodel
(
"hudmodel",
EV_DEFAULT,
"s",
"name",
"Which model this item is"
);
Event evi_hudanim
(
"hudanim",
EV_DEFAULT,
"s",
"anim",
"Which anim this item uses"
);
Event evi_hudscale
(
"hudscale",
EV_DEFAULT,
"f",
"scale",
"How much to scale the model"
);
Event evi_hudangles
(
"hudangles",
EV_DEFAULT,
"v",
"angles",
"The orientation of the model"
);
Event evi_hudangledeltas
(
"hudangledeltas",
EV_DEFAULT,
"v",
"angles",
"How to spin or bob the model"
);
Event evi_hudmove
(
"hudmove",
EV_DEFAULT,
"s",
"movetype",
"How to move the model when selected.\n either bob or spin"
);
Event evi_hudcompassangles
(
"hudcompassangles",
EV_DEFAULT,
NULL,
NULL,
"Applies the special case compass angles to the model\n"
);
Event evi_hudcompassneedleangles
(
"hudcompassneedleangles",
EV_DEFAULT,
NULL,
NULL,
"Applies the special case compass needle angles to the model\n"
);
Event evi_hudrotateoffset
(
"hudrotateoffset",
EV_DEFAULT,
"v",
"offset",
"Offsets the origin of the model for rotation"
);
Event evi_hudoffset
(
"hudoffset",
EV_DEFAULT,
"v",
"offset",
"Offsets the origin of the model for moving"
);
Event evi_bgshader
(
"bgshader",
EV_DEFAULT,
"s",
"shader",
"Shader to draw on the background of the item widget"
);
Event evi_barshader
(
"barshader",
EV_DEFAULT,
"s",
"shader",
"Shader to draw on the background of the item widget to display ammo counts"
);
Event evi_selitemshader
(
"selitem_shader",
EV_DEFAULT,
"s",
"shader",
"The shader for an item that is currently selected in the class submenu"
);
Event evi_selitemshaderontop
(
"selitem_shaderontop",
EV_DEFAULT,
NULL,
NULL,
"Whether the sel shader should be rendered after the model"
);
Event evi_modelwindow
(
"modelwindow",
EV_DEFAULT,
"ffff",
"x y width height",
"Specifies the dimensions of the model window for the inventory in normalized coordinates"
);
CLASS_DECLARATION(Listener, invlistener, NULL) {
{&evi_inv_width, &invlistener::InvWidth },
{&evi_inv_height, &invlistener::InvHeight },
{&evi_inv_vertical_offset, &invlistener::InvVertOffset },
{&evi_inv_horizontal_offset, &invlistener::InvHorizOffset },
{&evi_inv_selectsound, &invlistener::InvSelectSound },
{&evi_inv_rejectsound, &invlistener::InvRejectSound },
{&evi_inv_changesound, &invlistener::InvChangeSound },
{&evi_inv_align, &invlistener::InvAlign },
{&evi_inv_cascade, &invlistener::InvCascade },
{&evi_typedef, &invlistener::Typedef },
{&evi_openbrace, &invlistener::OpenBrace },
{&evi_closebrace, &invlistener::CloseBrace },
{&evi_button_shader, &invlistener::ButtonShader },
{&evi_hover_shader, &invlistener::HoverShader },
{&evi_sel_shader, &invlistener::SelShader },
{&evi_bg, &invlistener::Background },
{&evi_bg_tile, &invlistener::BackgroundTile },
{&evi_width, &invlistener::Width },
{&evi_height, &invlistener::Height },
{&evi_barwidth, &invlistener::BarWidth },
{&evi_barheight, &invlistener::BarHeight },
{&evi_baroffsetx, &invlistener::BarOffsetX },
{&evi_baroffsety, &invlistener::BarOffsetY },
{&evi_item, &invlistener::Item },
{&evi_ammo, &invlistener::Ammo },
{&evi_equip, &invlistener::Equip },
{&evi_checkammo, &invlistener::CheckAmmo },
{&evi_command, &invlistener::Command },
{&evi_bgshader, &invlistener::BGShader },
{&evi_barshader, &invlistener::BarShader },
{&evi_selitemshader, &invlistener::SelItemShader },
{&evi_selitemshaderontop, &invlistener::SelItemShaderOnTop },
{&evi_modelwindow, &invlistener::ModelWindow },
{&evi_model, &invlistener::Model },
{&evi_anim, &invlistener::Anim },
{&evi_move, &invlistener::Move },
{&evi_rotateoffset, &invlistener::RotateOffset },
{&evi_offset, &invlistener::Offset },
{&evi_scale, &invlistener::Scale },
{&evi_angles, &invlistener::Angles },
{&evi_angledeltas, &invlistener::AngleDeltas },
{&evi_hudmodel, &invlistener::HudModel },
{&evi_hudanim, &invlistener::HudAnim },
{&evi_hudmove, &invlistener::HudMove },
{&evi_hudcompassangles, &invlistener::HudCompassAngles },
{&evi_hudcompassneedleangles, &invlistener::HudCompassNeedleAngles},
{&evi_hudrotateoffset, &invlistener::HudRotateOffset },
{&evi_hudoffset, &invlistener::HudOffset },
{&evi_hudscale, &invlistener::HudScale },
{&evi_hudangles, &invlistener::HudAngles },
{&evi_hudangledeltas, &invlistener::HudAngleDeltas },
{NULL, NULL }
2016-03-27 11:49:47 +02:00
};
2023-12-31 13:32:46 +01:00
invlistener::invlistener(inventory_t *i)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
inv = i;
curtype = 0;
2016-03-27 11:49:47 +02:00
}
2023-12-31 14:19:57 +01:00
invlistener::invlistener() {}
2016-03-27 11:49:47 +02:00
2023-12-31 13:32:46 +01:00
void invlistener::verify_curitem(void)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
if (!curitem) {
throw "no current item";
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::verify_curtype(void)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
if (!curtype) {
throw "no current type";
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::verify_one_arg(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
if (ev->NumArgs() != 1) {
throw "bad arg count";
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
bool invlistener::Load(Script& script)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
str token;
str errortext;
while (script.TokenAvailable(true)) {
token = script.GetToken(true);
if (!token.length() || !ValidEvent(token)) {
throw "invalid token";
}
Event *event = new Event(token);
while (script.TokenAvailable(false)) {
event->AddToken(script.GetToken(false));
}
ProcessEvent(event);
}
return true;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
bool CL_LoadInventory(const char *filename, inventory_t *inv)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
Script script;
Com_Printf("Loading inventory...\n");
inv->Clear();
invlistener listener(inv);
// Load the inventory file
script.LoadFile(filename);
return listener.Load(script);
}
inventory_t::inventory_t()
{
typewidth = 64;
typeheight = 64;
horizoffset = 0;
vertoffset = 0;
align = INV_ALIGN_RIGHT;
cascade = INV_CASCADE_LEFT;
}
inventory_t::~inventory_t()
{
Clear();
}
inventory_t::inventory_t(const inventory_t& other)
{
typewidth = other.typewidth;
typeheight = other.typeheight;
horizoffset = other.horizoffset;
vertoffset = other.vertoffset;
align = other.align;
cascade = other.cascade;
rejectsound = other.rejectsound;
selectsound = other.selectsound;
changesound = other.changesound;
types = other.types;
}
inventory_t& inventory_t::operator=(const inventory_t& other)
{
Clear();
typewidth = other.typewidth;
typeheight = other.typeheight;
horizoffset = other.horizoffset;
vertoffset = other.vertoffset;
align = other.align;
cascade = other.cascade;
rejectsound = other.rejectsound;
selectsound = other.selectsound;
changesound = other.changesound;
types = other.types;
return *this;
}
void inventory_t::Clear()
{
types.ClearObjectList();
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvAlign(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
str side;
verify_one_arg(ev);
side = ev->GetString(1);
if (!str::icmp(side, "left")) {
inv->align = INV_ALIGN_LEFT;
} else if (!str::icmp(side, "right")) {
inv->align = INV_ALIGN_RIGHT;
} else {
warning(__FUNCTION__, "Invalid align side '%s'\n", side.c_str());
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvCascade(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
str side;
verify_one_arg(ev);
side = ev->GetString(1);
if (!str::icmp(side, "left")) {
inv->cascade = INV_CASCADE_LEFT;
} else if (!str::icmp(side, "right")) {
inv->cascade = INV_CASCADE_RIGHT;
} else {
warning(__FUNCTION__, "Invalid cascade side '%s'\n", side.c_str());
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvWidth(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->typewidth = ev->GetInteger(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvHeight(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->typeheight = ev->GetInteger(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvVertOffset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->vertoffset = ev->GetInteger(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvHorizOffset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->horizoffset = ev->GetInteger(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvSelectSound(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->selectsound = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvRejectSound(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->rejectsound = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::InvChangeSound(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
inv->changesound = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Typedef(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
str type;
inventory_type_t *t;
2016-03-27 11:49:47 +02:00
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
2016-03-27 11:49:47 +02:00
2023-12-31 14:19:57 +01:00
type = ev->GetString(1);
t = new inventory_type_t();
t->name = type;
t->bg_tile = false;
curtype = t;
curitem = NULL;
defaultWidth = 0;
defaultHeight = 0;
defaultBarWidth = 0;
defaultBarHeight = 0;
defaultBarOffsetX = 0;
defaultBarOffsetY = 0;
inv->types.AddObject(t);
2016-03-27 11:49:47 +02:00
}
2023-12-31 14:19:57 +01:00
void invlistener::OpenBrace(Event *ev) {}
void invlistener::CloseBrace(Event *ev) {}
2023-12-31 13:32:46 +01:00
void invlistener::ButtonShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curtype();
curtype->texture = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HoverShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curtype();
curtype->hoverTexture = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::SelShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curtype();
curtype->selTexture = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Background(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curtype();
curtype->bg = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BackgroundTile(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curtype();
curtype->bg = uWinMan.RegisterShader(ev->GetString(1));
curtype->bg_tile = true;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BGShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->bgshader = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::SelItemShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->selshader = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::SelItemShaderOnTop(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_curitem();
curitem->selShaderOnTop = true;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BarShader(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->barshader = uWinMan.RegisterShader(ev->GetString(1));
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Width(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->width = ev->GetInteger(1);
} else {
defaultWidth = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Height(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->height = ev->GetInteger(1);
} else {
defaultHeight = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BarWidth(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->barwidth = ev->GetInteger(1);
} else {
defaultBarWidth = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BarHeight(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->barheight = ev->GetInteger(1);
} else {
defaultBarHeight = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BarOffsetY(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->baroffsetY = ev->GetInteger(1);
} else {
defaultBarOffsetY = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::BarOffsetX(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
if (curitem) {
curitem->baroffsetX = ev->GetInteger(1);
} else {
defaultBarOffsetX = ev->GetInteger(1);
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Item(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
str type;
inventory_item_t *item;
verify_one_arg(ev);
verify_curtype();
item = new inventory_item_t();
item->name = ev->GetString(1);
item->width = defaultWidth;
item->height = defaultHeight;
item->barwidth = defaultBarWidth;
item->barheight = defaultBarHeight;
item->baroffsetX = defaultBarOffsetX;
item->baroffsetY = defaultBarOffsetY;
item->equip = 8;
curtype->items.AddObject(item);
curitem = curtype->items.ObjectAt(curtype->items.NumObjects());
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Ammo(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->ammoname = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::RotateOffset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.rotateoffset = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudRotateOffset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.rotateoffset = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Offset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.offset = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudOffset(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.offset = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Command(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_curitem();
if (ev->NumArgs() <= 0) {
throw "command needs one or more args";
}
curitem->command = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::CheckAmmo(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
curitem->checkammo = ev->GetBoolean(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Equip(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
int i;
verify_curitem();
if (ev->NumArgs() <= 0) {
throw "command needs one or more args";
}
curitem->equip = 0;
for (i = 1; i <= ev->NumArgs(); i++) {
str equipstr = ev->GetString(i);
int tab;
for (tab = 0; s_equipTable[tab].string; tab++) {
if (equipstr == s_equipTable[tab].string) {
curitem->equip |= s_equipTable[tab].value;
break;
}
}
if (!s_equipTable[tab].string) {
throw "bad equip arguments";
}
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Model(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.model = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::ModelWindow(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
if (ev->NumArgs() != 4) {
throw "ModelWindow: bad arg count";
}
verify_curitem();
curitem->modelWindowX = ev->GetFloat(1);
curitem->modelWindowY = ev->GetFloat(2);
curitem->modelWindowWidth = ev->GetFloat(3);
curitem->modelWindowHeight = ev->GetFloat(4);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudModel(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.model = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Anim(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.anim = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudAnim(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.anim = ev->GetString(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Scale(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.scale = ev->GetFloat(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudScale(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.scale = ev->GetFloat(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Angles(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.angles = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudAngles(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.angles = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::AngleDeltas(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->invprops.angledeltas = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudAngleDeltas(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
curitem->hudprops.angledeltas = ev->GetVector(1);
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::Move(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
str arg = ev->GetString(1);
if (arg == "bob") {
curitem->invprops.move = INV_MOVE_BOB;
} else if (arg == "spin") {
curitem->invprops.move = INV_MOVE_SPIN;
} else {
throw "bad move arguments";
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudMove(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_one_arg(ev);
verify_curitem();
str arg = ev->GetString(1);
if (arg == "bob") {
curitem->hudprops.move = INV_MOVE_BOB;
} else if (arg == "spin") {
curitem->hudprops.move = INV_MOVE_SPIN;
} else {
throw "bad move arguments";
}
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudCompassAngles(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_curitem();
curitem->anglesType = INV_HUDANGLES_COMPASS;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void invlistener::HudCompassNeedleAngles(Event *ev)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
verify_curitem();
curitem->anglesType = INV_HUDANGLES_COMPASS_NEEDLE;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
inventory_item_t *CL_GetInvItemByName(inventory_t *inv, const char *name)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
if (!inv) {
return NULL;
}
for (int i = 1; i <= inv->types.NumObjects(); i++) {
const inventory_type_t *type = inv->types.ObjectAt(i);
for (int ii = 1; ii <= type->items.NumObjects(); ii++) {
inventory_item_t *item = type->items.ObjectAt(i);
if (!item) {
return NULL;
}
if (!str::icmp(item->name, name)) {
return item;
}
}
}
2023-12-31 13:32:46 +01:00
return NULL;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
qboolean CL_HasInventoryItem(const char *name)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
int i;
for (i = 2; i < 6; i++) {
int index = cl.snap.ps.activeItems[i];
if (index > 0) {
if (!str::icmp(name, CL_ConfigString(CS_WEAPONS + index))) {
return true;
}
}
}
return false;
2016-03-27 11:49:47 +02:00
}
2023-12-31 13:32:46 +01:00
void CL_AmmoCount(const char *name, int *ammo_count, int *max_ammo_count)
2016-03-27 11:49:47 +02:00
{
2023-12-31 14:19:57 +01:00
int i;
*ammo_count = 0;
*max_ammo_count = 0;
for (i = 0; i < ARRAY_LEN(cl.snap.ps.ammo_name_index); i++) {
int index = cl.snap.ps.ammo_name_index[i];
if (index) {
if (!str::icmp(name, CL_ConfigString(CS_WEAPONS + index))) {
*ammo_count = cl.snap.ps.ammo_amount[i];
*max_ammo_count = cl.snap.ps.max_ammo_amount[i];
break;
}
}
}
2016-03-27 11:49:47 +02:00
}