From 32129ac235359559bbd7c77385138a6bda1a98b1 Mon Sep 17 00:00:00 2001 From: Adidasman Date: Fri, 4 Nov 2016 01:29:54 +0600 Subject: [PATCH] Add project --- Makefile | 49 + README.md | 3 + bin/relocalizebugfix_mm.dll | Bin 0 -> 97792 bytes bin/relocalizebugfix_mm.pdb | Bin 0 -> 3215360 bytes bin/relocalizebugfix_mm_i386.so | Bin 0 -> 45408 bytes cssdk/common/IGameServerData.h | 15 + cssdk/common/Sequence.h | 201 +++++ cssdk/common/SteamCommon.h | 703 +++++++++++++++ cssdk/common/beamdef.h | 62 ++ cssdk/common/cl_entity.h | 115 +++ cssdk/common/com_model.h | 340 +++++++ cssdk/common/con_nprint.h | 38 + cssdk/common/const.h | 806 +++++++++++++++++ cssdk/common/crc.h | 55 ++ cssdk/common/cvardef.h | 39 + cssdk/common/demo_api.h | 31 + cssdk/common/director_cmds.h | 38 + cssdk/common/dlight.h | 33 + cssdk/common/dll_state.h | 23 + cssdk/common/entity_state.h | 197 ++++ cssdk/common/entity_types.h | 26 + cssdk/common/enums.h | 27 + cssdk/common/event_api.h | 51 ++ cssdk/common/event_args.h | 50 ++ cssdk/common/event_flags.h | 47 + cssdk/common/hltv.h | 61 ++ cssdk/common/in_buttons.h | 38 + cssdk/common/ivoicetweak.h | 38 + cssdk/common/kbutton.h | 44 + cssdk/common/mathlib.h | 127 +++ cssdk/common/net_api.h | 99 ++ cssdk/common/netadr.h | 40 + cssdk/common/nowin.h | 16 + cssdk/common/parsemsg.cpp | 259 ++++++ cssdk/common/parsemsg.h | 66 ++ cssdk/common/particledef.h | 57 ++ cssdk/common/pmtrace.h | 43 + cssdk/common/port.h | 119 +++ cssdk/common/qfont.h | 41 + cssdk/common/qlimits.h | 39 + cssdk/common/quakedef.h | 44 + cssdk/common/r_efx.h | 197 ++++ cssdk/common/r_studioint.h | 151 ++++ cssdk/common/ref_params.h | 75 ++ cssdk/common/screenfade.h | 24 + cssdk/common/studio_event.h | 29 + cssdk/common/triangleapi.h | 64 ++ cssdk/common/usercmd.h | 41 + cssdk/common/vmodes.h | 35 + cssdk/common/weaponinfo.h | 53 ++ cssdk/common/winsani_in.h | 7 + cssdk/common/winsani_out.h | 4 + cssdk/dlls/activity.h | 145 +++ cssdk/dlls/activitymap.h | 111 +++ cssdk/dlls/airtank.h | 42 + cssdk/dlls/ammo.h | 98 ++ cssdk/dlls/basemonster.h | 105 +++ cssdk/dlls/bmodels.h | 131 +++ cssdk/dlls/bot/cs_bot.h | 641 +++++++++++++ cssdk/dlls/bot/cs_bot_chatter.h | 337 +++++++ cssdk/dlls/bot/cs_bot_manager.h | 145 +++ cssdk/dlls/bot/cs_gamestate.h | 90 ++ cssdk/dlls/buttons.h | 104 +++ cssdk/dlls/cbase.h | 375 ++++++++ cssdk/dlls/cdll_dll.h | 126 +++ cssdk/dlls/client.h | 97 ++ cssdk/dlls/csbot_dll.h | 50 ++ cssdk/dlls/decals.h | 83 ++ cssdk/dlls/doors.h | 92 ++ cssdk/dlls/effects.h | 407 +++++++++ cssdk/dlls/enginecallback.h | 178 ++++ cssdk/dlls/explode.h | 55 ++ cssdk/dlls/extdef.h | 102 +++ cssdk/dlls/extdll.h | 82 ++ cssdk/dlls/func_break.h | 119 +++ cssdk/dlls/func_tank.h | 159 ++++ cssdk/dlls/gamerules.h | 678 ++++++++++++++ cssdk/dlls/h_battery.h | 45 + cssdk/dlls/h_cycler.h | 104 +++ cssdk/dlls/healthkit.h | 52 ++ cssdk/dlls/hintmessage.h | 81 ++ cssdk/dlls/hookchains.h | 110 +++ cssdk/dlls/hostage/hostage.h | 232 +++++ cssdk/dlls/hostage/hostage_improv.h | 331 +++++++ cssdk/dlls/hostage/hostage_localnav.h | 58 ++ cssdk/dlls/hostage/hostage_states.h | 203 +++++ cssdk/dlls/items.h | 155 ++++ cssdk/dlls/lights.h | 50 ++ cssdk/dlls/mapinfo.h | 40 + cssdk/dlls/maprules.h | 236 +++++ cssdk/dlls/monsterevent.h | 44 + cssdk/dlls/monsters.h | 113 +++ cssdk/dlls/mortar.h | 55 ++ cssdk/dlls/observer.h | 32 + cssdk/dlls/pathcorner.h | 39 + cssdk/dlls/plats.h | 178 ++++ cssdk/dlls/player.h | 578 ++++++++++++ cssdk/dlls/regamedll_api.h | 413 +++++++++ cssdk/dlls/regamedll_common.h | 95 ++ cssdk/dlls/regamedll_const.h | 104 +++ cssdk/dlls/regamedll_interfaces.h | 296 ++++++ cssdk/dlls/revert_saved.h | 49 + cssdk/dlls/skill.h | 53 ++ cssdk/dlls/sound.h | 141 +++ cssdk/dlls/spectator.h | 33 + cssdk/dlls/subs.h | 40 + cssdk/dlls/training_gamerules.h | 84 ++ cssdk/dlls/trains.h | 149 ++++ cssdk/dlls/triggers.h | 358 ++++++++ cssdk/dlls/unisignals.h | 57 ++ cssdk/dlls/util.h | 182 ++++ cssdk/dlls/vector.h | 176 ++++ cssdk/dlls/vehicle.h | 53 ++ cssdk/dlls/weapons.h | 894 +++++++++++++++++++ cssdk/dlls/weapontype.h | 412 +++++++++ cssdk/dlls/wpn_shared.h | 598 +++++++++++++ cssdk/engine/FlightRecorder.h | 61 ++ cssdk/engine/Sequence.h | 201 +++++ cssdk/engine/archtypes.h | 66 ++ cssdk/engine/bspfile.h | 169 ++++ cssdk/engine/cmd_rehlds.h | 50 ++ cssdk/engine/common_rehlds.h | 73 ++ cssdk/engine/crc32c.cpp | 143 +++ cssdk/engine/crc32c.h | 22 + cssdk/engine/custom.h | 96 ++ cssdk/engine/customentity.h | 38 + cssdk/engine/d_local.h | 46 + cssdk/engine/edict.h | 36 + cssdk/engine/eiface.h | 536 +++++++++++ cssdk/engine/keydefs.h | 131 +++ cssdk/engine/maintypes.h | 52 ++ cssdk/engine/model.h | 415 +++++++++ cssdk/engine/modelgen.h | 144 +++ cssdk/engine/osconfig.h | 194 ++++ cssdk/engine/progdefs.h | 224 +++++ cssdk/engine/progs.h | 82 ++ cssdk/engine/rehlds_api.h | 299 +++++++ cssdk/engine/rehlds_interfaces.h | 132 +++ cssdk/engine/shake.h | 57 ++ cssdk/engine/spritegn.h | 90 ++ cssdk/engine/static_map.h | 257 ++++++ cssdk/engine/studio.h | 358 ++++++++ cssdk/engine/sys_shared.cpp | 72 ++ cssdk/engine/sys_shared.h | 39 + cssdk/engine/userid_rehlds.h | 47 + cssdk/game_shared/GameEvent.h | 138 +++ cssdk/game_shared/bitvec.h | 157 ++++ cssdk/game_shared/bot/bot.h | 164 ++++ cssdk/game_shared/bot/bot_constants.h | 47 + cssdk/game_shared/bot/bot_manager.h | 70 ++ cssdk/game_shared/bot/bot_profile.h | 116 +++ cssdk/game_shared/bot/bot_util.h | 141 +++ cssdk/game_shared/bot/improv.h | 120 +++ cssdk/game_shared/bot/nav.h | 400 +++++++++ cssdk/game_shared/bot/nav_area.h | 320 +++++++ cssdk/game_shared/bot/nav_node.h | 110 +++ cssdk/game_shared/bot/nav_path.h | 99 ++ cssdk/game_shared/bot/simple_state_machine.h | 101 +++ cssdk/game_shared/perf_counter.h | 183 ++++ cssdk/game_shared/shared_util.h | 63 ++ cssdk/game_shared/simple_checksum.h | 49 + cssdk/game_shared/steam_util.h | 76 ++ cssdk/game_shared/voice_common.h | 36 + cssdk/game_shared/voice_gamemgr.h | 56 ++ cssdk/pm_shared/pm_defs.h | 192 ++++ cssdk/pm_shared/pm_info.h | 30 + cssdk/pm_shared/pm_materials.h | 45 + cssdk/pm_shared/pm_movevars.h | 59 ++ cssdk/pm_shared/pm_shared.h | 75 ++ cssdk/public/FileSystem.h | 189 ++++ cssdk/public/basetypes.h | 287 ++++++ cssdk/public/commonmacros.h | 30 + cssdk/public/interface.cpp | 263 ++++++ cssdk/public/interface.h | 150 ++++ cssdk/public/protected_things.h | 187 ++++ cssdk/public/tier0/dbg.cpp | 444 +++++++++ cssdk/public/tier0/dbg.h | 451 ++++++++++ cssdk/public/tier0/platform.h | 630 +++++++++++++ cssdk/public/utlmemory.h | 357 ++++++++ cssdk/public/utlvector.h | 565 ++++++++++++ include/engine_rehlds.h | 15 + include/main.h | 12 + include/precompiled.h | 25 + metamod/dllapi.h | 189 ++++ metamod/engine_api.h | 461 ++++++++++ metamod/enginecallbacks.h | 74 ++ metamod/h_export.h | 46 + metamod/log_meta.h | 99 ++ metamod/meta_api.h | 232 +++++ metamod/mhook.h | 157 ++++ metamod/mreg.h | 183 ++++ metamod/mutil.h | 157 ++++ metamod/osdep.h | 519 +++++++++++ metamod/plinfo.h | 79 ++ metamod/sdk_util.h | 98 ++ metamod/types_meta.h | 79 ++ msvc/relocalizebugfix.def | 5 + msvc/relocalizebugfix.sln | 22 + msvc/relocalizebugfix.vcxproj | 162 ++++ msvc/relocalizebugfix.vcxproj.filters | 54 ++ msvc/relocalizebugfix.vcxproj.user | 4 + src/dllapi.cpp | 175 ++++ src/engine_rehlds.cpp | 52 ++ src/h_export.cpp | 16 + src/main.cpp | 63 ++ src/meta_api.cpp | 53 ++ src/precompiled.cpp | 1 + src/sdk_util.cpp | 14 + 208 files changed, 29811 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 bin/relocalizebugfix_mm.dll create mode 100644 bin/relocalizebugfix_mm.pdb create mode 100644 bin/relocalizebugfix_mm_i386.so create mode 100644 cssdk/common/IGameServerData.h create mode 100644 cssdk/common/Sequence.h create mode 100644 cssdk/common/SteamCommon.h create mode 100644 cssdk/common/beamdef.h create mode 100644 cssdk/common/cl_entity.h create mode 100644 cssdk/common/com_model.h create mode 100644 cssdk/common/con_nprint.h create mode 100644 cssdk/common/const.h create mode 100644 cssdk/common/crc.h create mode 100644 cssdk/common/cvardef.h create mode 100644 cssdk/common/demo_api.h create mode 100644 cssdk/common/director_cmds.h create mode 100644 cssdk/common/dlight.h create mode 100644 cssdk/common/dll_state.h create mode 100644 cssdk/common/entity_state.h create mode 100644 cssdk/common/entity_types.h create mode 100644 cssdk/common/enums.h create mode 100644 cssdk/common/event_api.h create mode 100644 cssdk/common/event_args.h create mode 100644 cssdk/common/event_flags.h create mode 100644 cssdk/common/hltv.h create mode 100644 cssdk/common/in_buttons.h create mode 100644 cssdk/common/ivoicetweak.h create mode 100644 cssdk/common/kbutton.h create mode 100644 cssdk/common/mathlib.h create mode 100644 cssdk/common/net_api.h create mode 100644 cssdk/common/netadr.h create mode 100644 cssdk/common/nowin.h create mode 100644 cssdk/common/parsemsg.cpp create mode 100644 cssdk/common/parsemsg.h create mode 100644 cssdk/common/particledef.h create mode 100644 cssdk/common/pmtrace.h create mode 100644 cssdk/common/port.h create mode 100644 cssdk/common/qfont.h create mode 100644 cssdk/common/qlimits.h create mode 100644 cssdk/common/quakedef.h create mode 100644 cssdk/common/r_efx.h create mode 100644 cssdk/common/r_studioint.h create mode 100644 cssdk/common/ref_params.h create mode 100644 cssdk/common/screenfade.h create mode 100644 cssdk/common/studio_event.h create mode 100644 cssdk/common/triangleapi.h create mode 100644 cssdk/common/usercmd.h create mode 100644 cssdk/common/vmodes.h create mode 100644 cssdk/common/weaponinfo.h create mode 100644 cssdk/common/winsani_in.h create mode 100644 cssdk/common/winsani_out.h create mode 100644 cssdk/dlls/activity.h create mode 100644 cssdk/dlls/activitymap.h create mode 100644 cssdk/dlls/airtank.h create mode 100644 cssdk/dlls/ammo.h create mode 100644 cssdk/dlls/basemonster.h create mode 100644 cssdk/dlls/bmodels.h create mode 100644 cssdk/dlls/bot/cs_bot.h create mode 100644 cssdk/dlls/bot/cs_bot_chatter.h create mode 100644 cssdk/dlls/bot/cs_bot_manager.h create mode 100644 cssdk/dlls/bot/cs_gamestate.h create mode 100644 cssdk/dlls/buttons.h create mode 100644 cssdk/dlls/cbase.h create mode 100644 cssdk/dlls/cdll_dll.h create mode 100644 cssdk/dlls/client.h create mode 100644 cssdk/dlls/csbot_dll.h create mode 100644 cssdk/dlls/decals.h create mode 100644 cssdk/dlls/doors.h create mode 100644 cssdk/dlls/effects.h create mode 100644 cssdk/dlls/enginecallback.h create mode 100644 cssdk/dlls/explode.h create mode 100644 cssdk/dlls/extdef.h create mode 100644 cssdk/dlls/extdll.h create mode 100644 cssdk/dlls/func_break.h create mode 100644 cssdk/dlls/func_tank.h create mode 100644 cssdk/dlls/gamerules.h create mode 100644 cssdk/dlls/h_battery.h create mode 100644 cssdk/dlls/h_cycler.h create mode 100644 cssdk/dlls/healthkit.h create mode 100644 cssdk/dlls/hintmessage.h create mode 100644 cssdk/dlls/hookchains.h create mode 100644 cssdk/dlls/hostage/hostage.h create mode 100644 cssdk/dlls/hostage/hostage_improv.h create mode 100644 cssdk/dlls/hostage/hostage_localnav.h create mode 100644 cssdk/dlls/hostage/hostage_states.h create mode 100644 cssdk/dlls/items.h create mode 100644 cssdk/dlls/lights.h create mode 100644 cssdk/dlls/mapinfo.h create mode 100644 cssdk/dlls/maprules.h create mode 100644 cssdk/dlls/monsterevent.h create mode 100644 cssdk/dlls/monsters.h create mode 100644 cssdk/dlls/mortar.h create mode 100644 cssdk/dlls/observer.h create mode 100644 cssdk/dlls/pathcorner.h create mode 100644 cssdk/dlls/plats.h create mode 100644 cssdk/dlls/player.h create mode 100644 cssdk/dlls/regamedll_api.h create mode 100644 cssdk/dlls/regamedll_common.h create mode 100644 cssdk/dlls/regamedll_const.h create mode 100644 cssdk/dlls/regamedll_interfaces.h create mode 100644 cssdk/dlls/revert_saved.h create mode 100644 cssdk/dlls/skill.h create mode 100644 cssdk/dlls/sound.h create mode 100644 cssdk/dlls/spectator.h create mode 100644 cssdk/dlls/subs.h create mode 100644 cssdk/dlls/training_gamerules.h create mode 100644 cssdk/dlls/trains.h create mode 100644 cssdk/dlls/triggers.h create mode 100644 cssdk/dlls/unisignals.h create mode 100644 cssdk/dlls/util.h create mode 100644 cssdk/dlls/vector.h create mode 100644 cssdk/dlls/vehicle.h create mode 100644 cssdk/dlls/weapons.h create mode 100644 cssdk/dlls/weapontype.h create mode 100644 cssdk/dlls/wpn_shared.h create mode 100644 cssdk/engine/FlightRecorder.h create mode 100644 cssdk/engine/Sequence.h create mode 100644 cssdk/engine/archtypes.h create mode 100644 cssdk/engine/bspfile.h create mode 100644 cssdk/engine/cmd_rehlds.h create mode 100644 cssdk/engine/common_rehlds.h create mode 100644 cssdk/engine/crc32c.cpp create mode 100644 cssdk/engine/crc32c.h create mode 100644 cssdk/engine/custom.h create mode 100644 cssdk/engine/customentity.h create mode 100644 cssdk/engine/d_local.h create mode 100644 cssdk/engine/edict.h create mode 100644 cssdk/engine/eiface.h create mode 100644 cssdk/engine/keydefs.h create mode 100644 cssdk/engine/maintypes.h create mode 100644 cssdk/engine/model.h create mode 100644 cssdk/engine/modelgen.h create mode 100644 cssdk/engine/osconfig.h create mode 100644 cssdk/engine/progdefs.h create mode 100644 cssdk/engine/progs.h create mode 100644 cssdk/engine/rehlds_api.h create mode 100644 cssdk/engine/rehlds_interfaces.h create mode 100644 cssdk/engine/shake.h create mode 100644 cssdk/engine/spritegn.h create mode 100644 cssdk/engine/static_map.h create mode 100644 cssdk/engine/studio.h create mode 100644 cssdk/engine/sys_shared.cpp create mode 100644 cssdk/engine/sys_shared.h create mode 100644 cssdk/engine/userid_rehlds.h create mode 100644 cssdk/game_shared/GameEvent.h create mode 100644 cssdk/game_shared/bitvec.h create mode 100644 cssdk/game_shared/bot/bot.h create mode 100644 cssdk/game_shared/bot/bot_constants.h create mode 100644 cssdk/game_shared/bot/bot_manager.h create mode 100644 cssdk/game_shared/bot/bot_profile.h create mode 100644 cssdk/game_shared/bot/bot_util.h create mode 100644 cssdk/game_shared/bot/improv.h create mode 100644 cssdk/game_shared/bot/nav.h create mode 100644 cssdk/game_shared/bot/nav_area.h create mode 100644 cssdk/game_shared/bot/nav_node.h create mode 100644 cssdk/game_shared/bot/nav_path.h create mode 100644 cssdk/game_shared/bot/simple_state_machine.h create mode 100644 cssdk/game_shared/perf_counter.h create mode 100644 cssdk/game_shared/shared_util.h create mode 100644 cssdk/game_shared/simple_checksum.h create mode 100644 cssdk/game_shared/steam_util.h create mode 100644 cssdk/game_shared/voice_common.h create mode 100644 cssdk/game_shared/voice_gamemgr.h create mode 100644 cssdk/pm_shared/pm_defs.h create mode 100644 cssdk/pm_shared/pm_info.h create mode 100644 cssdk/pm_shared/pm_materials.h create mode 100644 cssdk/pm_shared/pm_movevars.h create mode 100644 cssdk/pm_shared/pm_shared.h create mode 100644 cssdk/public/FileSystem.h create mode 100644 cssdk/public/basetypes.h create mode 100644 cssdk/public/commonmacros.h create mode 100644 cssdk/public/interface.cpp create mode 100644 cssdk/public/interface.h create mode 100644 cssdk/public/protected_things.h create mode 100644 cssdk/public/tier0/dbg.cpp create mode 100644 cssdk/public/tier0/dbg.h create mode 100644 cssdk/public/tier0/platform.h create mode 100644 cssdk/public/utlmemory.h create mode 100644 cssdk/public/utlvector.h create mode 100644 include/engine_rehlds.h create mode 100644 include/main.h create mode 100644 include/precompiled.h create mode 100644 metamod/dllapi.h create mode 100644 metamod/engine_api.h create mode 100644 metamod/enginecallbacks.h create mode 100644 metamod/h_export.h create mode 100644 metamod/log_meta.h create mode 100644 metamod/meta_api.h create mode 100644 metamod/mhook.h create mode 100644 metamod/mreg.h create mode 100644 metamod/mutil.h create mode 100644 metamod/osdep.h create mode 100644 metamod/plinfo.h create mode 100644 metamod/sdk_util.h create mode 100644 metamod/types_meta.h create mode 100644 msvc/relocalizebugfix.def create mode 100644 msvc/relocalizebugfix.sln create mode 100644 msvc/relocalizebugfix.vcxproj create mode 100644 msvc/relocalizebugfix.vcxproj.filters create mode 100644 msvc/relocalizebugfix.vcxproj.user create mode 100644 src/dllapi.cpp create mode 100644 src/engine_rehlds.cpp create mode 100644 src/h_export.cpp create mode 100644 src/main.cpp create mode 100644 src/meta_api.cpp create mode 100644 src/precompiled.cpp create mode 100644 src/sdk_util.cpp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..95f7220 --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +COMPILER = /opt/intel/bin/icpc + +HLSDK = cssdk +METAMOD = metamod +INCLUDES = include + +NAME = relocalizebugfix + +OBJECTS = src/main.cpp src/meta_api.cpp src/dllapi.cpp \ + src/engine_rehlds.cpp src/h_export.cpp \ + src/sdk_util.cpp cssdk/public/interface.cpp + +LINK = -lm -ldl -static-intel -static-libgcc -no-intel-extensions + +OPT_FLAGS = -O3 -msse3 -ipo -no-prec-div -fp-model fast=2 -funroll-loops -fomit-frame-pointer -fno-stack-protector + +INCLUDE = -I. -I$(INCLUDES)/ -I$(HLSDK)/common -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/pm_shared -I$(HLSDK)/public -I$(METAMOD) + +BIN_DIR = Release +CFLAGS = $(OPT_FLAGS) + +CFLAGS += -g -fvisibility=hidden -fvisibility-inlines-hidden \ + -DNDEBUG -Dlinux -D__linux__ -std=c++0x -shared -wd147,274 -fasm-blocks \ + -Qoption,cpp,--treat_func_as_string_literal_cpp -fno-rtti + +OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.c + $(COMPILER) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + + $(MAKE) $(NAME) && strip -x $(BIN_DIR)/$(NAME)_mm_i386.so + +$(NAME): $(OBJ_LINUX) + $(COMPILER) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -o$(BIN_DIR)/$(NAME)_mm_i386.so + +check: + cppcheck $(INCLUDE) --quiet --max-configs=100 -D__linux__ -DNDEBUG -DHAVE_STDINT_H . + +debug: + $(MAKE) all DEBUG=false + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(NAME)_mm_i386.so diff --git a/README.md b/README.md new file mode 100644 index 0000000..360d4eb --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +#ReLocalizeBug Fix + +Fix exploit localization strings in chat diff --git a/bin/relocalizebugfix_mm.dll b/bin/relocalizebugfix_mm.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b2a42bea5d019966911d019e8e115ffcb8380a4 GIT binary patch literal 97792 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

R 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�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%0AnTlVnO7ae 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

1_lHfB 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

_Duen$bW zTORL>cRLfE354f5=UK*`{W$4sa`&#q-pi3!?oQj7L^QP~Tg_I_$Q3{%jn^Z-A4p-U z)$+tdcdSQZzw${A$NHPg%n~k^Oc=Z-(&+vIT&r9kZ&krHkh#(JG{a60$b*+zwl zSdMt^OkvQwokpWQK_cT!@AlPku61Ky^%Sm)8YA&^ZyY^8*f_nic58oO<#ZHAJ0i?X z3Nux1jPc4cuX1HDEXK&6nci4PVWexDUDT~)f9PlntH|f*_RE<9Y(>V%_{4avgWgcS zT`b7{x@pcKeRF34u3jD=Yme1h6FtEpG&WY|SC*In(|Qh?@2&4jVW-NiY7OC0m!|3u z&3Nfhq{|0Vm~Oc}IW{pt$c+Kb_1963ku0S{Q7_z=!c^O3QiQeZ6P@v79gGl_rAmbV zL;)UsULiK7jj+xJI10R!>EwqC@bGB`VcYE0%BR^moyf_gAfUi=&Zsc z?TqzWWd;8%^tsLv>i4rXk=94AwCb&~iDrE)8SCkl&83C@F*77=N}^8CnP0x1&?^%Y z)mp7yjd}&`X^LgE`I7TeJ#7blSfA`vnq%#}84QMfnMN$FM>@}>aNu4aBOt#zp7al$ zx7t1naqLS4_*%J6+EE4JMmd7z;L0ru62hEf-**&X$I7+J#1vLFNJkSBb7h_0hb-#| z|E^*97SeK}J(<93w)U+Y$NpJ4mDx;@ukT6WC(9G9u~uum)sbFc#BNB0x!xDYdtVB} zdY|l#^U73X%7NTW9oD|FzXwy;$uilG+YJPhg9afO`rC*w4;5i12xD#5>G#;$%B`4F z`&Jh-{@sW;em;e%V$X3ys@`Z#Cc2jK6_tGC$FCG%d#tkFWEYo~1}Em0*pG4w!rnN%yBheD zvrUJ8Ace2hp;fO_~!VP8>(=8?}IN!#g`r`SfY zeFP1^k}U)VVdJtd(z%4QBI7a4=}xE4ZAf6)Y|L%hDVDM|b#V%ZK5G(G*PiM{JA}S6 zL!=V%+g^mhFl$sQ?Ww5dC19dKk-_XtVW!yH^y<~I23txu4GKIQ=dzr_u+H1uL7321 zIKphP$&m?^+k%DrZ@R+(Z`BmSDr~>50C<@*6mJUGRYN^Z#7Hvk>Bn}>sOoQUbWTgO@w`Rl!05e+9jTWcYb?U z3g0O=>Qf!In~rJ(4>r$S9N+s=7~~b(4%c9b z9U@FFcisf@#69B!1=tA;C%iBXv&`$j??QxH14st-T0yMG>ac;_;=)o`&gN1v1&R zM3`$+80^r_WV>2z1oVbXh6r=82-78LaixmC&-xkKbVq(0OJT5YCh8MoQ(U0TZL?8Y ztdz;eR~O*h2&Q&pyi%#A@YcWiD>t$&TI~PK5PYXgqL*f;y9NFn_$#(4n-B2kJfuD` zi4aMAGiF?}!gK2~m#gnj;XCCjame(J8Gf30QMdqSLtN9xBJbRr!XQ_>|iDL9j0LklYn zm`7doXaRnzj2X-I^+xJT(|FyR7l^hpKff8BByk*<67QAMoV~*o8|v|~mV9!=1%OGk zD%a+gGc{f!ouJF8YYXr#Y{bq)vxiS>eZzF25dlvu`gkpOA(S>F{mUsl_CvefY&B~w zz+K#EBa&}Ja$i8N2-og4WdL=`#C?LaTOYZ1xip9}{M9Mk^%G3nWCd%>_B%dUTe@e* z!}ylc`qioOSfw^r#aD4IpP!kDg&E8DEpJNO>Xmr`8wra`%&a7LA4-oz#d9dm^<60( zINkPY{28r^PJwkKkiuA!E-{Q)Qo|>@&nSb8gBJa$fd)%KnzSGq1l?F>tGk zgZaT}f+FNFU<{k{8v*_c)X{sk=aY4YMW)Cuxu0nJDck;>w$Cs1R!$GrW{LfpoIA64 zYV(xei~0-7Mm$w$kL^4^#3OBh^D{yW9mtsg!r!#2LB={W5GK}PaD_TL?-bpxA=c_V z&YN})V%QGLYN1@dk>y#b-iUQ@i=Dfw?!@EO9iuWoT1TpX{4wj_v~yS4>t7Sg^n==XA(%jX3;8sNZi50f4O1buqGAw$yE$yKcneT@ephI9^{!XCz`0>z|KZqw)1y zTL5xQk~zuhHy*ow#QoEeek{!s8z((rxj@3wEfJU3Ww>vtTOebspW)IP*?1sh&QDqW z#$(stf;-BgzjC~9+Np@U`MAWZzZh}fTK92q-wKcte#=-Jk6mAU3p%A4;-F3E9vI@8 z{nawXy(q6=8SCl1xW{o*v)7%%!~jZu2@^Xy?F)N=%VPVh5$?biK2Q%!vEJ=@y)Bcf zim~3ES-q{}OY6Oo02#%h%(QnOs@ya*HU<{kTMG4RGnJ7QW4%W#P8I$?ymM=NggT4| zdY;MJJ7-;l;1E9P%oE5G`@9gje!kY6^*JPgl0M(QrOz#O&n0+$nbW6u8M2hFE%do% z&J@&fs2l3uv!&k=_33%b*P-#oz8?tf&9wJG*51hoxMW~$%IxGg?W9Cyw)>tWG}8EtMH(#P3U4 z{k>aQKb27za$7mzx24`e2p8Man+ky@BkM&xug&V^c#Z%#6xW;bvU|IGw{o+QGLI`e zn$_L2wJz%?;;Nj&5!Wp%gnALzGg-X^*AV~_*SBZ&_ip7-$8{m%@cyjso~?BgTtAf6 z+dZ;g#8tU5eM~v7qX1-YzxvtSJGtYZUv>I|exo*7VGl5OVx76n%Mj_yeJ;CWb%nyb z?1|@Ju-tF04OU|jG2*e!XP53+?KjSB43-x-4%^!9v+sWWYxgxLw|5zP>K>cF zbuED}J&|v`x!tF~wB6Enz7rwQU$L!=;b-mM5&Bfw>GcJ{h$gYDtbWa>ZZs{F-I0`$ z{<2V3x)?ZeiVl|h$L5xX%7n`?4y4!EO3~kC?6n?&9^ZMXbS_u;R@O9h+PiSu-}C)D z?0bJ^bCoa;vv;)r@%`Bwt!(uEOf>yJ(C%8YKn^zM`b*%WcH{RKhVN_PyJ)TYJHq#c zr8T3qzFil;t!!lQFAm>U34u)8JrusbM&a=k#CE?ad|z6BP4?|o;oBPDB3>^I-xlW9 zwYSacertq3mgDuh2+y|&|B~=+eubFP1peyq9pRp}c~PtjWg?yzgm1^zSFKI)>QhU~ z3_?D@G1Lt ziM}Q4Pi;Lj)QjI^AD8O;vB8N&oFc;WE7T>_#qMVl(y)Z{Ec_To_b0~hYd*GE|4HGyE!(91CnxpQujGU9d`kR2x4_+td81uy>w-{b z`>~|0r-tu#B$KrDw7e}SM`&$Q_ViE&KO+H%BWCtuKNrUKHi~1pD12uucK0;ae@3i- zc6mcQD;Xmn&KpdQ6n!|?1V7A9{4ifr3itJbhv9}BGAjhx;CED?!zMG-OZD^(H>7_t zt`~*+7vgt{^>a@E)$>2Hw!f0sP1WBGH>7_hZ9n|PtnCcZ8*ccv?02eWZNKG7S=|&< zs;7VE^-P=<;Zy_&?#^4*3n6o^&d%${;A2{(Vn@1T?+PKJawZA0P$z9K0 zMR$*1!d^7c^qeGB4y8TR>xnqiH8NrOI|U)V6SC!kZTqY|dnk)+KqQ?52bJlbbn+%& zOs9gb@tlO=t}6JFe^~7RN-AMbkebz&JR$dS#3N77;u-1>d-aHu^7+(a-5h7;n|#ER z1$;)r3zu&M{v1QLb{Zk$01dyqJ8OHD^9=EbwVj97GB>`a)c=!n9#dSF!HWMLe7CoI z!g!eASY5gVG2x~1eF1Md=a%x~Y+e0oD4#oqwR?&xguB`uRUCQhS2(Dhhm!GkR|sr5 zyDKaE+?KK&?up5`wQjvlr}0c_7sDfyecy@q0Tj z19`PGJpNdICX{cb-$mPQfq%|DH{Skd9X=le1H3Hs{T$YH7@rM2&dDS1@HtCy+Dlx1 zlwrSbGE5@lq(#?$3&yICZ?9c2dK$cc9NhXO#f;}KW6r$KgZ!S(4)gYAWt&OaV0965 zNM(Vq7(cc&DPG6=!)0fZGCv@6eZUY(zr5e)zQ4FWmtS~bKe6a*S~R>19cntGP^YvQ zWz8M5pOp`mr8Tu*UW{jtcSrc+bGNOmmF6zNw$yvZR{-|}&JevX&*c&ODt4vy>*cX8 zmB+3w3uUn%@5b}msh>V~q;3MCICpjWWq&bh$QiAl^pj2((tGu}twXSPX(7`3e%iVW zA4Oi|epS))o)b13H3i|PT>qq_jaV~Ah6Ck~J7Cs>{ zU6bcsvh{o|-hM&*P zC%nvtF5DyU9YrPpGm8wkVsXrWc;K)9uDhler@9< zcd4`Q*FrR{Pue=g-B7+?Wch4E{aD?;Gry%!KUUAi`x0pJ+!7uE9j$rSSs$MYedF*r zO}Z@m4hc%XF=qIp$${bT$m93@kbNhJ#S7xt<$sp_+6OC3JHel^><3@wW!{)-3*VfFcF@n)mh2OKd%ZnfAEzeKC2>B^v9wIKk>n%x{g9%UX zZ=M}XqM9mWbf;+8&X z`A7H^%WwY~FW+1)RLIJ|n6`^ZR4vfY%AXbBwZK=_^Y$aH-W>YZj9Z0e#p1YK{YY3t z__zzYg7!=AyCJOMfU)@Zw_aH)MVJT@bz!I<64T^zN&I#Vd>zP=@%yLX>G(YkE3Vb& z{#U1o{H9U>>72ZPw!-IZ9G|Bxvj^DMhmj!fo!5RT=%PS3p4Rd2UmJMH>0Zjd_X5AG z9s16`Kk-J#X>rB4d0FQobX$7nP5xbrynU{89*r}`KcZ_X&{Z@)Rw`}C&iGyE8pn_i zLF2w?+lS9V^S@{AVq4x+PNyC;$JZW)kbl1e|B`(V3o_E;&u$B2Tc6u-pWeCVI$s<3 z>@kU~dL~D{;|_0UN%8WFJZjIMkU24@F@MP_cwp?*7c2B zwN9LF2bo9CJpy_;y-q@t_&v53$NS{J@V0F4O<*6cwQRlYAl60m$LHf1Cd(1#xe-Rw z9$>oA4^os?XJqGd#$PM0OzEF)_S>v}o6$cz^pE~4lP5&` z2Kk2McV^#Ut0v03fLB1vZGYA6_ii%VKiX_B1D10nQ>y{ZOa{I$l&RrZ7Wq$boOKP6 zKR*xGIOP-Rug@JHU~tBrf8Xue^JEvRj($egn^%sg(s?m1;X_9>M)5nbdm7c^30-2> zzG_o`xPL?r=|^pi?ozm2v~9c98ePx3)H=9m+ZSms^tq+W=%f6dXq#~o!L9HXu6VxN zjWwD%7IE9*-(~81Vcw+msWti59}IjgNkB@}xnpM5Eygycukmu(kUEb7G0Rjcd}IH= z=53G?*3634=rfJuF~pL-wRiin@u6-IAI|mx(!;xKXR-y|%r?9hq<58ks8N27O*mi3 zn4fp~X)-`KKJ*Ny>8cm33TJ(n%_v?90NMA?#QLEi_R;GleJojEZ6?1TyfG=;^s*?U ze*X=DzMHG;z--TDTi)32?H7hQUzK98BBQ-<)O`-)2X}l?PNr7H$a91&{qPm|GmbqU zy6fb#S7u`mL-+6hA{ZZgq?PG#)emD|jRorCtJIHUS06rf$xJVcV^^6E-OKcDQ5;)7 zH0}A^XA#FXVrbOyIl3U&Aqz?ZN3yd1Nqp}8h0Rl^&RQMu?|ZPlv?efZ$m)>Pqb&9n z+9?!=W~k#j;X~BlgWWcw8Pjo0PEz zb3MM-`93Yq?*5J8E6#MqJ}%UfilFA2VpDp+?)?RY5NY?2=@(@0+KK)Ww=gz2s6l2* zo^HlEpGoRi(Har;R;9EV$8~@1yWv7@|Mc9(x}46L&3W{fZQQ5lF$DO2I_kdHWZ#$P zSI_p>A>WGTLuc_3x2>r8oT*O4jXFc9$$!ZEnXfAGhA}TH=p2Q{<=1$MzV$jh1ZuB# zO>55dU2%Q=)uO{Ao`vm1=i3^~g|i*((5nuRmB(Z;#Moc4kWRARr zmZwntM7{SQ^86rcb2Q3o%lZFa2x0ZMs?dy{$Kh42^K9g1tuRZv`eAhPw(9hGJ@v9V zlI@jMQ=dLRm)slLV}3e$`o@azk9B&#l-FsIHZV&ANG+}F=fGE^PrpiXk zO_zHQL4V`P)gFd~G;fLdb-ceT=yVN>P?|*|u~w->!n+N_N%mcY&%twAcc9P9^pf*d z@XRK7aj=_x=dgsObsNHNIg^8T1|8Y=B204mX)oILXXuJp7K@^cldbr2=EXK6d6QY6 zFZj7Y>!gBqNh$m*itx6HigM})hT!cf8W4+m_KK$mnl8;-QGdR4O7rwaaE@hpQN9ln zy@=6@c*kbV_7Sh#QJ_U``@W&@9Um&0c;?Yi^NaX>fQvGCXV43QmZ9DnxkvcB@t(v2ENNCzT!IKT0%cQJzG!)=Zm&I^kPd+X#82I z7dlZ}U#5?UbD>U-vbDASS*23Md8nSX7In#YUGKaxcWV7aFn+T=`+@HWe8cTvH;@#) zl&_a-qW!f-dNJ;|nGI!C-0nv7lpcs}i1#uxtaLoe^5z@8kD>|JI1~4X;z61z>F&0z zTdgi$(uf9KEWb4JAZApshaoHYl37xli97JSg%~D*X2=XoUBM zHjY?ttWd8#)of4nz;EWHS;1wq6(CWmQ>@2JdyP()6kcnK#eRE*dd)_2yh}!n>A9G| zDB6fKX}$eZQyiUE#zmHextOo;yjb^@g}UP%Ub-aPk%*I3&gw3tbq`c4l~#>(lA_Og zRyoGDFQs*_uaj@3S(z{zEhn{0r(^vyY5jxTK(4hX+7;1iEpI%;d5LCkNbBz>x#MJa zf=oluEJLLn+kR78_h6e>=clH+QzG2vT2`C3o(}UGwd-oOURk@^2COA?U&Ig8$?cHCfH{KhcYIfm`?#gY&_C8#w zH#t$McBi;zUmwhSy~y()P3s+~kz%&lV*N6|n`Bw{x{-GtOzR$Ob;nx`o{`lYujQ2! zzI-UHzmMcw6ChjDT$78|eW2xt$7c(5>m+XMcF1nPd@lyd=l9YcPV4Tibvu)-DjA@d z%b0d3uls1BE;reEgss`rd}b_?;qaBT?*2}-N{*s>OLMwOrY=J`TSrf1ua?Q%>#Jit zUD}zbYhHO0>=@}Me0&y*sWp0WTK~ZKc(+;OoixqwN>)44`HHme!7<+dZ8fHBj?<=d zd9kBVzfm8XY>=u*b6u<-d1z-^e>Xy|+T&rEa%Iwy&hA+4E!3-lbA7x@TANre;(IWy zcd*(cr&PUNEl*A!+O@E7XxG_5>C>+WwpKl@Uu~300yIvpuv&S6pF=wj?VIF>{2liD zS$+aBV}E+fF{Ay#ar`Mr$WD1|?9iT5rw;9jnS2)ZhyE6l`nwKHR$Dc)NLI~TKdq)s z1(`hajw0Mr0d9hX8xss)b&LWl`Yiz~MYxRuTy>HhM85$;U|xUuFG>32FkgKMg$F|q00 zBHY^xaIIFmTJN>T49@5|r|Py~9IhGW;jR>Js@xvyj**gYu13veq?NpV2s99|`F(cH_&`eowjghUDzHn1$?}0*ljdG(pg%LL8 zlo^^q;~SgMbGIDt%YLTNZVg7C>~`8?&KW~9Y;$(*CU?ZScrJ#1SM2!sJnw4?=V|$L^A+60=X-l!Rzv6J;@co*Sz7T`KfREtud zt5QY(n2H|(cd!80>td}n8V;BDm+*ZYU%3D`Q5$cO_{x`$(dArnOg_VGjt;cPQN$!b z6NWjMDOn$0Mwea@uGVXGsx_yljnDcsd&dDIo<|FC=&#z;#H6#9afHo-5vK_E>H=Jo zT*zeVQ58E*HNz#5Dy0n1lLfeHmHePJQril$tA9*Tn|)O5Z?yo|XiZdV6Kxmpb=5RH zty_nSa^p-2C%Ms_Y_uEvqH04NYBb6jD4Ep~A&u^PxUh4ALd$Y_zPWcd+y7GP=}G);@FtE$!0KPgO{w}UAR^kALV zCda}FoB=r0E;V3k$^JQHe;Z2`_^R{+0sl_gE*r^-E(v~V+px*o$$!JHrH4cNGDP#v z9Rn*FT|dVo|4r?bOT69dGGrsg2Q zg8O1fPvoHm_>HnrY>>s+T#E0xS@Lk6%Yr{z@4qxlw6?^F>*i|a6Dxh4@l0oaabaeq zW2YK=6b#;3(h@o^%Ifm2M5pXSsPL#z$3;MH*#yZEVa5tD6Ko0UHCb!d$)>5EOqM4&XE0|9FzjwB)ke+jc!M#y>f_8{ z?kK>t#(Ir*yW+I5>WS@@!Q5GZne6tujY_a@6VVN(F)pK`AmW@bt zb$7M8tQwfF?_VFXI8@)#;~4Q z%?IzS_^dy>8Zg6t&pG$rckk=hvSFJ3%pb0gt?Ih>+;h*bd+xcv!*aeRaR!&+pf4fo z^G=yuIjCi$P@-{WB~1nwoHCdX4)eI?n`z@RR!C|1x#*NB2DLIa#fa^Ef=EiUol8y` zOb>+t&DRn*ZzbXwF~QGerws1PFO_RDjN{JRGM(5CUUJIhqH+&Mlvd9br%XO* z;HquRITJNJ+OsM$GPvrLsiGkiaouTLCQWYFoHE6*;^zuAp^eQZjW#s$I4<5(z`{So^(<3^qGuu$ENDyph;7 zm-!@7nb7H0r%V}hF7*c9Iw2@7V-0srJ+yzoj1Bhq*<7vG!1@-IVKFmPiF$^dGPwxz zPL+zZ1ul~&13Y49)l&}|LA9Ef86g&PTA7Snrcm~aS=`i5)NuP@$C#ika>|sjxvqo< z1qdh}BuSCjt`9q9=vkm5o-m5#mS&@)PMOFrprVrHd(&)m$|+Nd3Q-Y@U0e@Wk*1%X zQ>I=h;J)5a+5(qJt7p+ElgnqTKHhZUdf1Pq`H+)NnR=mE&X(1T9g~&juTME;!dkVC z?pf+#v*CeBLO+i?Wy+Nt9t11Mc#X;8{y9!( zZ}Uhet<9Zv%3!srj7c#u9;S_jm!R#OQ>GeWfB`0>xWF4o{^uHB{Tye_ea)oT!SF<8)0%^8$)hUB{<2*VO z=^MG}q_v-GPMI3+udg9cWq!ENO4BJe8(aRZD z;c>*G7?d?AVT{VH7lScrKEl ztic=O$Wvl?kEw7c_V#+r>e9ZB5*ceJ&yP zY+<#Ed5Jxm*gBhNie9d{yp&71N~I`H(HaCY8Fi{XO)od?cIXJQ*cO#ev85 z3K*`6K-kPBFk?EnxW$a7V|M}v1znYz*eT<%?38h&*eP8&Wa&06;}KAd{+JiGbw(sY zWm{)N#A$3}p^Kw{#hF0wt6(#i&W?FuGf(kjhg}?D1rDf=r&g&Z#vy}H#=&khMK2RB z4h$>sB9R)zF%IbiV>(iNVb8@;L-}&m7b9b}vQR`G+}v0wt~?$|;NT-yk@#fBVab$n zq{#G?i=$Dll)#Jl4_2#%gY7g$rcbyy@ZM_Vm(}(X_8&5+WqGg<;!eip<&2A?R;ZaS zipj84%hqM}`=-r3?cxA}uu@im4Yyg#DRX;ykZ5q}IPc=f`PfDqV1pt-v2JI$OsrdG z$i?xTi=$A*PzY|BaWDz29MLVCMv8r0a&h2E8!W_P{f%m35-b~I6FtOqAvbO>FSBh)K9w9$Wnw z3G*SNEoO$1NHE2}SwalNV&jfLNL-_7+-BpiWw5suZ}+Kz8S9-b+0r{ZDVNV77e^U` z{9G09un`mw9;}AIET*)_`w}>^nA8mLY#iaRh-bE#L*~_`qm;l=uK0LnUET>f$J2K+wRGjYI(}gKbbmnnYo2c*ez%kMLe{h|S%E zgvH621PRBTDeZC5#gW4#DK>wLUYG`}ALY0+r5}CN#S!AA+H9o!HH*_~2kcf-+QH*4 z4mw^?E)|3qwhyaOvwc{NTHEQ9E)HzF#lxsdx9sECSVbPm07v6E>*ByDzY<_iM{K8z zNN_M650bR$|JXl0| zjUW4*^4JPoQrj?C<(A&r1#=y)tX^|*gbfV)Yih$T_mAS#n55k4_EQ-Csx~} zO>ihqTZ`!|M+Y8Pvg2z!h8tx4 zNE{{Ou;RGoa2#=Q)XVuGTZ}}v+z#G=Os8BNc)pxoOSR~*zeFC~oH>|tah!BvxhL+xoQ zW(9~WXe&Upa6Rkd!rGc&#jZ@2H4lZjEn2>dWo>nCz@__y=WSfIOc+GiNvZZxvf7zZ z5fyts?hjnOU3PKMq5$3;&&B-;^Cmdhbi|Fa-ZULAyEvj6HcOP%0u!6CC1!35_s3$^ zI5xe@X-_%q{m<)dW-JXW{^5DI6g$4^(t))aEMDT-SE`NmWce4yQCdpJYc39i9mN`U zb}|kw&Vs#uTUdLK!%I}GRp1(yba4D*$&^im8x`S+ z`}?gf4lGI5@&&aR#cH+su;t{j-NoUDh#6E!$&#>|b&?Dd5AJhuz_>A4zJc4bG)N92 zSc$P?6Wy>$m@(61HvU?siWgY1cS+hi(`dC37D0+#opy1QC>X`&C?=8nK1L*BW20cD zx_mxm;{czSBdgT(U1v!j$g$NM<5Tr9FP;Ako0ftmNhJR$ZVvvheur;m?Ou+qlh%s46TsC^ly*5IB;e#U%}v-bL zdD6zw$Y6O3_YgWUE)J~6Gzw_yWbH{a;aQ)mx-!x$kyyU^y;}oiypOG`r3e zIx;SfMg=>IG>)Y1m=`tz;YI5%v~fUp2q)?VHBMsLrnm9eQJrUWH(}$)*cYppSiY2T zN31)R{BrHzoY5QDxN4aIGbDvZKE0n{m&h&0)!j)KN3N6)O9i$0B&j=Yb18CvEP(^N zpy?<7i}p26izzYp%0Iw}mJf09pOft2Qp|%gGihHEh6So|1Cmkj0`$ z`vJN$-1s)&$YG|d5{hq2+9Ru-{iiG2buNxvv0e!6WkQP^Mq!zwnWNfl<7i|mwWx#@ zZENnDRwT60@y|CG(#B;k{9Hpp=3xkT*+NVVdi^S?6wQMsk zjt0DR4RZyt%~^s;hNl`w=;EkVtHnafVIKB}Y`2zhHIBnBj-VP9p`Uaev)@XI=O$bn zxP%DL-K#4NlD5w-E2XdRC2?TOQ%>PX+ADXk~JN4 z7n;?6bI>d1m}Sh6 zEh%m8l8Yn6&AW{(E@`5gl60_Xq{!n%7YEh@ak-5;beyDvWtu|A6&DB2o|Lf_Ej>o# zDOVPXE00%Q95{oQ!~Cz+=B&2Qyri^S?<0r*6t9u!Ld%eKx8SU)^B-c9;wStl>MI9S_R zR0lB4Jq#rqH|7Gd)1->q#$r3>;8^Hny4kp0`)Rs3u$GIqpbl0f+XDY)A-Xt5T^zYu zh<2^!wURi-V)-%G+J0tS9QkZi$S>#Tcf;@}y9E|qt2Jn7=du@v@7fTFGNBqMklRVAq?1 z;$AH8jain7(YwvUXez{aD6|?H_NfHN> zV6}ZczT0Hu!1%6;GY-Xy9iT`|+n}gyjmEz{fxnD1D41-tf@}*P z6K(xwgq)ZZfmu(<+xRioF2e8lk@S7s9E4{kpMNvCLZtRxk&7epvF7L(WlX_k#LvVy zQvA*l7e}s=s}+iBu9|UJ;{f(MmOiztrfeM0MUbu5uutD&#tH@)Da%GWh&LdslQw?z zH^po|tLG(Hl@>Y{n^fo6++!{dbT*X;=Z@L-8HYt8{}y#RI8M7b@+Dlz*ih{_HYs6? zMa{grI(y2+QLYuML8xLt?q4ik__u6ZaOgPa;;3T}Q@(EFuxux`LYIzbT^wb^ZzU{G zu{^k53kUNiv4=y)MHff0P-tK+PUee~IIQ0eju%`UxFa~M=G566s|?#Pn+hAD%gakH z4qV|H1bS^E6~_XV7aThFdd0@k$P}@4KFq0$p%@3(Yc0gGpO@dvkTq}dnvDx>8#nhh zidk_TELL$i%oE#*#0QRC*5WQ0YutnVc8$8)?#(EyX2~kHSTgh1n_L{&CsZy+MQa|- zLc*q+V)I*F9F?F{E7uC?`x@9z#C{!Kw!1jW*m39QLmBrZnPD6$?Pi~gBZpgminyeK z?KO#Gxwe;gabP%F$d}bwk0cIOHz&Hb7P&a0O0`hLFfNr2j)CY7|uiY^+Pg z!7578%an@)J2Wuoq5O7|mmaZ@(tZan4orDqd|pr23wLDvk1LOpE{-s4VB4-bbCRTk zZ8Xg{Cvaq|1>Db)J{QHJNU^cgE{+=Ft9nTtY);a_I8x%)r(7IC1$T^Nnl9Fh)kiQ1 zDed;0ivz2Ik&hFisW{loQ)2LET^u-pgL!zh*2=tCbZ~nSf8w;ci!P385!bNh)INq( z94U0X;Nl3%IOAE8ur(EhB@W|*UUG4SI67C$l`Y*`ys)25q2m=7N1mpX>&wWL31gwS zc6!alftw5pQC0c(Bs11;N2WJ@%<;(~Zmq<5vvgkA2c@)^4K5Dsfhl8qdHS3OH(4v* z(sADw7Y8o%C`C~*9S6G~J_z8-<1QCRKFSuux*8i<{Bs}0B&77ayImY`K@E_RP6zv- zly;kOanLzaoGQ2aO3OYN2NUP=61q6bxtgDCs0&k*yf6;SP_;}CyEqDPsAb%zklJn; z#|fgrrDMXyQO3U9Mi{2gMKN1e_@L?Nxi~N`%3%zVw#_)K-wqw;T^zW~m#$e5#c&z%TQQCl zKlYr9qf!kTxKS*9(+KwsDKfp};=m<4xX28TD;Qpcf2L!(c3w*#Uu{vw(^TJ)673Avnf(MoCI2jVn({;6} z@?c+>(l@MgaTIX7R@hLNRInen;&oO@ik)sw;K1SC0?tJ<9gM@WbvCyYzfNy#S}{M) z-}wkYB>rF(h&`}87)MIKKjh-b<)Tuxpw7)Q4$Ib;qvJjoN5nfg)MZYL!?F*y(-gm6 za&hG7u?0LE!174quzoxC(R6VXvp#mls&!5-W69L|?cf-7aiH1bGH`Vn9G5x4ew<~> zY^22NGcJxCE*B~Ls=crbIdGA2zxCUpV=;lFT&TwrG5g`l?y;^iwI4qnF9Z$MA>Se4gU?VT{!ebuGC-ZOaFkL#% zx;QH35O>h1Jr6wPVd3ERli~}XadF^CP*l_BU>JwYov?2C&y;c01s6v-2+{Scdpo#{ zw9~lFS?$)`>1^Y`x=k)u!6oA?4o1OUfkg|;)xx8F*^4$F>;nNEm^hI6ycm(#8UIe{ z>#n#sN;z!OriWli`dr4ccmB=7b#?Qqi=#@NC3cfD4t6<~jaa`O8}YEPWcjjO9(S(! zLIxMHW>T!*jKah*>s%Z`=;Jc6io`M8Oj(d34;E*NemA=~e7r9d;>jE4g>kSD1c&w8 z;bohP1146_RjLyAa~bBqYX2#^9ddC*SzP9WhnHeHqzu~`<4nPEpNj*V3$T-0-6X_i zEWf;*jg?#+h+%LONmgPZ#$ov(_U$QjG+i8c!>U9NS;f3qI2fncoFmgw7e^H3X=9x9 zbzH`>G3&R3W5&gSbLROf4vI4!Og1xM*+)uDwwSRS9uoJZi#$oApxtQ$H1dgZy znHHt*PvWqCJG?yZ;s`6%D5$BiC70oUuFuPpE{+@?3o9WCiFvW~vfMn%Sr-R}Fr|hX zCbJi}+;Y;yOuK!?#ZkhobVYr!BO|e7YW;TPalyqARA^Y zX9cVlu4^u?BIc@tsyfD;N*6O|b)wdM_1diCtNpMT1_d=A$zm0D*f&|f9er&|;J^bS zjl8;-oy%CUn)TbkvDL+aJ!#nItj?LU>0Zb9bRW9i#gT)$%KEV*#$my3V?|aCu>+ zh(qrQx-4g&G(wB6^DZvTzf^DuZF0{j6C*sP;L`SZ(Z+>$6B-40WOb(nW03tM+{Rgz zVi#;ndY$(L8wb{Tacd?fr_`D|BjJ`Uw6GtvjDp=52LcRap*L&puO#qS!W^E!Qfuz7 zho2F0ecUsMgqeJU|E8Sf=V;FW)+(?_5bMSwpQ~e^DeNpyzGv`nN#OT!Z*tWU@^vb> z4*gn(yKVfnOudL(z4d)~Os^GGCrv@)$hbIaxHPun*p!8Xaazq!;|P;DFmW8Ji_f`? ztgWyuu}iXWXrFS}#({GS4Y~l%aw!7PJ1bIN5bUbv}R{h#((7i}D9^LY9&s`>Wq-!f=q#V}Iq_wtS2 zwE343_;E)M_J^rWcS(H7-*2GJU$gP!>?V$qhU#8hZmH5;Gxhx2@_Xj4)|-6G@8JwY zl&xXPM;cr5j;N$v>Hc z(@w=UNjf-QN{JbpE{mW*ltC(*F6k)pqF(o*O*Rd+j&*oulL9{qf$3R^R)uO8>@bdH<+2K0nBJkI&6? zj&)}29mhCwl=r-Q?^N)YEqIIo+r5#&{Pf(>VA1pHw=0-!KdW$}wz=u?*4U!%q`50oap0S zULl}Q%;>V;?R7wB9l=pz- zfu1}Fap`$T@`#?12S=Ki(-EquG?o1!$@ej$$_@uH<~xzsGI$S;1jBipf<72FW8%1c z4KUPXnhh%hyb$g&Q(p4Q6ilOD{a)B(Ydo*$U9VYqXt(kX)N5$eMZ5!b{buW#_r zXyBLF&Fu>3=q&=1Xtuy1?KXQT_7&xR)E<8rZ=y|Pdp*{rz&f$Ng zYb8HN_1yH1xSpYXSYRsT>XnR^iVM5JhP@}kJ;4p^sUu(#k-+M+B%5tm#31=Pj>qA# z8USmVNdcTC(Pg%|Wh!`18~2}Z1zL`#jP65+>@qoAgyR<)1>8Sc#yfM z@%D^*H!tAmB?H!X>3TyO2i_bHu{Fj=KkVaGw?QX3)|rD#eL$+-ujF>bE`xJn)iUlp z#wGz(XrwdS?oD;)JEkDwkB_OcJ*R9rldB>;%i;hwxNJ_L(ut7)47Z2}>Dw?1C0P$g zCq-wcobosyUc^PVSm#i63yNO1J43FWEhOXVvS*yKc?3UUP{Y2Jxb8$j2uhE?p0Uef zuA@+^R|3fCf%fzOJx`)u>f*-021gwv@2sZb1se}uBhUK<-^YQ&j6c)ucM@ns>}_54 zl|

UST%ap8Y9-T|r)J36>B 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%0Alm%DCF3}gRbqi( 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 z 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

-_&klRSO?eG9BfkiOkv533-k&yfB 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 VC@q1~5-2T!(h?{wf&c3z@E@$UC=~zz literal 0 HcmV?d00001 diff --git a/bin/relocalizebugfix_mm_i386.so b/bin/relocalizebugfix_mm_i386.so new file mode 100644 index 0000000000000000000000000000000000000000..03f883ce8757ebf42440bb03c5de13ef4fbc7ea3 GIT binary patch literal 45408 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 literal 0 HcmV?d00001 diff --git a/cssdk/common/IGameServerData.h b/cssdk/common/IGameServerData.h new file mode 100644 index 0000000..d431f00 --- /dev/null +++ b/cssdk/common/IGameServerData.h @@ -0,0 +1,15 @@ +#pragma once + +#include "maintypes.h" +#include "interface.h" + +class IGameServerData : public IBaseInterface { +public: + virtual ~IGameServerData() { }; + + virtual void WriteDataRequest(const void *buffer, int bufferSize) = 0; + + virtual int ReadDataResponse(void *data, int len) = 0; +}; + +#define GAMESERVERDATA_INTERFACE_VERSION "GameServerData001" diff --git a/cssdk/common/Sequence.h b/cssdk/common/Sequence.h new file mode 100644 index 0000000..8df553d --- /dev/null +++ b/cssdk/common/Sequence.h @@ -0,0 +1,201 @@ +//--------------------------------------------------------------------------- +// +// S c r i p t e d S e q u e n c e s +// +//--------------------------------------------------------------------------- +#ifndef _INCLUDE_SEQUENCE_H_ +#define _INCLUDE_SEQUENCE_H_ + + +#ifndef _DEF_BYTE_ +typedef unsigned char byte; +#endif + +//--------------------------------------------------------------------------- +// client_textmessage_t +//--------------------------------------------------------------------------- +typedef struct client_textmessage_s +{ + int effect; + byte r1, g1, b1, a1; // 2 colors for effects + byte r2, g2, b2, a2; + float x; + float y; + float fadein; + float fadeout; + float holdtime; + float fxtime; + const char *pName; + const char *pMessage; +} client_textmessage_t; + + +//-------------------------------------------------------------------------- +// sequenceDefaultBits_e +// +// Enumerated list of possible modifiers for a command. This enumeration +// is used in a bitarray controlling what modifiers are specified for a command. +//--------------------------------------------------------------------------- +enum sequenceModifierBits +{ + SEQUENCE_MODIFIER_EFFECT_BIT = (1 << 1), + SEQUENCE_MODIFIER_POSITION_BIT = (1 << 2), + SEQUENCE_MODIFIER_COLOR_BIT = (1 << 3), + SEQUENCE_MODIFIER_COLOR2_BIT = (1 << 4), + SEQUENCE_MODIFIER_FADEIN_BIT = (1 << 5), + SEQUENCE_MODIFIER_FADEOUT_BIT = (1 << 6), + SEQUENCE_MODIFIER_HOLDTIME_BIT = (1 << 7), + SEQUENCE_MODIFIER_FXTIME_BIT = (1 << 8), + SEQUENCE_MODIFIER_SPEAKER_BIT = (1 << 9), + SEQUENCE_MODIFIER_LISTENER_BIT = (1 << 10), + SEQUENCE_MODIFIER_TEXTCHANNEL_BIT = (1 << 11), +}; +typedef enum sequenceModifierBits sequenceModifierBits_e ; + + +//--------------------------------------------------------------------------- +// sequenceCommandEnum_e +// +// Enumerated sequence command types. +//--------------------------------------------------------------------------- +enum sequenceCommandEnum_ +{ + SEQUENCE_COMMAND_ERROR = -1, + SEQUENCE_COMMAND_PAUSE = 0, + SEQUENCE_COMMAND_FIRETARGETS, + SEQUENCE_COMMAND_KILLTARGETS, + SEQUENCE_COMMAND_TEXT, + SEQUENCE_COMMAND_SOUND, + SEQUENCE_COMMAND_GOSUB, + SEQUENCE_COMMAND_SENTENCE, + SEQUENCE_COMMAND_REPEAT, + SEQUENCE_COMMAND_SETDEFAULTS, + SEQUENCE_COMMAND_MODIFIER, + SEQUENCE_COMMAND_POSTMODIFIER, + SEQUENCE_COMMAND_NOOP, + + SEQUENCE_MODIFIER_EFFECT, + SEQUENCE_MODIFIER_POSITION, + SEQUENCE_MODIFIER_COLOR, + SEQUENCE_MODIFIER_COLOR2, + SEQUENCE_MODIFIER_FADEIN, + SEQUENCE_MODIFIER_FADEOUT, + SEQUENCE_MODIFIER_HOLDTIME, + SEQUENCE_MODIFIER_FXTIME, + SEQUENCE_MODIFIER_SPEAKER, + SEQUENCE_MODIFIER_LISTENER, + SEQUENCE_MODIFIER_TEXTCHANNEL, +}; +typedef enum sequenceCommandEnum_ sequenceCommandEnum_e; + + +//--------------------------------------------------------------------------- +// sequenceCommandType_e +// +// Typeerated sequence command types. +//--------------------------------------------------------------------------- +enum sequenceCommandType_ +{ + SEQUENCE_TYPE_COMMAND, + SEQUENCE_TYPE_MODIFIER, +}; +typedef enum sequenceCommandType_ sequenceCommandType_e; + + +//--------------------------------------------------------------------------- +// sequenceCommandMapping_s +// +// A mapping of a command enumerated-value to its name. +//--------------------------------------------------------------------------- +typedef struct sequenceCommandMapping_ sequenceCommandMapping_s; +struct sequenceCommandMapping_ +{ + sequenceCommandEnum_e commandEnum; + const char* commandName; + sequenceCommandType_e commandType; +}; + + +//--------------------------------------------------------------------------- +// sequenceCommandLine_s +// +// Structure representing a single command (usually 1 line) from a +// .SEQ file entry. +//--------------------------------------------------------------------------- +typedef struct sequenceCommandLine_ sequenceCommandLine_s; +struct sequenceCommandLine_ +{ + int commandType; // Specifies the type of command + client_textmessage_t clientMessage; // Text HUD message struct + char* speakerName; // Targetname of speaking entity + char* listenerName; // Targetname of entity being spoken to + char* soundFileName; // Name of sound file to play + char* sentenceName; // Name of sentences.txt to play + char* fireTargetNames; // List of targetnames to fire + char* killTargetNames; // List of targetnames to remove + float delay; // Seconds 'till next command + int repeatCount; // If nonzero, reset execution pointer to top of block (N times, -1 = infinite) + int textChannel; // Display channel on which text message is sent + int modifierBitField; // Bit field to specify what clientmessage fields are valid + sequenceCommandLine_s* nextCommandLine; // Next command (linked list) +}; + + +//--------------------------------------------------------------------------- +// sequenceEntry_s +// +// Structure representing a single command (usually 1 line) from a +// .SEQ file entry. +//--------------------------------------------------------------------------- +typedef struct sequenceEntry_ sequenceEntry_s; +struct sequenceEntry_ +{ + char* fileName; // Name of sequence file without .SEQ extension + char* entryName; // Name of entry label in file + sequenceCommandLine_s* firstCommand; // Linked list of commands in entry + sequenceEntry_s* nextEntry; // Next loaded entry + qboolean isGlobal; // Is entry retained over level transitions? +}; + + + +//--------------------------------------------------------------------------- +// sentenceEntry_s +// Structure representing a single sentence of a group from a .SEQ +// file entry. Sentences are identical to entries in sentences.txt, but +// can be unique per level and are loaded/unloaded with the level. +//--------------------------------------------------------------------------- +typedef struct sentenceEntry_ sentenceEntry_s; +struct sentenceEntry_ +{ + char* data; // sentence data (ie "We have hostiles" ) + sentenceEntry_s* nextEntry; // Next loaded entry + qboolean isGlobal; // Is entry retained over level transitions? + unsigned int index; // this entry's position in the file. +}; + +//-------------------------------------------------------------------------- +// sentenceGroupEntry_s +// Structure representing a group of sentences found in a .SEQ file. +// A sentence group is defined by all sentences with the same name, ignoring +// the number at the end of the sentence name. Groups enable a sentence +// to be picked at random across a group. +//-------------------------------------------------------------------------- +typedef struct sentenceGroupEntry_ sentenceGroupEntry_s; +struct sentenceGroupEntry_ +{ + char* groupName; // name of the group (ie CT_ALERT ) + unsigned int numSentences; // number of sentences in group + sentenceEntry_s* firstSentence; // head of linked list of sentences in group + sentenceGroupEntry_s* nextEntry; // next loaded group +}; + +//--------------------------------------------------------------------------- +// Function declarations +//--------------------------------------------------------------------------- +sequenceEntry_s* SequenceGet( const char* fileName, const char* entryName ); +void Sequence_ParseFile( const char* fileName, qboolean isGlobal ); +void Sequence_OnLevelLoad( const char* mapName ); +sentenceEntry_s* SequencePickSentence( const char *groupName, int pickMethod, int *picked ); + +#endif // _INCLUDE_SEQUENCE_H_ diff --git a/cssdk/common/SteamCommon.h b/cssdk/common/SteamCommon.h new file mode 100644 index 0000000..364889c --- /dev/null +++ b/cssdk/common/SteamCommon.h @@ -0,0 +1,703 @@ + +//========= Copyright Valve Corporation, All rights reserved. ============// +/* +** The copyright to the contents herein is the property of Valve Corporation. +** The contents may be used and/or copied only with the written permission of +** Valve, or in accordance with the terms and conditions stipulated in +** the agreement/contract under which the contents have been supplied. +** +******************************************************************************* +** +** Contents: +** +** Common types used in the Steam DLL interface. +** +** This file is distributed to Steam application developers. +** +** +** +*******************************************************************************/ + +#ifndef INCLUDED_STEAM_COMMON_STEAMCOMMON_H +#define INCLUDED_STEAM_COMMON_STEAMCOMMON_H + +#if defined(_MSC_VER) && (_MSC_VER > 1000) +#pragma once +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Applications should not define STEAM_EXPORTS. */ + +#if defined ( _WIN32 ) + +#ifdef STEAM_EXPORTS +#define STEAM_API __declspec(dllexport) +#else +#define STEAM_API __declspec(dllimport) +#endif + +#define STEAM_CALL __cdecl + +#else + +#define STEAM_API /* */ +#define STEAM_CALL /* */ + +#endif + +typedef void (STEAM_CALL *KeyValueIteratorCallback_t )(const char *Key, const char *Val, void *pvParam); + + +/****************************************************************************** +** +** Exported macros and constants +** +******************************************************************************/ + +/* DEPRECATED -- these are ignored now, all API access is granted on SteamStartup */ +#define STEAM_USING_FILESYSTEM (0x00000001) +#define STEAM_USING_LOGGING (0x00000002) +#define STEAM_USING_USERID (0x00000004) +#define STEAM_USING_ACCOUNT (0x00000008) +#define STEAM_USING_ALL (0x0000000f) +/* END DEPRECATED */ + +#define STEAM_MAX_PATH (255) +#define STEAM_QUESTION_MAXLEN (255) +#define STEAM_SALT_SIZE (8) +#define STEAM_PROGRESS_PERCENT_SCALE (0x00001000) + +/* These are maximum significant string lengths, excluding nul-terminator. */ +#define STEAM_CARD_NUMBER_SIZE (17) +#define STEAM_CARD_HOLDERNAME_SIZE (100) +#define STEAM_CARD_EXPYEAR_SIZE (4) +#define STEAM_CARD_EXPMONTH_SIZE (2) +#define STEAM_CARD_CVV2_SIZE (5) +#define STEAM_BILLING_ADDRESS1_SIZE (128) +#define STEAM_BILLING_ADDRESS2_SIZE (128) +#define STEAM_BILLING_CITY_SIZE (50) +#define STEAM_BILLING_ZIP_SIZE (16) +#define STEAM_BILLING_STATE_SIZE (32) +#define STEAM_BILLING_COUNTRY_SIZE (32) +#define STEAM_BILLING_PHONE_SIZE (20) +#define STEAM_BILLING_EMAIL_ADDRESS_SIZE (100) +#define STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE (20) +#define STEAM_PROOF_OF_PURCHASE_TOKEN_SIZE (200) +#define STEAM_EXTERNAL_ACCOUNTNAME_SIZE (100) +#define STEAM_EXTERNAL_ACCOUNTPASSWORD_SIZE (80) +#define STEAM_BILLING_CONFIRMATION_CODE_SIZE (22) +#define STEAM_BILLING_CARD_APPROVAL_CODE_SIZE (100) +#define STEAM_BILLING_TRANS_DATE_SIZE (9) // mm/dd/yy +#define STEAM_BILLING_TRANS_TIME_SIZE (9) // hh:mm:ss + +/****************************************************************************** +** +** Scalar type and enumerated type definitions. +** +******************************************************************************/ + + +typedef unsigned int SteamHandle_t; + +typedef void * SteamUserIDTicketValidationHandle_t; + +typedef unsigned int SteamCallHandle_t; + +#if defined(_MSC_VER) +typedef unsigned __int64 SteamUnsigned64_t; +#else +typedef unsigned long long SteamUnsigned64_t; +#endif + +typedef enum +{ + eSteamSeekMethodSet = 0, + eSteamSeekMethodCur = 1, + eSteamSeekMethodEnd = 2 +} ESteamSeekMethod; + +typedef enum +{ + eSteamBufferMethodFBF = 0, + eSteamBufferMethodNBF = 1 +} ESteamBufferMethod; + +typedef enum +{ + eSteamErrorNone = 0, + eSteamErrorUnknown = 1, + eSteamErrorLibraryNotInitialized = 2, + eSteamErrorLibraryAlreadyInitialized = 3, + eSteamErrorConfig = 4, + eSteamErrorContentServerConnect = 5, + eSteamErrorBadHandle = 6, + eSteamErrorHandlesExhausted = 7, + eSteamErrorBadArg = 8, + eSteamErrorNotFound = 9, + eSteamErrorRead = 10, + eSteamErrorEOF = 11, + eSteamErrorSeek = 12, + eSteamErrorCannotWriteNonUserConfigFile = 13, + eSteamErrorCacheOpen = 14, + eSteamErrorCacheRead = 15, + eSteamErrorCacheCorrupted = 16, + eSteamErrorCacheWrite = 17, + eSteamErrorCacheSession = 18, + eSteamErrorCacheInternal = 19, + eSteamErrorCacheBadApp = 20, + eSteamErrorCacheVersion = 21, + eSteamErrorCacheBadFingerPrint = 22, + + eSteamErrorNotFinishedProcessing = 23, + eSteamErrorNothingToDo = 24, + eSteamErrorCorruptEncryptedUserIDTicket = 25, + eSteamErrorSocketLibraryNotInitialized = 26, + eSteamErrorFailedToConnectToUserIDTicketValidationServer = 27, + eSteamErrorBadProtocolVersion = 28, + eSteamErrorReplayedUserIDTicketFromClient = 29, + eSteamErrorReceiveResultBufferTooSmall = 30, + eSteamErrorSendFailed = 31, + eSteamErrorReceiveFailed = 32, + eSteamErrorReplayedReplyFromUserIDTicketValidationServer = 33, + eSteamErrorBadSignatureFromUserIDTicketValidationServer = 34, + eSteamErrorValidationStalledSoAborted = 35, + eSteamErrorInvalidUserIDTicket = 36, + eSteamErrorClientLoginRateTooHigh = 37, + eSteamErrorClientWasNeverValidated = 38, + eSteamErrorInternalSendBufferTooSmall = 39, + eSteamErrorInternalReceiveBufferTooSmall = 40, + eSteamErrorUserTicketExpired = 41, + eSteamErrorCDKeyAlreadyInUseOnAnotherClient = 42, + + eSteamErrorNotLoggedIn = 101, + eSteamErrorAlreadyExists = 102, + eSteamErrorAlreadySubscribed = 103, + eSteamErrorNotSubscribed = 104, + eSteamErrorAccessDenied = 105, + eSteamErrorFailedToCreateCacheFile = 106, + eSteamErrorCallStalledSoAborted = 107, + eSteamErrorEngineNotRunning = 108, + eSteamErrorEngineConnectionLost = 109, + eSteamErrorLoginFailed = 110, + eSteamErrorAccountPending = 111, + eSteamErrorCacheWasMissingRetry = 112, + eSteamErrorLocalTimeIncorrect = 113, + eSteamErrorCacheNeedsDecryption = 114, + eSteamErrorAccountDisabled = 115, + eSteamErrorCacheNeedsRepair = 116, + eSteamErrorRebootRequired = 117, + + eSteamErrorNetwork = 200, + eSteamErrorOffline = 201 + + +} ESteamError; + + +typedef enum +{ + eNoDetailedErrorAvailable, + eStandardCerrno, + eWin32LastError, + eWinSockLastError, + eDetailedPlatformErrorCount +} EDetailedPlatformErrorType; + +typedef enum /* Filter elements returned by SteamFind{First,Next} */ +{ + eSteamFindLocalOnly, /* limit search to local filesystem */ + eSteamFindRemoteOnly, /* limit search to remote repository */ + eSteamFindAll /* do not limit search (duplicates allowed) */ +} ESteamFindFilter; + + +/****************************************************************************** +** +** Exported structure and complex type definitions. +** +******************************************************************************/ + + +typedef struct +{ + ESteamError eSteamError; + EDetailedPlatformErrorType eDetailedErrorType; + int nDetailedErrorCode; + char szDesc[STEAM_MAX_PATH]; +} TSteamError; + + + +typedef struct +{ + int bIsDir; /* If non-zero, element is a directory; if zero, element is a file */ + unsigned int uSizeOrCount; /* If element is a file, this contains size of file in bytes */ + int bIsLocal; /* If non-zero, reported item is a standalone element on local filesystem */ + char cszName[STEAM_MAX_PATH]; /* Base element name (no path) */ + long lLastAccessTime; /* Seconds since 1/1/1970 (like time_t) when element was last accessed */ + long lLastModificationTime; /* Seconds since 1/1/1970 (like time_t) when element was last modified */ + long lCreationTime; /* Seconds since 1/1/1970 (like time_t) when element was created */ +} TSteamElemInfo; + + +typedef struct +{ + unsigned int uNumSubscriptions; + unsigned int uMaxNameChars; + unsigned int uMaxApps; + +} TSteamSubscriptionStats; + + +typedef struct +{ + unsigned int uNumApps; + unsigned int uMaxNameChars; + unsigned int uMaxInstallDirNameChars; + unsigned int uMaxVersionLabelChars; + unsigned int uMaxLaunchOptions; + unsigned int uMaxLaunchOptionDescChars; + unsigned int uMaxLaunchOptionCmdLineChars; + unsigned int uMaxNumIcons; + unsigned int uMaxIconSize; + unsigned int uMaxDependencies; + +} TSteamAppStats; + +typedef struct +{ + char *szLabel; + unsigned int uMaxLabelChars; + unsigned int uVersionId; + int bIsNotAvailable; +} TSteamAppVersion; + +typedef struct +{ + char *szDesc; + unsigned int uMaxDescChars; + char *szCmdLine; + unsigned int uMaxCmdLineChars; + unsigned int uIndex; + unsigned int uIconIndex; + int bNoDesktopShortcut; + int bNoStartMenuShortcut; + int bIsLongRunningUnattended; + +} TSteamAppLaunchOption; + + +typedef struct +{ + char *szName; + unsigned int uMaxNameChars; + char *szLatestVersionLabel; + unsigned int uMaxLatestVersionLabelChars; + char *szCurrentVersionLabel; + unsigned int uMaxCurrentVersionLabelChars; + char *szInstallDirName; + unsigned int uMaxInstallDirNameChars; + unsigned int uId; + unsigned int uLatestVersionId; + unsigned int uCurrentVersionId; + unsigned int uMinCacheFileSizeMB; + unsigned int uMaxCacheFileSizeMB; + unsigned int uNumLaunchOptions; + unsigned int uNumIcons; + unsigned int uNumVersions; + unsigned int uNumDependencies; + +} TSteamApp; + +typedef enum +{ + eNoCost = 0, + eBillOnceOnly = 1, + eBillMonthly = 2, + eProofOfPrepurchaseOnly = 3, + eGuestPass = 4, + eHardwarePromo = 5, + eNumBillingTypes, +} EBillingType; + +typedef struct +{ + char *szName; + unsigned int uMaxNameChars; + unsigned int *puAppIds; + unsigned int uMaxAppIds; + unsigned int uId; + unsigned int uNumApps; + EBillingType eBillingType; + unsigned int uCostInCents; + unsigned int uNumDiscounts; + int bIsPreorder; + int bRequiresShippingAddress; + unsigned int uDomesticShippingCostInCents; + unsigned int uInternationalShippingCostInCents; + bool bIsCyberCafeSubscription; + unsigned int uGameCode; + char szGameCodeDesc[STEAM_MAX_PATH]; + bool bIsDisabled; + bool bRequiresCD; + unsigned int uTerritoryCode; + bool bIsSteam3Subscription; + +} TSteamSubscription; + +typedef struct +{ + char szName[STEAM_MAX_PATH]; + unsigned int uDiscountInCents; + unsigned int uNumQualifiers; + +} TSteamSubscriptionDiscount; + +typedef struct +{ + char szName[STEAM_MAX_PATH]; + unsigned int uRequiredSubscription; + int bIsDisqualifier; + +} TSteamDiscountQualifier; + +typedef struct TSteamProgress +{ + int bValid; /* non-zero if call provides progress info */ + unsigned int uPercentDone; /* 0 to 100 * STEAM_PROGRESS_PERCENT_SCALE if bValid */ + char szProgress[STEAM_MAX_PATH]; /* additional progress info */ +} TSteamProgress; + +typedef enum +{ + eSteamNotifyTicketsWillExpire, + eSteamNotifyAccountInfoChanged, + eSteamNotifyContentDescriptionChanged, + eSteamNotifyPleaseShutdown, + eSteamNotifyNewContentServer, + eSteamNotifySubscriptionStatusChanged, + eSteamNotifyContentServerConnectionLost, + eSteamNotifyCacheLoadingCompleted, + eSteamNotifyCacheNeedsDecryption, + eSteamNotifyCacheNeedsRepair +} ESteamNotificationCallbackEvent; + + +typedef void(*SteamNotificationCallback_t)(ESteamNotificationCallbackEvent eEvent, unsigned int nData); + + +typedef char SteamPersonalQuestion_t[ STEAM_QUESTION_MAXLEN + 1 ]; + +typedef struct +{ + unsigned char uchSalt[STEAM_SALT_SIZE]; +} SteamSalt_t; + +typedef enum +{ + eVisa = 1, + eMaster = 2, + eAmericanExpress = 3, + eDiscover = 4, + eDinnersClub = 5, + eJCB = 6 +} ESteamPaymentCardType; + +typedef struct +{ + ESteamPaymentCardType eCardType; + char szCardNumber[ STEAM_CARD_NUMBER_SIZE +1 ]; + char szCardHolderName[ STEAM_CARD_HOLDERNAME_SIZE + 1]; + char szCardExpYear[ STEAM_CARD_EXPYEAR_SIZE + 1 ]; + char szCardExpMonth[ STEAM_CARD_EXPMONTH_SIZE+ 1 ]; + char szCardCVV2[ STEAM_CARD_CVV2_SIZE + 1 ]; + char szBillingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ]; + char szBillingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ]; + char szBillingCity[ STEAM_BILLING_CITY_SIZE + 1 ]; + char szBillingZip[ STEAM_BILLING_ZIP_SIZE + 1 ]; + char szBillingState[ STEAM_BILLING_STATE_SIZE + 1 ]; + char szBillingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ]; + char szBillingPhone[ STEAM_BILLING_PHONE_SIZE + 1 ]; + char szBillingEmailAddress[ STEAM_BILLING_EMAIL_ADDRESS_SIZE + 1 ]; + unsigned int uExpectedCostInCents; + unsigned int uExpectedTaxInCents; + /* If the TSteamSubscription says that shipping info is required, */ + /* then the following fields must be filled out. */ + /* If szShippingName is empty, then assumes so are the rest. */ + char szShippingName[ STEAM_CARD_HOLDERNAME_SIZE + 1]; + char szShippingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ]; + char szShippingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ]; + char szShippingCity[ STEAM_BILLING_CITY_SIZE + 1 ]; + char szShippingZip[ STEAM_BILLING_ZIP_SIZE + 1 ]; + char szShippingState[ STEAM_BILLING_STATE_SIZE + 1 ]; + char szShippingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ]; + char szShippingPhone[ STEAM_BILLING_PHONE_SIZE + 1 ]; + unsigned int uExpectedShippingCostInCents; + +} TSteamPaymentCardInfo; + +typedef struct +{ + char szTypeOfProofOfPurchase[ STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE + 1 ]; + + /* A ProofOfPurchase token is not necessarily a nul-terminated string; it may be binary data + (perhaps encrypted). Hence we need a length and an array of bytes. */ + unsigned int uLengthOfBinaryProofOfPurchaseToken; + char cBinaryProofOfPurchaseToken[ STEAM_PROOF_OF_PURCHASE_TOKEN_SIZE + 1 ]; +} TSteamPrepurchaseInfo; + +typedef struct +{ + char szAccountName[ STEAM_EXTERNAL_ACCOUNTNAME_SIZE + 1 ]; + char szPassword[ STEAM_EXTERNAL_ACCOUNTPASSWORD_SIZE + 1 ]; +} TSteamExternalBillingInfo; + +typedef enum +{ + ePaymentCardInfo = 1, + ePrepurchasedInfo = 2, + eAccountBillingInfo = 3, + eExternalBillingInfo = 4, /* indirect billing via ISP etc (not supported yet) */ + ePaymentCardReceipt = 5, + ePrepurchaseReceipt = 6, + eEmptyReceipt = 7 +} ESteamSubscriptionBillingInfoType; + +typedef struct +{ + ESteamSubscriptionBillingInfoType eBillingInfoType; + union { + TSteamPaymentCardInfo PaymentCardInfo; + TSteamPrepurchaseInfo PrepurchaseInfo; + TSteamExternalBillingInfo ExternalBillingInfo; + char bUseAccountBillingInfo; + }; + +} TSteamSubscriptionBillingInfo; + +typedef enum +{ + /* Subscribed */ + eSteamSubscriptionOK = 0, /* Subscribed */ + eSteamSubscriptionPending = 1, /* Awaiting transaction completion */ + eSteamSubscriptionPreorder = 2, /* Is currently a pre-order */ + eSteamSubscriptionPrepurchaseTransferred = 3, /* hop to this account */ + /* Unusbscribed */ + eSteamSubscriptionPrepurchaseInvalid = 4, /* Invalid cd-key */ + eSteamSubscriptionPrepurchaseRejected = 5, /* hopped out / banned / etc */ + eSteamSubscriptionPrepurchaseRevoked = 6, /* hop away from this account */ + eSteamSubscriptionPaymentCardDeclined = 7, /* CC txn declined */ + eSteamSubscriptionCancelledByUser = 8, /* Cancelled by client */ + eSteamSubscriptionCancelledByVendor = 9, /* Cancelled by us */ + eSteamSubscriptionPaymentCardUseLimit = 10, /* Card used too many times, potential fraud */ + eSteamSubscriptionPaymentCardAlert = 11, /* Got a "pick up card" or the like from bank */ + eSteamSubscriptionFailed = 12, /* Other Error in subscription data or transaction failed/lost */ + eSteamSubscriptionPaymentCardAVSFailure = 13, /* Card failed Address Verification check */ + eSteamSubscriptionPaymentCardInsufficientFunds = 14, /* Card failed due to insufficient funds */ + eSteamSubscriptionRestrictedCountry = 15 /* The subscription is not available in the user's country */ + +} ESteamSubscriptionStatus; + +typedef struct +{ + ESteamPaymentCardType eCardType; + char szCardLastFourDigits[ 4 + 1 ]; + char szCardHolderName[ STEAM_CARD_HOLDERNAME_SIZE + 1]; + char szBillingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ]; + char szBillingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ]; + char szBillingCity[ STEAM_BILLING_CITY_SIZE + 1 ]; + char szBillingZip[ STEAM_BILLING_ZIP_SIZE + 1 ]; + char szBillingState[ STEAM_BILLING_STATE_SIZE + 1 ]; + char szBillingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ]; + + // The following are only available after the subscription leaves "pending" status + char szCardApprovalCode[ STEAM_BILLING_CARD_APPROVAL_CODE_SIZE + 1]; + char szTransDate[ STEAM_BILLING_TRANS_DATE_SIZE + 1]; /* mm/dd/yy */ + char szTransTime[ STEAM_BILLING_TRANS_TIME_SIZE + 1]; /* hh:mm:ss */ + unsigned int uPriceWithoutTax; + unsigned int uTaxAmount; + unsigned int uShippingCost; + +} TSteamPaymentCardReceiptInfo; + +typedef struct +{ + char szTypeOfProofOfPurchase[ STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE + 1 ]; +} TSteamPrepurchaseReceiptInfo; + +typedef struct +{ + ESteamSubscriptionStatus eStatus; + ESteamSubscriptionStatus ePreviousStatus; + ESteamSubscriptionBillingInfoType eReceiptInfoType; + char szConfirmationCode[ STEAM_BILLING_CONFIRMATION_CODE_SIZE + 1]; + union { + TSteamPaymentCardReceiptInfo PaymentCardReceiptInfo; + TSteamPrepurchaseReceiptInfo PrepurchaseReceiptInfo; + }; + +} TSteamSubscriptionReceipt; + +typedef enum +{ + ePhysicalBytesReceivedThisSession = 1, + eAppReadyToLaunchStatus = 2, + eAppPreloadStatus = 3, + eAppEntireDepot = 4, + eCacheBytesPresent = 5 +} ESteamAppUpdateStatsQueryType; + +typedef struct +{ + SteamUnsigned64_t uBytesTotal; + SteamUnsigned64_t uBytesPresent; +} TSteamUpdateStats; + +typedef enum +{ + eSteamUserAdministrator = 0x00000001, /* May subscribe, unsubscribe, etc */ + eSteamUserDeveloper = 0x00000002, /* Steam or App developer */ + eSteamUserCyberCafe = 0x00000004 /* CyberCafe, school, etc -- UI should ask for password */ + /* before allowing logout, unsubscribe, etc */ +} ESteamUserTypeFlags; + +typedef enum +{ + eSteamAccountStatusDefault = 0x00000000, + eSteamAccountStatusEmailVerified = 0x00000001, + /* Note: Mask value 0x2 is reserved for future use. (Some, but not all, public accounts already have this set.) */ + eSteamAccountDisabled = 0x00000004 +} ESteamAccountStatusBitFields ; + + +typedef enum +{ + eSteamBootstrapperError = -1, + eSteamBootstrapperDontCheckForUpdate = 0, + eSteamBootstrapperCheckForUpdateAndRerun = 7 + +} ESteamBootStrapperClientAppResult; + +typedef enum +{ + eSteamOnline = 0, + eSteamOffline = 1, + eSteamNoAuthMode = 2, + eSteamBillingOffline = 3 +} eSteamOfflineStatus; + +typedef struct +{ + int eOfflineNow; + int eOfflineNextSession; +} TSteamOfflineStatus; + +typedef struct +{ + unsigned int uAppId; + int bIsSystemDefined; + char szMountPath[STEAM_MAX_PATH]; +} TSteamAppDependencyInfo; + +typedef enum +{ + eSteamOpenFileRegular = 0x0, + eSteamOpenFileIgnoreLocal = 0x1, + eSteamOpenFileChecksumReads = 0x2 +} ESteamOpenFileFlags; + +typedef enum +{ + eSteamValveCDKeyValidationServer = 0, + eSteamHalfLifeMasterServer = 1, + eSteamFriendsServer = 2, + eSteamCSERServer = 3, + eSteamHalfLife2MasterServer = 4, + eSteamRDKFMasterServer = 5, + eMaxServerTypes = 6 +} ESteamServerType; + +/****************************************************************************** +** +** More exported constants +** +******************************************************************************/ + + +#ifdef __cplusplus + +const SteamHandle_t STEAM_INVALID_HANDLE = 0; +const SteamCallHandle_t STEAM_INVALID_CALL_HANDLE = 0; +const SteamUserIDTicketValidationHandle_t STEAM_INACTIVE_USERIDTICKET_VALIDATION_HANDLE = 0; +const unsigned int STEAM_USE_LATEST_VERSION = 0xFFFFFFFF; + +#else + +#define STEAM_INVALID_HANDLE ((SteamHandle_t)(0)) +#define STEAM_INVALID_CALL_HANDLE ((SteamCallHandle_t)(0)) +#define STEAM_INACTIVE_USERIDTICKET_VALIDATION_HANDLE ((SteamUserIDTicketValidationHandle_t)(0)) +#define STEAM_USE_LATEST_VERSION (0xFFFFFFFFu); + +#endif + + +/****************************************************************************** +** Each Steam instance (licensed Steam Service Provider) has a unique SteamInstanceID_t. +** +** Each Steam instance as its own DB of users. +** Each user in the DB has a unique SteamLocalUserID_t (a serial number, with possible +** rare gaps in the sequence). +** +******************************************************************************/ + +typedef unsigned short SteamInstanceID_t; // MUST be 16 bits + + +#if defined ( _WIN32 ) +typedef unsigned __int64 SteamLocalUserID_t; // MUST be 64 bits +#else +typedef unsigned long long SteamLocalUserID_t; // MUST be 64 bits +#endif + +/****************************************************************************** +** +** Applications need to be able to authenticate Steam users from ANY instance. +** So a SteamIDTicket contains SteamGlobalUserID, which is a unique combination of +** instance and user id. +** +** SteamLocalUserID is an unsigned 64-bit integer. +** For platforms without 64-bit int support, we provide access via a union that splits it into +** high and low unsigned 32-bit ints. Such platforms will only need to compare LocalUserIDs +** for equivalence anyway - not perform arithmetic with them. +** +********************************************************************************/ +typedef struct +{ + unsigned int Low32bits; + unsigned int High32bits; +} TSteamSplitLocalUserID; + +typedef struct +{ + SteamInstanceID_t m_SteamInstanceID; + + union + { + SteamLocalUserID_t As64bits; + TSteamSplitLocalUserID Split; + } m_SteamLocalUserID; + +} TSteamGlobalUserID; + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/cssdk/common/beamdef.h b/cssdk/common/beamdef.h new file mode 100644 index 0000000..fd77a76 --- /dev/null +++ b/cssdk/common/beamdef.h @@ -0,0 +1,62 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined ( BEAMDEFH ) +#define BEAMDEFH +#ifdef _WIN32 +#pragma once +#endif + +#define FBEAM_STARTENTITY 0x00000001 +#define FBEAM_ENDENTITY 0x00000002 +#define FBEAM_FADEIN 0x00000004 +#define FBEAM_FADEOUT 0x00000008 +#define FBEAM_SINENOISE 0x00000010 +#define FBEAM_SOLID 0x00000020 +#define FBEAM_SHADEIN 0x00000040 +#define FBEAM_SHADEOUT 0x00000080 +#define FBEAM_STARTVISIBLE 0x10000000 // Has this client actually seen this beam's start entity yet? +#define FBEAM_ENDVISIBLE 0x20000000 // Has this client actually seen this beam's end entity yet? +#define FBEAM_ISACTIVE 0x40000000 +#define FBEAM_FOREVER 0x80000000 + +typedef struct beam_s BEAM; +struct beam_s +{ + BEAM *next; + int type; + int flags; + vec3_t source; + vec3_t target; + vec3_t delta; + float t; // 0 .. 1 over lifetime of beam + float freq; + float die; + float width; + float amplitude; + float r, g, b; + float brightness; + float speed; + float frameRate; + float frame; + int segments; + int startEntity; + int endEntity; + int modelIndex; + int frameCount; + struct model_s *pFollowModel; + struct particle_s *particles; +}; + +#endif diff --git a/cssdk/common/cl_entity.h b/cssdk/common/cl_entity.h new file mode 100644 index 0000000..a7cd472 --- /dev/null +++ b/cssdk/common/cl_entity.h @@ -0,0 +1,115 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// cl_entity.h +#if !defined( CL_ENTITYH ) +#define CL_ENTITYH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct efrag_s +{ + struct mleaf_s *leaf; + struct efrag_s *leafnext; + struct cl_entity_s *entity; + struct efrag_s *entnext; +} efrag_t; + +typedef struct +{ + byte mouthopen; // 0 = mouth closed, 255 = mouth agape + byte sndcount; // counter for running average + int sndavg; // running average +} mouth_t; + +typedef struct +{ + float prevanimtime; + float sequencetime; + byte prevseqblending[2]; + vec3_t prevorigin; + vec3_t prevangles; + + int prevsequence; + float prevframe; + + byte prevcontroller[4]; + byte prevblending[2]; +} latchedvars_t; + +typedef struct +{ + // Time stamp for this movement + float animtime; + + vec3_t origin; + vec3_t angles; +} position_history_t; + +typedef struct cl_entity_s cl_entity_t; + +#define HISTORY_MAX 64 // Must be power of 2 +#define HISTORY_MASK ( HISTORY_MAX - 1 ) + + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( PROGS_H ) +#include "progs.h" +#endif + +struct cl_entity_s +{ + int index; // Index into cl_entities ( should match actual slot, but not necessarily ) + + qboolean player; // True if this entity is a "player" + + entity_state_t baseline; // The original state from which to delta during an uncompressed message + entity_state_t prevstate; // The state information from the penultimate message received from the server + entity_state_t curstate; // The state information from the last message received from server + + int current_position; // Last received history update index + position_history_t ph[ HISTORY_MAX ]; // History of position and angle updates for this player + + mouth_t mouth; // For synchronizing mouth movements. + + latchedvars_t latched; // Variables used by studio model rendering routines + + // Information based on interplocation, extrapolation, prediction, or just copied from last msg received. + // + float lastmove; + + // Actual render position and angles + vec3_t origin; + vec3_t angles; + + // Attachment points + vec3_t attachment[4]; + + // Other entity local information + int trivial_accept; + + struct model_s *model; // cl.model_precache[ curstate.modelindes ]; all visible entities have a model + struct efrag_s *efrag; // linked list of efrags + struct mnode_s *topnode; // for bmodels, first world node that splits bmodel, or NULL if not split + + float syncbase; // for client-side animations -- used by obsolete alias animation system, remove? + int visframe; // last frame this entity was found in an active leaf + colorVec cvFloorColor; +}; + +#endif // !CL_ENTITYH diff --git a/cssdk/common/com_model.h b/cssdk/common/com_model.h new file mode 100644 index 0000000..d6e3d42 --- /dev/null +++ b/cssdk/common/com_model.h @@ -0,0 +1,340 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +// com_model.h +#pragma once + +#define STUDIO_RENDER 1 +#define STUDIO_EVENTS 2 + +//#define MAX_MODEL_NAME 64 +//#define MAX_MAP_HULLS 4 +//#define MIPLEVELS 4 +//#define NUM_AMBIENTS 4 // automatic ambient sounds +//#define MAXLIGHTMAPS 4 +#define PLANE_ANYZ 5 + +#define ALIAS_Z_CLIP_PLANE 5 + +// flags in finalvert_t.flags +#define ALIAS_LEFT_CLIP 0x0001 +#define ALIAS_TOP_CLIP 0x0002 +#define ALIAS_RIGHT_CLIP 0x0004 +#define ALIAS_BOTTOM_CLIP 0x0008 +#define ALIAS_Z_CLIP 0x0010 +#define ALIAS_ONSEAM 0x0020 +#define ALIAS_XY_CLIP_MASK 0x000F + +#define ZISCALE ((float)0x8000) + +#define CACHE_SIZE 32 // used to align key data structures + +//typedef enum +//{ +// mod_brush, +// mod_sprite, +// mod_alias, +// mod_studio +//} modtype_t; + +// must match definition in modelgen.h +//#ifndef SYNCTYPE_T +//#define SYNCTYPE_T +// +//typedef enum +//{ +// ST_SYNC=0, +// ST_RAND +//} synctype_t; +// +//#endif + +//typedef struct +//{ +// float mins[3], maxs[3]; +// float origin[3]; +// int headnode[MAX_MAP_HULLS]; +// int visleafs; // not including the solid leaf 0 +// int firstface, numfaces; +//} dmodel_t; + +// plane_t structure +//typedef struct mplane_s +//{ +// vec3_t normal; // surface normal +// float dist; // closest appoach to origin +// byte type; // for texture axis selection and fast side tests +// byte signbits; // signx + signy<<1 + signz<<1 +// byte pad[2]; +//} mplane_t; + +//typedef struct +//{ +// vec3_t position; +//} mvertex_t; + +//typedef struct +//{ +// unsigned short v[2]; +// unsigned int cachededgeoffset; +//} medge_t; + +//typedef struct texture_s +//{ +// char name[16]; +// unsigned width, height; +// int anim_total; // total tenths in sequence ( 0 = no) +// int anim_min, anim_max; // time for this frame min <=time< max +// struct texture_s *anim_next; // in the animation sequence +// struct texture_s *alternate_anims; // bmodels in frame 1 use these +// unsigned offsets[MIPLEVELS]; // four mip maps stored +// unsigned paloffset; +//} texture_t; + +//typedef struct +//{ +// float vecs[2][4]; // [s/t] unit vectors in world space. +// // [i][3] is the s/t offset relative to the origin. +// // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] +// float mipadjust; // ?? mipmap limits for very small surfaces +// texture_t *texture; +// int flags; // sky or slime, no lightmap or 256 subdivision +//} mtexinfo_t; + +//typedef struct mnode_s +//{ +// // common with leaf +// int contents; // 0, to differentiate from leafs +// int visframe; // node needs to be traversed if current +// +// short minmaxs[6]; // for bounding box culling +// +// struct mnode_s *parent; +// +// // node specific +// mplane_t *plane; +// struct mnode_s *children[2]; +// +// unsigned short firstsurface; +// unsigned short numsurfaces; +//} mnode_t; + +//typedef struct msurface_s msurface_t; +//typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +//struct decal_s +//{ +// decal_t *pnext; // linked list for each surface +// msurface_t *psurface; // Surface id for persistence / unlinking +// short dx; // Offsets into surface texture (in texture coordinates, so we don't need floats) +// short dy; +// short texture; // Decal texture +// byte scale; // Pixel scale +// byte flags; // Decal flags +// +// short entityIndex; // Entity this is attached to +//}; + +//typedef struct mleaf_s +//{ +// // common with node +// int contents; // wil be a negative contents number +// int visframe; // node needs to be traversed if current +// +// short minmaxs[6]; // for bounding box culling +// +// struct mnode_s *parent; +// +// // leaf specific +// byte *compressed_vis; +// struct efrag_s *efrags; +// +// msurface_t **firstmarksurface; +// int nummarksurfaces; +// int key; // BSP sequence number for leaf's contents +// byte ambient_sound_level[NUM_AMBIENTS]; +//} mleaf_t; + +//struct msurface_s +//{ +// int visframe; // should be drawn when node is crossed +// +// int dlightframe; // last frame the surface was checked by an animated light +// int dlightbits; // dynamically generated. Indicates if the surface illumination +// // is modified by an animated light. +// +// mplane_t *plane; // pointer to shared plane +// int flags; // see SURF_ #defines +// +// int firstedge; // look up in model->surfedges[], negative numbers +// int numedges; // are backwards edges +// +// // surface generation data +// struct surfcache_s *cachespots[MIPLEVELS]; +// +// short texturemins[2]; // smallest s/t position on the surface. +// short extents[2]; // ?? s/t texture size, 1..256 for all non-sky surfaces +// +// mtexinfo_t *texinfo; +// +// // lighting info +// byte styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights +// // no one surface can be effected by more than 4 +// // animated lights. +// color24 *samples; +// +// decal_t *pdecals; +//}; + +//typedef struct +//{ +// int planenum; +// short children[2]; // negative numbers are contents +//} dclipnode_t; + +//typedef struct hull_s +//{ +// dclipnode_t *clipnodes; +// mplane_t *planes; +// int firstclipnode; +// int lastclipnode; +// vec3_t clip_mins; +// vec3_t clip_maxs; +//} hull_t; + +typedef struct cache_user_s +{ + void *data; +} cache_user_t; + +//typedef struct model_s +//{ +// char name[ MAX_MODEL_NAME ]; +// qboolean needload; // bmodels and sprites don't cache normally +// +// modtype_t type; +// int numframes; +// synctype_t synctype; +// +// int flags; +// +// // +// // volume occupied by the model +// // +// vec3_t mins, maxs; +// float radius; +// +// // +// // brush model +// // +// int firstmodelsurface, nummodelsurfaces; +// +// int numsubmodels; +// dmodel_t *submodels; +// +// int numplanes; +// mplane_t *planes; +// +// int numleafs; // number of visible leafs, not counting 0 +// struct mleaf_s *leafs; +// +// int numvertexes; +// mvertex_t *vertexes; +// +// int numedges; +// medge_t *edges; +// +// int numnodes; +// mnode_t *nodes; +// +// int numtexinfo; +// mtexinfo_t *texinfo; +// +// int numsurfaces; +// msurface_t *surfaces; +// +// int numsurfedges; +// int *surfedges; +// +// int numclipnodes; +// dclipnode_t *clipnodes; +// +// int nummarksurfaces; +// msurface_t **marksurfaces; +// +// hull_t hulls[MAX_MAP_HULLS]; +// +// int numtextures; +// texture_t **textures; +// +// byte *visdata; +// +// color24 *lightdata; +// +// char *entities; +// +// // +// // additional model data +// // +// cache_user_t cache; // only access through Mod_Extradata +// +//} model_t; + +//typedef vec_t vec4_t[4]; + +typedef struct alight_s +{ + int ambientlight; // clip at 128 + int shadelight; // clip at 192 - ambientlight + vec3_t color; + float *plightvec; +} alight_t; + +typedef struct auxvert_s +{ + float fv[3]; // viewspace x, y +} auxvert_t; + +#include "custom.h" + +//#define MAX_SCOREBOARDNAME 32 + +// Defined in client.h differently +//typedef struct player_info_s +//{ +// // User id on server +// int userid; +// +// // User info string +// char userinfo[ MAX_INFO_STRING ]; +// +// // Name +// char name[ MAX_SCOREBOARDNAME ]; +// +// // Spectator or not, unused +// int spectator; +// +// int ping; +// int packet_loss; +// +// // skin information +// char model[MAX_QPATH]; +// int topcolor; +// int bottomcolor; +// +// // last frame rendered +// int renderframe; +// +// // Gait frame estimation +// int gaitsequence; +// float gaitframe; +// float gaityaw; +// vec3_t prevgaitorigin; +// +// customization_t customdata; +//} player_info_t; diff --git a/cssdk/common/con_nprint.h b/cssdk/common/con_nprint.h new file mode 100644 index 0000000..b2a1888 --- /dev/null +++ b/cssdk/common/con_nprint.h @@ -0,0 +1,38 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( CON_NPRINTH ) +#define CON_NPRINTH +#ifdef _WIN32 +#pragma once +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct con_nprint_s +{ + int index; // Row # + float time_to_live; // # of seconds before it dissappears + float color[ 3 ]; // RGB colors ( 0.0 -> 1.0 scale ) +} con_nprint_t; + +void Con_NPrintf( int idx, const char *fmt, ... ); +void Con_NXPrintf( struct con_nprint_s *info, const char *fmt, ... ); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cssdk/common/const.h b/cssdk/common/const.h new file mode 100644 index 0000000..aa081dc --- /dev/null +++ b/cssdk/common/const.h @@ -0,0 +1,806 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#ifndef CONST_H +#define CONST_H +#ifdef _WIN32 +#pragma once +#endif + +// Max # of clients allowed in a server. +#define MAX_CLIENTS 32 + +// How many bits to use to encode an edict. +#define MAX_EDICT_BITS 11 // # of bits needed to represent max edicts +// Max # of edicts in a level (2048) +#define MAX_EDICTS (1<flags +#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground +#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) +#define FL_CONVEYOR (1<<2) +#define FL_CLIENT (1<<3) +#define FL_INWATER (1<<4) +#define FL_MONSTER (1<<5) +#define FL_GODMODE (1<<6) +#define FL_NOTARGET (1<<7) +#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself +#define FL_ONGROUND (1<<9) // At rest / on the ground +#define FL_PARTIALGROUND (1<<10) // not all corners are valid +#define FL_WATERJUMP (1<<11) // player jumping out of water +#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera +#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them +#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched +#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water +#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection + +// UNDONE: Do we need these? +#define FL_IMMUNE_WATER (1<<17) +#define FL_IMMUNE_SLIME (1<<18) +#define FL_IMMUNE_LAVA (1<<19) + +#define FL_PROXY (1<<20) // This is a spectator proxy +#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path) +#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum) +#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set +#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction. +#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) +#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc. +#define FL_CUSTOMENTITY (1<<29) // This is a custom entity +#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time +#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client + +// SV_EmitSound2 flags +#define SND_EMIT2_NOPAS (1<<0) // never to do check PAS +#define SND_EMIT2_INVOKER (1<<1) // do not send to the client invoker + +// Engine edict->spawnflags +#define SF_NOTINDEATHMATCH 0x0800 // Do not spawn when deathmatch and loading entities from a file + + +// Goes into globalvars_t.trace_flags +#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box + + +// walkmove modes +#define WALKMOVE_NORMAL 0 // normal walkmove +#define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type +#define WALKMOVE_CHECKONLY 2 // move, but don't touch triggers + +// edict->movetype values +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // Player only - moving on the ground +#define MOVETYPE_STEP 4 // gravity, special edge handling -- monsters use this +#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff +#define MOVETYPE_TOSS 6 // gravity/collisions +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity +#define MOVETYPE_FLYMISSILE 9 // extra size to monsters +#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces +#define MOVETYPE_BOUNCEMISSILE 11 // bounce w/o gravity +#define MOVETYPE_FOLLOW 12 // track movement of aiment +#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision) + +// edict->solid values +// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves +// SOLID only effects OTHER entities colliding with this one when they move - UGH! +#define SOLID_NOT 0 // no interaction with other objects +#define SOLID_TRIGGER 1 // touch on edge, but not blocking +#define SOLID_BBOX 2 // touch on edge, block +#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground +#define SOLID_BSP 4 // bsp clip, touch on edge, block + +// edict->deadflag values +#define DEAD_NO 0 // alive +#define DEAD_DYING 1 // playing death animation or still falling off of a ledge waiting to hit ground +#define DEAD_DEAD 2 // dead. lying still. +#define DEAD_RESPAWNABLE 3 +#define DEAD_DISCARDBODY 4 + +#define DAMAGE_NO 0 +#define DAMAGE_YES 1 +#define DAMAGE_AIM 2 + +// entity effects +#define EF_BRIGHTFIELD 1 // swirling cloud of particles +#define EF_MUZZLEFLASH 2 // single frame ELIGHT on entity attachment 0 +#define EF_BRIGHTLIGHT 4 // DLIGHT centered at entity origin +#define EF_DIMLIGHT 8 // player flashlight +#define EF_INVLIGHT 16 // get lighting from ceiling +#define EF_NOINTERP 32 // don't interpolate the next frame +#define EF_LIGHT 64 // rocket flare glow sprite +#define EF_NODRAW 128 // don't draw entity +#define EF_NIGHTVISION 256 // player nightvision +#define EF_SNIPERLASER 512 // sniper laser effect +#define EF_FIBERCAMERA 1024// fiber camera + + +// entity flags +#define EFLAG_SLERP 1 // do studio interpolation of this entity + +// +// temp entity events +// +#define TE_BEAMPOINTS 0 // beam effect between two points +// coord coord coord (start position) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMENTPOINT 1 // beam effect between point and entity +// short (start entity) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_GUNSHOT 2 // particle effect plus ricochet sound +// coord coord coord (position) + +#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) +// byte (flags) +// +// The Explosion effect has some flags to control performance/aesthetic features: +#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion +#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite) +#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights +#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound +#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles + + +#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound +// coord coord coord (position) + +#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) + +#define TE_TRACER 6 // tracer effect from point to point +// coord, coord, coord (start) +// coord, coord, coord (end) + +#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters +// coord, coord, coord (start) +// coord, coord, coord (end) +// byte (life in 0.1's) +// byte (width in 0.1's) +// byte (amplitude in 0.01's) +// short (sprite model index) + +#define TE_BEAMENTS 8 +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite +// coord coord coord (position) + +#define TE_LAVASPLASH 10 // Quake1 lava splash +// coord coord coord (position) + +#define TE_TELEPORT 11 // Quake1 teleport splash +// coord coord coord (position) + +#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound +// coord coord coord (position) +// byte (starting color) +// byte (num colors) + +#define TE_BSPDECAL 13 // Decal from the .BSP file +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// short (texture index of precached decal texture name) +// short (entity index) +// [optional - only included if previous short is non-zero (not the world)] short (index of model of above entity) + +#define TE_IMPLOSION 14 // tracers moving toward a point +// coord, coord, coord (position) +// byte (radius) +// byte (count) +// byte (life in 0.1's) + +#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions +// coord, coord, coord (start) +// coord, coord, coord (end) +// short (sprite index) +// byte (count) +// byte (life in 0.1's) +// byte (scale in 0.1's) +// byte (velocity along vector in 10's) +// byte (randomness of velocity in 10's) + +#define TE_BEAM 16 // obsolete + +#define TE_SPRITE 17 // additive sprite, plays 1 cycle +// coord, coord, coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (brightness) + +#define TE_BEAMSPRITE 18 // A beam with a sprite at the end +// coord, coord, coord (start position) +// coord, coord, coord (end position) +// short (beam sprite index) +// short (end sprite index) + +#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving +// short (entity:attachment to follow) +// short (sprite index) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte,byte,byte (color) +// byte (brightness) + +#define TE_GLOWSPRITE 23 +// coord, coord, coord (pos) short (model index) byte (scale / 10) + +#define TE_BEAMRING 24 // connect a beam ring to two entities +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_STREAK_SPLASH 25 // oriented shower of tracers +// coord coord coord (start position) +// coord coord coord (direction vector) +// byte (color) +// short (count) +// short (base speed) +// short (ramdon velocity) + +#define TE_BEAMHOSE 26 // obsolete + +#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect +// coord, coord, coord (pos) +// byte (radius in 10's) +// byte byte byte (color) +// byte (brightness) +// byte (life in 10's) +// byte (decay rate in 10's) + +#define TE_ELIGHT 28 // point entity light, no world effect +// short (entity:attachment to follow) +// coord coord coord (initial position) +// coord (radius) +// byte byte byte (color) +// byte (life in 0.1's) +// coord (decay rate) + +#define TE_TEXTMESSAGE 29 +// short 1.2.13 x (-1 = center) +// short 1.2.13 y (-1 = center) +// byte Effect 0 = fade in/fade out + // 1 is flickery credits + // 2 is write out (training room) + +// 4 bytes r,g,b,a color1 (text color) +// 4 bytes r,g,b,a color2 (effect color) +// ushort 8.8 fadein time +// ushort 8.8 fadeout time +// ushort 8.8 hold time +// optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2) +// string text message (512 chars max sz string) +#define TE_LINE 30 +// coord, coord, coord startpos +// coord, coord, coord endpos +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_BOX 31 +// coord, coord, coord boxmins +// coord, coord, coord boxmaxs +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_KILLBEAM 99 // kill all beams attached to entity +// short (entity) + +#define TE_LARGEFUNNEL 100 +// coord coord coord (funnel position) +// short (sprite index) +// short (flags) + +#define TE_BLOODSTREAM 101 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_SHOWLINE 102 // line of particles every 5 units, dies in 30 seconds +// coord coord coord (start position) +// coord coord coord (end position) + +#define TE_BLOOD 103 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_DECAL 104 // Decal applied to a brush entity (not the world) +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) +// short (entity index) + +#define TE_FIZZ 105 // create alpha sprites inside of entity, float upwards +// short (entity) +// short (sprite index) +// byte (density) + +#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// angle (initial yaw) +// short (model index) +// byte (bounce sound type) +// byte (life in 0.1's) + +#define TE_EXPLODEMODEL 107 // spherical shower of models, picks from set +// coord, coord, coord (origin) +// coord (velocity) +// short (model index) +// short (count) +// byte (life in 0.1's) + +#define TE_BREAKMODEL 108 // box of models or sprites +// coord, coord, coord (position) +// coord, coord, coord (size) +// coord, coord, coord (velocity) +// byte (random velocity in 10's) +// short (sprite or model index) +// byte (count) +// byte (life in 0.1 secs) +// byte (flags) + +#define TE_GUNSHOTDECAL 109 // decal and ricochet sound +// coord, coord, coord (position) +// short (entity index???) +// byte (decal???) + +#define TE_SPRITE_SPRAY 110 // spay of alpha sprites +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (sprite index) +// byte (count) +// byte (speed) +// byte (noise) + +#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound. +// coord, coord, coord (position) +// byte (scale in 0.1's) + +#define TE_PLAYERDECAL 112 // ??? +// byte (playerindex) +// coord, coord, coord (position) +// short (entity???) +// byte (decal number???) +// [optional] short (model index???) + +#define TE_BUBBLES 113 // create alpha sprites inside of box, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BUBBLETRAIL 114 // create alpha sprites along a line, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BLOODSPRITE 115 // spray of opaque sprite1's that fall, single sprite2 for 1..2 secs (this is a high-priority tent) +// coord, coord, coord (position) +// short (sprite1 index) +// short (sprite2 index) +// byte (color) +// byte (scale) + +#define TE_WORLDDECAL 116 // Decal applied to the world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) + +#define TE_WORLDDECALHIGH 117 // Decal (with texture index > 256) applied to world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) + +#define TE_DECALHIGH 118 // Same as TE_DECAL, but the texture index was greater than 256 +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) +// short (entity index) + +#define TE_PROJECTILE 119 // Makes a projectile (like a nail) (this is a high-priority tent) +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (modelindex) +// byte (life) +// byte (owner) projectile won't collide with owner (if owner == 0, projectile will hit any client). + +#define TE_SPRAY 120 // Throws a shower of sprites or models +// coord, coord, coord (position) +// coord, coord, coord (direction) +// short (modelindex) +// byte (count) +// byte (speed) +// byte (noise) +// byte (rendermode) + +#define TE_PLAYERSPRITES 121 // sprites emit from a player's bounding box (ONLY use for players!) +// byte (playernum) +// short (sprite modelindex) +// byte (count) +// byte (variance) (0 = no variance in size) (10 = 10% variance in size) + +#define TE_PARTICLEBURST 122 // very similar to lavasplash. +// coord (origin) +// short (radius) +// byte (particle color) +// byte (duration * 10) (will be randomized a bit) + +#define TE_FIREFIELD 123 // makes a field of fire. +// coord (origin) +// short (radius) (fire is made in a square around origin. -radius, -radius to radius, radius) +// short (modelindex) +// byte (count) +// byte (flags) +// byte (duration (in seconds) * 10) (will be randomized a bit) +// +// to keep network traffic low, this message has associated flags that fit into a byte: +#define TEFIRE_FLAG_ALLFLOAT 1 // all sprites will drift upwards as they animate +#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance) +#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration. +#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque +#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube. +#define TEFIRE_FLAG_ADDITIVE 32 // if set, sprite is rendered non-opaque with additive + +#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent) +// byte (entity index of player) +// coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset ) +// short (model index) +// short (life * 10 ); + +#define TE_KILLPLAYERATTACHMENTS 125 // will expire all TENTS attached to a player. +// byte (entity index of player) + +#define TE_MULTIGUNSHOT 126 // much more compact shotgun message +// This message is used to make a client approximate a 'spray' of gunfire. +// Any weapon that fires more than one bullet per frame and fires in a bit of a spread is +// a good candidate for MULTIGUNSHOT use. (shotguns) +// +// NOTE: This effect makes the client do traces for each bullet, these client traces ignore +// entities that have studio models.Traces are 4096 long. +// +// coord (origin) +// coord (origin) +// coord (origin) +// coord (direction) +// coord (direction) +// coord (direction) +// coord (x noise * 100) +// coord (y noise * 100) +// byte (count) +// byte (bullethole decal texture index) + +#define TE_USERTRACER 127 // larger message than the standard tracer, but allows some customization. +// coord (origin) +// coord (origin) +// coord (origin) +// coord (velocity) +// coord (velocity) +// coord (velocity) +// byte ( life * 10 ) +// byte ( color ) this is an index into an array of color vectors in the engine. (0 - ) +// byte ( length * 10 ) + + + +#define MSG_BROADCAST 0 // unreliable to all +#define MSG_ONE 1 // reliable to one (msg_entity) +#define MSG_ALL 2 // reliable to all +#define MSG_INIT 3 // write to the init string +#define MSG_PVS 4 // Ents in PVS of org +#define MSG_PAS 5 // Ents in PAS of org +#define MSG_PVS_R 6 // Reliable to PVS +#define MSG_PAS_R 7 // Reliable to PAS +#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped ) +#define MSG_SPEC 9 // Sends to all spectator proxies + +// contents of a spot in the world +#define CONTENTS_EMPTY -1 +#define CONTENTS_SOLID -2 +#define CONTENTS_WATER -3 +#define CONTENTS_SLIME -4 +#define CONTENTS_LAVA -5 +#define CONTENTS_SKY -6 +/* These additional contents constants are defined in bspfile.h +#define CONTENTS_ORIGIN -7 // removed at csg time +#define CONTENTS_CLIP -8 // changed to contents_solid +#define CONTENTS_CURRENT_0 -9 +#define CONTENTS_CURRENT_90 -10 +#define CONTENTS_CURRENT_180 -11 +#define CONTENTS_CURRENT_270 -12 +#define CONTENTS_CURRENT_UP -13 +#define CONTENTS_CURRENT_DOWN -14 + +#define CONTENTS_TRANSLUCENT -15 +*/ +#define CONTENTS_LADDER -16 + +#define CONTENT_FLYFIELD -17 +#define CONTENT_GRAVITY_FLYFIELD -18 +#define CONTENT_FOG -19 + +#define CONTENT_EMPTY -1 +#define CONTENT_SOLID -2 +#define CONTENT_WATER -3 +#define CONTENT_SLIME -4 +#define CONTENT_LAVA -5 +#define CONTENT_SKY -6 + +// channels +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area +#define CHAN_STATIC 6 // allocate channel from the static area +#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network +#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END). +#define CHAN_BOT 501 // channel used for bot chatter. + +// attenuation values +#define ATTN_NONE 0 +#define ATTN_NORM (float)0.8 +#define ATTN_IDLE (float)2 +#define ATTN_STATIC (float)1.25 + +// pitch values +#define PITCH_NORM 100 // non-pitch shifted +#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high +#define PITCH_HIGH 120 + +// volume values +#define VOL_NORM 1.0 + +// plats +#define PLAT_LOW_TRIGGER 1 + +// Trains +#define SF_TRAIN_WAIT_RETRIGGER 1 +#define SF_TRAIN_START_ON 4 // Train is initially moving +#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains + +// buttons +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +// Break Model Defines + +#define BREAK_TYPEMASK 0x4F +#define BREAK_GLASS 0x01 +#define BREAK_METAL 0x02 +#define BREAK_FLESH 0x04 +#define BREAK_WOOD 0x08 + +#define BREAK_SMOKE 0x10 +#define BREAK_TRANS 0x20 +#define BREAK_CONCRETE 0x40 +#define BREAK_2 0x80 + +// Colliding temp entity sounds + +#define BOUNCE_GLASS BREAK_GLASS +#define BOUNCE_METAL BREAK_METAL +#define BOUNCE_FLESH BREAK_FLESH +#define BOUNCE_WOOD BREAK_WOOD +#define BOUNCE_SHRAP 0x10 +#define BOUNCE_SHELL 0x20 +#define BOUNCE_CONCRETE BREAK_CONCRETE +#define BOUNCE_SHOTSHELL 0x80 + +// Temp entity bounce sound types +#define TE_BOUNCE_NULL 0 +#define TE_BOUNCE_SHELL 1 +#define TE_BOUNCE_SHOTSHELL 2 + +// Rendering constants +enum +{ + kRenderNormal, // src + kRenderTransColor, // c*a+dest*(1-a) + kRenderTransTexture, // src*a+dest*(1-a) + kRenderGlow, // src*a+dest -- No Z buffer checks + kRenderTransAlpha, // src*srca+dest*(1-srca) + kRenderTransAdd, // src*a+dest +}; + +enum +{ + kRenderFxNone = 0, + kRenderFxPulseSlow, + kRenderFxPulseFast, + kRenderFxPulseSlowWide, + kRenderFxPulseFastWide, + kRenderFxFadeSlow, + kRenderFxFadeFast, + kRenderFxSolidSlow, + kRenderFxSolidFast, + kRenderFxStrobeSlow, + kRenderFxStrobeFast, + kRenderFxStrobeFaster, + kRenderFxFlickerSlow, + kRenderFxFlickerFast, + kRenderFxNoDissipation, + kRenderFxDistort, // Distort/scale/translate flicker + kRenderFxHologram, // kRenderFxDistort + distance fade + kRenderFxDeadPlayer, // kRenderAmt is the player index + kRenderFxExplode, // Scale up really big! + kRenderFxGlowShell, // Glowing Shell + kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!) + kRenderFxLightMultiplier, //CTM !!!CZERO added to tell the studiorender that the value in iuser2 is a lightmultiplier +}; + + +typedef unsigned int func_t; +typedef unsigned int string_t; + +typedef unsigned char byte; +typedef unsigned short word; +#define _DEF_BYTE_ + +#undef true +#undef false + +#ifndef __cplusplus +typedef enum {false, true} qboolean; +#else +typedef int qboolean; +#endif + +typedef struct +{ + byte r, g, b; +} color24; + +typedef struct +{ + unsigned r, g, b, a; +} colorVec; + +#ifdef _WIN32 +#pragma pack(push,2) +#endif + +typedef struct +{ + unsigned short r, g, b, a; +} PackedColorVec; + +#ifdef _WIN32 +#pragma pack(pop) +#endif +typedef struct link_s +{ + struct link_s *prev, *next; +} link_t; + +typedef struct edict_s edict_t; + +typedef struct +{ + vec3_t normal; + float dist; +} plane_t; + +typedef struct +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + plane_t plane; // surface normal at impact + edict_t * ent; // entity the surface is on + int hitgroup; // 0 == generic, non zero is specific body part +} trace_t; + +#endif // CONST_H diff --git a/cssdk/common/crc.h b/cssdk/common/crc.h new file mode 100644 index 0000000..44bcf35 --- /dev/null +++ b/cssdk/common/crc.h @@ -0,0 +1,55 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +/* crc.h */ +#pragma once + +#include "quakedef.h" + +// MD5 Hash +typedef struct +{ + unsigned int buf[4]; + unsigned int bits[2]; + unsigned char in[64]; +} MD5Context_t; + +typedef unsigned int CRC32_t; + + +#ifdef __cplusplus +extern "C" +{ +#endif + +void CRC32_Init(CRC32_t *pulCRC); +CRC32_t CRC32_Final(CRC32_t pulCRC); +void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *pBuffer, int nBuffer); +BOOL CRC_File(CRC32_t *crcvalue, char *pszFileName); + +#ifdef __cplusplus +} +#endif + +byte COM_BlockSequenceCRCByte(byte *base, int length, int sequence); +int CRC_MapFile(CRC32_t *crcvalue, char *pszFileName); + +void MD5Init(MD5Context_t *ctx); +void MD5Update(MD5Context_t *ctx, const unsigned char *buf, unsigned int len); +void MD5Final(unsigned char digest[16], MD5Context_t *ctx); +void MD5Transform(unsigned int buf[4], const unsigned int in[16]); + +BOOL MD5_Hash_File(unsigned char digest[16], char *pszFileName, BOOL bUsefopen, BOOL bSeed, unsigned int seed[4]); +char *MD5_Print(unsigned char hash[16]); diff --git a/cssdk/common/cvardef.h b/cssdk/common/cvardef.h new file mode 100644 index 0000000..cc3a222 --- /dev/null +++ b/cssdk/common/cvardef.h @@ -0,0 +1,39 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#ifndef CVARDEF_H +#define CVARDEF_H + +#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc +#define FCVAR_USERINFO (1<<1) // changes the client's info string +#define FCVAR_SERVER (1<<2) // notifies players when changed +#define FCVAR_EXTDLL (1<<3) // defined by external DLL +#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NOEXTRAWHITEPACE (1<<9) // strip trailing/leading white space from this cvar + +typedef struct cvar_s +{ + const char *name; + char *string; + int flags; + float value; + struct cvar_s *next; +} cvar_t; + +#endif // CVARDEF_H diff --git a/cssdk/common/demo_api.h b/cssdk/common/demo_api.h new file mode 100644 index 0000000..8284a81 --- /dev/null +++ b/cssdk/common/demo_api.h @@ -0,0 +1,31 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined ( DEMO_APIH ) +#define DEMO_APIH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct demo_api_s +{ + int ( *IsRecording ) ( void ); + int ( *IsPlayingback ) ( void ); + int ( *IsTimeDemo ) ( void ); + void ( *WriteBuffer ) ( int size, unsigned char *buffer ); +} demo_api_t; + +extern demo_api_t demoapi; + +#endif diff --git a/cssdk/common/director_cmds.h b/cssdk/common/director_cmds.h new file mode 100644 index 0000000..4c8fdd5 --- /dev/null +++ b/cssdk/common/director_cmds.h @@ -0,0 +1,38 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +// director_cmds.h +// sub commands for svc_director + +#define DRC_ACTIVE 0 // tells client that he's an spectator and will get director command +#define DRC_STATUS 1 // send status infos about proxy +#define DRC_CAMERA 2 // set the actual director camera position +#define DRC_EVENT 3 // informs the dircetor about ann important game event + + +#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important) +#define DRC_FLAG_SIDE (1<<4) +#define DRC_FLAG_DRAMATIC (1<<5) + + + +// commands of the director API function CallDirectorProc(...) + +#define DRCAPI_NOP 0 // no operation +#define DRCAPI_ACTIVE 1 // de/acivates director mode in engine +#define DRCAPI_STATUS 2 // request proxy information +#define DRCAPI_SETCAM 3 // set camera n to given position and angle +#define DRCAPI_GETCAM 4 // request camera n position and angle +#define DRCAPI_DIRPLAY 5 // set director time and play with normal speed +#define DRCAPI_DIRFREEZE 6 // freeze directo at this time +#define DRCAPI_SETVIEWMODE 7 // overview or 4 cameras +#define DRCAPI_SETOVERVIEWPARAMS 8 // sets parameter for overview mode +#define DRCAPI_SETFOCUS 9 // set the camera which has the input focus +#define DRCAPI_GETTARGETS 10 // queries engine for player list +#define DRCAPI_SETVIEWPOINTS 11 // gives engine all waypoints + + diff --git a/cssdk/common/dlight.h b/cssdk/common/dlight.h new file mode 100644 index 0000000..f869c98 --- /dev/null +++ b/cssdk/common/dlight.h @@ -0,0 +1,33 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined ( DLIGHTH ) +#define DLIGHTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct dlight_s +{ + vec3_t origin; + float radius; + color24 color; + float die; // stop lighting after this time + float decay; // drop this each second + float minlight; // don't add when contributing less + int key; + qboolean dark; // subtracts light instead of adding +} dlight_t; + +#endif diff --git a/cssdk/common/dll_state.h b/cssdk/common/dll_state.h new file mode 100644 index 0000000..ad16296 --- /dev/null +++ b/cssdk/common/dll_state.h @@ -0,0 +1,23 @@ +//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +//DLL State Flags + +#define DLL_INACTIVE 0 // no dll +#define DLL_ACTIVE 1 // dll is running +#define DLL_PAUSED 2 // dll is paused +#define DLL_CLOSE 3 // closing down dll +#define DLL_TRANS 4 // Level Transition + +// DLL Pause reasons + +#define DLL_NORMAL 0 // User hit Esc or something. +#define DLL_QUIT 4 // Quit now +#define DLL_RESTART 5 // Switch to launcher for linux, does a quit but returns 1 + +// DLL Substate info ( not relevant ) +#define ENG_NORMAL (1<<0) diff --git a/cssdk/common/entity_state.h b/cssdk/common/entity_state.h new file mode 100644 index 0000000..b3d364d --- /dev/null +++ b/cssdk/common/entity_state.h @@ -0,0 +1,197 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#ifndef ENTITY_STATE_H +#define ENTITY_STATE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "const.h" + + +// For entityType below +#define ENTITY_NORMAL (1<<0) +#define ENTITY_BEAM (1<<1) + +// Entity state is used for the baseline and for delta compression of a packet of +// entities that is sent to a client. +typedef struct entity_state_s entity_state_t; + +struct entity_state_s +{ +// Fields which are filled in by routines outside of delta compression + int entityType; + // Index into cl_entities array for this entity. + int number; + float msg_time; + + // Message number last time the player/entity state was updated. + int messagenum; + + // Fields which can be transitted and reconstructed over the network stream + vec3_t origin; + vec3_t angles; + + int modelindex; + int sequence; + float frame; + int colormap; + short skin; + short solid; + int effects; + float scale; + + byte eflags; + + // Render information + int rendermode; + int renderamt; + color24 rendercolor; + int renderfx; + + int movetype; + float animtime; + float framerate; + int body; + byte controller[4]; + byte blending[4]; + vec3_t velocity; + + // Send bbox down to client for use during prediction. + vec3_t mins; + vec3_t maxs; + + int aiment; + // If owned by a player, the index of that player ( for projectiles ). + int owner; + + // Friction, for prediction. + float friction; + // Gravity multiplier + float gravity; + +// PLAYER SPECIFIC + int team; + int playerclass; + int health; + qboolean spectator; + int weaponmodel; + int gaitsequence; + // If standing on conveyor, e.g. + vec3_t basevelocity; + // Use the crouched hull, or the regular player hull. + int usehull; + // Latched buttons last time state updated. + int oldbuttons; + // -1 = in air, else pmove entity number + int onground; + int iStepLeft; + // How fast we are falling + float flFallVelocity; + + float fov; + int weaponanim; + + // Parametric movement overrides + vec3_t startpos; + vec3_t endpos; + float impacttime; + float starttime; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +}; + +#include "pm_info.h" + +typedef struct clientdata_s +{ + vec3_t origin; + vec3_t velocity; + + int viewmodel; + vec3_t punchangle; + int flags; + int waterlevel; + int watertype; + vec3_t view_ofs; + float health; + + int bInDuck; + + int weapons; // remove? + + int flTimeStepSound; + int flDuckTime; + int flSwimTime; + int waterjumptime; + + float maxspeed; + + float fov; + int weaponanim; + + int m_iId; + int ammo_shells; + int ammo_nails; + int ammo_cells; + int ammo_rockets; + float m_flNextAttack; + + int tfstate; + + int pushmsec; + + int deadflag; + + char physinfo[ MAX_PHYSINFO_STRING ]; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} clientdata_t; + +#include "weaponinfo.h" + +typedef struct local_state_s +{ + entity_state_t playerstate; + clientdata_t client; + weapon_data_t weapondata[ 64 ]; +} local_state_t; + +#endif // ENTITY_STATE_H diff --git a/cssdk/common/entity_types.h b/cssdk/common/entity_types.h new file mode 100644 index 0000000..ff783df --- /dev/null +++ b/cssdk/common/entity_types.h @@ -0,0 +1,26 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// entity_types.h +#if !defined( ENTITY_TYPESH ) +#define ENTITY_TYPESH + +#define ET_NORMAL 0 +#define ET_PLAYER 1 +#define ET_TEMPENTITY 2 +#define ET_BEAM 3 +// BMODEL or SPRITE that was split across BSP nodes +#define ET_FRAGMENTED 4 + +#endif // !ENTITY_TYPESH diff --git a/cssdk/common/enums.h b/cssdk/common/enums.h new file mode 100644 index 0000000..14e2ce3 --- /dev/null +++ b/cssdk/common/enums.h @@ -0,0 +1,27 @@ +/*** + * + * Copyright (c) 2009, Valve LLC. All rights reserved. + * + * This product contains software technology licensed from Id + * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. + * All Rights Reserved. + * + * Use, distribution, and modification of this source code and/or resulting + * object code is restricted to non-commercial enhancements to products from + * Valve LLC. All other use, distribution, or modification is prohibited + * without written permission from Valve LLC. + * + ****/ + +#ifndef ENUMS_H +#define ENUMS_H + +typedef enum netsrc_s +{ + NS_CLIENT, + NS_SERVER, + NS_MULTICAST // xxxMO +} netsrc_t; + +#endif + diff --git a/cssdk/common/event_api.h b/cssdk/common/event_api.h new file mode 100644 index 0000000..722dfe2 --- /dev/null +++ b/cssdk/common/event_api.h @@ -0,0 +1,51 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined ( EVENT_APIH ) +#define EVENT_APIH +#ifdef _WIN32 +#pragma once +#endif + +#define EVENT_API_VERSION 1 + +typedef struct event_api_s +{ + int version; + void ( *EV_PlaySound ) ( int ent, float *origin, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch ); + void ( *EV_StopSound ) ( int ent, int channel, const char *sample ); + int ( *EV_FindModelIndex )( const char *pmodel ); + int ( *EV_IsLocal ) ( int playernum ); + int ( *EV_LocalPlayerDucking ) ( void ); + void ( *EV_LocalPlayerViewheight ) ( float * ); + void ( *EV_LocalPlayerBounds ) ( int hull, float *mins, float *maxs ); + int ( *EV_IndexFromTrace) ( struct pmtrace_s *pTrace ); + struct physent_s *( *EV_GetPhysent ) ( int idx ); + void ( *EV_SetUpPlayerPrediction ) ( int dopred, int bIncludeLocalClient ); + void ( *EV_PushPMStates ) ( void ); + void ( *EV_PopPMStates ) ( void ); + void ( *EV_SetSolidPlayers ) (int playernum); + void ( *EV_SetTraceHull ) ( int hull ); + void ( *EV_PlayerTrace ) ( float *start, float *end, int traceFlags, int ignore_pe, struct pmtrace_s *tr ); + void ( *EV_WeaponAnimation ) ( int sequence, int body ); + unsigned short ( *EV_PrecacheEvent ) ( int type, const char* psz ); + void ( *EV_PlaybackEvent ) ( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + const char *( *EV_TraceTexture ) ( int ground, float *vstart, float *vend ); + void ( *EV_StopAllSounds ) ( int entnum, int entchannel ); + void ( *EV_KillEvents ) ( int entnum, const char *eventname ); +} event_api_t; + +extern event_api_t eventapi; + +#endif diff --git a/cssdk/common/event_args.h b/cssdk/common/event_args.h new file mode 100644 index 0000000..99dd49a --- /dev/null +++ b/cssdk/common/event_args.h @@ -0,0 +1,50 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( EVENT_ARGSH ) +#define EVENT_ARGSH +#ifdef _WIN32 +#pragma once +#endif + +// Event was invoked with stated origin +#define FEVENT_ORIGIN ( 1<<0 ) + +// Event was invoked with stated angles +#define FEVENT_ANGLES ( 1<<1 ) + +typedef struct event_args_s +{ + int flags; + + // Transmitted + int entindex; + + float origin[3]; + float angles[3]; + float velocity[3]; + + int ducking; + + float fparam1; + float fparam2; + + int iparam1; + int iparam2; + + int bparam1; + int bparam2; +} event_args_t; + +#endif diff --git a/cssdk/common/event_flags.h b/cssdk/common/event_flags.h new file mode 100644 index 0000000..43f804f --- /dev/null +++ b/cssdk/common/event_flags.h @@ -0,0 +1,47 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( EVENT_FLAGSH ) +#define EVENT_FLAGSH +#ifdef _WIN32 +#pragma once +#endif + +// Skip local host for event send. +#define FEV_NOTHOST (1<<0) + +// Send the event reliably. You must specify the origin and angles and use +// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything +// that depends on the event origin/angles. I.e., the origin/angles are not +// taken from the invoking edict for reliable events. +#define FEV_RELIABLE (1<<1) + +// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC +// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ). +#define FEV_GLOBAL (1<<2) + +// If this client already has one of these events in its queue, just update the event instead of sending it as a duplicate +// +#define FEV_UPDATE (1<<3) + +// Only send to entity specified as the invoker +#define FEV_HOSTONLY (1<<4) + +// Only send if the event was created on the server. +#define FEV_SERVER (1<<5) + +// Only issue event client side ( from shared code ) +#define FEV_CLIENT (1<<6) + +#endif diff --git a/cssdk/common/hltv.h b/cssdk/common/hltv.h new file mode 100644 index 0000000..a6ded4e --- /dev/null +++ b/cssdk/common/hltv.h @@ -0,0 +1,61 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +// hltv.h +// all shared consts between server, clients and proxy + +#ifndef HLTV_H +#define HLTV_H + +#define TYPE_CLIENT 0 // client is a normal HL client (default) +#define TYPE_PROXY 1 // client is another proxy +#define TYPE_COMMENTATOR 3 // client is a commentator +#define TYPE_DEMO 4 // client is a demo file + +// sub commands of svc_hltv: +#define HLTV_ACTIVE 0 // tells client that he's an spectator and will get director commands +#define HLTV_STATUS 1 // send status infos about proxy +#define HLTV_LISTEN 2 // tell client to listen to a multicast stream + +// director command types: +#define DRC_CMD_NONE 0 // NULL director command +#define DRC_CMD_START 1 // start director mode +#define DRC_CMD_EVENT 2 // informs about director command +#define DRC_CMD_MODE 3 // switches camera modes +#define DRC_CMD_CAMERA 4 // set fixed camera +#define DRC_CMD_TIMESCALE 5 // sets time scale +#define DRC_CMD_MESSAGE 6 // send HUD centerprint +#define DRC_CMD_SOUND 7 // plays a particular sound +#define DRC_CMD_STATUS 8 // HLTV broadcast status +#define DRC_CMD_BANNER 9 // set GUI banner +#define DRC_CMD_STUFFTEXT 10 // like the normal svc_stufftext but as director command +#define DRC_CMD_CHASE 11 // chase a certain player +#define DRC_CMD_INEYE 12 // view player through own eyes +#define DRC_CMD_MAP 13 // show overview map +#define DRC_CMD_CAMPATH 14 // define camera waypoint +#define DRC_CMD_WAYPOINTS 15 // start moving camera, inetranl message + +#define DRC_CMD_LAST 15 + + +// DRC_CMD_EVENT event flags +#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important) +#define DRC_FLAG_SIDE (1<<4) // +#define DRC_FLAG_DRAMATIC (1<<5) // is a dramatic scene +#define DRC_FLAG_SLOWMOTION (1<<6) // would look good in SloMo +#define DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc) +#define DRC_FLAG_INTRO (1<<8) // is a introduction scene +#define DRC_FLAG_FINAL (1<<9) // is a final scene +#define DRC_FLAG_NO_RANDOM (1<<10) // don't randomize event data + + +// DRC_CMD_WAYPOINT flags +#define DRC_FLAG_STARTPATH 1 // end with speed 0.0 +#define DRC_FLAG_SLOWSTART 2 // start with speed 0.0 +#define DRC_FLAG_SLOWEND 4 // end with speed 0.0 + +#endif // HLTV_H diff --git a/cssdk/common/in_buttons.h b/cssdk/common/in_buttons.h new file mode 100644 index 0000000..4196a2d --- /dev/null +++ b/cssdk/common/in_buttons.h @@ -0,0 +1,38 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef IN_BUTTONS_H +#define IN_BUTTONS_H +#ifdef _WIN32 +#pragma once +#endif + +#define IN_ATTACK (1 << 0) +#define IN_JUMP (1 << 1) +#define IN_DUCK (1 << 2) +#define IN_FORWARD (1 << 3) +#define IN_BACK (1 << 4) +#define IN_USE (1 << 5) +#define IN_CANCEL (1 << 6) +#define IN_LEFT (1 << 7) +#define IN_RIGHT (1 << 8) +#define IN_MOVELEFT (1 << 9) +#define IN_MOVERIGHT (1 << 10) +#define IN_ATTACK2 (1 << 11) +#define IN_RUN (1 << 12) +#define IN_RELOAD (1 << 13) +#define IN_ALT1 (1 << 14) +#define IN_SCORE (1 << 15) // Used by client.dll for when scoreboard is held down + +#endif // IN_BUTTONS_H diff --git a/cssdk/common/ivoicetweak.h b/cssdk/common/ivoicetweak.h new file mode 100644 index 0000000..da568c5 --- /dev/null +++ b/cssdk/common/ivoicetweak.h @@ -0,0 +1,38 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef IVOICETWEAK_H +#define IVOICETWEAK_H +#ifdef _WIN32 +#pragma once +#endif + +// These provide access to the voice controls. +typedef enum +{ + MicrophoneVolume=0, // values 0-1. + OtherSpeakerScale, // values 0-1. Scales how loud other players are. + MicBoost, // 20 db gain to voice input +} VoiceTweakControl; + + +typedef struct IVoiceTweak_s +{ + // These turn voice tweak mode on and off. While in voice tweak mode, the user's voice is echoed back + // without sending to the server. + int (*StartVoiceTweakMode)(); // Returns 0 on error. + void (*EndVoiceTweakMode)(); + + // Get/set control values. + void (*SetControlFloat)(VoiceTweakControl iControl, float value); + float (*GetControlFloat)(VoiceTweakControl iControl); + + int (*GetSpeakingVolume)(); +} IVoiceTweak; + + +#endif // IVOICETWEAK_H diff --git a/cssdk/common/kbutton.h b/cssdk/common/kbutton.h new file mode 100644 index 0000000..a890ce5 --- /dev/null +++ b/cssdk/common/kbutton.h @@ -0,0 +1,44 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef KBUTTON_H +#define KBUTTON_H +#ifdef _WIN32 +#pragma once +#endif + + +/* <31b2a> ../common/kbutton.h:7 */ +typedef struct kbutton_s +{ + int down[2]; + int state; +} kbutton_t; + + +#endif // KBUTTON_H diff --git a/cssdk/common/mathlib.h b/cssdk/common/mathlib.h new file mode 100644 index 0000000..d1dbdc9 --- /dev/null +++ b/cssdk/common/mathlib.h @@ -0,0 +1,127 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#ifdef PLAY_GAMEDLL + +// probably gamedll compiled with flag /fpmath:fasted, +// so we need to use type double, otherwise will be the test failed + +typedef double float_precision; + +#else + +typedef float float_precision; + +#endif // PLAY_GAMEDLL + +typedef float vec_t; +typedef vec_t vec3_t[3]; +typedef vec_t vec4_t[4]; +typedef int fixed16_t; + +typedef union DLONG_u +{ + int i[2]; + double d; + float f; +} DLONG; + +#define M_PI 3.14159265358979323846 + +#ifdef __cplusplus +#ifdef min +#undef min +#endif + +#ifdef max +#undef max +#endif + +#ifdef clamp +#undef clamp +#endif + +template +const T& min(const T& a, const T& b) { return (a < b) ? a : b; } + +template +const T& max(const T& a, const T& b) { return (a > b) ? a : b; } + +template +const T& clamp(const T& a, const T& min, const T& max) { return (a > max) ? max : (a < min) ? min : a; } + +#else // __cplusplus + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#define clamp(val, min, max) (((val) > (max)) ? (max) : (((val) < (min)) ? (min) : (val))) +#endif // __cplusplus + +// bitwise operators templates +template::type> +inline T operator~ (T a) { return (T)~(type)a; } +template::type> +inline T operator| (T a, T b) { return (T)((type)a | (type)b); } +template::type> +inline T operator& (T a, T b) { return (T)((type)a & (type)b); } +template::type> +inline T operator^ (T a, T b) { return (T)((type)a ^ (type)b); } +template::type> +inline T& operator|= (T& a, T b) { return (T&)((type&)a |= (type)b); } +template::type> +inline T& operator&= (T& a, T b) { return (T&)((type&)a &= (type)b); } +template::type> +inline T& operator^= (T& a, T b) { return (T&)((type&)a ^= (type)b); } + +inline double M_sqrt(int value) { + return sqrt(value); +} + +inline float M_sqrt(float value) { + return _mm_cvtss_f32(_mm_sqrt_ss(_mm_load_ss(&value))); +} + +inline double M_sqrt(double value) { + double ret; + auto v = _mm_load_sd(&value); + _mm_store_sd(&ret, _mm_sqrt_sd(v, v)); + return ret; +} + +#define VectorSubtract(a,b,c) {(c)[0]=(a)[0]-(b)[0];(c)[1]=(a)[1]-(b)[1];(c)[2]=(a)[2]-(b)[2];} +#define VectorAdd(a,b,c) {(c)[0]=(a)[0]+(b)[0];(c)[1]=(a)[1]+(b)[1];(c)[2]=(a)[2]+(b)[2];} +#define VectorCopy(a,b) {(b)[0]=(a)[0];(b)[1]=(a)[1];(b)[2]=(a)[2];} +#define VectorClear(a) {(a)[0]=0.0;(a)[1]=0.0;(a)[2]=0.0;} diff --git a/cssdk/common/net_api.h b/cssdk/common/net_api.h new file mode 100644 index 0000000..9551d18 --- /dev/null +++ b/cssdk/common/net_api.h @@ -0,0 +1,99 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined( NET_APIH ) +#define NET_APIH +#ifdef _WIN32 +#pragma once +#endif + +#if !defined ( NETADRH ) +#include "netadr.h" +#endif + +#define NETAPI_REQUEST_SERVERLIST ( 0 ) // Doesn't need a remote address +#define NETAPI_REQUEST_PING ( 1 ) +#define NETAPI_REQUEST_RULES ( 2 ) +#define NETAPI_REQUEST_PLAYERS ( 3 ) +#define NETAPI_REQUEST_DETAILS ( 4 ) + +// Set this flag for things like broadcast requests, etc. where the engine should not +// kill the request hook after receiving the first response +#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 ) + +typedef void ( *net_api_response_func_t ) ( struct net_response_s *response ); + +#define NET_SUCCESS ( 0 ) +#define NET_ERROR_TIMEOUT ( 1<<0 ) +#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 ) +#define NET_ERROR_UNDEFINED ( 1<<2 ) + +typedef struct net_adrlist_s +{ + struct net_adrlist_s *next; + netadr_t remote_address; +} net_adrlist_t; + +typedef struct net_response_s +{ + // NET_SUCCESS or an error code + int error; + + // Context ID + int context; + // Type + int type; + + // Server that is responding to the request + netadr_t remote_address; + + // Response RTT ping time + double ping; + // Key/Value pair string ( separated by backlash \ characters ) + // WARNING: You must copy this buffer in the callback function, because it is freed + // by the engine right after the call!!!! + // ALSO: For NETAPI_REQUEST_SERVERLIST requests, this will be a pointer to a linked list of net_adrlist_t's + void *response; +} net_response_t; + +typedef struct net_status_s +{ + // Connected to remote server? 1 == yes, 0 otherwise + int connected; + // Client's IP address + netadr_t local_address; + // Address of remote server + netadr_t remote_address; + // Packet Loss ( as a percentage ) + int packet_loss; + // Latency, in seconds ( multiply by 1000.0 to get milliseconds ) + double latency; + // Connection time, in seconds + double connection_time; + // Rate setting ( for incoming data ) + double rate; +} net_status_t; + +typedef struct net_api_s +{ + // APIs + void ( *InitNetworking )( void ); + void ( *Status ) ( struct net_status_s *status ); + void ( *SendRequest) ( int context, int request, int flags, double timeout, struct netadr_s *remote_address, net_api_response_func_t response ); + void ( *CancelRequest ) ( int context ); + void ( *CancelAllRequests ) ( void ); + char *( *AdrToString ) ( struct netadr_s *a ); + int ( *CompareAdr ) ( struct netadr_s *a, struct netadr_s *b ); + int ( *StringToAdr ) ( char *s, struct netadr_s *a ); + const char *( *ValueForKey ) ( const char *s, const char *key ); + void ( *RemoveKey ) ( char *s, const char *key ); + void ( *SetValueForKey ) (char *s, const char *key, const char *value, int maxsize ); +} net_api_t; + +extern net_api_t netapi; + +#endif // NET_APIH diff --git a/cssdk/common/netadr.h b/cssdk/common/netadr.h new file mode 100644 index 0000000..304073c --- /dev/null +++ b/cssdk/common/netadr.h @@ -0,0 +1,40 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// netadr.h +#ifndef NETADR_H +#define NETADR_H +#ifdef _WIN32 +#pragma once +#endif + +typedef enum +{ + NA_UNUSED, + NA_LOOPBACK, + NA_BROADCAST, + NA_IP, + NA_IPX, + NA_BROADCAST_IPX, +} netadrtype_t; + +typedef struct netadr_s +{ + netadrtype_t type; + unsigned char ip[4]; + unsigned char ipx[10]; + unsigned short port; +} netadr_t; + +#endif // NETADR_H diff --git a/cssdk/common/nowin.h b/cssdk/common/nowin.h new file mode 100644 index 0000000..0b1f577 --- /dev/null +++ b/cssdk/common/nowin.h @@ -0,0 +1,16 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef INC_NOWIN_H +#define INC_NOWIN_H +#ifndef _WIN32 + +#include +#include + +#endif //!_WIN32 +#endif //INC_NOWIN_H diff --git a/cssdk/common/parsemsg.cpp b/cssdk/common/parsemsg.cpp new file mode 100644 index 0000000..6742db2 --- /dev/null +++ b/cssdk/common/parsemsg.cpp @@ -0,0 +1,259 @@ +/*** +* +* Copyright (c) 1999, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// +// parsemsg.cpp +// +//-------------------------------------------------------------------------------------------------------------- +#include "parsemsg.h" +#include + +typedef unsigned char byte; +#define true 1 + +static byte *gpBuf; +static int giSize; +static int giRead; +static int giBadRead; + +int READ_OK( void ) +{ + return !giBadRead; +} + +void BEGIN_READ( void *buf, int size ) +{ + giRead = 0; + giBadRead = 0; + giSize = size; + gpBuf = (byte*)buf; +} + + +int READ_CHAR( void ) +{ + int c; + + if (giRead + 1 > giSize) + { + giBadRead = true; + return -1; + } + + c = (signed char)gpBuf[giRead]; + giRead++; + + return c; +} + +int READ_BYTE( void ) +{ + int c; + + if (giRead+1 > giSize) + { + giBadRead = true; + return -1; + } + + c = (unsigned char)gpBuf[giRead]; + giRead++; + + return c; +} + +int READ_SHORT( void ) +{ + int c; + + if (giRead+2 > giSize) + { + giBadRead = true; + return -1; + } + + c = (short)( gpBuf[giRead] + ( gpBuf[giRead+1] << 8 ) ); + + giRead += 2; + + return c; +} + +int READ_WORD( void ) +{ + return READ_SHORT(); +} + + +int READ_LONG( void ) +{ + int c; + + if (giRead+4 > giSize) + { + giBadRead = true; + return -1; + } + + c = gpBuf[giRead] + (gpBuf[giRead + 1] << 8) + (gpBuf[giRead + 2] << 16) + (gpBuf[giRead + 3] << 24); + + giRead += 4; + + return c; +} + +float READ_FLOAT( void ) +{ + union + { + byte b[4]; + float f; + int l; + } dat; + + dat.b[0] = gpBuf[giRead]; + dat.b[1] = gpBuf[giRead+1]; + dat.b[2] = gpBuf[giRead+2]; + dat.b[3] = gpBuf[giRead+3]; + giRead += 4; + +// dat.l = LittleLong (dat.l); + + return dat.f; +} + +char* READ_STRING( void ) +{ + static char string[2048]; + int l,c; + + string[0] = 0; + + l = 0; + do + { + if ( giRead+1 > giSize ) + break; // no more characters + + c = READ_CHAR(); + if (c == -1 || c == 0) + break; + string[l] = c; + l++; + } while (l < sizeof(string)-1); + + string[l] = 0; + + return string; +} + +float READ_COORD( void ) +{ + return (float)(READ_SHORT() * (1.0/8)); +} + +float READ_ANGLE( void ) +{ + return (float)(READ_CHAR() * (360.0/256)); +} + +float READ_HIRESANGLE( void ) +{ + return (float)(READ_SHORT() * (360.0/65536)); +} + +//-------------------------------------------------------------------------------------------------------------- +BufferWriter::BufferWriter() +{ + Init( NULL, 0 ); +} + +//-------------------------------------------------------------------------------------------------------------- +BufferWriter::BufferWriter( unsigned char *buffer, int bufferLen ) +{ + Init( buffer, bufferLen ); +} + +//-------------------------------------------------------------------------------------------------------------- +void BufferWriter::Init( unsigned char *buffer, int bufferLen ) +{ + m_overflow = false; + m_buffer = buffer; + m_remaining = bufferLen; + m_overallLength = bufferLen; +} + +//-------------------------------------------------------------------------------------------------------------- +void BufferWriter::WriteByte( unsigned char data ) +{ + if (!m_buffer || !m_remaining) + { + m_overflow = true; + return; + } + + *m_buffer = data; + ++m_buffer; + --m_remaining; +} + +//-------------------------------------------------------------------------------------------------------------- +void BufferWriter::WriteLong( int data ) +{ + if (!m_buffer || m_remaining < 4) + { + m_overflow = true; + return; + } + + m_buffer[0] = data&0xff; + m_buffer[1] = (data>>8)&0xff; + m_buffer[2] = (data>>16)&0xff; + m_buffer[3] = data>>24; + m_buffer += 4; + m_remaining -= 4; +} + +//-------------------------------------------------------------------------------------------------------------- +void BufferWriter::WriteString( const char *str ) +{ + if (!m_buffer || !m_remaining) + { + m_overflow = true; + return; + } + + if (!str) + str = ""; + + int len = strlen(str)+1; + if ( len > m_remaining ) + { + m_overflow = true; + str = ""; + len = 1; + } + + strcpy((char *)m_buffer, str); + m_remaining -= len; + m_buffer += len; +} + +//-------------------------------------------------------------------------------------------------------------- +int BufferWriter::GetSpaceUsed() +{ + return m_overallLength - m_remaining; +} + +//-------------------------------------------------------------------------------------------------------------- diff --git a/cssdk/common/parsemsg.h b/cssdk/common/parsemsg.h new file mode 100644 index 0000000..be7affc --- /dev/null +++ b/cssdk/common/parsemsg.h @@ -0,0 +1,66 @@ +/*** +* +* Copyright (c) 1999, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// +// parsemsg.h +// MDC - copying from cstrike\cl_dll so career-mode stuff can catch messages +// in this dll. (and C++ifying it) +// + +#ifndef PARSEMSG_H +#define PARSEMSG_H + +#define ASSERT( x ) +//-------------------------------------------------------------------------------------------------------------- +void BEGIN_READ( void *buf, int size ); +int READ_CHAR( void ); +int READ_BYTE( void ); +int READ_SHORT( void ); +int READ_WORD( void ); +int READ_LONG( void ); +float READ_FLOAT( void ); +char* READ_STRING( void ); +float READ_COORD( void ); +float READ_ANGLE( void ); +float READ_HIRESANGLE( void ); +int READ_OK( void ); + +//-------------------------------------------------------------------------------------------------------------- +class BufferWriter +{ +public: + BufferWriter(); + BufferWriter( unsigned char *buffer, int bufferLen ); + void Init( unsigned char *buffer, int bufferLen ); + + void WriteByte( unsigned char data ); + void WriteLong( int data ); + void WriteString( const char *str ); + + bool HasOverflowed(); + int GetSpaceUsed(); + +protected: + unsigned char *m_buffer; + int m_remaining; + bool m_overflow; + int m_overallLength; +}; + +//-------------------------------------------------------------------------------------------------------------- + +#endif // PARSEMSG_H + + + diff --git a/cssdk/common/particledef.h b/cssdk/common/particledef.h new file mode 100644 index 0000000..7e4043a --- /dev/null +++ b/cssdk/common/particledef.h @@ -0,0 +1,57 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( PARTICLEDEFH ) +#define PARTICLEDEFH +#ifdef _WIN32 +#pragma once +#endif + +typedef enum { + pt_static, + pt_grav, + pt_slowgrav, + pt_fire, + pt_explode, + pt_explode2, + pt_blob, + pt_blob2, + pt_vox_slowgrav, + pt_vox_grav, + pt_clientcustom // Must have callback function specified +} ptype_t; + +// !!! if this is changed, it must be changed in d_ifacea.h too !!! +typedef struct particle_s +{ +// driver-usable fields + vec3_t org; + short color; + short packedColor; +// drivers never touch the following fields + struct particle_s *next; + vec3_t vel; + float ramp; + float die; + ptype_t type; + void (*deathfunc)( struct particle_s *particle ); + + // for pt_clientcusttom, we'll call this function each frame + void (*callback)( struct particle_s *particle, float frametime ); + + // For deathfunc, etc. + unsigned char context; +} particle_t; + +#endif diff --git a/cssdk/common/pmtrace.h b/cssdk/common/pmtrace.h new file mode 100644 index 0000000..1784e9c --- /dev/null +++ b/cssdk/common/pmtrace.h @@ -0,0 +1,43 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( PMTRACEH ) +#define PMTRACEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t normal; + float dist; +} pmplane_t; + +typedef struct pmtrace_s pmtrace_t; + +struct pmtrace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; // End point is in empty space or in water + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + pmplane_t plane; // surface normal at impact + int ent; // entity at impact + vec3_t deltavelocity; // Change in player's velocity caused by impact. + // Only run on server. + int hitgroup; +}; + +#endif diff --git a/cssdk/common/port.h b/cssdk/common/port.h new file mode 100644 index 0000000..a0838a7 --- /dev/null +++ b/cssdk/common/port.h @@ -0,0 +1,119 @@ +// port.h: portability helper +// +////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "archtypes.h" // DAL + +#ifdef _WIN32 + + // Insert your headers here + #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + #define WIN32_EXTRA_LEAN + + #include "winsani_in.h" + #include + #include "winsani_out.h" + + #include + #include + #include + +#else // _WIN32 + + #include + #include + #include // exit() + #include // strncpy() + #include // tolower() + #include + #include + #include + #include + + typedef unsigned char BYTE; + + typedef int32 LONG; + //typedef uint32 ULONG; + + #ifndef ARCHTYPES_H + typedef uint32 ULONG; + #endif + + typedef void *HANDLE; + + #ifndef HMODULE + typedef void *HMODULE; + #endif + + typedef char * LPSTR; + + #define __cdecl + + + #ifdef __linux__ + typedef struct POINT_s + { + int x; + int y; + } POINT; + typedef void *HINSTANCE; + typedef void *HWND; + typedef void *HDC; + typedef void *HGLRC; + + typedef struct RECT_s + { + int left; + int right; + int top; + int bottom; + } RECT; + #endif + + + #ifdef __cplusplus + + //#undef FALSE + //#undef TRUE + + #ifdef OSX + //#else + //const bool FALSE = false; + //const bool TRUE = true; + #endif + #endif + + #ifndef NULL + #ifdef __cplusplus + #define NULL 0 + #else + #define NULL ((void *)0) + #endif + #endif + + #ifdef __cplusplus + inline int ioctlsocket( int d, int cmd, uint32 *argp ) { return ioctl( d, cmd, argp ); } + inline int closesocket( int fd ) { return close( fd ); } + inline char * GetCurrentDirectory( size_t size, char * buf ) { return getcwd( buf, size ); } + inline int WSAGetLastError() { return errno; } + + inline void DebugBreak( void ) { exit( 1 ); } + #endif + + extern char g_szEXEName[ 4096 ]; + + #define _snprintf snprintf + + #if defined(OSX) + #define SO_ARCH_SUFFIX ".dylib" + #else + #if defined ( __x86_64__ ) + #define SO_ARCH_SUFFIX "_amd64.so" + #else + #define SO_ARCH_SUFFIX ".so" + #endif + #endif +#endif + diff --git a/cssdk/common/qfont.h b/cssdk/common/qfont.h new file mode 100644 index 0000000..2fc8129 --- /dev/null +++ b/cssdk/common/qfont.h @@ -0,0 +1,41 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( QFONTH ) +#define QFONTH +#ifdef _WIN32 +#pragma once +#endif + +// Font stuff + +#define NUM_GLYPHS 256 +// does not exist: // #include "basetypes.h" + +typedef struct +{ + short startoffset; + short charwidth; +} charinfo; + +typedef struct qfont_s +{ + int width, height; + int rowcount; + int rowheight; + charinfo fontinfo[ NUM_GLYPHS ]; + unsigned char data[4]; +} qfont_t; + +#endif // qfont.h diff --git a/cssdk/common/qlimits.h b/cssdk/common/qlimits.h new file mode 100644 index 0000000..3fad403 --- /dev/null +++ b/cssdk/common/qlimits.h @@ -0,0 +1,39 @@ +//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ========== +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef QLIMITS_H +#define QLIMITS_H + +#if defined( _WIN32 ) +#pragma once +#endif + +// DATA STRUCTURE INFO + +#define MAX_NUM_ARGVS 50 + +// SYSTEM INFO +#define MAX_QPATH 64 // max length of a game pathname +#define MAX_OSPATH 260 // max length of a filesystem pathname + +#define ON_EPSILON 0.1 // point on plane side epsilon + +#define MAX_LIGHTSTYLE_INDEX_BITS 6 +#define MAX_LIGHTSTYLES (1< ../common/quakedef.h:29 */ +typedef int BOOL; /* size: 4 */ + +// user message +#define MAX_USER_MSG_DATA 192 + +/* <627f> ../common/quakedef.h:137 */ +//moved to com_model.h +//typedef struct cache_user_s +//{ +// void *data; +//} cache_user_t; + +/* <4313b> ../common/quakedef.h:162 */ +typedef int (*pfnUserMsgHook)(const char *, int, void *); diff --git a/cssdk/common/r_efx.h b/cssdk/common/r_efx.h new file mode 100644 index 0000000..4f7b806 --- /dev/null +++ b/cssdk/common/r_efx.h @@ -0,0 +1,197 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined ( R_EFXH ) +#define R_EFXH +#ifdef _WIN32 +#pragma once +#endif + +// particle_t +#if !defined( PARTICLEDEFH ) +#include "particledef.h" +#endif + +// BEAM +#if !defined( BEAMDEFH ) +#include "beamdef.h" +#endif + +// dlight_t +#if !defined ( DLIGHTH ) +#include "dlight.h" +#endif + +// cl_entity_t +#if !defined( CL_ENTITYH ) +#include "cl_entity.h" +#endif + +/* +// FOR REFERENCE, These are the built-in tracer colors. Note, color 4 is the one +// that uses the tracerred/tracergreen/tracerblue and traceralpha cvar settings +color24 gTracerColors[] = +{ + { 255, 255, 255 }, // White + { 255, 0, 0 }, // Red + { 0, 255, 0 }, // Green + { 0, 0, 255 }, // Blue + { 0, 0, 0 }, // Tracer default, filled in from cvars, etc. + { 255, 167, 17 }, // Yellow-orange sparks + { 255, 130, 90 }, // Yellowish streaks (garg) + { 55, 60, 144 }, // Blue egon streak + { 255, 130, 90 }, // More Yellowish streaks (garg) + { 255, 140, 90 }, // More Yellowish streaks (garg) + { 200, 130, 90 }, // More red streaks (garg) + { 255, 120, 70 }, // Darker red streaks (garg) +}; +*/ + +// Temporary entity array +#define TENTPRIORITY_LOW 0 +#define TENTPRIORITY_HIGH 1 + +// TEMPENTITY flags +#define FTENT_NONE 0x00000000 +#define FTENT_SINEWAVE 0x00000001 +#define FTENT_GRAVITY 0x00000002 +#define FTENT_ROTATE 0x00000004 +#define FTENT_SLOWGRAVITY 0x00000008 +#define FTENT_SMOKETRAIL 0x00000010 +#define FTENT_COLLIDEWORLD 0x00000020 +#define FTENT_FLICKER 0x00000040 +#define FTENT_FADEOUT 0x00000080 +#define FTENT_SPRANIMATE 0x00000100 +#define FTENT_HITSOUND 0x00000200 +#define FTENT_SPIRAL 0x00000400 +#define FTENT_SPRCYCLE 0x00000800 +#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes +#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw +#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything +#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner) +#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed +#define FTENT_SPARKSHOWER 0x00020000 +#define FTENT_NOMODEL 0x00040000 // Doesn't have a model, never try to draw ( it just triggers other things ) +#define FTENT_CLIENTCUSTOM 0x00080000 // Must specify callback. Callback function is responsible for killing tempent and updating fields ( unless other flags specify how to do things ) + +typedef struct tempent_s +{ + int flags; + float die; + float frameMax; + float x; + float y; + float z; + float fadeSpeed; + float bounceFactor; + int hitSound; + void ( *hitcallback ) ( struct tempent_s *ent, struct pmtrace_s *ptr ); + void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ); + struct tempent_s *next; + int priority; + short clientIndex; // if attached, this is the index of the client to stick to + // if COLLIDEALL, this is the index of the client to ignore + // TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex! + + vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin. + cl_entity_t entity; + + // baseline.origin - velocity + // baseline.renderamt - starting fadeout intensity + // baseline.angles - angle velocity +} TEMPENTITY; + +typedef struct efx_api_s efx_api_t; + +struct efx_api_s +{ + particle_t *( *R_AllocParticle ) ( void ( *callback ) ( struct particle_s *particle, float frametime ) ); + void ( *R_BlobExplosion ) ( float * org ); + void ( *R_Blood ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BloodSprite ) ( float * org, int colorindex, int modelIndex, int modelIndex2, float size ); + void ( *R_BloodStream ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BreakModel ) ( float *pos, float *size, float *dir, float random, float life, int count, int modelIndex, char flags ); + void ( *R_Bubbles ) ( float * mins, float * maxs, float height, int modelIndex, int count, float speed ); + void ( *R_BubbleTrail ) ( float * start, float * end, float height, int modelIndex, int count, float speed ); + void ( *R_BulletImpactParticles ) ( float * pos ); + void ( *R_EntityParticles ) ( struct cl_entity_s *ent ); + void ( *R_Explosion ) ( float *pos, int model, float scale, float framerate, int flags ); + void ( *R_FizzEffect ) ( struct cl_entity_s *pent, int modelIndex, int density ); + void ( *R_FireField ) ( float * org, int radius, int modelIndex, int count, int flags, float life ); + void ( *R_FlickerParticles ) ( float * org ); + void ( *R_FunnelSprite ) ( float *org, int modelIndex, int reverse ); + void ( *R_Implosion ) ( float * end, float radius, int count, float life ); + void ( *R_LargeFunnel ) ( float * org, int reverse ); + void ( *R_LavaSplash ) ( float * org ); + void ( *R_MultiGunshot ) ( float * org, float * dir, float * noise, int count, int decalCount, int *decalIndices ); + void ( *R_MuzzleFlash ) ( float *pos1, int type ); + void ( *R_ParticleBox ) ( float *mins, float *maxs, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_ParticleBurst ) ( float * pos, int size, int color, float life ); + void ( *R_ParticleExplosion ) ( float * org ); + void ( *R_ParticleExplosion2 ) ( float * org, int colorStart, int colorLength ); + void ( *R_ParticleLine ) ( float * start, float *end, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_PlayerSprites ) ( int client, int modelIndex, int count, int size ); + void ( *R_Projectile ) ( float * origin, float * velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) ); + void ( *R_RicochetSound ) ( float * pos ); + void ( *R_RicochetSprite ) ( float *pos, struct model_s *pmodel, float duration, float scale ); + void ( *R_RocketFlare ) ( float *pos ); + void ( *R_RocketTrail ) ( float * start, float * end, int type ); + void ( *R_RunParticleEffect ) ( float * org, float * dir, int color, int count ); + void ( *R_ShowLine ) ( float * start, float * end ); + void ( *R_SparkEffect ) ( float *pos, int count, int velocityMin, int velocityMax ); + void ( *R_SparkShower ) ( float *pos ); + void ( *R_SparkStreaks ) ( float * pos, int count, int velocityMin, int velocityMax ); + void ( *R_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int spread, int rendermode ); + void ( *R_Sprite_Explode ) ( TEMPENTITY *pTemp, float scale, int flags ); + void ( *R_Sprite_Smoke ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_Sprite_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int iRand ); + void ( *R_Sprite_Trail ) ( int type, float * start, float * end, int modelIndex, int count, float life, float size, float amplitude, int renderamt, float speed ); + void ( *R_Sprite_WallPuff ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_StreakSplash ) ( float * pos, float * dir, int color, int count, float speed, int velocityMin, int velocityMax ); + void ( *R_TracerEffect ) ( float * start, float * end ); + void ( *R_UserTracerParticle ) ( float * org, float * vel, float life, int colorIndex, float length, unsigned char deathcontext, void ( *deathfunc)( struct particle_s *particle ) ); + particle_t *( *R_TracerParticles ) ( float * org, float * vel, float life ); + void ( *R_TeleportSplash ) ( float * org ); + void ( *R_TempSphereModel ) ( float *pos, float speed, float life, int count, int modelIndex ); + TEMPENTITY *( *R_TempModel ) ( float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype ); + TEMPENTITY *( *R_DefaultSprite ) ( float *pos, int spriteIndex, float framerate ); + TEMPENTITY *( *R_TempSprite ) ( float *pos, float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags ); + int ( *Draw_DecalIndex ) ( int id ); + int ( *Draw_DecalIndexFromName ) ( char *name ); + void ( *R_DecalShoot ) ( int textureIndex, int entity, int modelIndex, float * position, int flags ); + void ( *R_AttachTentToPlayer ) ( int client, int modelIndex, float zoffset, float life ); + void ( *R_KillAttachedTents ) ( int client ); + BEAM *( *R_BeamCirclePoints ) ( int type, float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEntPoint ) ( int startEnt, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEnts ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamFollow ) ( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness ); + void ( *R_BeamKill ) ( int deadEntity ); + BEAM *( *R_BeamLightning ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed ); + BEAM *( *R_BeamPoints ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamRing ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + dlight_t *( *CL_AllocDlight ) ( int key ); + dlight_t *( *CL_AllocElight ) ( int key ); + TEMPENTITY *( *CL_TempEntAlloc ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TempEntAllocNoModel ) ( float * org ); + TEMPENTITY *( *CL_TempEntAllocHigh ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TentEntAllocCustom ) ( float *origin, struct model_s *model, int high, void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ) ); + void ( *R_GetPackedColor ) ( short *packed, short color ); + short ( *R_LookupColor ) ( unsigned char r, unsigned char g, unsigned char b ); + void ( *R_DecalRemoveAll ) ( int textureIndex ); //textureIndex points to the decal index in the array, not the actual texture index. + void ( *R_FireCustomDecal ) ( int textureIndex, int entity, int modelIndex, float * position, int flags, float scale ); +}; + +extern efx_api_t efx; + +#endif diff --git a/cssdk/common/r_studioint.h b/cssdk/common/r_studioint.h new file mode 100644 index 0000000..2ddf012 --- /dev/null +++ b/cssdk/common/r_studioint.h @@ -0,0 +1,151 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined( R_STUDIOINT_H ) +#define R_STUDIOINT_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define STUDIO_INTERFACE_VERSION 1 + +typedef struct engine_studio_api_s +{ + // Allocate number*size bytes and zero it + void *( *Mem_Calloc ) ( int number, size_t size ); + // Check to see if pointer is in the cache + void *( *Cache_Check ) ( struct cache_user_s *c ); + // Load file into cache ( can be swapped out on demand ) + void ( *LoadCacheFile ) ( char *path, struct cache_user_s *cu ); + // Retrieve model pointer for the named model + struct model_s *( *Mod_ForName ) ( const char *name, int crash_if_missing ); + // Retrieve pointer to studio model data block from a model + void *( *Mod_Extradata ) ( struct model_s *mod ); + // Retrieve indexed model from client side model precache list + struct model_s *( *GetModelByIndex ) ( int index ); + // Get entity that is set for rendering + struct cl_entity_s * ( *GetCurrentEntity ) ( void ); + // Get referenced player_info_t + struct player_info_s *( *PlayerInfo ) ( int index ); + // Get most recently received player state data from network system + struct entity_state_s *( *GetPlayerState ) ( int index ); + // Get viewentity + struct cl_entity_s * ( *GetViewEntity ) ( void ); + // Get current frame count, and last two timestampes on client + void ( *GetTimes ) ( int *framecount, double *current, double *old ); + // Get a pointer to a cvar by name + struct cvar_s *( *GetCvar ) ( const char *name ); + // Get current render origin and view vectors ( up, right and vpn ) + void ( *GetViewInfo ) ( float *origin, float *upv, float *rightv, float *vpnv ); + // Get sprite model used for applying chrome effect + struct model_s *( *GetChromeSprite ) ( void ); + // Get model counters so we can incement instrumentation + void ( *GetModelCounters ) ( int **s, int **a ); + // Get software scaling coefficients + void ( *GetAliasScale ) ( float *x, float *y ); + + // Get bone, light, alias, and rotation matrices + float ****( *StudioGetBoneTransform ) ( void ); + float ****( *StudioGetLightTransform )( void ); + float ***( *StudioGetAliasTransform ) ( void ); + float ***( *StudioGetRotationMatrix ) ( void ); + + // Set up body part, and get submodel pointers + void ( *StudioSetupModel ) ( int bodypart, void **ppbodypart, void **ppsubmodel ); + // Check if entity's bbox is in the view frustum + int ( *StudioCheckBBox ) ( void ); + // Apply lighting effects to model + void ( *StudioDynamicLight ) ( struct cl_entity_s *ent, struct alight_s *plight ); + void ( *StudioEntityLight ) ( struct alight_s *plight ); + void ( *StudioSetupLighting ) ( struct alight_s *plighting ); + + // Draw mesh vertices + void ( *StudioDrawPoints ) ( void ); + + // Draw hulls around bones + void ( *StudioDrawHulls ) ( void ); + // Draw bbox around studio models + void ( *StudioDrawAbsBBox ) ( void ); + // Draws bones + void ( *StudioDrawBones ) ( void ); + // Loads in appropriate texture for model + void ( *StudioSetupSkin ) ( void *ptexturehdr, int index ); + // Sets up for remapped colors + void ( *StudioSetRemapColors ) ( int top, int bottom ); + // Set's player model and returns model pointer + struct model_s *( *SetupPlayerModel ) ( int index ); + // Fires any events embedded in animation + void ( *StudioClientEvents ) ( void ); + // Retrieve/set forced render effects flags + int ( *GetForceFaceFlags ) ( void ); + void ( *SetForceFaceFlags ) ( int flags ); + // Tell engine the value of the studio model header + void ( *StudioSetHeader ) ( void *header ); + // Tell engine which model_t * is being renderered + void ( *SetRenderModel ) ( struct model_s *model ); + + // Final state setup and restore for rendering + void ( *SetupRenderer ) ( int rendermode ); + void ( *RestoreRenderer ) ( void ); + + // Set render origin for applying chrome effect + void ( *SetChromeOrigin ) ( void ); + + // True if using D3D/OpenGL + int ( *IsHardware ) ( void ); + + // Only called by hardware interface + void ( *GL_StudioDrawShadow ) ( void ); + void ( *GL_SetRenderMode ) ( int mode ); + + void ( *StudioSetRenderamt ) (int iRenderamt); //!!!CZERO added for rendering glass on viewmodels + void ( *StudioSetCullState ) ( int iCull ); + void ( *StudioRenderShadow ) ( int iSprite, float *p1, float *p2, float *p3, float *p4 ); +} engine_studio_api_t; + +typedef struct server_studio_api_s +{ + // Allocate number*size bytes and zero it + void *( *Mem_Calloc ) ( int number, size_t size ); + // Check to see if pointer is in the cache + void *( *Cache_Check ) ( struct cache_user_s *c ); + // Load file into cache ( can be swapped out on demand ) + void ( *LoadCacheFile ) ( char *path, struct cache_user_s *cu ); + // Retrieve pointer to studio model data block from a model + void *( *Mod_Extradata ) ( struct model_s *mod ); +} server_studio_api_t; + + +// client blending +typedef struct r_studio_interface_s +{ + int version; + int ( *StudioDrawModel ) ( int flags ); + int ( *StudioDrawPlayer ) ( int flags, struct entity_state_s *pplayer ); +} r_studio_interface_t; + +extern r_studio_interface_t *pStudioAPI; + +// server blending +#define SV_BLENDING_INTERFACE_VERSION 1 + +typedef struct sv_blending_interface_s +{ + int version; + + void ( *SV_StudioSetupBones )( struct model_s *pModel, + float frame, + int sequence, + const vec3_t angles, + const vec3_t origin, + const byte *pcontroller, + const byte *pblending, + int iBone, + const edict_t *pEdict ); +} sv_blending_interface_t; + +#endif // R_STUDIOINT_H diff --git a/cssdk/common/ref_params.h b/cssdk/common/ref_params.h new file mode 100644 index 0000000..90eb03f --- /dev/null +++ b/cssdk/common/ref_params.h @@ -0,0 +1,75 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( REF_PARAMSH ) +#define REF_PARAMSH + +typedef struct ref_params_s +{ + // Output + float vieworg[3]; + float viewangles[3]; + + float forward[3]; + float right[3]; + float up[3]; + + // Client frametime; + float frametime; + // Client time + float time; + + // Misc + int intermission; + int paused; + int spectator; + int onground; + int waterlevel; + + float simvel[3]; + float simorg[3]; + + float viewheight[3]; + float idealpitch; + + float cl_viewangles[3]; + + int health; + float crosshairangle[3]; + float viewsize; + + float punchangle[3]; + int maxclients; + int viewentity; + int playernum; + int max_entities; + int demoplayback; + int hardware; + + int smoothing; + + // Last issued usercmd + struct usercmd_s *cmd; + + // Movevars + struct movevars_s *movevars; + + int viewport[4]; // the viewport coordinates x ,y , width, height + + int nextView; // the renderer calls ClientDLL_CalcRefdef() and Renderview + // so long in cycles until this value is 0 (multiple views) + int onlyClientDraw; // if !=0 nothing is drawn by the engine except clientDraw functions +} ref_params_t; + +#endif // !REF_PARAMSH diff --git a/cssdk/common/screenfade.h b/cssdk/common/screenfade.h new file mode 100644 index 0000000..62c0d25 --- /dev/null +++ b/cssdk/common/screenfade.h @@ -0,0 +1,24 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined( SCREENFADEH ) +#define SCREENFADEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct screenfade_s +{ + float fadeSpeed; // How fast to fade (tics / second) (+ fade in, - fade out) + float fadeEnd; // When the fading hits maximum + float fadeTotalEnd; // Total End Time of the fade (used for FFADE_OUT) + float fadeReset; // When to reset to not fading (for fadeout and hold) + byte fader, fadeg, fadeb, fadealpha; // Fade color + int fadeFlags; // Fading flags +} screenfade_t; + +#endif // !SCREENFADEH diff --git a/cssdk/common/studio_event.h b/cssdk/common/studio_event.h new file mode 100644 index 0000000..c79c210 --- /dev/null +++ b/cssdk/common/studio_event.h @@ -0,0 +1,29 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( STUDIO_EVENTH ) +#define STUDIO_EVENTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct mstudioevent_s +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; + +#endif // STUDIO_EVENTH diff --git a/cssdk/common/triangleapi.h b/cssdk/common/triangleapi.h new file mode 100644 index 0000000..069a4d6 --- /dev/null +++ b/cssdk/common/triangleapi.h @@ -0,0 +1,64 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( TRIANGLEAPIH ) +#define TRIANGLEAPIH +#ifdef _WIN32 +#pragma once +#endif + +typedef enum +{ + TRI_FRONT = 0, + TRI_NONE = 1, +} TRICULLSTYLE; + +#define TRI_API_VERSION 1 + +#define TRI_TRIANGLES 0 +#define TRI_TRIANGLE_FAN 1 +#define TRI_QUADS 2 +#define TRI_POLYGON 3 +#define TRI_LINES 4 +#define TRI_TRIANGLE_STRIP 5 +#define TRI_QUAD_STRIP 6 + +typedef struct triangleapi_s +{ + int version; + + void ( *RenderMode )( int mode ); + void ( *Begin )( int primitiveCode ); + void ( *End ) ( void ); + + void ( *Color4f ) ( float r, float g, float b, float a ); + void ( *Color4ub ) ( unsigned char r, unsigned char g, unsigned char b, unsigned char a ); + void ( *TexCoord2f ) ( float u, float v ); + void ( *Vertex3fv ) ( float *worldPnt ); + void ( *Vertex3f ) ( float x, float y, float z ); + void ( *Brightness ) ( float brightness ); + void ( *CullFace ) ( TRICULLSTYLE style ); + int ( *SpriteTexture ) ( struct model_s *pSpriteModel, int frame ); + int ( *WorldToScreen ) ( float *world, float *screen ); // Returns 1 if it's z clipped + void ( *Fog ) ( float flFogColor[3], float flStart, float flEnd, int bOn ); // Works just like GL_FOG, flFogColor is r/g/b. + void ( *ScreenToWorld ) ( float *screen, float *world ); + void ( *GetMatrix ) ( const int pname, float *matrix ); + int ( *BoxInPVS ) ( float *mins, float *maxs ); + void ( *LightAtPoint ) ( float *pos, float *value ); + void ( *Color4fRendermode ) ( float r, float g, float b, float a, int rendermode ); + void ( *FogParams ) ( float flDensity, int iFogSkybox ); // Used with Fog()...sets fog density and whether the fog should be applied to the skybox + +} triangleapi_t; + +#endif // !TRIANGLEAPIH diff --git a/cssdk/common/usercmd.h b/cssdk/common/usercmd.h new file mode 100644 index 0000000..7cdcfe2 --- /dev/null +++ b/cssdk/common/usercmd.h @@ -0,0 +1,41 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef USERCMD_H +#define USERCMD_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct usercmd_s +{ + short lerp_msec; // Interpolation time on client + byte msec; // Duration in ms of command + vec3_t viewangles; // Command view angles. + +// intended velocities + float forwardmove; // Forward velocity. + float sidemove; // Sideways velocity. + float upmove; // Upward velocity. + byte lightlevel; // Light level at spot where we are standing. + unsigned short buttons; // Attack buttons + byte impulse; // Impulse command issued. + byte weaponselect; // Current weapon id + +// Experimental player impact stuff. + int impact_index; + vec3_t impact_position; +} usercmd_t; + +#endif // USERCMD_H diff --git a/cssdk/common/vmodes.h b/cssdk/common/vmodes.h new file mode 100644 index 0000000..5d4384f --- /dev/null +++ b/cssdk/common/vmodes.h @@ -0,0 +1,35 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + + +/* <430ee> ../common/vmodes.h:40 */ +typedef struct rect_s +{ + int left, right, top, bottom; +} wrect_t; diff --git a/cssdk/common/weaponinfo.h b/cssdk/common/weaponinfo.h new file mode 100644 index 0000000..251a096 --- /dev/null +++ b/cssdk/common/weaponinfo.h @@ -0,0 +1,53 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#ifndef WEAPONINFO_H +#define WEAPONINFO_H +#ifdef _WIN32 +#pragma once +#endif + +// Info about weapons player might have in his/her possession +typedef struct weapon_data_s +{ + int m_iId; + int m_iClip; + + float m_flNextPrimaryAttack; + float m_flNextSecondaryAttack; + float m_flTimeWeaponIdle; + + int m_fInReload; + int m_fInSpecialReload; + float m_flNextReload; + float m_flPumpTime; + float m_fReloadTime; + + float m_fAimedDamage; + float m_fNextAimBonus; + int m_fInZoom; + int m_iWeaponState; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; +} weapon_data_t; + +#endif // WEAPONINFO_H diff --git a/cssdk/common/winsani_in.h b/cssdk/common/winsani_in.h new file mode 100644 index 0000000..d8c8527 --- /dev/null +++ b/cssdk/common/winsani_in.h @@ -0,0 +1,7 @@ +#if _MSC_VER >= 1500 // MSVC++ 9.0 (Visual Studio 2008) +#pragma push_macro("ARRAYSIZE") +#ifdef ARRAYSIZE +#undef ARRAYSIZE +#endif +#define HSPRITE WINDOWS_HSPRITE +#endif diff --git a/cssdk/common/winsani_out.h b/cssdk/common/winsani_out.h new file mode 100644 index 0000000..2726950 --- /dev/null +++ b/cssdk/common/winsani_out.h @@ -0,0 +1,4 @@ +#if _MSC_VER >= 1500 // MSVC++ 9.0 (Visual Studio 2008) +#undef HSPRITE +#pragma pop_macro("ARRAYSIZE") +#endif diff --git a/cssdk/dlls/activity.h b/cssdk/dlls/activity.h new file mode 100644 index 0000000..a34b76a --- /dev/null +++ b/cssdk/dlls/activity.h @@ -0,0 +1,145 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +typedef enum Activity_s +{ + ACT_INVALID = -1, + + ACT_RESET = 0, // Set m_Activity to this invalid value to force a reset to m_IdealActivity + ACT_IDLE, + ACT_GUARD, + ACT_WALK, + ACT_RUN, + ACT_FLY, + ACT_SWIM, + ACT_HOP, + ACT_LEAP, + ACT_FALL, + ACT_LAND, + ACT_STRAFE_LEFT, + ACT_STRAFE_RIGHT, + ACT_ROLL_LEFT, + ACT_ROLL_RIGHT, + ACT_TURN_LEFT, + ACT_TURN_RIGHT, + ACT_CROUCH, + ACT_CROUCHIDLE, + ACT_STAND, + ACT_USE, + ACT_SIGNAL1, + ACT_SIGNAL2, + ACT_SIGNAL3, + ACT_TWITCH, + ACT_COWER, + ACT_SMALL_FLINCH, + ACT_BIG_FLINCH, + ACT_RANGE_ATTACK1, + ACT_RANGE_ATTACK2, + ACT_MELEE_ATTACK1, + ACT_MELEE_ATTACK2, + ACT_RELOAD, + ACT_ARM, + ACT_DISARM, + ACT_EAT, + ACT_DIESIMPLE, + ACT_DIEBACKWARD, + ACT_DIEFORWARD, + ACT_DIEVIOLENT, + ACT_BARNACLE_HIT, + ACT_BARNACLE_PULL, + ACT_BARNACLE_CHOMP, + ACT_BARNACLE_CHEW, + ACT_SLEEP, + ACT_INSPECT_FLOOR, + ACT_INSPECT_WALL, + ACT_IDLE_ANGRY, + ACT_WALK_HURT, + ACT_RUN_HURT, + ACT_HOVER, + ACT_GLIDE, + ACT_FLY_LEFT, + ACT_FLY_RIGHT, + ACT_DETECT_SCENT, + ACT_SNIFF, + ACT_BITE, + ACT_THREAT_DISPLAY, + ACT_FEAR_DISPLAY, + ACT_EXCITED, + ACT_SPECIAL_ATTACK1, + ACT_SPECIAL_ATTACK2, + ACT_COMBAT_IDLE, + ACT_WALK_SCARED, + ACT_RUN_SCARED, + ACT_VICTORY_DANCE, + ACT_DIE_HEADSHOT, + ACT_DIE_CHESTSHOT, + ACT_DIE_GUTSHOT, + ACT_DIE_BACKSHOT, + ACT_FLINCH_HEAD, + ACT_FLINCH_CHEST, + ACT_FLINCH_STOMACH, + ACT_FLINCH_LEFTARM, + ACT_FLINCH_RIGHTARM, + ACT_FLINCH_LEFTLEG, + ACT_FLINCH_RIGHTLEG, + ACT_FLINCH, + ACT_LARGE_FLINCH, + ACT_HOLDBOMB, + ACT_IDLE_FIDGET, + ACT_IDLE_SCARED, + ACT_IDLE_SCARED_FIDGET, + ACT_FOLLOW_IDLE, + ACT_FOLLOW_IDLE_FIDGET, + ACT_FOLLOW_IDLE_SCARED, + ACT_FOLLOW_IDLE_SCARED_FIDGET, + ACT_CROUCH_IDLE, + ACT_CROUCH_IDLE_FIDGET, + ACT_CROUCH_IDLE_SCARED, + ACT_CROUCH_IDLE_SCARED_FIDGET, + ACT_CROUCH_WALK, + ACT_CROUCH_WALK_SCARED, + ACT_CROUCH_DIE, + ACT_WALK_BACK, + ACT_IDLE_SNEAKY, + ACT_IDLE_SNEAKY_FIDGET, + ACT_WALK_SNEAKY, + ACT_WAVE, + ACT_YES, + ACT_NO, + +} Activity; + +typedef struct +{ + int type; + char *name; + +} activity_map_t; + +extern activity_map_t activity_map[]; diff --git a/cssdk/dlls/activitymap.h b/cssdk/dlls/activitymap.h new file mode 100644 index 0000000..cf5ddfc --- /dev/null +++ b/cssdk/dlls/activitymap.h @@ -0,0 +1,111 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#define _A(a)\ + { a, #a } + +activity_map_t activity_map[] = +{ + _A(ACT_IDLE), + _A(ACT_GUARD), + _A(ACT_WALK), + _A(ACT_RUN), + _A(ACT_FLY), + _A(ACT_SWIM), + _A(ACT_HOP), + _A(ACT_LEAP), + _A(ACT_FALL), + _A(ACT_LAND), + _A(ACT_STRAFE_LEFT), + _A(ACT_STRAFE_RIGHT), + _A(ACT_ROLL_LEFT), + _A(ACT_ROLL_RIGHT), + _A(ACT_TURN_LEFT), + _A(ACT_TURN_RIGHT), + _A(ACT_CROUCH), + _A(ACT_CROUCHIDLE), + _A(ACT_STAND), + _A(ACT_USE), + _A(ACT_SIGNAL1), + _A(ACT_SIGNAL2), + _A(ACT_SIGNAL3), + _A(ACT_TWITCH), + _A(ACT_COWER), + _A(ACT_SMALL_FLINCH), + _A(ACT_BIG_FLINCH), + _A(ACT_RANGE_ATTACK1), + _A(ACT_RANGE_ATTACK2), + _A(ACT_MELEE_ATTACK1), + _A(ACT_MELEE_ATTACK2), + _A(ACT_RELOAD), + _A(ACT_ARM), + _A(ACT_DISARM), + _A(ACT_EAT), + _A(ACT_DIESIMPLE), + _A(ACT_DIEBACKWARD), + _A(ACT_DIEFORWARD), + _A(ACT_DIEVIOLENT), + _A(ACT_BARNACLE_HIT), + _A(ACT_BARNACLE_PULL), + _A(ACT_BARNACLE_CHOMP), + _A(ACT_BARNACLE_CHEW), + _A(ACT_SLEEP), + _A(ACT_INSPECT_FLOOR), + _A(ACT_INSPECT_WALL), + _A(ACT_IDLE_ANGRY), + _A(ACT_WALK_HURT), + _A(ACT_RUN_HURT), + _A(ACT_HOVER), + _A(ACT_GLIDE), + _A(ACT_FLY_LEFT), + _A(ACT_FLY_RIGHT), + _A(ACT_DETECT_SCENT), + _A(ACT_SNIFF), + _A(ACT_BITE), + _A(ACT_THREAT_DISPLAY), + _A(ACT_FEAR_DISPLAY), + _A(ACT_EXCITED), + _A(ACT_SPECIAL_ATTACK1), + _A(ACT_SPECIAL_ATTACK2), + _A(ACT_COMBAT_IDLE), + _A(ACT_WALK_SCARED), + _A(ACT_RUN_SCARED), + _A(ACT_VICTORY_DANCE), + _A(ACT_DIE_HEADSHOT), + _A(ACT_DIE_CHESTSHOT), + _A(ACT_DIE_GUTSHOT), + _A(ACT_DIE_BACKSHOT), + _A(ACT_FLINCH_HEAD), + _A(ACT_FLINCH_CHEST), + _A(ACT_FLINCH_STOMACH), + _A(ACT_FLINCH_LEFTARM), + _A(ACT_FLINCH_RIGHTARM), + _A(ACT_FLINCH_LEFTLEG), + _A(ACT_FLINCH_RIGHTLEG), + 0, NULL +}; diff --git a/cssdk/dlls/airtank.h b/cssdk/dlls/airtank.h new file mode 100644 index 0000000..3f435a8 --- /dev/null +++ b/cssdk/dlls/airtank.h @@ -0,0 +1,42 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CAirtank: public CGrenade { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual int BloodColor() = 0; + + int GetState() const { return m_state; } +private: + int m_state; +}; diff --git a/cssdk/dlls/ammo.h b/cssdk/dlls/ammo.h new file mode 100644 index 0000000..4b22b9e --- /dev/null +++ b/cssdk/dlls/ammo.h @@ -0,0 +1,98 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class C9MMAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class CBuckShotAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C556NatoAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C556NatoBoxAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C762NatoAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C45ACPAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C50AEAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C338MagnumAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C57MMAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; + +class C357SIGAmmo: public CBasePlayerAmmo { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; +}; diff --git a/cssdk/dlls/basemonster.h b/cssdk/dlls/basemonster.h new file mode 100644 index 0000000..05cb5e3 --- /dev/null +++ b/cssdk/dlls/basemonster.h @@ -0,0 +1,105 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "activity.h" + +class EHANDLE; + +enum MONSTERSTATE +{ + MONSTERSTATE_NONE = 0, + MONSTERSTATE_IDLE, + MONSTERSTATE_COMBAT, + MONSTERSTATE_ALERT, + MONSTERSTATE_HUNT, + MONSTERSTATE_PRONE, + MONSTERSTATE_SCRIPT, + MONSTERSTATE_PLAYDEAD, + MONSTERSTATE_DEAD +}; + +class CBaseToggle; +class CBaseMonster: public CBaseToggle { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual BOOL TakeHealth(float flHealth, int bitsDamageType) = 0; + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual int BloodColor() = 0; + virtual BOOL IsAlive() = 0; + virtual float ChangeYaw(int speed) = 0; + virtual BOOL HasHumanGibs() = 0; + virtual BOOL HasAlienGibs() = 0; + virtual void FadeMonster() = 0; + virtual void GibMonster() = 0; + virtual Activity GetDeathActivity() = 0; + virtual void BecomeDead() = 0; + virtual BOOL ShouldFadeOnDeath() = 0; + virtual int IRelationship(CBaseEntity *pTarget) = 0; + virtual void PainSound() = 0; + virtual void ResetMaxSpeed() = 0; + virtual void ReportAIState() = 0; + virtual void MonsterInitDead() = 0; + virtual void Look(int iDistance) = 0; + virtual CBaseEntity *BestVisibleEnemy() = 0; + virtual BOOL FInViewCone(CBaseEntity *pEntity) = 0; + virtual BOOL FInViewCone(const Vector *pOrigin) = 0; +public: + void SetConditions(int iConditions) { m_afConditions |= iConditions; } + void ClearConditions(int iConditions) { m_afConditions &= ~iConditions; } + BOOL HasConditions(int iConditions) { return (m_afConditions & iConditions) ? TRUE : FALSE; } + BOOL HasAllConditions(int iConditions) { return ((m_afConditions & iConditions) == iConditions) ? TRUE : FALSE; } + + void Remember(int iMemory) { m_afMemory |= iMemory; } + void Forget(int iMemory) { m_afMemory &= ~iMemory; } + BOOL HasMemory(int iMemory) { return (m_afMemory & iMemory) ? TRUE : FALSE; } + BOOL HasAllMemories(int iMemory) { return ((m_afMemory & iMemory) == iMemory) ? TRUE : FALSE; } + + void StopAnimation() { pev->framerate = 0.0f; } +public: + Activity m_Activity; // what the monster is doing (animation) + Activity m_IdealActivity; // monster should switch to this activity + int m_LastHitGroup; // the last body region that took damage + int m_bitsDamageType; // what types of damage has monster (player) taken + byte m_rgbTimeBasedDamage[8]; + + MONSTERSTATE m_MonsterState; // monster's current state + MONSTERSTATE m_IdealMonsterState; // monster should change to this state + int m_afConditions; + int m_afMemory; + + float m_flNextAttack; // cannot attack again until this time + EHANDLE m_hEnemy; // the entity that the monster is fighting. + EHANDLE m_hTargetEnt; // the entity that the monster is trying to reach + float m_flFieldOfView; // width of monster's field of view ( dot product ) + int m_bloodColor; // color of blood particless + Vector m_HackedGunPos; // HACK until we can query end of gun + Vector m_vecEnemyLKP; // last known position of enemy. (enemy's origin) +}; diff --git a/cssdk/dlls/bmodels.h b/cssdk/dlls/bmodels.h new file mode 100644 index 0000000..741ebc6 --- /dev/null +++ b/cssdk/dlls/bmodels.h @@ -0,0 +1,131 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_PENDULUM_SWING 2 // spawnflag that makes a pendulum a rope swing. + +#define SF_BRUSH_ACCDCC 16 // brush should accelerate and decelerate when toggled +#define SF_BRUSH_HURT 32 // rotating brush that inflicts pain based on rotation speed +#define SF_ROTATING_NOT_SOLID 64 // some special rotating objects are not solid. + +#define SF_WALL_START_OFF 0x0001 + +#define SF_CONVEYOR_VISUAL 0x0001 +#define SF_CONVEYOR_NOTSOLID 0x0002 + +#define SF_WORLD_DARK 0x0001 // Fade from black at startup +#define SF_WORLD_TITLE 0x0002 // Display game title at startup +#define SF_WORLD_FORCETEAM 0x0004 // Force teams + +#define FANPITCHMIN 30 +#define FANPITCHMAX 100 + +// This is just a solid wall if not inhibited +class CFuncWall: public CBaseEntity { +public: + virtual void Spawn() = 0; + + // Bmodels don't go across transitions + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CFuncWallToggle: public CFuncWall { +public: + virtual void Spawn() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CFuncConveyor: public CFuncWall { +public: + virtual void Spawn() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +// A simple entity that looks solid but lets you walk through it. +class CFuncIllusionary: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int ObjectCaps() = 0; +}; + +// Monster only clip brush +// +// This brush will be solid for any entity who has the FL_MONSTERCLIP flag set +// in pev->flags +// +// otherwise it will be invisible and not solid. This can be used to keep +// specific monsters out of certain areas +class CFuncMonsterClip: public CFuncWall { +public: + virtual void Spawn() = 0; + + // Clear out func_wall's use function + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CFuncRotating: public CBaseEntity { +public: + // basic functions + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + + float m_flFanFriction; + float m_flAttenuation; + float m_flVolume; + float m_pitch; + int m_sounds; +}; + +class CPendulum: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + float m_accel; // Acceleration + float m_distance; + float m_time; + float m_damp; + float m_maxSpeed; + float m_dampSpeed; + + Vector m_center; + Vector m_start; +}; diff --git a/cssdk/dlls/bot/cs_bot.h b/cssdk/dlls/bot/cs_bot.h new file mode 100644 index 0000000..f9f30aa --- /dev/null +++ b/cssdk/dlls/bot/cs_bot.h @@ -0,0 +1,641 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "bot/cs_gamestate.h" +#include "bot/cs_bot_manager.h" +#include "bot/cs_bot_chatter.h" + +#define PRIMARY_WEAPON_BUY_COUNT 13 +#define SECONDARY_WEAPON_BUY_COUNT 3 + +#define FLAG_PROGRESS_DRAW 0x0 // draw status bar progress +#define FLAG_PROGRESS_START 0x1 // init status bar progress +#define FLAG_PROGRESS_HIDE 0x2 // hide status bar progress + +#define HI_X 0x01 +#define LO_X 0x02 +#define HI_Y 0x04 +#define LO_Y 0x08 +#define HI_Z 0x10 +#define LO_Z 0x20 + +extern int _navAreaCount; +extern int _currentIndex; + +extern struct BuyInfo primaryWeaponBuyInfoCT[PRIMARY_WEAPON_BUY_COUNT]; +extern struct BuyInfo secondaryWeaponBuyInfoCT[SECONDARY_WEAPON_BUY_COUNT]; + +extern struct BuyInfo primaryWeaponBuyInfoT[PRIMARY_WEAPON_BUY_COUNT]; +extern struct BuyInfo secondaryWeaponBuyInfoT[SECONDARY_WEAPON_BUY_COUNT]; + +class CCSBot; +class BotChatterInterface; + +class BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const = 0; +}; + +class IdleState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual const char *GetName() const { return "Idle"; } +}; + +class HuntState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "Hunt"; } +public: + CNavArea *m_huntArea; +}; + +class AttackState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "Attack"; } +public: + enum DodgeStateType + { + STEADY_ON, + SLIDE_LEFT, + SLIDE_RIGHT, + JUMP, + NUM_ATTACK_STATES + } m_dodgeState; + + float m_nextDodgeStateTimestamp; + CountdownTimer m_repathTimer; + float m_scopeTimestamp; + bool m_haveSeenEnemy; + bool m_isEnemyHidden; + float m_reacquireTimestamp; + float m_shieldToggleTimestamp; + bool m_shieldForceOpen; + float m_pinnedDownTimestamp; + bool m_crouchAndHold; + bool m_didAmbushCheck; + bool m_dodge; + bool m_firstDodge; + bool m_isCoward; + CountdownTimer m_retreatTimer; +}; + +class InvestigateNoiseState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "InvestigateNoise"; } +private: + void AttendCurrentNoise(CCSBot *me); + Vector m_checkNoisePosition; +}; + +class BuyState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "Buy"; } +public: + bool m_isInitialDelay; + int m_prefRetries; + int m_prefIndex; + int m_retries; + bool m_doneBuying; + bool m_buyDefuseKit; + bool m_buyGrenade; + bool m_buyShield; + bool m_buyPistol; +}; + +class MoveToState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "MoveTo"; } + + void SetGoalPosition(const Vector &pos) { m_goalPosition = pos; } + void SetRouteType(RouteType route) { m_routeType = route; } + +private: + Vector m_goalPosition; + RouteType m_routeType; + bool m_radioedPlan; + bool m_askedForCover; +}; + +class FetchBombState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual const char *GetName() const { return "FetchBomb"; } +}; + +class PlantBombState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "PlantBomb"; } +}; + +class DefuseBombState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "DefuseBomb"; } +}; + +class HideState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "Hide"; } + +public: + void SetHidingSpot(const Vector &pos) { m_hidingSpot = pos; } + const Vector &GetHidingSpot() const { return m_hidingSpot; } + + void SetSearchArea(CNavArea *area) { m_searchFromArea = area; } + void SetSearchRange(float range) { m_range = range; } + + void SetDuration(float time) { m_duration = time; } + void SetHoldPosition(bool hold) { m_isHoldingPosition = hold; } + + bool IsAtSpot() const { return m_isAtSpot; } + +public: + CNavArea *m_searchFromArea; + float m_range; + + Vector m_hidingSpot; + bool m_isAtSpot; + float m_duration; + bool m_isHoldingPosition; + float m_holdPositionTime; + bool m_heardEnemy; + + float m_firstHeardEnemyTime; + int m_retry; + Vector m_leaderAnchorPos; +}; + +class EscapeFromBombState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "EscapeFromBomb"; } +}; + +class FollowState: public BotState +{ +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "Follow"; } + + void SetLeader(CBaseEntity *leader) { m_leader = leader; } + +public: + EHANDLE m_leader; + Vector m_lastLeaderPos; + bool m_isStopped; + float m_stoppedTimestamp; + + enum LeaderMotionStateType + { + INVALID, + STOPPED, + WALKING, + RUNNING + + } m_leaderMotionState; + + IntervalTimer m_leaderMotionStateTime; + + bool m_isSneaking; + float m_lastSawLeaderTime; + CountdownTimer m_repathInterval; + + IntervalTimer m_walkTime; + bool m_isAtWalkSpeed; + + float m_waitTime; + CountdownTimer m_idleTimer; +}; + +class UseEntityState: public BotState { +public: + virtual void OnEnter(CCSBot *me) {} + virtual void OnUpdate(CCSBot *me) {} + virtual void OnExit(CCSBot *me) {} + virtual const char *GetName() const { return "UseEntity"; } + + void SetEntity(CBaseEntity *entity) { m_entity = entity; } + +private: + EHANDLE m_entity; +}; + +// The Counter-strike Bot +class CCSBot: public CBot { +public: + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; // invoked when injured by something (EXTEND) - returns the amount of damage inflicted + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; // invoked when killed (EXTEND) + virtual void RoundRespawn() = 0; + virtual void Blind(float duration, float holdTime, float fadeTime, int alpha = 255) = 0; // player blinded by a flashbang + virtual void OnTouchingWeapon(CWeaponBox *box) = 0; // invoked when in contact with a CWeaponBox + + virtual bool Initialize(const BotProfile *profile) = 0; // (EXTEND) prepare bot for action + virtual void SpawnBot() = 0; // (EXTEND) spawn the bot into the game + + virtual void Upkeep() = 0; // lightweight maintenance, invoked frequently + virtual void Update() = 0; // heavyweight algorithms, invoked less often + + virtual void Walk() = 0; + virtual bool Jump(bool mustJump = false) = 0; // returns true if jump was started + + virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL) = 0; // invoked when event occurs in the game (some events have NULL entity) + + #define CHECK_FOV true + virtual bool IsVisible(const Vector *pos, bool testFOV = false) const = 0; // return true if we can see the point + virtual bool IsVisible(CBasePlayer *player, bool testFOV = false, unsigned char *visParts = NULL) const = 0; // return true if we can see any part of the player + + virtual bool IsEnemyPartVisible(VisiblePartType part) const = 0; // if enemy is visible, return the part we see for our current enemy + +public: + const Vector &GetEyePosition() const + { + m_eyePos = pev->origin + pev->view_ofs; + return m_eyePos; + } +public: + friend class CCSBotManager; + + // TODO: Get rid of these + friend class AttackState; + friend class BuyState; + + char m_name[64]; // copied from STRING(pev->netname) for debugging + + // behavior properties + float m_combatRange; // desired distance between us and them during gunplay + mutable bool m_isRogue; // if true, the bot is a "rogue" and listens to no-one + mutable CountdownTimer m_rogueTimer; + + enum MoraleType + { + TERRIBLE = -3, + BAD = -2, + NEGATIVE = -1, + NEUTRAL = 0, + POSITIVE = 1, + GOOD = 2, + EXCELLENT = 3, + }; + + MoraleType m_morale; // our current morale, based on our win/loss history + bool m_diedLastRound; // true if we died last round + float m_safeTime; // duration at the beginning of the round where we feel "safe" + bool m_wasSafe; // true if we were in the safe time last update + NavRelativeDirType m_blindMoveDir; // which way to move when we're blind + bool m_blindFire; // if true, fire weapon while blinded + + // TODO: implement through CountdownTimer + float m_surpriseDelay; // when we were surprised + float m_surpriseTimestamp; + + bool m_isFollowing; // true if we are following someone + EHANDLE m_leader; // the ID of who we are following + float m_followTimestamp; // when we started following + float m_allowAutoFollowTime; // time when we can auto follow + + CountdownTimer m_hurryTimer; // if valid, bot is in a hurry + + // instances of each possible behavior state, to avoid dynamic memory allocation during runtime + IdleState m_idleState; + HuntState m_huntState; + AttackState m_attackState; + InvestigateNoiseState m_investigateNoiseState; + BuyState m_buyState; + MoveToState m_moveToState; + FetchBombState m_fetchBombState; + PlantBombState m_plantBombState; + DefuseBombState m_defuseBombState; + HideState m_hideState; + EscapeFromBombState m_escapeFromBombState; + FollowState m_followState; + UseEntityState m_useEntityState; + + // TODO: Allow multiple simultaneous state machines (look around, etc) + BotState *m_state; // current behavior state + float m_stateTimestamp; // time state was entered + bool m_isAttacking; // if true, special Attack state is overriding the state machine + + // high-level tasks + enum TaskType + { + SEEK_AND_DESTROY, + PLANT_BOMB, + FIND_TICKING_BOMB, + DEFUSE_BOMB, + GUARD_TICKING_BOMB, + GUARD_BOMB_DEFUSER, + GUARD_LOOSE_BOMB, + GUARD_BOMB_ZONE, + ESCAPE_FROM_BOMB, + HOLD_POSITION, + FOLLOW, + VIP_ESCAPE, + GUARD_VIP_ESCAPE_ZONE, + COLLECT_HOSTAGES, + RESCUE_HOSTAGES, + GUARD_HOSTAGES, + GUARD_HOSTAGE_RESCUE_ZONE, + MOVE_TO_LAST_KNOWN_ENEMY_POSITION, + MOVE_TO_SNIPER_SPOT, + SNIPING, + + NUM_TASKS + }; + TaskType m_task; // our current task + EHANDLE m_taskEntity; // an entity used for our task + + // navigation + Vector m_goalPosition; + EHANDLE m_goalEntity; + + CNavArea *m_currentArea; // the nav area we are standing on + CNavArea *m_lastKnownArea; // the last area we were in + EHANDLE m_avoid; // higher priority player we need to make way for + float m_avoidTimestamp; + bool m_isJumpCrouching; + bool m_isJumpCrouched; + float m_jumpCrouchTimestamp; + + // path navigation data + enum { _MAX_PATH_LENGTH = 256 }; + struct ConnectInfo + { + CNavArea *area; // the area along the path + NavTraverseType how; // how to enter this area from the previous one + Vector pos; // our movement goal position at this point in the path + const CNavLadder *ladder; // if "how" refers to a ladder, this is it + } + m_path[_MAX_PATH_LENGTH]; + int m_pathLength; + int m_pathIndex; + float m_areaEnteredTimestamp; + + CountdownTimer m_repathTimer; // must have elapsed before bot can pathfind again + + mutable CountdownTimer m_avoidFriendTimer; // used to throttle how often we check for friends in our path + mutable bool m_isFriendInTheWay; // true if a friend is blocking our path + CountdownTimer m_politeTimer; // we'll wait for friend to move until this runs out + bool m_isWaitingBehindFriend; // true if we are waiting for a friend to move + + enum LadderNavState + { + APPROACH_ASCENDING_LADDER, // prepare to scale a ladder + APPROACH_DESCENDING_LADDER, // prepare to go down ladder + FACE_ASCENDING_LADDER, + FACE_DESCENDING_LADDER, + MOUNT_ASCENDING_LADDER, // move toward ladder until "on" it + MOUNT_DESCENDING_LADDER, // move toward ladder until "on" it + ASCEND_LADDER, // go up the ladder + DESCEND_LADDER, // go down the ladder + DISMOUNT_ASCENDING_LADDER, // get off of the ladder + DISMOUNT_DESCENDING_LADDER, // get off of the ladder + MOVE_TO_DESTINATION, // dismount ladder and move to destination area + } + m_pathLadderState; + bool m_pathLadderFaceIn; // if true, face towards ladder, otherwise face away + const CNavLadder *m_pathLadder; // the ladder we need to use to reach the next area + NavRelativeDirType m_pathLadderDismountDir; // which way to dismount + float m_pathLadderDismountTimestamp; // time when dismount started + float m_pathLadderEnd; // if ascending, z of top, if descending z of bottom + float m_pathLadderTimestamp; // time when we started using ladder - for timeout check + + CountdownTimer m_mustRunTimer; // if nonzero, bot cannot walk + + // game scenario mechanisms + CSGameState m_gameState; + + // hostages mechanism + byte m_hostageEscortCount; + float m_hostageEscortCountTimestamp; + bool m_isWaitingForHostage; + CountdownTimer m_inhibitWaitingForHostageTimer; + CountdownTimer m_waitForHostageTimer; + + // listening mechanism + Vector m_noisePosition; // position we last heard non-friendly noise + float m_noiseTimestamp; // when we heard it (can get zeroed) + CNavArea *m_noiseArea; // the nav area containing the noise + float m_noiseCheckTimestamp; + PriorityType m_noisePriority; // priority of currently heard noise + bool m_isNoiseTravelRangeChecked; + + // "looking around" mechanism + float m_lookAroundStateTimestamp; // time of next state change + float m_lookAheadAngle; // our desired forward look angle + float m_forwardAngle; // our current forward facing direction + float m_inhibitLookAroundTimestamp; // time when we can look around again + + enum LookAtSpotState + { + NOT_LOOKING_AT_SPOT, // not currently looking at a point in space + LOOK_TOWARDS_SPOT, // in the process of aiming at m_lookAtSpot + LOOK_AT_SPOT, // looking at m_lookAtSpot + NUM_LOOK_AT_SPOT_STATES + } + m_lookAtSpotState; + Vector m_lookAtSpot; // the spot we're currently looking at + PriorityType m_lookAtSpotPriority; + float m_lookAtSpotDuration; // how long we need to look at the spot + float m_lookAtSpotTimestamp; // when we actually began looking at the spot + float m_lookAtSpotAngleTolerance; // how exactly we must look at the spot + bool m_lookAtSpotClearIfClose; // if true, the look at spot is cleared if it gets close to us + const char *m_lookAtDesc; // for debugging + float m_peripheralTimestamp; + + enum { MAX_APPROACH_POINTS = 16 }; + Vector m_approachPoint[MAX_APPROACH_POINTS]; + unsigned char m_approachPointCount; + Vector m_approachPointViewPosition; // the position used when computing current approachPoint set + bool m_isWaitingToTossGrenade; // lining up throw + CountdownTimer m_tossGrenadeTimer; // timeout timer for grenade tossing + + SpotEncounter *m_spotEncounter; // the spots we will encounter as we move thru our current area + float m_spotCheckTimestamp; // when to check next encounter spot + + // TODO: Add timestamp for each possible client to hiding spots + enum { MAX_CHECKED_SPOTS = 64 }; + struct HidingSpotCheckInfo + { + HidingSpot *spot; + float timestamp; + } + m_checkedHidingSpot[MAX_CHECKED_SPOTS]; + int m_checkedHidingSpotCount; + + // view angle mechanism + float m_lookPitch; // our desired look pitch angle + float m_lookPitchVel; + float m_lookYaw; // our desired look yaw angle + float m_lookYawVel; + + // aim angle mechanism + mutable Vector m_eyePos; + Vector m_aimOffset; // current error added to victim's position to get actual aim spot + Vector m_aimOffsetGoal; // desired aim offset + float m_aimOffsetTimestamp; // time of next offset adjustment + float m_aimSpreadTimestamp; // time used to determine max spread as it begins to tighten up + Vector m_aimSpot; // the spot we are currently aiming to fire at + + // attack state data + // behavior modifiers + enum DispositionType + { + ENGAGE_AND_INVESTIGATE, // engage enemies on sight and investigate enemy noises + OPPORTUNITY_FIRE, // engage enemies on sight, but only look towards enemy noises, dont investigate + SELF_DEFENSE, // only engage if fired on, or very close to enemy + IGNORE_ENEMIES, // ignore all enemies - useful for ducking around corners, running away, etc + + NUM_DISPOSITIONS + }; + DispositionType m_disposition; // how we will react to enemies + CountdownTimer m_ignoreEnemiesTimer; // how long will we ignore enemies + mutable EHANDLE m_enemy; // our current enemy + bool m_isEnemyVisible; // result of last visibility test on enemy + unsigned char m_visibleEnemyParts; // which parts of the visible enemy do we see + Vector m_lastEnemyPosition; // last place we saw the enemy + float m_lastSawEnemyTimestamp; + float m_firstSawEnemyTimestamp; + float m_currentEnemyAcquireTimestamp; + float m_enemyDeathTimestamp; // if m_enemy is dead, this is when he died + bool m_isLastEnemyDead; // true if we killed or saw our last enemy die + int m_nearbyEnemyCount; // max number of enemies we've seen recently + unsigned int m_enemyPlace; // the location where we saw most of our enemies + + struct WatchInfo + { + float timestamp; + bool isEnemy; + } + m_watchInfo[MAX_CLIENTS]; + mutable EHANDLE m_bomber; // points to bomber if we can see him + + int m_nearbyFriendCount; // number of nearby teammates + mutable EHANDLE m_closestVisibleFriend; // the closest friend we can see + mutable EHANDLE m_closestVisibleHumanFriend; // the closest human friend we can see + + CBasePlayer *m_attacker; // last enemy that hurt us (may not be same as m_enemy) + float m_attackedTimestamp; // when we were hurt by the m_attacker + + int m_lastVictimID; // the entindex of the last victim we killed, or zero + bool m_isAimingAtEnemy; // if true, we are trying to aim at our enemy + bool m_isRapidFiring; // if true, RunUpkeep() will toggle our primary attack as fast as it can + IntervalTimer m_equipTimer; // how long have we had our current weapon equipped + float m_fireWeaponTimestamp; + + // reaction time system + enum { MAX_ENEMY_QUEUE = 20 }; + struct ReactionState + { + // NOTE: player position & orientation is not currently stored separately + EHANDLE player; + bool isReloading; + bool isProtectedByShield; + } + m_enemyQueue[MAX_ENEMY_QUEUE]; // round-robin queue for simulating reaction times + + byte m_enemyQueueIndex; + byte m_enemyQueueCount; + byte m_enemyQueueAttendIndex; // index of the timeframe we are "conscious" of + + // stuck detection + bool m_isStuck; + float m_stuckTimestamp; // time when we got stuck + Vector m_stuckSpot; // the location where we became stuck + NavRelativeDirType m_wiggleDirection; + float m_wiggleTimestamp; + float m_stuckJumpTimestamp; // time for next jump when stuck + + enum { MAX_VEL_SAMPLES = 5 }; + float m_avgVel[MAX_VEL_SAMPLES]; + int m_avgVelIndex; + int m_avgVelCount; + Vector m_lastOrigin; + + // chatter mechanism + GameEventType m_lastRadioCommand; // last radio command we recieved + + float m_lastRadioRecievedTimestamp; // time we recieved a radio message + float m_lastRadioSentTimestamp; // time when we send a radio message + EHANDLE m_radioSubject; // who issued the radio message + Vector m_radioPosition; // position referred to in radio message + float m_voiceFeedbackStartTimestamp; + float m_voiceFeedbackEndTimestamp; // new-style "voice" chatter gets voice feedback + BotChatterInterface m_chatter; + + // learn map mechanism + const CNavNode *m_navNodeList; + CNavNode *m_currentNode; + NavDirType m_generationDir; + NavAreaList::iterator m_analyzeIter; + + enum ProcessType + { + PROCESS_NORMAL, + PROCESS_LEARN, + PROCESS_ANALYZE_ALPHA, + PROCESS_ANALYZE_BETA, + PROCESS_SAVE, + } + m_processMode; + CountdownTimer m_mumbleTimer; + CountdownTimer m_booTimer; + CountdownTimer m_relocateTimer; +}; diff --git a/cssdk/dlls/bot/cs_bot_chatter.h b/cssdk/dlls/bot/cs_bot_chatter.h new file mode 100644 index 0000000..4f56b96 --- /dev/null +++ b/cssdk/dlls/bot/cs_bot_chatter.h @@ -0,0 +1,337 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define UNDEFINED_COUNT 0xFFFF +#define MAX_PLACES_PER_MAP 64 +#define UNDEFINED_SUBJECT (-1) +#define COUNT_MANY 4 // equal to or greater than this is "many" + +class CCSBot; +class BotChatterInterface; + +typedef unsigned int PlaceCriteria; +typedef unsigned int CountCriteria; + +// A meme is a unit information that bots use to +// transmit information to each other via the radio +class BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const = 0; // cause the given bot to act on this meme +}; + +class BotAllHostagesGoneMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +}; + +class BotHostageBeingTakenMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +}; + +class BotHelpMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +public: + Place m_place; +}; + +class BotBombsiteStatusMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +public: + enum StatusType { CLEAR, PLANTED }; + int m_zoneIndex; // the bombsite + StatusType m_status; // whether it is cleared or the bomb is there (planted) +}; + +class BotBombStatusMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme + +public: + CSGameState::BombState m_state; + Vector m_pos; +}; + +class BotFollowMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +}; + +class BotDefendHereMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +public: + Vector m_pos; +}; + +class BotWhereBombMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +}; + +class BotRequestReportMeme: public BotMeme { +public: + virtual void Interpret(CCSBot *sender, CCSBot *receiver) const; // cause the given bot to act on this meme +}; + +enum BotStatementType +{ + REPORT_VISIBLE_ENEMIES, + REPORT_ENEMY_ACTION, + REPORT_MY_CURRENT_TASK, + REPORT_MY_INTENTION, + REPORT_CRITICAL_EVENT, + REPORT_REQUEST_HELP, + REPORT_REQUEST_INFORMATION, + REPORT_ROUND_END, + REPORT_MY_PLAN, + REPORT_INFORMATION, + REPORT_EMOTE, + REPORT_ACKNOWLEDGE, // affirmative or negative + REPORT_ENEMIES_REMAINING, + REPORT_FRIENDLY_FIRE, + REPORT_KILLED_FRIEND, + //REPORT_ENEMY_LOST + + NUM_BOT_STATEMENT_TYPES, +}; + +// BotSpeakables are the smallest unit of bot chatter. +// They represent a specific wav file of a phrase, and the criteria for which it is useful +class BotSpeakable { +public: + char *m_phrase; + float m_duration; + PlaceCriteria m_place; + CountCriteria m_count; +}; + +typedef std::vector BotSpeakableVector; +typedef std::vector BotVoiceBankVector; + +// The BotPhrase class is a collection of Speakables associated with a name, ID, and criteria +class BotPhrase { +public: + const char *GetName() const { return m_name; } + Place GetID() const { return m_id; } + GameEventType GetRadioEquivalent() const { return m_radioEvent; } + bool IsImportant() const { return m_isImportant; } // return true if this phrase is part of an important statement + bool IsPlace() const { return m_isPlace; } +public: + friend class BotPhraseManager; + char *m_name; + Place m_id; + bool m_isPlace; // true if this is a Place phrase + GameEventType m_radioEvent; + bool m_isImportant; // mission-critical statement + + mutable BotVoiceBankVector m_voiceBank; // array of voice banks (arrays of speakables) + std::vector m_count; // number of speakables + mutable std::vector< int > m_index; // index of next speakable to return + int m_numVoiceBanks; // number of voice banks that have been initialized + + mutable PlaceCriteria m_placeCriteria; + mutable CountCriteria m_countCriteria; +}; + +typedef std::list BotPhraseList; + +// The BotPhraseManager is a singleton that provides an interface to all BotPhrase collections +class BotPhraseManager { +public: + const BotPhraseList *GetPlaceList() const { return &m_placeList; } + + // return time last statement of given type was emitted by a teammate for the given place + float GetPlaceStatementInterval(Place place) const; + + // set time of last statement of given type was emitted by a teammate for the given place + void ResetPlaceStatementInterval(Place place) const; + +public: + int FindPlaceIndex(Place where) const; + + // master list of all phrase collections + BotPhraseList m_list; + + // master list of all Place phrases + BotPhraseList m_placeList; + + struct PlaceTimeInfo + { + Place placeID; + IntervalTimer timer; + }; + + mutable PlaceTimeInfo m_placeStatementHistory[MAX_PLACES_PER_MAP]; + mutable int m_placeCount; +}; + +inline int BotPhraseManager::FindPlaceIndex(Place where) const +{ + for (int i = 0; i < m_placeCount; ++i) + { + if (m_placeStatementHistory[i].placeID == where) + return i; + } + + if (m_placeCount < MAX_PLACES_PER_MAP) + { + m_placeStatementHistory[++m_placeCount].placeID = where; + m_placeStatementHistory[++m_placeCount].timer.Invalidate(); + return m_placeCount - 1; + } + + return -1; +} + +inline float BotPhraseManager::GetPlaceStatementInterval(Place place) const +{ + int index = FindPlaceIndex(place); + + if (index < 0) + return 999999.9f; + + if (index >= m_placeCount) + return 999999.9f; + + return m_placeStatementHistory[index].timer.GetElapsedTime(); +} + +inline void BotPhraseManager::ResetPlaceStatementInterval(Place place) const +{ + int index = FindPlaceIndex(place); + + if (index < 0) + return; + + if (index >= m_placeCount) + return; + + m_placeStatementHistory[index].timer.Reset(); +} + +// Statements are meaningful collections of phrases +class BotStatement { +public: + BotChatterInterface *GetChatter() const { return m_chatter; } + BotStatementType GetType() const { return m_type; } // return the type of statement this is + bool HasSubject() const { return (m_subject != UNDEFINED_SUBJECT); } + void SetSubject(int playerID) { m_subject = playerID; } // who this statement is about + int GetSubject() const { return m_subject; } // who this statement is about + void SetPlace(Place where) { m_place = where; } // explicitly set place + + void SetStartTime(float timestamp) { m_startTime = timestamp; } // define the earliest time this statement can be spoken + float GetStartTime() const { return m_startTime; } + bool IsSpeaking() const { return m_isSpeaking; } // return true if this statement is currently being spoken + float GetTimestamp() const { return m_timestamp; } // get time statement was created (but not necessarily started talking) + +public: + friend class BotChatterInterface; + + BotChatterInterface *m_chatter; // the chatter system this statement is part of + BotStatement *m_next, *m_prev; // linked list hooks + + BotStatementType m_type; // what kind of statement this is + int m_subject; // who this subject is about + Place m_place; // explicit place - note some phrases have implicit places as well + BotMeme *m_meme; // a statement can only have a single meme for now + + float m_timestamp; // time when message was created + float m_startTime; // the earliest time this statement can be spoken + float m_expireTime; // time when this statement is no longer valid + float m_speakTimestamp; // time when message began being spoken + bool m_isSpeaking; // true if this statement is current being spoken + + float m_nextTime; // time for next phrase to begin + + enum { MAX_BOT_PHRASES = 4 }; + enum ContextType + { + CURRENT_ENEMY_COUNT, + REMAINING_ENEMY_COUNT, + SHORT_DELAY, + LONG_DELAY, + ACCUMULATE_ENEMIES_DELAY, + }; + struct + { + bool isPhrase; + union + { + const BotPhrase *phrase; + ContextType context; + }; + + } + m_statement[MAX_BOT_PHRASES]; + + enum { MAX_BOT_CONDITIONS = 4 }; + enum ConditionType + { + IS_IN_COMBAT, + RADIO_SILENCE, + ENEMIES_REMAINING, + NUM_CONDITIONS, + }; + + ConditionType m_condition[MAX_BOT_CONDITIONS]; // conditions that must be true for the statement to be said + int m_conditionCount; + + int m_index; // m_index refers to the phrase currently being spoken, or -1 if we havent started yet + int m_count; +}; + +// This class defines the interface to the bot radio chatter system +class BotChatterInterface { +public: + CCSBot *GetOwner() const { return m_me; } + int GetPitch() const { return m_pitch; } + bool SeesAtLeastOneEnemy() const { return m_seeAtLeastOneEnemy; } +public: + BotStatement *m_statementList; // list of all active/pending messages for this bot + void ReportEnemies(); // track nearby enemy count and generate enemy activity statements + bool ShouldSpeak() const; // return true if we speaking makes sense now + CCSBot *m_me; // the bot this chatter is for + bool m_seeAtLeastOneEnemy; + float m_timeWhenSawFirstEnemy; + bool m_reportedEnemies; + bool m_requestedBombLocation; // true if we already asked where the bomb has been planted + int m_pitch; + IntervalTimer m_needBackupInterval; + IntervalTimer m_spottedBomberInterval; + IntervalTimer m_scaredInterval; + IntervalTimer m_planInterval; + CountdownTimer m_spottedLooseBombTimer; + CountdownTimer m_heardNoiseTimer; + CountdownTimer m_escortingHostageTimer; +}; + +extern BotPhraseManager *TheBotPhrases; diff --git a/cssdk/dlls/bot/cs_bot_manager.h b/cssdk/dlls/bot/cs_bot_manager.h new file mode 100644 index 0000000..38f3d60 --- /dev/null +++ b/cssdk/dlls/bot/cs_bot_manager.h @@ -0,0 +1,145 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +extern CBotManager *TheBots; + +// The manager for Counter-Strike specific bots +class CCSBotManager: public CBotManager { +public: + virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0; + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; + + virtual void ServerActivate() = 0; + virtual void ServerDeactivate() = 0; + + virtual void ServerCommand(const char *pcmd) = 0; + virtual void AddServerCommand(const char *cmd) = 0; + virtual void AddServerCommands() = 0; + + virtual void RestartRound() = 0; // (EXTEND) invoked when a new round begins + virtual void StartFrame() = 0; // (EXTEND) called each frame + + virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL) = 0; + virtual unsigned int GetPlayerPriority(CBasePlayer *player) const = 0; // return priority of player (0 = max pri) + virtual bool IsImportantPlayer(CBasePlayer *player) const = 0; // return true if player is important to scenario (VIP, bomb carrier, etc) + +public: + // the supported game scenarios + enum GameScenarioType + { + SCENARIO_DEATHMATCH, + SCENARIO_DEFUSE_BOMB, + SCENARIO_RESCUE_HOSTAGES, + SCENARIO_ESCORT_VIP + }; + GameScenarioType GetScenario() const { return m_gameScenario; } + + // "zones" + // depending on the game mode, these are bomb zones, rescue zones, etc. + enum { MAX_ZONES = 4 }; // max # of zones in a map + enum { MAX_ZONE_NAV_AREAS = 16 }; // max # of nav areas in a zone + struct Zone + { + CBaseEntity *m_entity; // the map entity + CNavArea *m_area[MAX_ZONE_NAV_AREAS]; // nav areas that overlap this zone + int m_areaCount; + Vector m_center; + bool m_isLegacy; // if true, use pev->origin and 256 unit radius as zone + int m_index; + Extent m_extent; + }; + + const Zone *GetZone(int i) const { return &m_zone[i]; } + int GetZoneCount() const { return m_zoneCount; } + + // pick a zone at random and return it + const Zone *GetRandomZone() const + { + if (!m_zoneCount) + return NULL; + + return &m_zone[RANDOM_LONG(0, m_zoneCount - 1)]; + } + + bool IsBombPlanted() const { return m_isBombPlanted; } // returns true if bomb has been planted + float GetBombPlantTimestamp() const { return m_bombPlantTimestamp; } // return time bomb was planted + bool IsTimeToPlantBomb() const { return (gpGlobals->time >= m_earliestBombPlantTimestamp); } // return true if it's ok to try to plant bomb + CBasePlayer *GetBombDefuser() const { return m_bombDefuser; } // return the player currently defusing the bomb, or NULL + CBaseEntity *GetLooseBomb() { return m_looseBomb; } // return the bomb if it is loose on the ground + CNavArea *GetLooseBombArea() const { return m_looseBombArea; } // return area that bomb is in/near + + float GetLastSeenEnemyTimestamp() const { return m_lastSeenEnemyTimestamp; } // return the last time anyone has seen an enemy + void SetLastSeenEnemyTimestamp() { m_lastSeenEnemyTimestamp = gpGlobals->time; } + + float GetRoundStartTime() const { return m_roundStartTimestamp; } + float GetElapsedRoundTime() const { return gpGlobals->time - m_roundStartTimestamp; } // return the elapsed time since the current round began + + bool IsDefenseRushing() const { return m_isDefenseRushing; } // returns true if defense team has "decided" to rush this round + bool IsRoundOver() const { return m_isRoundOver; } // return true if the round has ended + + unsigned int GetNavPlace() const { return m_navPlace; } + void SetNavPlace(unsigned int place) { m_navPlace = place; } + +public: + GameScenarioType m_gameScenario; // what kind of game are we playing + + Zone m_zone[MAX_ZONES]; + int m_zoneCount; + + bool m_isBombPlanted; // true if bomb has been planted + float m_bombPlantTimestamp; // time bomb was planted + float m_earliestBombPlantTimestamp; // don't allow planting until after this time has elapsed + CBasePlayer *m_bombDefuser; // the player currently defusing a bomb + EHANDLE m_looseBomb; // will be non-NULL if bomb is loose on the ground + CNavArea *m_looseBombArea; // area that bomb is is/near + + bool m_isRoundOver; // true if the round has ended + float m_radioMsgTimestamp[24][2]; + + float m_lastSeenEnemyTimestamp; + float m_roundStartTimestamp; // the time when the current round began + + bool m_isDefenseRushing; // whether defensive team is rushing this round or not + + unsigned int m_navPlace; + CountdownTimer m_respawnTimer; + bool m_isRespawnStarted; + bool m_canRespawn; + bool m_bServerActive; +}; + +inline int OtherTeam(int team) +{ + return (team == TERRORIST) ? CT : TERRORIST; +} + +inline CCSBotManager *TheCSBots() +{ + return reinterpret_cast(TheBots); +} diff --git a/cssdk/dlls/bot/cs_gamestate.h b/cssdk/dlls/bot/cs_gamestate.h new file mode 100644 index 0000000..769575f --- /dev/null +++ b/cssdk/dlls/bot/cs_gamestate.h @@ -0,0 +1,90 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CCSBot; + +// This class represents the game state as known by a particular bot +class CSGameState { +public: + // bomb defuse scenario + enum BombState + { + MOVING, // being carried by a Terrorist + LOOSE, // loose on the ground somewhere + PLANTED, // planted and ticking + DEFUSED, // the bomb has been defused + EXPLODED, // the bomb has exploded + }; + + bool IsBombMoving() const { return (m_bombState == MOVING); } + bool IsBombLoose() const { return (m_bombState == LOOSE); } + bool IsBombPlanted() const { return (m_bombState == PLANTED); } + bool IsBombDefused() const { return (m_bombState == DEFUSED); } + bool IsBombExploded() const { return (m_bombState == EXPLODED); } + +public: + CCSBot *m_owner; // who owns this gamestate + bool m_isRoundOver; // true if round is over, but no yet reset + + // bomb defuse scenario + BombState GetBombState() { return m_bombState; } + BombState m_bombState; // what we think the bomb is doing + + IntervalTimer m_lastSawBomber; + Vector m_bomberPos; + + IntervalTimer m_lastSawLooseBomb; + Vector m_looseBombPos; + + bool m_isBombsiteClear[4]; // corresponds to zone indices in CCSBotManager + int m_bombsiteSearchOrder[4]; // randomized order of bombsites to search + int m_bombsiteCount; + int m_bombsiteSearchIndex; // the next step in the search + + int m_plantedBombsite; // zone index of the bombsite where the planted bomb is + + bool m_isPlantedBombPosKnown; // if true, we know the exact location of the bomb + Vector m_plantedBombPos; + + // hostage rescue scenario + struct HostageInfo + { + CHostage *hostage; + Vector knownPos; + bool isValid; + bool isAlive; + bool isFree; // not being escorted by a CT + } + m_hostage[MAX_HOSTAGES]; + int m_hostageCount; // number of hostages left in map + CountdownTimer m_validateInterval; + + bool m_allHostagesRescued; // if true, so every hostages been is rescued + bool m_haveSomeHostagesBeenTaken; // true if a hostage has been moved by a CT (and we've seen it) +}; diff --git a/cssdk/dlls/buttons.h b/cssdk/dlls/buttons.h new file mode 100644 index 0000000..087417a --- /dev/null +++ b/cssdk/dlls/buttons.h @@ -0,0 +1,104 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_BUTTON_DONTMOVE 1 +#define SF_ROTBUTTON_NOTSOLID 1 +#define SF_BUTTON_TOGGLE 32 // button stays pushed until reactivated +#define SF_BUTTON_SPARK_IF_OFF 64 // button sparks in OFF state +#define SF_BUTTON_TOUCH_ONLY 256 // button only fires as a result of USE key. + +#define SF_GLOBAL_SET 1 // Set global state to initial state on spawn + +#define SF_MULTI_INIT 1 + +// Make this button behave like a door (HACKHACK) +// This will disable use and make the button solid +// rotating buttons were made SOLID_NOT by default since their were some +// collision problems with them... +#define SF_MOMENTARY_DOOR 0x0001 + +#define SF_SPARK_TOOGLE 32 +#define SF_SPARK_IF_OFF 64 + +#define SF_BTARGET_USE 0x0001 +#define SF_BTARGET_ON 0x0002 + +class CEnvGlobal: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + string_t m_globalstate; + int m_triggermode; + int m_initialstate; +}; + +class CRotButton: public CBaseButton { +public: + virtual void Spawn() = 0; +}; + +class CMomentaryRotButton: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_lastUsed; + int m_direction; + float m_returnSpeed; + Vector m_start; + Vector m_end; + int m_sounds; +}; + +class CEnvSpark: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; +public: + float m_flDelay; +}; + +class CButtonTarget: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int ObjectCaps() = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; diff --git a/cssdk/dlls/cbase.h b/cssdk/dlls/cbase.h new file mode 100644 index 0000000..4817034 --- /dev/null +++ b/cssdk/dlls/cbase.h @@ -0,0 +1,375 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "util.h" +#include "monsterevent.h" + +class CSave; +class CRestore; +class CBasePlayer; +class CBaseEntity; +class CBaseMonster; +class CBasePlayerItem; +class CSquadMonster; +class CCSEntity; + +class CBaseEntity { +public: + // Constructor. Set engine to use C/C++ callback functions + // pointers to engine data + entvars_t *pev; // Don't need to save/restore this pointer, the engine resets it + + // path corners + CBaseEntity *m_pGoalEnt; // path corner we are heading towards + CBaseEntity *m_pLink; // used for temporary link-list operations. + + // initialization functions + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Activate() = 0; + + // Setup the object->object collision box (pev->mins / pev->maxs is the object->world collision box) + virtual void SetObjectCollisionBox() = 0; + + // Classify - returns the type of group (i.e, "houndeye", or "human military" so that monsters with different classnames + // still realize that they are teammates. (overridden for monsters that form groups) + virtual int Classify() = 0; + virtual void DeathNotice(entvars_t *pevChild) = 0; + + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual BOOL TakeHealth(float flHealth, int bitsDamageType) = 0; + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual int BloodColor() = 0; + virtual void TraceBleed(float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) = 0; + virtual BOOL IsTriggered(CBaseEntity *pActivator) = 0; + virtual CBaseMonster *MyMonsterPointer() = 0; + virtual CSquadMonster *MySquadMonsterPointer() = 0; + virtual int GetToggleState() = 0; + virtual void AddPoints(int score, BOOL bAllowNegativeScore) = 0; + virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore) = 0; + virtual BOOL AddPlayerItem(CBasePlayerItem *pItem) = 0; + virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem) = 0; + virtual int GiveAmmo(int iAmount, char *szName, int iMax) = 0; + virtual float GetDelay() = 0; + virtual int IsMoving() = 0; + virtual void OverrideReset() = 0; + virtual int DamageDecal(int bitsDamageType) = 0; + + // This is ONLY used by the node graph to test movement through a door + virtual void SetToggleState(int state) = 0; + virtual void StartSneaking() = 0; + virtual void StopSneaking() = 0; + virtual BOOL OnControls(entvars_t *onpev) = 0; + virtual BOOL IsSneaking() = 0; + virtual BOOL IsAlive() = 0; + virtual BOOL IsBSPModel() = 0; + virtual BOOL ReflectGauss() = 0; + virtual BOOL HasTarget(string_t targetname) = 0; + virtual BOOL IsInWorld() = 0; + virtual BOOL IsPlayer() = 0; + virtual BOOL IsNetClient() = 0; + virtual const char *TeamID() = 0; + + virtual CBaseEntity *GetNextTarget() = 0; + + // fundamental callbacks + void (CBaseEntity::*m_pfnThink)(); + void (CBaseEntity::*m_pfnTouch)(CBaseEntity *pOther); + void (CBaseEntity::*m_pfnUse)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value); + void (CBaseEntity::*m_pfnBlocked)(CBaseEntity *pOther); + + virtual void Think() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType = USE_OFF, float value = 0.0f) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; + + virtual CBaseEntity *Respawn() = 0; + virtual void UpdateOwner() = 0; + virtual BOOL FBecomeProne() = 0; + + virtual Vector Center() = 0; // center point of entity + virtual Vector EyePosition() = 0; // position of eyes + virtual Vector EarPosition() = 0; // position of ears + virtual Vector BodyTarget(const Vector &posSrc) = 0; // position to shoot at + + virtual int Illumination() = 0; + virtual BOOL FVisible(CBaseEntity *pEntity) = 0; + virtual BOOL FVisible(const Vector &vecOrigin) = 0; +public: + static CBaseEntity *Instance(edict_t *pent) { return (CBaseEntity *)GET_PRIVATE(pent ? pent : ENT(0)); } + static CBaseEntity *Instance(entvars_t *pev) { return Instance(ENT(pev)); } + static CBaseEntity *Instance(int offset) { return Instance(ENT(offset)); } + + edict_t *edict() { return ENT(pev); } + EOFFSET eoffset() { return OFFSET(pev); } + int entindex() { return ENTINDEX(edict()); } +public: + CCSEntity *m_pEntity; // NOTE: it was replaced on member "int *current_ammo" because it is useless. + + // We use this variables to store each ammo count. + float currentammo; + int maxammo_buckshot; + int ammo_buckshot; + int maxammo_9mm; + int ammo_9mm; + int maxammo_556nato; + int ammo_556nato; + int maxammo_556natobox; + int ammo_556natobox; + int maxammo_762nato; + int ammo_762nato; + int maxammo_45acp; + int ammo_45acp; + int maxammo_50ae; + int ammo_50ae; + int maxammo_338mag; + int ammo_338mag; + int maxammo_57mm; + int ammo_57mm; + int maxammo_357sig; + int ammo_357sig; + + // Special stuff for grenades and knife. + float m_flStartThrow; + float m_flReleaseThrow; + int m_iSwing; + + // client has left the game + bool has_disconnected; +}; + +class CPointEntity: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int ObjectCaps() = 0; +}; + + +// generic Delay entity +class CBaseDelay: public CBaseEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; +public: + float m_flDelay; + int m_iszKillTarget; +}; + +class CBaseAnimating: public CBaseDelay { +public: + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void HandleAnimEvent(MonsterEvent_t *pEvent) = 0; +public: + // animation needs + float m_flFrameRate; // computed FPS for current sequence + float m_flGroundSpeed; // computed linear movement rate for current sequence + float m_flLastEventCheck; // last time the event list was checked + BOOL m_fSequenceFinished; // flag set when StudioAdvanceFrame moves across a frame boundry + BOOL m_fSequenceLoops; // true if the sequence loops +}; + +// EHANDLE. Safe way to point to CBaseEntities who may die between frames +class EHANDLE { +public: + edict_t *Get(); + edict_t *Set(edict_t *pent); + + operator int(); + operator CBaseEntity*(); + operator CBasePlayer*(); + + CBaseEntity *operator=(CBaseEntity *pEntity); + CBaseEntity *operator->(); + +private: + edict_t *m_pent; + int m_serialnumber; +}; + +// generic Toggle entity. +class CBaseToggle: public CBaseAnimating { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int GetToggleState() = 0; + virtual float GetDelay() = 0; +public: + TOGGLE_STATE m_toggle_state; + float m_flActivateFinished; // like attack_finished, but for doors + float m_flMoveDistance; // how far a door should slide or rotate + float m_flWait; + float m_flLip; + float m_flTWidth; // for plats + float m_flTLength; // for plats + + Vector m_vecPosition1; + Vector m_vecPosition2; + Vector m_vecAngle1; + Vector m_vecAngle2; + + int m_cTriggersLeft; // trigger_counter only, # of activations remaining + float m_flHeight; + EHANDLE m_hActivator; + void (CBaseToggle::*m_pfnCallWhenMoveDone)(); + Vector m_vecFinalDest; + Vector m_vecFinalAngle; + + int m_bitsDamageInflict; // DMG_ damage type that the door or tigger does + + string_t m_sMaster; // If this button has a master switch, this is the targetname. + // A master switch must be of the multisource type. If all + // of the switches in the multisource have been triggered, then + // the button will be allowed to operate. Otherwise, it will be + // deactivated. +}; + +#include "basemonster.h" +#include "weapons.h" +#include "player.h" + +// Generic Button +class CBaseButton: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; // Buttons that don't take damage can be IMPULSE used +public: + BOOL m_fStayPushed; // button stays pushed in until touched again? + BOOL m_fRotating; // a rotating button? default is a sliding button. + + string_t m_strChangeTarget; // if this field is not null, this is an index into the engine string array. + // when this button is touched, it's target entity's TARGET field will be set + // to the button's ChangeTarget. This allows you to make a func_train switch paths, etc. + + locksound_t m_ls; // door lock sounds + + byte m_bLockedSound; // ordinals from entity selection + byte m_bLockedSentence; + byte m_bUnlockedSound; + byte m_bUnlockedSentence; + int m_sounds; +}; + +// MultiSouce + +#define MAX_MULTI_TARGETS 16 // maximum number of targets a single multi_manager entity may be assigned. +#define MS_MAX_TARGETS 32 + +class CMultiSource: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual BOOL IsTriggered(CBaseEntity *pActivator) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + EHANDLE m_rgEntities[MS_MAX_TARGETS]; + int m_rgTriggered[MS_MAX_TARGETS]; + + int m_iTotal; + string_t m_globalstate; +}; + +// This spawns first when each level begins. +class CWorld: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +}; + +// Inlines +inline edict_t *EHANDLE::Get() +{ + if (!m_pent || m_pent->serialnumber != m_serialnumber) + return NULL; + + return m_pent; +} + +inline edict_t *EHANDLE::Set(edict_t *pent) +{ + m_pent = pent; + if (pent) + m_serialnumber = pent->serialnumber; + + return pent; +} + +inline EHANDLE::operator int() +{ + return Get() != NULL; +} + +inline EHANDLE::operator CBaseEntity *() +{ + return (CBaseEntity *)GET_PRIVATE(Get()); +} + +inline EHANDLE::operator CBasePlayer *() +{ + return static_cast(GET_PRIVATE(Get())); +} + +inline CBaseEntity *EHANDLE::operator=(CBaseEntity *pEntity) +{ + if (pEntity != NULL) + { + m_pent = ENT(pEntity->pev); + if (m_pent) + m_serialnumber = m_pent->serialnumber; + } + else + { + m_pent = NULL; + m_serialnumber = 0; + } + + return pEntity; +} + +inline CBaseEntity *EHANDLE::operator->() +{ + return (CBaseEntity *)GET_PRIVATE(Get()); +} diff --git a/cssdk/dlls/cdll_dll.h b/cssdk/dlls/cdll_dll.h new file mode 100644 index 0000000..e69f6fc --- /dev/null +++ b/cssdk/dlls/cdll_dll.h @@ -0,0 +1,126 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define MAX_WEAPON_SLOTS 5 // hud item selection slots +#define MAX_ITEM_TYPES 6 // hud item selection slots + +#define MAX_ITEMS 4 // hard coded item types + +#define DEFAULT_FOV 90 // the default field of view + +#define HIDEHUD_WEAPONS (1<<0) +#define HIDEHUD_FLASHLIGHT (1<<1) +#define HIDEHUD_ALL (1<<2) +#define HIDEHUD_HEALTH (1<<3) +#define HIDEHUD_TIMER (1<<4) +#define HIDEHUD_MONEY (1<<5) +#define HIDEHUD_CROSSHAIR (1<<6) + +#define STATUSICON_HIDE 0 +#define STATUSICON_SHOW 1 +#define STATUSICON_FLASH 2 + +#define HUD_PRINTNOTIFY 1 +#define HUD_PRINTCONSOLE 2 +#define HUD_PRINTTALK 3 +#define HUD_PRINTCENTER 4 +#define HUD_PRINTRADIO 5 + +#define STATUS_NIGHTVISION_ON 1 +#define STATUS_NIGHTVISION_OFF 0 + +#define ITEM_STATUS_NIGHTVISION (1<<0) +#define ITEM_STATUS_DEFUSER (1<<1) + +#define SCORE_STATUS_DEAD (1<<0) +#define SCORE_STATUS_BOMB (1<<1) +#define SCORE_STATUS_VIP (1<<2) + +#define SIGNAL_BUY (1<<0) +#define SIGNAL_BOMB (1<<1) +#define SIGNAL_RESCUE (1<<2) +#define SIGNAL_ESCAPE (1<<3) +#define SIGNAL_VIPSAFETY (1<<4) + +#define DATA_IUSER3_CANSHOOT (1<<0) +#define DATA_IUSER3_FREEZETIMEOVER (1<<1) +#define DATA_IUSER3_INBOMBZONE (1<<2) +#define DATA_IUSER3_HOLDINGSHIELD (1<<3) + +#define MENU_KEY_1 (1<<0) +#define MENU_KEY_2 (1<<1) +#define MENU_KEY_3 (1<<2) +#define MENU_KEY_4 (1<<3) +#define MENU_KEY_5 (1<<4) +#define MENU_KEY_6 (1<<5) +#define MENU_KEY_7 (1<<6) +#define MENU_KEY_8 (1<<7) +#define MENU_KEY_9 (1<<8) +#define MENU_KEY_0 (1<<9) + +#define MAX_AMMO_TYPES 32 // ??? +#define MAX_AMMO_SLOTS 32 // not really slots + +#define HUD_PRINTNOTIFY 1 +#define HUD_PRINTCONSOLE 2 +#define HUD_PRINTTALK 3 +#define HUD_PRINTCENTER 4 + +#define WEAPON_SUIT 31 +#define WEAPON_ALLWEAPONS (~(1 << WEAPON_SUIT)) + +// custom enum +enum VGUIMenu +{ + VGUI_Menu_Team = 2, + VGUI_Menu_MapBriefing = 4, + + VGUI_Menu_Class_T = 26, + VGUI_Menu_Class_CT, + VGUI_Menu_Buy, + VGUI_Menu_Buy_Pistol, + VGUI_Menu_Buy_ShotGun, + VGUI_Menu_Buy_Rifle, + VGUI_Menu_Buy_SubMachineGun, + VGUI_Menu_Buy_MachineGun, + VGUI_Menu_Buy_Item, +}; + +// custom enum +enum VGUIMenuSlot +{ + VGUI_MenuSlot_Buy_Pistol = 1, + VGUI_MenuSlot_Buy_ShotGun, + VGUI_MenuSlot_Buy_SubMachineGun, + VGUI_MenuSlot_Buy_Rifle, + VGUI_MenuSlot_Buy_MachineGun, + VGUI_MenuSlot_Buy_PrimAmmo, + VGUI_MenuSlot_Buy_SecAmmo, + VGUI_MenuSlot_Buy_Item, +}; diff --git a/cssdk/dlls/client.h b/cssdk/dlls/client.h new file mode 100644 index 0000000..f7f8a55 --- /dev/null +++ b/cssdk/dlls/client.h @@ -0,0 +1,97 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// custom enum +enum ChooseTeamMenuSlot +{ + MENU_SLOT_TEAM_UNDEFINED = -1, + + MENU_SLOT_TEAM_TERRORIST = 1, + MENU_SLOT_TEAM_CT, + MENU_SLOT_TEAM_VIP, + + MENU_SLOT_TEAM_RANDOM = 5, + MENU_SLOT_TEAM_SPECT +}; + +// custom enum +enum BuyItemMenuSlot +{ + MENU_SLOT_ITEM_VEST = 1, + MENU_SLOT_ITEM_VESTHELM, + MENU_SLOT_ITEM_FLASHGREN, + MENU_SLOT_ITEM_HEGREN, + MENU_SLOT_ITEM_SMOKEGREN, + MENU_SLOT_ITEM_NVG, + MENU_SLOT_ITEM_DEFUSEKIT, + MENU_SLOT_ITEM_SHIELD, +}; + +#define CS_NUM_SKIN 4 +#define CZ_NUM_SKIN 5 + +#define FIELD_ORIGIN0 0 +#define FIELD_ORIGIN1 1 +#define FIELD_ORIGIN2 2 + +#define FIELD_ANGLES0 3 +#define FIELD_ANGLES1 4 +#define FIELD_ANGLES2 5 + +#define CUSTOMFIELD_ORIGIN0 0 +#define CUSTOMFIELD_ORIGIN1 1 +#define CUSTOMFIELD_ORIGIN2 2 + +#define CUSTOMFIELD_ANGLES0 3 +#define CUSTOMFIELD_ANGLES1 4 +#define CUSTOMFIELD_ANGLES2 5 + +#define CUSTOMFIELD_SKIN 6 +#define CUSTOMFIELD_SEQUENCE 7 +#define CUSTOMFIELD_ANIMTIME 8 + +typedef struct +{ + float m_fTimeEnteredPVS; + +} ENTITYPVSSTATUS; + +struct PLAYERPVSSTATUS +{ + ENTITYPVSSTATUS m_Status[1380]; + int headnode; + int num_leafs; + short int leafnums[ MAX_ENT_LEAFS ]; +}; + +struct entity_field_alias_t +{ + char name[32]; + int field; +}; diff --git a/cssdk/dlls/csbot_dll.h b/cssdk/dlls/csbot_dll.h new file mode 100644 index 0000000..f96b728 --- /dev/null +++ b/cssdk/dlls/csbot_dll.h @@ -0,0 +1,50 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "../game_shared/GameEvent.h" +#include "../game_shared/bot/bot_util.h" +#include "../game_shared/bot/simple_state_machine.h" +#include "../game_shared/steam_util.h" +#include "../game_shared/perf_counter.h" +#include "../game_shared/bot/bot_manager.h" +#include "../game_shared/bot/bot_constants.h" +#include "../game_shared/bot/bot.h" +#include "../game_shared/shared_util.h" +#include "../game_shared/bot/bot_profile.h" + +#include "../game_shared/bot/improv.h" +#include "../game_shared/bot/nav.h" +#include "../game_shared/bot/nav_node.h" +#include "../game_shared/bot/nav_area.h" +#include "../game_shared/bot/nav_path.h" + +#include "../dlls/hostage/hostage.h" +#include "../dlls/hostage/hostage_localnav.h" + +#include "../dlls/bot/cs_bot.h" diff --git a/cssdk/dlls/decals.h b/cssdk/dlls/decals.h new file mode 100644 index 0000000..6f37432 --- /dev/null +++ b/cssdk/dlls/decals.h @@ -0,0 +1,83 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +enum decal_e +{ + DECAL_GUNSHOT1 = 0, + DECAL_GUNSHOT2, + DECAL_GUNSHOT3, + DECAL_GUNSHOT4, + DECAL_GUNSHOT5, + DECAL_LAMBDA1, + DECAL_LAMBDA2, + DECAL_LAMBDA3, + DECAL_LAMBDA4, + DECAL_LAMBDA5, + DECAL_LAMBDA6, + DECAL_SCORCH1, + DECAL_SCORCH2, + DECAL_BLOOD1, + DECAL_BLOOD2, + DECAL_BLOOD3, + DECAL_BLOOD4, + DECAL_BLOOD5, + DECAL_BLOOD6, + DECAL_YBLOOD1, + DECAL_YBLOOD2, + DECAL_YBLOOD3, + DECAL_YBLOOD4, + DECAL_YBLOOD5, + DECAL_YBLOOD6, + DECAL_GLASSBREAK1, + DECAL_GLASSBREAK2, + DECAL_GLASSBREAK3, + DECAL_BIGSHOT1, + DECAL_BIGSHOT2, + DECAL_BIGSHOT3, + DECAL_BIGSHOT4, + DECAL_BIGSHOT5, + DECAL_SPIT1, + DECAL_SPIT2, + DECAL_BPROOF1, // Bulletproof glass decal + DECAL_GARGSTOMP1, // Gargantua stomp crack + DECAL_SMALLSCORCH1, // Small scorch mark + DECAL_SMALLSCORCH2, // Small scorch mark + DECAL_SMALLSCORCH3, // Small scorch mark + DECAL_MOMMABIRTH, // Big momma birth splatter + DECAL_MOMMASPLAT, +}; + +typedef struct +{ + char *name; + int index; + +} DLL_DECALLIST; + +extern DLL_DECALLIST gDecals[42]; diff --git a/cssdk/dlls/doors.h b/cssdk/dlls/doors.h new file mode 100644 index 0000000..92a97b4 --- /dev/null +++ b/cssdk/dlls/doors.h @@ -0,0 +1,92 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define DOOR_SENTENCEWAIT 6 +#define DOOR_SOUNDWAIT 3 +#define BUTTON_SOUNDWAIT 0.5 + +#define SF_DOOR_ROTATE_Y 0 +#define SF_DOOR_START_OPEN 1 +#define SF_DOOR_ROTATE_BACKWARDS 2 +#define SF_DOOR_PASSABLE 8 +#define SF_DOOR_ONEWAY 16 +#define SF_DOOR_NO_AUTO_RETURN 32 +#define SF_DOOR_ROTATE_Z 64 +#define SF_DOOR_ROTATE_X 128 +#define SF_DOOR_USE_ONLY 256 // door must be opened by player's use button. +#define SF_DOOR_NOMONSTERS 512 // Monster can't open +#define SF_DOOR_SILENT 0x80000000 + +class CBaseDoor: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void SetToggleState(int state) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + byte m_bHealthValue; // some doors are medi-kit doors, they give players health + + byte m_bMoveSnd; // sound a door makes while moving + byte m_bStopSnd; // sound a door makes when it stops + + locksound_t m_ls; // door lock sounds + + byte m_bLockedSound; // ordinals from entity selection + byte m_bLockedSentence; + byte m_bUnlockedSound; + byte m_bUnlockedSentence; + + float m_lastBlockedTimestamp; +}; + +class CRotDoor: public CBaseDoor { +public: + virtual void Spawn() = 0; + virtual void Restart() = 0; + virtual void SetToggleState(int state) = 0; +}; + +class CMomentaryDoor: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + byte m_bMoveSnd; // sound a door makes while moving +}; diff --git a/cssdk/dlls/effects.h b/cssdk/dlls/effects.h new file mode 100644 index 0000000..5df1335 --- /dev/null +++ b/cssdk/dlls/effects.h @@ -0,0 +1,407 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_BEAM_STARTON 0x0001 +#define SF_BEAM_TOGGLE 0x0002 +#define SF_BEAM_RANDOM 0x0004 +#define SF_BEAM_RING 0x0008 +#define SF_BEAM_SPARKSTART 0x0010 +#define SF_BEAM_SPARKEND 0x0020 +#define SF_BEAM_DECALS 0x0040 +#define SF_BEAM_SHADEIN 0x0080 +#define SF_BEAM_SHADEOUT 0x0100 +#define SF_BEAM_TEMPORARY 0x8000 + +#define SF_GIBSHOOTER_REPEATABLE 1 +#define SF_FUNNEL_REVERSE 1 + +#define SF_BUBBLES_STARTOFF 0x0001 + +#define SF_BLOOD_RANDOM 0x0001 +#define SF_BLOOD_STREAM 0x0002 +#define SF_BLOOD_PLAYER 0x0004 +#define SF_BLOOD_DECAL 0x0008 + +#define SF_SHAKE_EVERYONE 0x0001 +#define SF_SHAKE_DISRUPT 0x0002 +#define SF_SHAKE_INAIR 0x0004 + +#define SF_FADE_IN 0x0001 +#define SF_FADE_MODULATE 0x0002 +#define SF_FADE_ONLYONE 0x0004 + +#define SF_SPRITE_STARTON 0x0001 +#define SF_SPRITE_ONCE 0x0002 +#define SF_SPRITE_TEMPORARY 0x8000 + +#define SF_MESSAGE_ONCE 0x0001 // Fade in, not out +#define SF_MESSAGE_ALL 0x0002 // Send to all clients + +class CSprite: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + +public: + void SetAttachment(edict_t *pEntity, int attachment) + { + if (pEntity != NULL) + { + pev->skin = ENTINDEX(pEntity); + pev->body = attachment; + pev->aiment = pEntity; + pev->movetype = MOVETYPE_FOLLOW; + } + } + + float Frames() const { return m_maxFrame; } + void SetTransparency(int rendermode, int r, int g, int b, int a, int fx) + { + pev->rendermode = rendermode; + pev->rendercolor.x = r; + pev->rendercolor.y = g; + pev->rendercolor.z = b; + pev->renderamt = a; + pev->renderfx = fx; + } + + void SetTexture(int spriteIndex) { pev->modelindex = spriteIndex; } + void SetScale(float scale) { pev->scale = scale; } + void SetColor(int r, int g, int b) { pev->rendercolor.x = r; pev->rendercolor.y = g; pev->rendercolor.z = b; } + void SetBrightness(int brightness) { pev->renderamt = brightness; } + void AnimateAndDie(float framerate) + { + SetThink(&CSprite::AnimateUntilDead); + pev->framerate = framerate; + pev->dmgtime = gpGlobals->time + (m_maxFrame / framerate); + pev->nextthink = gpGlobals->time; + } +private: + float m_lastTime; + float m_maxFrame; +}; + +class CBeam: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int ObjectCaps() = 0; + virtual Vector Center() = 0; +public: + void SetType(int type) { pev->rendermode = (pev->rendermode & 0xF0) | (type & 0x0F); } + void SetFlags(int flags) { pev->rendermode = (pev->rendermode & 0x0F) | (flags & 0xF0); } + void SetStartPos(const Vector &pos) { pev->origin = pos; } + void SetEndPos(const Vector &pos) { pev->angles = pos; } + + void SetStartEntity(int entityIndex); + void SetEndEntity(int entityIndex); + + void SetStartAttachment(int attachment) { pev->sequence = (pev->sequence & 0x0FFF) | ((attachment & 0xF) << 12); } + void SetEndAttachment(int attachment) { pev->skin = (pev->skin & 0x0FFF) | ((attachment & 0xF) << 12); } + void SetTexture(int spriteIndex) { pev->modelindex = spriteIndex; } + void SetWidth(int width) { pev->scale = width; } + void SetNoise(int amplitude) { pev->body = amplitude; } + void SetColor(int r, int g, int b) { pev->rendercolor.x = r; pev->rendercolor.y = g; pev->rendercolor.z = b; } + void SetBrightness(int brightness) { pev->renderamt = brightness; } + void SetFrame(float frame) { pev->frame = frame; } + void SetScrollRate(int speed) { pev->animtime = speed; } + int GetType() const { return pev->rendermode & 0x0F; } + int GetFlags() const { return pev->rendermode & 0xF0; } + int GetStartEntity() const { return pev->sequence & 0xFFF; } + int GetEndEntity() const { return pev->skin & 0xFFF; } + + const Vector &GetStartPos(); + const Vector &GetEndPos(); + + int GetTexture() const { return pev->modelindex; } + int GetWidth() const { return pev->scale; } + int GetNoise() const { return pev->body; } + int GetBrightness() const { return pev->renderamt; } + int GetFrame() const { return pev->frame; } + int GetScrollRate() const { return pev->animtime; } + + void LiveForTime(float time) + { + SetThink(&CBeam::SUB_Remove); + pev->nextthink = gpGlobals->time + time; + } + void BeamDamageInstant(TraceResult *ptr, float damage) + { + pev->dmg = damage; + pev->dmgtime = gpGlobals->time - 1; + BeamDamage(ptr); + } +}; + +class CLaser: public CBeam { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + CSprite *m_pSprite; + int m_iszSpriteName; + Vector m_firePosition; +}; + +class CBubbling: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_density; + int m_frequency; + int m_bubbleModel; + int m_state; +}; + +class CLightning: public CBeam { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Activate() = 0; +public: + inline BOOL ServerSide() const + { + if (!m_life && !(pev->spawnflags & SF_BEAM_RING)) + return TRUE; + + return FALSE; + } +public: + int m_active; + int m_iszStartEntity; + int m_iszEndEntity; + float m_life; + int m_boltWidth; + int m_noiseAmplitude; + int m_brightness; + int m_speed; + float m_restrike; + int m_spriteTexture; + int m_iszSpriteName; + int m_frameStart; + float m_radius; +}; + +class CGlow: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Think() = 0; +public: + float m_lastTime; + float m_maxFrame; +}; + +class CBombGlow: public CSprite { +public: + virtual void Spawn() = 0; + virtual void Think() = 0; +public: + float m_lastTime; + float m_tmBeepPeriod; + bool m_bSetModel; +}; + +class CGibShooter: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual CGib *CreateGib() = 0; +public: + int m_iGibs; + int m_iGibCapacity; + int m_iGibMaterial; + int m_iGibModelIndex; + + float m_flGibVelocity; + float m_flVariance; + float m_flGibLife; +}; + +class CEnvShooter: public CGibShooter { +public: + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual CGib *CreateGib() = 0; +}; + +#define MAX_BEAM 24 + +class CTestEffect: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_iLoop; + int m_iBeam; + + CBeam *m_pBeam[MAX_BEAM]; + + float m_flBeamTime[MAX_BEAM]; + float m_flStartTime; +}; + +class CBlood: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + +public: + int Color() const { return pev->impulse; } + float BloodAmount() const { return pev->dmg; } + + void SetColor(int color) { pev->impulse = color; } + void SetBloodAmount(float amount) { pev->dmg = amount; } +}; + +class CShake: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float Amplitude() const { return pev->scale; } + float Frequency() const { return pev->dmg_save; } + float Duration() const { return pev->dmg_take; } + float Radius() const { return pev->dmg; } + + void SetAmplitude(float amplitude) { pev->scale = amplitude; } + void SetFrequency(float frequency) { pev->dmg_save = frequency; } + void SetDuration(float duration) { pev->dmg_take = duration; } + void SetRadius(float radius) { pev->dmg = radius; } +}; + +class CFade: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float Duration() const { return pev->dmg_take; } + float HoldTime() const { return pev->dmg_save; } + + void SetDuration(float duration) { pev->dmg_take = duration; } + void SetHoldTime(float hold) { pev->dmg_save = hold; } +}; + +class CMessage: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CEnvFunnel: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_iSprite; +}; + +class CEnvBeverage: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CItemSoda: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; +}; + +// Inlines +inline void CBeam::SetStartEntity(int entityIndex) +{ + pev->sequence = (entityIndex & 0x0FFF) | ((pev->sequence & 0xF000) << 12); + pev->owner = INDEXENT(entityIndex); +} + +inline void CBeam::SetEndEntity(int entityIndex) +{ + pev->skin = (entityIndex & 0x0FFF) | ((pev->skin & 0xF000) << 12); + pev->aiment = INDEXENT(entityIndex); +} + +inline const Vector &CBeam::GetStartPos() +{ + if (GetType() == BEAM_ENTS) + { + edict_t *pent = INDEXENT(GetStartEntity()); + return pent->v.origin; + } + + return pev->origin; +} + +inline const Vector &CBeam::GetEndPos() +{ + int type = GetType(); + if (type == BEAM_POINTS || type == BEAM_HOSE) + { + return pev->angles; + } + + edict_t *pent = INDEXENT(GetEndEntity()); + if (pent != NULL) + { + return pent->v.origin; + } + + return pev->angles; +} diff --git a/cssdk/dlls/enginecallback.h b/cssdk/dlls/enginecallback.h new file mode 100644 index 0000000..dbe3e71 --- /dev/null +++ b/cssdk/dlls/enginecallback.h @@ -0,0 +1,178 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "event_flags.h" + +// Must be provided by user of this code +extern enginefuncs_t g_engfuncs; + +// The actual engine callbacks +#define GETPLAYERUSERID (*g_engfuncs.pfnGetPlayerUserId) +#define PRECACHE_MODEL (*g_engfuncs.pfnPrecacheModel) +#define PRECACHE_SOUND (*g_engfuncs.pfnPrecacheSound) +#define PRECACHE_GENERIC (*g_engfuncs.pfnPrecacheGeneric) +#define SET_MODEL (*g_engfuncs.pfnSetModel) +#define MODEL_INDEX (*g_engfuncs.pfnModelIndex) +#define MODEL_FRAMES (*g_engfuncs.pfnModelFrames) +#define SET_SIZE (*g_engfuncs.pfnSetSize) +#define CHANGE_LEVEL (*g_engfuncs.pfnChangeLevel) +#define GET_SPAWN_PARMS (*g_engfuncs.pfnGetSpawnParms) +#define SAVE_SPAWN_PARMS (*g_engfuncs.pfnSaveSpawnParms) +#define VEC_TO_YAW (*g_engfuncs.pfnVecToYaw) +#define VEC_TO_ANGLES (*g_engfuncs.pfnVecToAngles) +#define MOVE_TO_ORIGIN (*g_engfuncs.pfnMoveToOrigin) +#define oldCHANGE_YAW (*g_engfuncs.pfnChangeYaw) +#define CHANGE_PITCH (*g_engfuncs.pfnChangePitch) +#define MAKE_VECTORS (*g_engfuncs.pfnMakeVectors) +#define CREATE_ENTITY (*g_engfuncs.pfnCreateEntity) +#define REMOVE_ENTITY (*g_engfuncs.pfnRemoveEntity) +#define CREATE_NAMED_ENTITY (*g_engfuncs.pfnCreateNamedEntity) +#define MAKE_STATIC (*g_engfuncs.pfnMakeStatic) +#define ENT_IS_ON_FLOOR (*g_engfuncs.pfnEntIsOnFloor) +#define DROP_TO_FLOOR (*g_engfuncs.pfnDropToFloor) +#define WALK_MOVE (*g_engfuncs.pfnWalkMove) +#define SET_ORIGIN (*g_engfuncs.pfnSetOrigin) +#define EMIT_SOUND_DYN2 (*g_engfuncs.pfnEmitSound) +#define BUILD_SOUND_MSG (*g_engfuncs.pfnBuildSoundMsg) +#define TRACE_LINE (*g_engfuncs.pfnTraceLine) +#define TRACE_TOSS (*g_engfuncs.pfnTraceToss) +#define TRACE_MONSTER_HULL (*g_engfuncs.pfnTraceMonsterHull) +#define TRACE_HULL (*g_engfuncs.pfnTraceHull) +#define TRACE_MODEL (*g_engfuncs.pfnTraceModel) +#define GET_AIM_VECTOR (*g_engfuncs.pfnGetAimVector) +#define SERVER_COMMAND (*g_engfuncs.pfnServerCommand) +#define SERVER_EXECUTE (*g_engfuncs.pfnServerExecute) +#define CLIENT_COMMAND (*g_engfuncs.pfnClientCommand) +#define PARTICLE_EFFECT (*g_engfuncs.pfnParticleEffect) +#define LIGHT_STYLE (*g_engfuncs.pfnLightStyle) +#define DECAL_INDEX (*g_engfuncs.pfnDecalIndex) +#define POINT_CONTENTS (*g_engfuncs.pfnPointContents) +#define CRC32_INIT (*g_engfuncs.pfnCRC32_Init) +#define CRC32_PROCESS_BUFFER (*g_engfuncs.pfnCRC32_ProcessBuffer) +#define CRC32_PROCESS_BYTE (*g_engfuncs.pfnCRC32_ProcessByte) +#define CRC32_FINAL (*g_engfuncs.pfnCRC32_Final) +#define RANDOM_LONG (*g_engfuncs.pfnRandomLong) +#define RANDOM_FLOAT (*g_engfuncs.pfnRandomFloat) +#define ADD_SERVER_COMMAND (*g_engfuncs.pfnAddServerCommand) +#define SET_CLIENT_LISTENING (*g_engfuncs.pfnVoice_SetClientListening) +#define GETPLAYERAUTHID (*g_engfuncs.pfnGetPlayerAuthId) +#define GET_FILE_SIZE (*g_engfuncs.pfnGetFileSize) +#define GET_APPROX_WAVE_PLAY_LEN (*g_engfuncs.pfnGetApproxWavePlayLen) +#define IS_CAREER_MATCH (*g_engfuncs.pfnIsCareerMatch) +#define GET_LOCALIZED_STRING_LENGTH (*g_engfuncs.pfnGetLocalizedStringLength) +#define REGISTER_TUTOR_MESSAGE_SHOWN (*g_engfuncs.pfnRegisterTutorMessageShown) +#define GET_TIMES_TUTOR_MESSAGE_SHOWN (*g_engfuncs.pfnGetTimesTutorMessageShown) +#define ENG_CHECK_PARM (*g_engfuncs.pfnEngCheckParm) + +inline void MESSAGE_BEGIN(int msg_dest, int msg_type, const float *pOrigin = NULL, edict_t *ed = NULL) { (*g_engfuncs.pfnMessageBegin)(msg_dest, msg_type, pOrigin, ed); } + +inline void *GET_PRIVATE(edict_t *pent) +{ + if (pent) + return pent->pvPrivateData; + return NULL; +} + +#define MESSAGE_END (*g_engfuncs.pfnMessageEnd) +#define WRITE_BYTE (*g_engfuncs.pfnWriteByte) +#define WRITE_CHAR (*g_engfuncs.pfnWriteChar) +#define WRITE_SHORT (*g_engfuncs.pfnWriteShort) +#define WRITE_LONG (*g_engfuncs.pfnWriteLong) +#define WRITE_ANGLE (*g_engfuncs.pfnWriteAngle) +#define WRITE_COORD (*g_engfuncs.pfnWriteCoord) +#define WRITE_STRING (*g_engfuncs.pfnWriteString) +#define WRITE_ENTITY (*g_engfuncs.pfnWriteEntity) +#define CVAR_REGISTER (*g_engfuncs.pfnCVarRegister) +#define CVAR_GET_FLOAT (*g_engfuncs.pfnCVarGetFloat) +#define CVAR_GET_STRING (*g_engfuncs.pfnCVarGetString) +#define CVAR_SET_FLOAT (*g_engfuncs.pfnCVarSetFloat) +#define CVAR_SET_STRING (*g_engfuncs.pfnCVarSetString) +#define CVAR_GET_POINTER (*g_engfuncs.pfnCVarGetPointer) +#define ALERT (*g_engfuncs.pfnAlertMessage) +#define ENGINE_FPRINTF (*g_engfuncs.pfnEngineFprintf) +#define ALLOC_PRIVATE (*g_engfuncs.pfnPvAllocEntPrivateData) +#define FREE_PRIVATE (*g_engfuncs.pfnFreeEntPrivateData) +//#define STRING (*g_engfuncs.pfnSzFromIndex) +#define ALLOC_STRING (*g_engfuncs.pfnAllocString) +#define FIND_ENTITY_BY_STRING (*g_engfuncs.pfnFindEntityByString) +#define GETENTITYILLUM (*g_engfuncs.pfnGetEntityIllum) +#define FIND_ENTITY_IN_SPHERE (*g_engfuncs.pfnFindEntityInSphere) +#define FIND_CLIENT_IN_PVS (*g_engfuncs.pfnFindClientInPVS) +#define FIND_ENTITY_IN_PVS (*g_engfuncs.pfnEntitiesInPVS) +#define EMIT_AMBIENT_SOUND (*g_engfuncs.pfnEmitAmbientSound) +#define GET_MODEL_PTR (*g_engfuncs.pfnGetModelPtr) +#define REG_USER_MSG (*g_engfuncs.pfnRegUserMsg) +#define GET_BONE_POSITION (*g_engfuncs.pfnGetBonePosition) +#define FUNCTION_FROM_NAME (*g_engfuncs.pfnFunctionFromName) +#define NAME_FOR_FUNCTION (*g_engfuncs.pfnNameForFunction) +#define TRACE_TEXTURE (*g_engfuncs.pfnTraceTexture) +#define CLIENT_PRINTF (*g_engfuncs.pfnClientPrintf) +#define SERVER_PRINT (*g_engfuncs.pfnServerPrint) +#define CMD_ARGS (*g_engfuncs.pfnCmd_Args) +#define CMD_ARGC (*g_engfuncs.pfnCmd_Argc) +#define CMD_ARGV (*g_engfuncs.pfnCmd_Argv) +#define GET_ATTACHMENT (*g_engfuncs.pfnGetAttachment) +#define SET_VIEW (*g_engfuncs.pfnSetView) +#define SET_CROSSHAIRANGLE (*g_engfuncs.pfnCrosshairAngle) +#define LOAD_FILE_FOR_ME (*g_engfuncs.pfnLoadFileForMe) +#define FREE_FILE (*g_engfuncs.pfnFreeFile) +#define END_SECTION (*g_engfuncs.pfnEndSection) +#define COMPARE_FILE_TIME (*g_engfuncs.pfnCompareFileTime) +#define GET_GAME_DIR (*g_engfuncs.pfnGetGameDir) +#define SET_CLIENT_MAXSPEED (*g_engfuncs.pfnSetClientMaxspeed) +#define CREATE_FAKE_CLIENT (*g_engfuncs.pfnCreateFakeClient) +#define PLAYER_RUN_MOVE (*g_engfuncs.pfnRunPlayerMove) +#define NUMBER_OF_ENTITIES (*g_engfuncs.pfnNumberOfEntities) +#define GET_INFO_BUFFER (*g_engfuncs.pfnGetInfoKeyBuffer) +#define GET_KEY_VALUE (*g_engfuncs.pfnInfoKeyValue) +#define SET_KEY_VALUE (*g_engfuncs.pfnSetKeyValue) +#define SET_CLIENT_KEY_VALUE (*g_engfuncs.pfnSetClientKeyValue) +#define IS_MAP_VALID (*g_engfuncs.pfnIsMapValid) +#define STATIC_DECAL (*g_engfuncs.pfnStaticDecal) +#define IS_DEDICATED_SERVER (*g_engfuncs.pfnIsDedicatedServer) +#define PRECACHE_EVENT (*g_engfuncs.pfnPrecacheEvent) +#define PLAYBACK_EVENT_FULL (*g_engfuncs.pfnPlaybackEvent) +#define ENGINE_SET_PVS (*g_engfuncs.pfnSetFatPVS) +#define ENGINE_SET_PAS (*g_engfuncs.pfnSetFatPAS) +#define ENGINE_CHECK_VISIBILITY (*g_engfuncs.pfnCheckVisibility) +#define DELTA_SET (*g_engfuncs.pfnDeltaSetField) +#define DELTA_UNSET (*g_engfuncs.pfnDeltaUnsetField) +#define DELTA_ADDENCODER (*g_engfuncs.pfnDeltaAddEncoder) +#define ENGINE_CURRENT_PLAYER (*g_engfuncs.pfnGetCurrentPlayer) +#define ENGINE_CANSKIP (*g_engfuncs.pfnCanSkipPlayer) +#define DELTA_FINDFIELD (*g_engfuncs.pfnDeltaFindField) +#define DELTA_SETBYINDEX (*g_engfuncs.pfnDeltaSetFieldByIndex) +#define DELTA_UNSETBYINDEX (*g_engfuncs.pfnDeltaUnsetFieldByIndex) +#define REMOVE_KEY_VALUE (*g_engfuncs.pfnInfo_RemoveKey) +#define SET_PHYSICS_KEY_VALUE (*g_engfuncs.pfnSetPhysicsKeyValue) +#define ENGINE_GETPHYSINFO (*g_engfuncs.pfnGetPhysicsInfoString) +#define ENGINE_SETGROUPMASK (*g_engfuncs.pfnSetGroupMask) +#define ENGINE_INSTANCE_BASELINE (*g_engfuncs.pfnCreateInstancedBaseline) +#define ENGINE_FORCE_UNMODIFIED (*g_engfuncs.pfnForceUnmodified) +#define PLAYER_CNX_STATS (*g_engfuncs.pfnGetPlayerStats) diff --git a/cssdk/dlls/explode.h b/cssdk/dlls/explode.h new file mode 100644 index 0000000..1a2f7a0 --- /dev/null +++ b/cssdk/dlls/explode.h @@ -0,0 +1,55 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_ENVEXPLOSION_NODAMAGE (1<<0) // when set, ENV_EXPLOSION will not actually inflict damage +#define SF_ENVEXPLOSION_REPEATABLE (1<<1) // can this entity be refired? +#define SF_ENVEXPLOSION_NOFIREBALL (1<<2) // don't draw the fireball +#define SF_ENVEXPLOSION_NOSMOKE (1<<3) // don't draw the smoke +#define SF_ENVEXPLOSION_NODECAL (1<<4) // don't make a scorch mark +#define SF_ENVEXPLOSION_NOSPARKS (1<<5) // don't make a scorch mark + +class CShower: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int ObjectCaps() = 0; + virtual void Think() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +}; + +class CEnvExplosion: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_iMagnitude; + int m_spriteScale; +}; diff --git a/cssdk/dlls/extdef.h b/cssdk/dlls/extdef.h new file mode 100644 index 0000000..2135558 --- /dev/null +++ b/cssdk/dlls/extdef.h @@ -0,0 +1,102 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "regamedll_const.h" + +#ifdef _WIN32 + // Attributes to specify an "exported" function, visible from outside the + // DLL. + #undef DLLEXPORT + #define DLLEXPORT __declspec(dllexport) + // WINAPI should be provided in the windows compiler headers. + // It's usually defined to something like "__stdcall". +#else + #undef DLLEXPORT + #define DLLEXPORT __attribute__((visibility("default"))) + #define WINAPI /* */ +#endif // _WIN32 + +// Simplified macro for declaring/defining exported DLL functions. They +// need to be 'extern "C"' so that the C++ compiler enforces parameter +// type-matching, rather than considering routines with mis-matched +// arguments/types to be overloaded functions... +// +// AFAIK, this is os-independent, but it's included here in osdep.h where +// DLLEXPORT is defined, for convenience. +#define C_DLLEXPORT extern "C" DLLEXPORT + +enum hash_types_e { CLASSNAME }; + +// Things that toggle (buttons/triggers/doors) need this +enum TOGGLE_STATE { TS_AT_TOP, TS_AT_BOTTOM, TS_GOING_UP, TS_GOING_DOWN }; + +typedef struct hash_item_s +{ + entvars_t *pev; + struct hash_item_s *next; + struct hash_item_s *lastHash; + int pevIndex; + +} hash_item_t; + +typedef struct locksounds +{ + string_t sLockedSound; + string_t sLockedSentence; + string_t sUnlockedSound; + string_t sUnlockedSentence; + int iLockedSentence; + int iUnlockedSentence; + float flwaitSound; + float flwaitSentence; + byte bEOFLocked; + byte bEOFUnlocked; + +} locksound_t; + +typedef struct hudtextparms_s +{ + float x; + float y; + int effect; + byte r1,g1,b1,a1; + byte r2,g2,b2,a2; + float fadeinTime; + float fadeoutTime; + float holdTime; + float fxTime; + int channel; + +} hudtextparms_t; + +enum USE_TYPE { USE_OFF, USE_ON, USE_SET, USE_TOGGLE }; +enum TRAIN_CODE { TRAIN_SAFE, TRAIN_BLOCKING, TRAIN_FOLLOWING }; +enum IGNORE_MONSTERS { ignore_monsters = 1, dont_ignore_monsters = 0, missile = 2 }; +enum IGNORE_GLASS { ignore_glass = 1, dont_ignore_glass = 0 }; +enum { point_hull = 0, human_hull = 1, large_hull = 2, head_hull = 3 }; diff --git a/cssdk/dlls/extdll.h b/cssdk/dlls/extdll.h new file mode 100644 index 0000000..e81fcd1 --- /dev/null +++ b/cssdk/dlls/extdll.h @@ -0,0 +1,82 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#pragma warning(disable:4244) // int or float down-conversion +#pragma warning(disable:4305) // int or float data truncation +#pragma warning(disable:4201) // nameless struct/union +#pragma warning(disable:4514) // unreferenced inline function removed +#pragma warning(disable:4100) // unreferenced formal parameter + +#include "archtypes.h" +#include "maintypes.h" +#include "regamedll_common.h" + +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #define NOWINRES + #define NOSERVICE + #define NOMCX + #define NOIME + #include "winsani_in.h" + #include "windows.h" + #include "winsani_out.h" + #undef PlaySound +#else + #include + #include + #include +#endif // _WIN32 + +// Misc C-runtime library headers +#include "stdio.h" +#include "stdlib.h" +#include "math.h" + +// Header file containing definition of globalvars_t and entvars_t +typedef int EOFFSET; // More explicit than "int" +typedef unsigned int func_t; +typedef unsigned int string_t; // from engine's pr_comp.h; +typedef float vec_t; // needed before including progdefs.h + +// Vector class +#include "vector.h" +//#include "vector.h" +// Defining it as a (bogus) struct helps enforce type-checking +#define vec3_t Vector +// Shared engine/DLL constants + +#include "const.h" +#include "edict.h" + +// Shared header describing protocol between engine and DLLs +#include "eiface.h" +// Shared header between the client DLL and the game DLLs +#include "cdll_dll.h" +#include "extdef.h" diff --git a/cssdk/dlls/func_break.h b/cssdk/dlls/func_break.h new file mode 100644 index 0000000..b2f5978 --- /dev/null +++ b/cssdk/dlls/func_break.h @@ -0,0 +1,119 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// this many shards spawned when breakable objects break; +#define NUM_SHARDS 6 + +// func breakable +#define SF_BREAK_TRIGGER_ONLY 1 // may only be broken by trigger +#define SF_BREAK_TOUCH 2 // can be 'crashed through' by running player (plate glass) +#define SF_BREAK_PRESSURE 4 // can be broken by a player standing on it +#define SF_BREAK_CROWBAR 256 // instant break if hit with crowbar + +// func_pushable (it's also func_breakable, so don't collide with those flags) +#define SF_PUSH_BREAKABLE 128 + +typedef enum +{ + expRandom = 0, + expDirected, + +} Explosions; + +typedef enum +{ + matGlass = 0, + matWood, + matMetal, + matFlesh, + matCinderBlock, + matCeilingTile, + matComputer, + matUnbreakableGlass, + matRocks, + matNone, + matLastMaterial, + +} Materials; + +class CBreakable: public CBaseDelay { +public: + // basic functions + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + + // To spark when hit + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) = 0; + + // breakables use an overridden takedamage + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + + virtual int DamageDecal(int bitsDamageType) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + +public: + BOOL Explodable() const { return ExplosionMagnitude() > 0; } + int ExplosionMagnitude() const { return pev->impulse; } + void ExplosionSetMagnitude(int magnitude) { pev->impulse = magnitude; } + +public: + Materials m_Material; + Explosions m_Explosion; + int m_idShard; + float m_angle; + int m_iszGibModel; + int m_iszSpawnObject; + float m_flHealth; +}; + +class CPushable: public CBreakable { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0 + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + +public: + float MaxSpeed() const { return m_maxSpeed; } + +public: + int m_lastSound; + float m_maxSpeed; + float m_soundTime; +}; \ No newline at end of file diff --git a/cssdk/dlls/func_tank.h b/cssdk/dlls/func_tank.h new file mode 100644 index 0000000..6ae26fa --- /dev/null +++ b/cssdk/dlls/func_tank.h @@ -0,0 +1,159 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_TANK_ACTIVE 0x0001 +#define SF_TANK_PLAYER 0x0002 +#define SF_TANK_HUMANS 0x0004 +#define SF_TANK_ALIENS 0x0008 +#define SF_TANK_LINEOFSIGHT 0x0010 +#define SF_TANK_CANCONTROL 0x0020 +#define SF_TANK_SOUNDON 0x8000 + +enum TANKBULLET +{ + TANK_BULLET_NONE = 0, // Custom damage + TANK_BULLET_9MM, // env_laser (duration is 0.5 rate of fire) + TANK_BULLET_MP5, // rockets + TANK_BULLET_12MM, // explosion? +}; + +class CFuncTank: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + + // Bmodels don't go across transitions + virtual int ObjectCaps() = 0; + virtual BOOL OnControls(entvars_t *pevTest) = 0; + virtual void Think() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) = 0; + virtual Vector UpdateTargetPosition(CBaseEntity *pTarget) = 0; +public: + BOOL IsActive() const { return (pev->spawnflags & SF_TANK_ACTIVE) == SF_TANK_ACTIVE; } + void TankActivate() + { + pev->spawnflags |= SF_TANK_ACTIVE; + pev->nextthink = pev->ltime + 0.1f; + m_fireLast = 0.0f; + } + void TankDeactivate() + { + pev->spawnflags &= ~SF_TANK_ACTIVE; + m_fireLast = 0.0f; + StopRotSound(); + } + + BOOL CanFire() const { return (gpGlobals->time - m_lastSightTime) < m_persist; } + Vector BarrelPosition() + { + Vector forward, right, up; + UTIL_MakeVectorsPrivate(pev->angles, forward, right, up); + return pev->origin + (forward * m_barrelPos.x) + (right * m_barrelPos.y) + (up * m_barrelPos.z); + } +protected: + CBasePlayer *m_pController; + float m_flNextAttack; + Vector m_vecControllerUsePos; + + float m_yawCenter; // "Center" yaw + float m_yawRate; // Max turn rate to track targets + float m_yawRange; // Range of turning motion (one-sided: 30 is +/- 30 degress from center) + // Zero is full rotation + + float m_yawTolerance; // Tolerance angle + + float m_pitchCenter; // "Center" pitch + float m_pitchRate; // Max turn rate on pitch + float m_pitchRange; // Range of pitch motion as above + float m_pitchTolerance; // Tolerance angle + + float m_fireLast; // Last time I fired + float m_fireRate; // How many rounds/second + float m_lastSightTime; // Last time I saw target + float m_persist; // Persistence of firing (how long do I shoot when I can't see) + float m_minRange; // Minimum range to aim/track + float m_maxRange; // Max range to aim/track + + Vector m_barrelPos; // Length of the freakin barrel + float m_spriteScale; // Scale of any sprites we shoot + int m_iszSpriteSmoke; + int m_iszSpriteFlash; + TANKBULLET m_bulletType; // Bullet type + int m_iBulletDamage; // 0 means use Bullet type's default damage + + Vector m_sightOrigin; // Last sight of target + int m_spread; // firing spread + int m_iszMaster; // Master entity (game_team_master or multisource) +}; + +class CFuncTankGun: public CFuncTank { +public: + virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) = 0; +}; + +class CFuncTankLaser: public CFuncTank { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Activate() = 0; + virtual void Think() = 0; + virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) = 0; +private: + CLaser *m_pLaser; + float m_laserTime; +}; + +class CFuncTankRocket: public CFuncTank { +public: + virtual void Precache() = 0; + virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) = 0; +}; + +class CFuncTankMortar: public CFuncTank { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) = 0; +}; + +class CFuncTankControls: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Think() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + CFuncTank *m_pTank; +}; diff --git a/cssdk/dlls/gamerules.h b/cssdk/dlls/gamerules.h new file mode 100644 index 0000000..cce267d --- /dev/null +++ b/cssdk/dlls/gamerules.h @@ -0,0 +1,678 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "voice_gamemgr.h" + +#define MAX_RULE_BUFFER 1024 +#define MAX_VOTE_MAPS 100 +#define MAX_VIP_QUEUES 5 + +#define MAX_BOMB_RADIUS 2048 + +#define MAP_VIP_SAFETYZONE_UNINITIALIZED 0 // uninitialized +#define MAP_HAVE_VIP_SAFETYZONE_YES 1 // has VIP safety zone +#define MAP_HAVE_VIP_SAFETYZONE_NO 2 // does not have VIP safetyzone + +#define MAP_HAS_CAMERAS_INIT 2 // initial +#define MAP_HAS_CAMERAS_YES 1 // on map have of camera's + +#define ITEM_RESPAWN_TIME 30 +#define WEAPON_RESPAWN_TIME 20 +#define AMMO_RESPAWN_TIME 20 + +// longest the intermission can last, in seconds +#define MAX_INTERMISSION_TIME 120 + +// when we are within this close to running out of entities, items +// marked with the ITEM_FLAG_LIMITINWORLD will delay their respawn +#define ENTITY_INTOLERANCE 100 + +#define MAX_MOTD_CHUNK 60 +#define MAX_MOTD_LENGTH 1536 // (MAX_MOTD_CHUNK * 4) + +// custom enum +#define WINNER_NONE 0 +#define WINNER_DRAW 1 + +enum +{ + WINSTATUS_CTS = 1, + WINSTATUS_TERRORISTS, + WINSTATUS_DRAW, +}; + +// custom enum +// used for EndRoundMessage() logged messages +enum ScenarioEventEndRound +{ + ROUND_NONE, + ROUND_TARGET_BOMB, + ROUND_VIP_ESCAPED, + ROUND_VIP_ASSASSINATED, + ROUND_TERRORISTS_ESCAPED, + ROUND_CTS_PREVENT_ESCAPE, + ROUND_ESCAPING_TERRORISTS_NEUTRALIZED, + ROUND_BOMB_DEFUSED, + ROUND_CTS_WIN, + ROUND_TERRORISTS_WIN, + ROUND_END_DRAW, + ROUND_ALL_HOSTAGES_RESCUED, + ROUND_TARGET_SAVED, + ROUND_HOSTAGE_NOT_RESCUED, + ROUND_TERRORISTS_NOT_ESCAPED, + ROUND_VIP_NOT_ESCAPED, + ROUND_GAME_COMMENCE, +}; + +enum RewardRules +{ + RR_CTS_WIN, + RR_TERRORISTS_WIN, + RR_TARGET_BOMB, + RR_VIP_ESCAPED, + RR_VIP_ASSASSINATED, + RR_TERRORISTS_ESCAPED, + RR_CTS_PREVENT_ESCAPE, + RR_ESCAPING_TERRORISTS_NEUTRALIZED, + RR_BOMB_DEFUSED, + RR_BOMB_PLANTED, + RR_BOMB_EXPLODED, + RR_ALL_HOSTAGES_RESCUED, + RR_TARGET_BOMB_SAVED, + RR_HOSTAGE_NOT_RESCUED, + RR_VIP_NOT_ESCAPED, + RR_LOSER_BONUS_DEFAULT, + RR_LOSER_BONUS_MIN, + RR_LOSER_BONUS_MAX, + RR_LOSER_BONUS_ADD, + RR_RESCUED_HOSTAGE, + RR_TOOK_HOSTAGE_ACC, + RR_TOOK_HOSTAGE, + RR_END +}; + +// custom enum +enum RewardAccount +{ + REWARD_TARGET_BOMB = 3500, + REWARD_VIP_ESCAPED = 3500, + REWARD_VIP_ASSASSINATED = 3250, + REWARD_TERRORISTS_ESCAPED = 3150, + REWARD_CTS_PREVENT_ESCAPE = 3500, + REWARD_ESCAPING_TERRORISTS_NEUTRALIZED = 3250, + REWARD_BOMB_DEFUSED = 3250, + REWARD_BOMB_PLANTED = 800, + REWARD_BOMB_EXPLODED = 3250, + REWARD_CTS_WIN = 3000, + REWARD_TERRORISTS_WIN = 3000, + REWARD_ALL_HOSTAGES_RESCUED = 2500, + + // the end round was by the expiration time + REWARD_TARGET_BOMB_SAVED = 3250, + REWARD_HOSTAGE_NOT_RESCUED = 3250, + REWARD_VIP_NOT_ESCAPED = 3250, + + // loser bonus + REWARD_LOSER_BONUS_DEFAULT = 1400, + REWARD_LOSER_BONUS_MIN = 1500, + REWARD_LOSER_BONUS_MAX = 3000, + REWARD_LOSER_BONUS_ADD = 500, + + REWARD_RESCUED_HOSTAGE = 750, + REWARD_KILLED_ENEMY = 300, + REWARD_KILLED_VIP = 2500, + REWARD_VIP_HAVE_SELF_RESCUED = 2500, + + REWARD_TAKEN_HOSTAGE = 1000 + +}; + +// custom enum +enum PaybackForBadThing +{ + PAYBACK_FOR_KILLED_TEAMMATES = -3300, +}; + +// custom enum +enum InfoMapBuyParam +{ + BUYING_EVERYONE = 0, + BUYING_ONLY_CTS, + BUYING_ONLY_TERRORISTS, + BUYING_NO_ONE, +}; + +// weapon respawning return codes +enum +{ + GR_NONE = 0, + + GR_WEAPON_RESPAWN_YES, + GR_WEAPON_RESPAWN_NO, + + GR_AMMO_RESPAWN_YES, + GR_AMMO_RESPAWN_NO, + + GR_ITEM_RESPAWN_YES, + GR_ITEM_RESPAWN_NO, + + GR_PLR_DROP_GUN_ALL, + GR_PLR_DROP_GUN_ACTIVE, + GR_PLR_DROP_GUN_NO, + + GR_PLR_DROP_AMMO_ALL, + GR_PLR_DROP_AMMO_ACTIVE, + GR_PLR_DROP_AMMO_NO, +}; + +// custom enum +enum +{ + SCENARIO_BLOCK_TIME_EXPRIRED = (1 << 0), + SCENARIO_BLOCK_NEED_PLAYERS = (1 << 1), + SCENARIO_BLOCK_VIP_ESCAPRE = (1 << 2), + SCENARIO_BLOCK_PRISON_ESCAPRE = (1 << 3), + SCENARIO_BLOCK_BOMB = (1 << 4), + SCENARIO_BLOCK_TEAM_EXTERMINATION = (1 << 5), + SCENARIO_BLOCK_HOSTAGE_RESCUE = (1 << 6), +}; + +// Player relationship return codes +enum +{ + GR_NOTTEAMMATE = 0, + GR_TEAMMATE, + GR_ENEMY, + GR_ALLY, + GR_NEUTRAL, +}; + +class CItem; + +class CGameRules { +protected: + virtual ~CGameRules() {}; +public: + virtual void RefreshSkillData() = 0; // fill skill data struct with proper values + virtual void Think() = 0; // runs every server frame, should handle any timer tasks, periodic events, etc. + virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0; // Can this item spawn (eg monsters don't spawn in deathmatch). + + virtual BOOL FAllowFlashlight() = 0; // Are players allowed to switch on their flashlight? + virtual BOOL FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; // should the player switch to this weapon? + virtual BOOL GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) = 0; // I can't use this weapon anymore, get me the next best one. + + // Functions to verify the single/multiplayer status of a game + virtual BOOL IsMultiplayer() = 0; // is this a multiplayer game? (either coop or deathmatch) + virtual BOOL IsDeathmatch() = 0; // is this a deathmatch game? + virtual BOOL IsTeamplay() = 0; // is this deathmatch game being played with team rules? + virtual BOOL IsCoOp() = 0; // is this a coop game? + virtual const char *GetGameDescription() = 0; // this is the game name that gets seen in the server browser + + // Client connection/disconnection + virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char *szRejectReason) = 0; // a client just connected to the server (player hasn't spawned yet) + virtual void InitHUD(CBasePlayer *pl) = 0; // the client dll is ready for updating + virtual void ClientDisconnected(edict_t *pClient) = 0; // a client just disconnected from the server + virtual void UpdateGameMode(CBasePlayer *pPlayer) = 0; // the client needs to be informed of the current game mode + + // Client damage rules + virtual float FlPlayerFallDamage(CBasePlayer *pPlayer) = 0; + virtual BOOL FPlayerCanTakeDamage(CBasePlayer *pPlayer, CBaseEntity *pAttacker) = 0; // can this player take damage from this attacker? + virtual BOOL ShouldAutoAim(CBasePlayer *pPlayer, edict_t *target) = 0; + + // Client spawn/respawn control + virtual void PlayerSpawn(CBasePlayer *pPlayer) = 0; // called by CBasePlayer::Spawn just before releasing player into the game + virtual void PlayerThink(CBasePlayer *pPlayer) = 0; // called by CBasePlayer::PreThink every frame, before physics are run and after keys are accepted + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer) = 0; // is this player allowed to respawn now? + virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer) = 0; // When in the future will this player be able to spawn? + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer) = 0; // Place this player on their spawnspot and face them the proper direction. + + virtual BOOL AllowAutoTargetCrosshair() = 0; + virtual BOOL ClientCommand_DeadOrAlive(CBasePlayer *pPlayer, const char *pcmd) = 0; + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; // handles the user commands; returns TRUE if command handled properly + virtual void ClientUserInfoChanged(CBasePlayer *pPlayer, char *infobuffer) = 0; // the player has changed userinfo; can change it now + + // Client kills/scoring + virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) = 0; // how many points do I award whoever kills this player? + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; // Called each time a player dies + virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor) = 0; // Call this from within a GameRules class to report an obituary. + + // Weapon retrieval + virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pItem) = 0; // The player is touching an CBasePlayerItem, do I give it to him? + virtual void PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; // Called each time a player picks up a weapon from the ground + + // Weapon spawn/respawn control + virtual int WeaponShouldRespawn(CBasePlayerItem *pWeapon) = 0; // should this weapon respawn? + virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon) = 0; // when may this weapon respawn? + virtual float FlWeaponTryRespawn(CBasePlayerItem *pWeapon) = 0; // can i respawn now, and if not, when should i try again? + virtual Vector VecWeaponRespawnSpot(CBasePlayerItem *pWeapon) = 0; // where in the world should this weapon respawn? + + // Item retrieval + virtual BOOL CanHaveItem(CBasePlayer *pPlayer, CItem *pItem) = 0; // is this player allowed to take this item? + virtual void PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem) = 0; // call each time a player picks up an item (battery, healthkit, longjump) + + // Item spawn/respawn control + virtual int ItemShouldRespawn(CItem *pItem) = 0; // Should this item respawn? + virtual float FlItemRespawnTime(CItem *pItem) = 0; // when may this item respawn? + virtual Vector VecItemRespawnSpot(CItem *pItem) = 0; // where in the world should this item respawn? + + // Ammo retrieval + virtual BOOL CanHaveAmmo(CBasePlayer *pPlayer, const char *pszAmmoName, int iMaxCarry) = 0; // can this player take more of this ammo? + virtual void PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount) = 0; // called each time a player picks up some ammo in the world + + // Ammo spawn/respawn control + virtual int AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) = 0; // should this ammo item respawn? + virtual float FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) = 0; // when should this ammo item respawn? + virtual Vector VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) = 0; // where in the world should this ammo item respawn? + + // Healthcharger respawn control + virtual float FlHealthChargerRechargeTime() = 0; // how long until a depleted HealthCharger recharges itself? + virtual float FlHEVChargerRechargeTime() = 0; // how long until a depleted HealthCharger recharges itself? + + // What happens to a dead player's weapons + virtual int DeadPlayerWeapons(CBasePlayer *pPlayer) = 0; // what do I do with a player's weapons when he's killed? + + // What happens to a dead player's ammo + virtual int DeadPlayerAmmo(CBasePlayer *pPlayer) = 0; // Do I drop ammo when the player dies? How much? + + // Teamplay stuff + virtual const char *GetTeamID(CBaseEntity *pEntity) = 0; // what team is this entity on? + virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) = 0; // What is the player's relationship with this entity? + virtual int GetTeamIndex(const char *pTeamName) = 0; + virtual const char *GetIndexedTeamName(int teamIndex) = 0; + virtual BOOL IsValidTeam(const char *pTeamName) = 0; + virtual void ChangePlayerTeam(CBasePlayer *pPlayer, const char *pTeamName, BOOL bKill, BOOL bGib) = 0; + virtual const char *SetDefaultPlayerTeam(CBasePlayer *pPlayer) = 0; + + // Sounds + virtual BOOL PlayTextureSounds() = 0; + + // Monsters + virtual BOOL FAllowMonsters() = 0; // are monsters allowed + + // Immediately end a multiplayer game + virtual void EndMultiplayerGame() = 0; + + // Stuff that is shared between client and server. + virtual BOOL IsFreezePeriod() = 0; + virtual void ServerDeactivate() = 0; + virtual void CheckMapConditions() = 0; +public: + BOOL m_bFreezePeriod; + BOOL m_bBombDropped; + + // custom + char *m_GameDesc; +}; + +// CHalfLifeRules - rules for the single player Half-Life game. +class CHalfLifeRules: public CGameRules { +protected: + virtual ~CHalfLifeRules() {}; +public: + virtual void Think() = 0; + virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0; + virtual BOOL FAllowFlashlight() = 0; + + virtual BOOL FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; + virtual BOOL GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) = 0; + + // Functions to verify the single/multiplayer status of a game + virtual BOOL IsMultiplayer() = 0; + virtual BOOL IsDeathmatch() = 0; + virtual BOOL IsCoOp() = 0; + + // Client connection/disconnection + virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]) = 0; + virtual void InitHUD(CBasePlayer *pl) = 0; // the client dll is ready for updating + virtual void ClientDisconnected(edict_t *pClient) = 0; + + // Client damage rules + virtual float FlPlayerFallDamage(CBasePlayer *pPlayer) = 0; + + // Client spawn/respawn control + virtual void PlayerSpawn(CBasePlayer *pPlayer) = 0; + virtual void PlayerThink(CBasePlayer *pPlayer) = 0; + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer) = 0; + virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer) = 0; + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer) = 0; + + virtual BOOL AllowAutoTargetCrosshair() = 0; + + // Client kills/scoring + virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) = 0; + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; + virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; + + // Weapon retrieval + virtual void PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; + + // Weapon spawn/respawn control + virtual int WeaponShouldRespawn(CBasePlayerItem *pWeapon) = 0; + virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon) = 0; + virtual float FlWeaponTryRespawn(CBasePlayerItem *pWeapon) = 0; + virtual Vector VecWeaponRespawnSpot(CBasePlayerItem *pWeapon) = 0; + + // Item retrieval + virtual BOOL CanHaveItem(CBasePlayer *pPlayer, CItem *pItem) = 0; + virtual void PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem) = 0; + + // Item spawn/respawn control + virtual int ItemShouldRespawn(CItem *pItem) = 0; + virtual float FlItemRespawnTime(CItem *pItem) = 0; + virtual Vector VecItemRespawnSpot(CItem *pItem) = 0; + + // Ammo retrieval + virtual void PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount) = 0; + + // Ammo spawn/respawn control + virtual int AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) = 0; + virtual float FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) = 0; + virtual Vector VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) = 0; + + // Healthcharger respawn control + virtual float FlHealthChargerRechargeTime() = 0; + + // What happens to a dead player's weapons + virtual int DeadPlayerWeapons(CBasePlayer *pPlayer) = 0; + + // What happens to a dead player's ammo + virtual int DeadPlayerAmmo(CBasePlayer *pPlayer) = 0; + + // Teamplay stuff + virtual const char *GetTeamID(CBaseEntity *pEntity) = 0; + virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) = 0; + + // Monsters + virtual BOOL FAllowMonsters() = 0; +}; + +// CHalfLifeMultiplay - rules for the basic half life multiplayer competition +class CHalfLifeMultiplay: public CGameRules { +protected: + virtual ~CHalfLifeMultiplay() {}; +public: + virtual void RefreshSkillData() = 0; + virtual void Think() = 0; + virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0; + virtual BOOL FAllowFlashlight() = 0; + + virtual BOOL FShouldSwitchWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; + virtual BOOL GetNextBestWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pCurrentWeapon) = 0; + + virtual BOOL IsMultiplayer() = 0; + virtual BOOL IsDeathmatch() = 0; + virtual BOOL IsCoOp() = 0; + + // Client connection/disconnection + // If ClientConnected returns FALSE, the connection is rejected and the user is provided the reason specified in szRejectReason + // Only the client's name and remote address are provided to the dll for verification. + virtual BOOL ClientConnected(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]) = 0; + virtual void InitHUD(CBasePlayer *pl) = 0; + virtual void ClientDisconnected(edict_t *pClient) = 0; + virtual void UpdateGameMode(CBasePlayer *pPlayer) = 0; + + // Client damage rules + virtual float FlPlayerFallDamage(CBasePlayer *pPlayer) = 0; + virtual BOOL FPlayerCanTakeDamage(CBasePlayer *pPlayer, CBaseEntity *pAttacker) = 0; + + // Client spawn/respawn control + virtual void PlayerSpawn(CBasePlayer *pPlayer) = 0; + virtual void PlayerThink(CBasePlayer *pPlayer) = 0; + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer) = 0; + virtual float FlPlayerSpawnTime(CBasePlayer *pPlayer) = 0; + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer) = 0; + + virtual BOOL AllowAutoTargetCrosshair() = 0; + + virtual BOOL ClientCommand_DeadOrAlive(CBasePlayer *pPlayer, const char *pcmd) = 0; + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; + virtual void ClientUserInfoChanged(CBasePlayer *pPlayer, char *infobuffer) = 0; + + // Client kills/scoring + virtual int IPointsForKill(CBasePlayer *pAttacker, CBasePlayer *pKilled) = 0; + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; + virtual void DeathNotice(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; + + // Weapon retrieval + virtual BOOL CanHavePlayerItem(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; + virtual void PlayerGotWeapon(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) = 0; + + // Weapon spawn/respawn control + virtual int WeaponShouldRespawn(CBasePlayerItem *pWeapon) = 0; + virtual float FlWeaponRespawnTime(CBasePlayerItem *pWeapon) = 0; + virtual float FlWeaponTryRespawn(CBasePlayerItem *pWeapon) = 0; + virtual Vector VecWeaponRespawnSpot(CBasePlayerItem *pWeapon) = 0; + + // Item retrieval + virtual BOOL CanHaveItem(CBasePlayer *pPlayer, CItem *pItem) = 0; + virtual void PlayerGotItem(CBasePlayer *pPlayer, CItem *pItem) = 0; + + // Item spawn/respawn control + virtual int ItemShouldRespawn(CItem *pItem) = 0; + virtual float FlItemRespawnTime(CItem *pItem) = 0; + virtual Vector VecItemRespawnSpot(CItem *pItem) = 0; + + // Ammo retrieval + virtual void PlayerGotAmmo(CBasePlayer *pPlayer, char *szName, int iCount) = 0; + + // Ammo spawn/respawn control + virtual int AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) = 0; + virtual float FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) = 0; + virtual Vector VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) = 0; + + // Healthcharger respawn control + virtual float FlHealthChargerRechargeTime() = 0; + virtual float FlHEVChargerRechargeTime() = 0; + + // What happens to a dead player's weapons + virtual int DeadPlayerWeapons(CBasePlayer *pPlayer) = 0; + + // What happens to a dead player's ammo + virtual int DeadPlayerAmmo(CBasePlayer *pPlayer) = 0; + + // Teamplay stuff + virtual const char *GetTeamID(CBaseEntity *pEntity) = 0; + virtual int PlayerRelationship(CBasePlayer *pPlayer, CBaseEntity *pTarget) = 0; + + virtual BOOL PlayTextureSounds() = 0; + + // Monsters + virtual BOOL FAllowMonsters() = 0; + + // Immediately end a multiplayer game + virtual void EndMultiplayerGame() = 0; + virtual void ServerDeactivate() = 0; + virtual void CheckMapConditions() = 0; + + // Recreate all the map entities from the map data (preserving their indices), + // then remove everything else except the players. + // Also get rid of all world decals. + virtual void CleanUpMap() = 0; + + virtual void RestartRound() = 0; + + // check if the scenario has been won/lost + virtual void CheckWinConditions() = 0; + virtual void RemoveGuns() = 0; + virtual void GiveC4() = 0; + virtual void ChangeLevel() = 0; + virtual void GoToIntermission() = 0; + + // Setup counts for m_iNumTerrorist, m_iNumCT, m_iNumSpawnableTerrorist, m_iNumSpawnableCT, etc. + virtual void InitializePlayerCounts(int &NumAliveTerrorist, int &NumAliveCT, int &NumDeadTerrorist, int &NumDeadCT) = 0; + + virtual void BalanceTeams() = 0; + virtual void SwapAllPlayers() = 0; + virtual void UpdateTeamScores() = 0; + virtual void EndRoundMessage(const char *sentence, int event) = 0; + virtual void SetAccountRules(RewardRules rules, int amount) = 0; + virtual RewardAccount GetAccountRules(RewardRules rules) const = 0; + + // BOMB MAP FUNCTIONS + virtual BOOL IsThereABomber() = 0; + virtual BOOL IsThereABomb() = 0; + virtual TeamName SelectDefaultTeam() = 0; + + virtual bool HasRoundTimeExpired() = 0; + virtual bool IsBombPlanted() = 0; + +public: + bool ShouldSkipShowMenu() const { return m_bSkipShowMenu; } + void MarkShowMenuSkipped() { m_bSkipShowMenu = false; } + + bool ShouldSkipSpawn() const { return m_bSkipSpawn; } + void MarkSpawnSkipped() { m_bSkipSpawn = false; } + + float TimeRemaining() { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; } + bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); } + + inline void TerminateRound(float tmDelay, int iWinStatus) + { + m_iRoundWinStatus = iWinStatus; + m_fTeamCount = gpGlobals->time + tmDelay; + m_bRoundTerminating = true; + } +public: + CVoiceGameMgr m_VoiceGameMgr; + float m_fTeamCount; // m_flRestartRoundTime, the global time when the round is supposed to end, if this is not 0 + float m_flCheckWinConditions; + float m_fRoundCount; + int m_iRoundTime; // (From mp_roundtime) - How many seconds long this round is. + int m_iRoundTimeSecs; + int m_iIntroRoundTime; // (From mp_freezetime) - How many seconds long the intro round (when players are frozen) is. + float m_fIntroRoundCount; // The global time when the intro round ends and the real one starts + // wrote the original "m_flRoundTime" comment for this variable). + int m_iAccountTerrorist; + int m_iAccountCT; + int m_iNumTerrorist; // The number of terrorists on the team (this is generated at the end of a round) + int m_iNumCT; // The number of CTs on the team (this is generated at the end of a round) + int m_iNumSpawnableTerrorist; + int m_iNumSpawnableCT; + int m_iSpawnPointCount_Terrorist; // Number of Terrorist spawn points + int m_iSpawnPointCount_CT; // Number of CT spawn points + int m_iHostagesRescued; + int m_iHostagesTouched; + int m_iRoundWinStatus; // 1 == CT's won last round, 2 == Terrorists did, 3 == Draw, no winner + + short m_iNumCTWins; + short m_iNumTerroristWins; + + bool m_bTargetBombed; // whether or not the bomb has been bombed + bool m_bBombDefused; // whether or not the bomb has been defused + + bool m_bMapHasBombTarget; + bool m_bMapHasBombZone; + bool m_bMapHasBuyZone; + bool m_bMapHasRescueZone; + bool m_bMapHasEscapeZone; + + int m_iMapHasVIPSafetyZone; // 0 = uninitialized; 1 = has VIP safety zone; 2 = DOES not have VIP safetyzone + int m_bMapHasCameras; + int m_iC4Timer; + int m_iC4Guy; // The current Terrorist who has the C4. + int m_iLoserBonus; // the amount of money the losing team gets. This scales up as they lose more rounds in a row + int m_iNumConsecutiveCTLoses; // the number of rounds the CTs have lost in a row. + int m_iNumConsecutiveTerroristLoses; // the number of rounds the Terrorists have lost in a row. + + float m_fMaxIdlePeriod; // For the idle kick functionality. This is tha max amount of time that the player has to be idle before being kicked + + int m_iLimitTeams; + bool m_bLevelInitialized; + bool m_bRoundTerminating; + bool m_bCompleteReset; // Set to TRUE to have the scores reset next time round restarts + float m_flRequiredEscapeRatio; + int m_iNumEscapers; + int m_iHaveEscaped; + bool m_bCTCantBuy; + bool m_bTCantBuy; // Who can and can't buy. + float m_flBombRadius; + int m_iConsecutiveVIP; + int m_iTotalGunCount; + int m_iTotalGrenadeCount; + int m_iTotalArmourCount; + int m_iUnBalancedRounds; // keeps track of the # of consecutive rounds that have gone by where one team outnumbers the other team by more than 2 + int m_iNumEscapeRounds; // keeps track of the # of consecutive rounds of escape played.. Teams will be swapped after 8 rounds + int m_iMapVotes[MAX_VOTE_MAPS]; + int m_iLastPick; + int m_iMaxMapTime; + int m_iMaxRounds; + int m_iTotalRoundsPlayed; + int m_iMaxRoundsWon; + int m_iStoredSpectValue; + float m_flForceCameraValue; + float m_flForceChaseCamValue; + float m_flFadeToBlackValue; + CBasePlayer *m_pVIP; + CBasePlayer *m_pVIPQueue[MAX_VIP_QUEUES]; + float m_flIntermissionEndTime; + float m_flIntermissionStartTime; + BOOL m_iEndIntermissionButtonHit; + float m_tmNextPeriodicThink; + bool m_bFirstConnected; + bool m_bInCareerGame; + float m_fCareerRoundMenuTime; + int m_iCareerMatchWins; + int m_iRoundWinDifference; + float m_fCareerMatchMenuTime; + bool m_bSkipSpawn; + + // custom + bool m_bSkipShowMenu; + bool m_bNeededPlayers; + float m_flEscapeRatio; +}; + +typedef struct mapcycle_item_s +{ + struct mapcycle_item_s *next; + char mapname[32]; + int minplayers; + int maxplayers; + char rulebuffer[MAX_RULE_BUFFER]; + +} mapcycle_item_t; + +typedef struct mapcycle_s +{ + struct mapcycle_item_s *items; + struct mapcycle_item_s *next_item; + +} mapcycle_t; + +class CCStrikeGameMgrHelper: public IVoiceGameMgrHelper { +public: + virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender) = 0; +}; + +extern CGameRules *g_pGameRules; + +inline CHalfLifeMultiplay *CSGameRules() +{ + return reinterpret_cast(g_pGameRules); +} diff --git a/cssdk/dlls/h_battery.h b/cssdk/dlls/h_battery.h new file mode 100644 index 0000000..e523dd6 --- /dev/null +++ b/cssdk/dlls/h_battery.h @@ -0,0 +1,45 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CRecharge: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float m_flNextCharge; + int m_iReactivate; + int m_iJuice; + int m_iOn; + float m_flSoundTime; +}; diff --git a/cssdk/dlls/h_cycler.h b/cssdk/dlls/h_cycler.h new file mode 100644 index 0000000..5f9ab00 --- /dev/null +++ b/cssdk/dlls/h_cycler.h @@ -0,0 +1,104 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CCycler: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + + // Don't treat as a live target + virtual BOOL IsAlive() = 0; + virtual void Think() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int m_animate; +}; + +// we should get rid of all the other cyclers and replace them with this. +class CGenericCycler: public CCycler { +public: + virtual void Spawn() = 0; +}; + +// Probe droid imported for tech demo compatibility +class CCyclerProbe: public CCycler { +public: + virtual void Spawn() = 0; +}; + +class CCyclerSprite: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Restart() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual void Think() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + inline int ShouldAnimate() { return (m_animate && m_maxFrame > 1.0f); } +public: + int m_animate; + float m_lastTime; + float m_maxFrame; + int m_renderfx; + int m_rendermode; + float m_renderamt; + vec3_t m_rendercolor; +}; + +class CWeaponCycler: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal = 0) = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; +public: + int m_iszModel; + int m_iModel; +}; + +// Flaming Wreakage +class CWreckage: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Think() = 0; +public: + int m_flStartTime; +}; diff --git a/cssdk/dlls/healthkit.h b/cssdk/dlls/healthkit.h new file mode 100644 index 0000000..eb4e63d --- /dev/null +++ b/cssdk/dlls/healthkit.h @@ -0,0 +1,52 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CHealthKit: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CWallHealth: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float m_flNextCharge; + int m_iReactivate; + int m_iJuice; + int m_iOn; + float m_flSoundTime; +}; diff --git a/cssdk/dlls/hintmessage.h b/cssdk/dlls/hintmessage.h new file mode 100644 index 0000000..ce63fde --- /dev/null +++ b/cssdk/dlls/hintmessage.h @@ -0,0 +1,81 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "utlvector.h" + +#define DHF_ROUND_STARTED (1<<1) +#define DHF_HOSTAGE_SEEN_FAR (1<<2) +#define DHF_HOSTAGE_SEEN_NEAR (1<<3) +#define DHF_HOSTAGE_USED (1<<4) +#define DHF_HOSTAGE_INJURED (1<<5) +#define DHF_HOSTAGE_KILLED (1<<6) +#define DHF_FRIEND_SEEN (1<<7) +#define DHF_ENEMY_SEEN (1<<8) +#define DHF_FRIEND_INJURED (1<<9) +#define DHF_FRIEND_KILLED (1<<10) +#define DHF_ENEMY_KILLED (1<<11) +#define DHF_BOMB_RETRIEVED (1<<12) +#define DHF_AMMO_EXHAUSTED (1<<15) +#define DHF_IN_TARGET_ZONE (1<<16) +#define DHF_IN_RESCUE_ZONE (1<<17) +#define DHF_IN_ESCAPE_ZONE (1<<18) +#define DHF_IN_VIPSAFETY_ZONE (1<<19) +#define DHF_NIGHTVISION (1<<20) +#define DHF_HOSTAGE_CTMOVE (1<<21) +#define DHF_SPEC_DUCK (1<<22) + +#define DHM_ROUND_CLEAR (DHF_ROUND_STARTED | DHF_HOSTAGE_KILLED | DHF_FRIEND_KILLED | DHF_BOMB_RETRIEVED) +#define DHM_CONNECT_CLEAR (DHF_HOSTAGE_SEEN_FAR | DHF_HOSTAGE_SEEN_NEAR | DHF_HOSTAGE_USED | DHF_HOSTAGE_INJURED | DHF_FRIEND_SEEN | DHF_ENEMY_SEEN | DHF_FRIEND_INJURED | DHF_ENEMY_KILLED | DHF_AMMO_EXHAUSTED | DHF_IN_TARGET_ZONE | DHF_IN_RESCUE_ZONE | DHF_IN_ESCAPE_ZONE | DHF_IN_VIPSAFETY_ZONE | DHF_HOSTAGE_CTMOVE | DHF_SPEC_DUCK) + +class CHintMessage { +public: + CHintMessage(const char *hintString, bool isHint, CUtlVector *args, float duration); + ~CHintMessage(); +public: + float GetDuration() const { return m_duration; } + void Send(CBaseEntity *client); + +private: + const char *m_hintString; + bool m_isHint; + CUtlVector m_args; + float m_duration; +}; + +class CHintMessageQueue { +public: + void Reset(); + void Update(CBaseEntity *client); + bool AddMessage(const char *message, float duration, bool isHint, CUtlVector *args); + bool IsEmpty() const { return m_messages.Count() == 0; } + +private: + float m_tmMessageEnd; + CUtlVector m_messages; +}; diff --git a/cssdk/dlls/hookchains.h b/cssdk/dlls/hookchains.h new file mode 100644 index 0000000..408d8a4 --- /dev/null +++ b/cssdk/dlls/hookchains.h @@ -0,0 +1,110 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +template +class IHookChain { +protected: + virtual ~IHookChain() {} + +public: + virtual t_ret callNext(t_args... args) = 0; + virtual t_ret callOriginal(t_args... args) = 0; +}; + +template +class IHookChainClass { +protected: + virtual ~IHookChainClass() {} + +public: + virtual t_ret callNext(t_class *, t_args... args) = 0; + virtual t_ret callOriginal(t_class *, t_args... args) = 0; +}; + +template +class IVoidHookChain +{ +protected: + virtual ~IVoidHookChain() {} + +public: + virtual void callNext(t_args... args) = 0; + virtual void callOriginal(t_args... args) = 0; +}; + +template +class IVoidHookChainClass +{ +protected: + virtual ~IVoidHookChainClass() {} + +public: + virtual void callNext(t_class *, t_args... args) = 0; + virtual void callOriginal(t_class *, t_args... args) = 0; +}; + +// Hook chain registry(for hooks [un]registration) +template +class IHookChainRegistry { +public: + typedef t_ret(*hookfunc_t)(IHookChain*, t_args...); + + virtual void registerHook(hookfunc_t hook) = 0; + virtual void unregisterHook(hookfunc_t hook) = 0; +}; + +// Hook chain registry(for hooks [un]registration) +template +class IHookChainRegistryClass { +public: + typedef t_ret(*hookfunc_t)(IHookChainClass*, t_class *, t_args...); + + virtual void registerHook(hookfunc_t hook) = 0; + virtual void unregisterHook(hookfunc_t hook) = 0; +}; + +// Hook chain registry(for hooks [un]registration) +template +class IVoidHookChainRegistry { +public: + typedef void(*hookfunc_t)(IVoidHookChain*, t_args...); + + virtual void registerHook(hookfunc_t hook) = 0; + virtual void unregisterHook(hookfunc_t hook) = 0; +}; + +// Hook chain registry(for hooks [un]registration) +template +class IVoidHookChainRegistryClass { +public: + typedef void(*hookfunc_t)(IVoidHookChainClass*, t_class *, t_args...); + + virtual void registerHook(hookfunc_t hook) = 0; + virtual void unregisterHook(hookfunc_t hook) = 0; +}; diff --git a/cssdk/dlls/hostage/hostage.h b/cssdk/dlls/hostage/hostage.h new file mode 100644 index 0000000..2819339 --- /dev/null +++ b/cssdk/dlls/hostage/hostage.h @@ -0,0 +1,232 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// Improved the hostages from CZero +#include "hostage/hostage_improv.h" + +#define MAX_NODES 100 +#define MAX_HOSTAGES 12 +#define MAX_HOSTAGES_NAV 20 + +#define HOSTAGE_STEPSIZE 26.0f +#define HOSTAGE_STEPSIZE_DEFAULT 18.0f + +#define VEC_HOSTAGE_VIEW Vector(0, 0, 12) +#define VEC_HOSTAGE_HULL_MIN Vector(-10, -10, 0) +#define VEC_HOSTAGE_HULL_MAX Vector(10, 10, 62) + +#define VEC_HOSTAGE_CROUCH Vector(10, 10, 30) +#define RESCUE_HOSTAGES_RADIUS 256.0f // rescue zones from legacy info_* + +class CHostage; +class CLocalNav; +class CHostageImprov; +class CHostageManager; + +enum HostageChatterType +{ + HOSTAGE_CHATTER_START_FOLLOW = 0, + HOSTAGE_CHATTER_STOP_FOLLOW, + HOSTAGE_CHATTER_INTIMIDATED, + HOSTAGE_CHATTER_PAIN, + HOSTAGE_CHATTER_SCARED_OF_GUNFIRE, + HOSTAGE_CHATTER_SCARED_OF_MURDER, + HOSTAGE_CHATTER_LOOK_OUT, + HOSTAGE_CHATTER_PLEASE_RESCUE_ME, + HOSTAGE_CHATTER_SEE_RESCUE_ZONE, + HOSTAGE_CHATTER_IMPATIENT_FOR_RESCUE, + HOSTAGE_CHATTER_CTS_WIN , + HOSTAGE_CHATTER_TERRORISTS_WIN, + HOSTAGE_CHATTER_RESCUED, + HOSTAGE_CHATTER_WARN_NEARBY, + HOSTAGE_CHATTER_WARN_SPOTTED, + HOSTAGE_CHATTER_CALL_TO_RESCUER, + HOSTAGE_CHATTER_RETREAT, + HOSTAGE_CHATTER_COUGH, + HOSTAGE_CHATTER_BLINDED, + HOSTAGE_CHATTER_SAW_HE_GRENADE, + HOSTAGE_CHATTER_DEATH_CRY, + NUM_HOSTAGE_CHATTER_TYPES, +}; + +extern CHostageManager *g_pHostages; +extern int g_iHostageNumber; + +// A Counter-Strike Hostage Simple +class CHostage: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int ObjectCaps() = 0; // make hostage "useable" + virtual int Classify() = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual int BloodColor() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int GetActivity() { return m_Activity; } + + // queries + bool IsFollowingSomeone() { return IsFollowing(); } + CBaseEntity *GetLeader() // return our leader, or NULL + { + if (m_improv != NULL) + { + return m_improv->GetFollowLeader(); + } + + return m_hTargetEnt; + } + bool IsFollowing(const CBaseEntity *entity = NULL) + { + if (m_improv != NULL) + { + return m_improv->IsFollowing(); + } + + if (entity == NULL && m_hTargetEnt == NULL || (entity != NULL && m_hTargetEnt != entity)) + return false; + + if (m_State != FOLLOW) + return false; + + return true; + } + bool IsValid() { return (pev->takedamage == DAMAGE_YES); } + bool IsDead() { return (pev->deadflag == DEAD_DEAD); } + bool IsAtHome() { return (pev->origin - m_vStart).IsLengthGreaterThan(20) != true; } + const Vector *GetHomePosition() { return &m_vStart; } +public: + int m_Activity; + BOOL m_bTouched; + BOOL m_bRescueMe; + float m_flFlinchTime; + float m_flNextChange; + float m_flMarkPosition; + int m_iModel; + int m_iSkin; + float m_flNextRadarTime; + enum state { FOLLOW, STAND, DUCK, SCARED, IDLE, FOLLOWPATH } + m_State; + Vector m_vStart; + Vector m_vStartAngles; + Vector m_vPathToFollow[20]; + int m_iWaypoint; + CBasePlayer *m_target; + CLocalNav *m_LocalNav; + int nTargetNode; + Vector vecNodes[MAX_NODES]; + EHANDLE m_hStoppedTargetEnt; + float m_flNextFullThink; + float m_flPathCheckInterval; + float m_flLastPathCheck; + int m_nPathNodes; + BOOL m_fHasPath; + float m_flPathAcquired; + Vector m_vOldPos; + int m_iHostageIndex; + BOOL m_bStuck; + float m_flStuckTime; + CHostageImprov *m_improv; + + enum ModelType { REGULAR_GUY, OLD_GUY, BLACK_GUY, GOOFY_GUY } + m_whichModel; +}; + +class SimpleChatter { +public: + struct SoundFile + { + char *filename; + float duration; + }; + + struct ChatterSet + { + SoundFile file[32]; + int count; + int index; + bool needsShuffle; + }; +private: + ChatterSet m_chatter[21]; +}; + +class CHostageManager { +public: + SimpleChatter *GetChatter() + { + return &m_chatter; + } + // Iterate over all active hostages in the game, invoking functor on each. + // If functor returns false, stop iteration and return false. + template + inline bool ForEachHostage(Functor &func) const + { + for (int i = 0; i < m_hostageCount; i++) + { + CHostage *hostage = m_hostage[i]; + + if (hostage == NULL || hostage->pev->deadflag == DEAD_DEAD) + continue; + + if (func(hostage) == false) + return false; + } + + return true; + } + inline CHostage *GetClosestHostage(const Vector &pos, float *resultRange = NULL) + { + float range; + float closeRange = 1e8f; + CHostage *close = NULL; + + for (int i = 0; i < m_hostageCount; i++) + { + range = (m_hostage[i]->pev->origin - pos).Length(); + + if (range < closeRange) + { + closeRange = range; + close = m_hostage[i]; + } + } + + if (resultRange) + *resultRange = closeRange; + + return close; + } + +private: + CHostage *m_hostage[MAX_HOSTAGES]; + int m_hostageCount; + SimpleChatter m_chatter; +}; diff --git a/cssdk/dlls/hostage/hostage_improv.h b/cssdk/dlls/hostage/hostage_improv.h new file mode 100644 index 0000000..9ec69a7 --- /dev/null +++ b/cssdk/dlls/hostage/hostage_improv.h @@ -0,0 +1,331 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "hostage/hostage.h" +#include "hostage/hostage_states.h" + +class CHostage; +enum HostageChatterType; + +// A Counter-Strike Hostage improved +class CHostageImprov: public CImprov { +public: + // invoked when an improv reaches its MoveTo goal + virtual void OnMoveToSuccess(const Vector &goal) = 0; + + // invoked when an improv fails to reach a MoveTo goal + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) = 0; + virtual void OnInjury(float amount) = 0; + virtual bool IsAlive() const = 0; + virtual void MoveTo(const Vector &goal) = 0; + virtual void LookAt(const Vector &target) = 0; + virtual void ClearLookAt() = 0; + virtual void FaceTo(const Vector &goal) = 0; + virtual void ClearFaceTo() = 0; + virtual bool IsAtMoveGoal(float error = 20.0f) const = 0; + virtual bool HasLookAt() const = 0; + virtual bool HasFaceTo() const = 0; + virtual bool IsAtFaceGoal() const = 0; + virtual bool IsFriendInTheWay(const Vector &goalPos) const = 0; + virtual bool IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const = 0; + virtual void MoveForward() = 0; + virtual void MoveBackward() = 0; + virtual void StrafeLeft() = 0; + virtual void StrafeRight() = 0; + + #define HOSTAGE_MUST_JUMP true + virtual bool Jump() = 0; + + virtual void Crouch() = 0; + virtual void StandUp() = 0; + virtual void TrackPath(const Vector &pathGoal, float deltaT) = 0; // move along path by following "pathGoal" + virtual void StartLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos) = 0; + virtual bool TraverseLadder(const CNavLadder *ladder, NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT) = 0; + virtual bool GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal = NULL) = 0; + virtual void Run() = 0; + virtual void Walk() = 0; + virtual void Stop() = 0; + virtual float GetMoveAngle() const = 0; + virtual float GetFaceAngle() const = 0; + virtual const Vector &GetFeet() const = 0; + virtual const Vector &GetCentroid() const = 0; + virtual const Vector &GetEyes() const = 0; + virtual bool IsRunning() const = 0; + virtual bool IsWalking() const = 0; + virtual bool IsStopped() const = 0; + virtual bool IsCrouching() const = 0; + virtual bool IsJumping() const = 0; + virtual bool IsUsingLadder() const = 0; + virtual bool IsOnGround() const = 0; + virtual bool IsMoving() const = 0; + virtual bool CanRun() const = 0; + virtual bool CanCrouch() const = 0; + virtual bool CanJump() const = 0; + virtual bool IsVisible(const Vector &pos, bool testFOV = false) const = 0; // return true if hostage can see position + virtual bool IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance = 0.95f) const = 0; + virtual CBasePlayer *IsAnyPlayerLookingAtMe(int team = 0, float cosTolerance = 0.95f) const = 0; + virtual CBasePlayer *GetClosestPlayerByTravelDistance(int team = 0, float *range = NULL) const = 0; + virtual CNavArea *GetLastKnownArea() const = 0; + virtual void OnUpdate(float deltaT) = 0; + virtual void OnUpkeep(float deltaT) = 0; + virtual void OnReset() = 0; + virtual void OnGameEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL) = 0; + virtual void OnTouch(CBaseEntity *other) = 0; // in contact with "other" +public: + enum MoveType { Stopped, Walking, Running }; + enum ScareType { NERVOUS, SCARED, TERRIFIED }; + + const Vector &GetKnownGoodPosition() const { return m_knownGoodPos; } + void ApplyForce(Vector force) { m_vel.x += force.x; m_vel.y += force.y; } // apply a force to the hostage + const Vector GetActualVelocity() const { return m_actualVel; } + void SetMoveLimit(MoveType limit) { m_moveLimit = limit; } + MoveType GetMoveLimit() const { return m_moveLimit; } + CNavPath *GetPath() { return &m_path; } + + // hostage states + // stand idle + void Idle() { m_behavior.SetState(&m_idleState); } + bool IsIdle() const { return m_behavior.IsState(&m_idleState); } + + // begin following "leader" + void Follow(CBasePlayer *leader) { m_followState.SetLeader(leader); m_behavior.SetState(&m_followState); } + bool IsFollowing(const CBaseEntity *leader = NULL) const { return m_behavior.IsState(&m_followState); } + + // Escape + void Escape() { m_behavior.SetState(&m_escapeState); } + bool IsEscaping() const { return m_behavior.IsState(&m_escapeState); } + + // Retreat + void Retreat() { m_behavior.SetState(&m_retreatState); } + bool IsRetreating() const { return m_behavior.IsState(&m_retreatState); } + + CBaseEntity *GetFollowLeader() const { return m_followState.GetLeader(); } + ScareType GetScareIntensity() const { return m_scareIntensity; } + bool IsIgnoringTerrorists() const { return m_ignoreTerroristTimer.IsElapsed(); } + float GetAggression() const { return m_aggression; } + bool IsTalking() const { return m_talkingTimer.IsElapsed(); } + CHostage *GetEntity() const { return m_hostage; } + void SetMoveAngle(float angle) { m_moveAngle = angle; } +public: + CountdownTimer m_coughTimer; + CountdownTimer m_grenadeTimer; +private: + CHostage *m_hostage; + CNavArea *m_lastKnownArea; // last area we were in + mutable Vector m_centroid; + mutable Vector m_eye; + HostageStateMachine m_behavior; + HostageIdleState m_idleState; + HostageEscapeState m_escapeState; + HostageRetreatState m_retreatState; + HostageFollowState m_followState; + HostageAnimateState m_animateState; + bool m_didFidget; + float m_aggression; + IntervalTimer m_lastSawCT; + IntervalTimer m_lastSawT; + CountdownTimer m_checkNearbyTerroristTimer; + bool m_isTerroristNearby; + CountdownTimer m_nearbyTerroristTimer; + CountdownTimer m_scaredTimer; + ScareType m_scareIntensity; + CountdownTimer m_ignoreTerroristTimer; + CountdownTimer m_blinkTimer; + char m_blinkCounter; + IntervalTimer m_lastInjuryTimer; + IntervalTimer m_lastNoiseTimer; + mutable CountdownTimer m_avoidFriendTimer; + mutable bool m_isFriendInTheWay; + CountdownTimer m_chatterTimer; + bool m_isDelayedChatterPending; + CountdownTimer m_delayedChatterTimer; + HostageChatterType m_delayedChatterType; + bool m_delayedChatterMustSpeak; + CountdownTimer m_talkingTimer; + unsigned int m_moveFlags; + Vector2D m_vel; + Vector m_actualVel; + Vector m_moveGoal; + Vector m_knownGoodPos; + bool m_hasKnownGoodPos; + Vector m_priorKnownGoodPos; + bool m_hasPriorKnownGoodPos; + CountdownTimer m_priorKnownGoodPosTimer; + IntervalTimer m_collisionTimer; + Vector m_viewGoal; + bool m_isLookingAt; + Vector m_faceGoal; + bool m_isFacingTo; + CNavPath m_path; // current path to follow + CNavPathFollower m_follower; + Vector m_lastPosition; + MoveType m_moveType; + MoveType m_moveLimit; + bool m_isCrouching; // true if hostage is crouching + CountdownTimer m_minCrouchTimer; + float m_moveAngle; + NavRelativeDirType m_wiggleDirection; + + CountdownTimer m_wiggleTimer; // for wiggling + CountdownTimer m_wiggleJumpTimer; + CountdownTimer m_inhibitObstacleAvoidance; + CountdownTimer m_jumpTimer; // if zero, we can jump + + bool m_hasJumped; + bool m_hasJumpedIntoAir; + Vector m_jumpTarget; + CountdownTimer m_clearPathTimer; + bool m_traversingLadder; + EHANDLE m_visiblePlayer[MAX_CLIENTS]; + int m_visiblePlayerCount; + CountdownTimer m_visionTimer; +}; + +class CheckWayFunctor { +public: + CheckWayFunctor(const CHostageImprov *me, const Vector &goalPos) + { + m_me = me; + m_goalPos = goalPos; + m_blocker = NULL; + } + bool operator()(CHostage *them) + { + if (((CBaseMonster *)them)->IsAlive() && m_me->IsFriendInTheWay((CBaseEntity *)them, m_goalPos)) + { + m_blocker = them; + return false; + } + + return true; + } + + const CHostageImprov *m_me; + Vector m_goalPos; + CHostage *m_blocker; +}; + +// Functor used with NavAreaBuildPath() for building Hostage paths. +// Once we hook up crouching and ladders, this can be removed and ShortestPathCost() can be used instead. +class HostagePathCost { +public: + float operator()(CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder) + { + if (fromArea == NULL) + { + // first area in path, no cost + return 0.0f; + } + else + { + // compute distance travelled along path so far + float dist; + + if (ladder != NULL) + { + const float ladderCost = 10.0f; + return ladder->m_length * ladderCost + fromArea->GetCostSoFar(); + } + else + { + dist = (*area->GetCenter() - *fromArea->GetCenter()).Length(); + } + + float cost = dist + fromArea->GetCostSoFar(); + + // if this is a "crouch" area, add penalty + if (area->GetAttributes() & NAV_CROUCH) + { + const float crouchPenalty = 10.0f; + cost += crouchPenalty * dist; + } + + // if this is a "jump" area, add penalty + if (area->GetAttributes() & NAV_JUMP) + { + const float jumpPenalty = 10.0f; + cost += jumpPenalty * dist; + } + + return cost; + } + } +}; + +class KeepPersonalSpace { +public: + KeepPersonalSpace(CHostageImprov *improv) + { + m_improv = improv; + m_velDir = improv->GetActualVelocity(); + m_speed = m_velDir.NormalizeInPlace(); + } + bool operator()(CBaseEntity *entity) + { + const float space = 1.0f; + Vector to; + float range; + + if (entity == reinterpret_cast(m_improv->GetEntity())) + return true; + + if (entity->IsPlayer() && !entity->IsAlive()) + return true; + + to = entity->pev->origin - m_improv->GetCentroid(); + range = to.NormalizeInPlace(); + + CBasePlayer *player = static_cast(entity); + + const float spring = 50.0f; + const float damper = 1.0f; + + if (range >= spring) + return true; + + const float cosTolerance = 0.8f; + if (entity->IsPlayer() && player->m_iTeam == CT && !m_improv->IsFollowing() && m_improv->IsPlayerLookingAtMe(player, cosTolerance)) + return true; + + const float minSpace = (spring - range); + float ds = -minSpace; + + m_improv->ApplyForce(to * ds); + + const float force = 0.1f; + m_improv->ApplyForce(m_speed * -force * m_velDir); + + return true; + } + +private: + CHostageImprov *m_improv; + Vector m_velDir; + float m_speed; +}; diff --git a/cssdk/dlls/hostage/hostage_localnav.h b/cssdk/dlls/hostage/hostage_localnav.h new file mode 100644 index 0000000..5a40e6f --- /dev/null +++ b/cssdk/dlls/hostage/hostage_localnav.h @@ -0,0 +1,58 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define NODE_INVALID_EMPTY -1 + +#define PATH_TRAVERSABLE_EMPTY 0 +#define PATH_TRAVERSABLE_SLOPE 1 +#define PATH_TRAVERSABLE_STEP 2 +#define PATH_TRAVERSABLE_STEPJUMPABLE 3 + +typedef int node_index_t; + +typedef struct localnode_s +{ + Vector vecLoc; + int offsetX; + int offsetY; + byte bDepth; + BOOL fSearched; + node_index_t nindexParent; + +} localnode_t; + +class CLocalNav { +private: + CHostage *m_pOwner; + edict_t *m_pTargetEnt; + BOOL m_fTargetEntHit; + localnode_t *m_nodeArr; + node_index_t m_nindexAvailableNode; + Vector m_vecStartingLoc; +}; diff --git a/cssdk/dlls/hostage/hostage_states.h b/cssdk/dlls/hostage/hostage_states.h new file mode 100644 index 0000000..9ac99cf --- /dev/null +++ b/cssdk/dlls/hostage/hostage_states.h @@ -0,0 +1,203 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CHostageImprov; + +class HostageState: public SimpleState, public IImprovEvent { +public: + virtual ~HostageState() {} + virtual void UpdateStationaryAnimation(CHostageImprov *improv) {} +}; + +class HostageStateMachine: public SimpleStateMachine, public IImprovEvent { +public: + virtual void OnMoveToSuccess(const Vector &goal) {} + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) {} + virtual void OnInjury(float amount) {} +}; + +class HostageIdleState: public HostageState { +public: + virtual ~HostageIdleState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Idle"; } + virtual void UpdateStationaryAnimation(CHostageImprov *improv) {} + virtual void OnMoveToSuccess(const Vector &goal) {} + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) {} + virtual void OnInjury(float amount = -1.0f) {} +private: + CountdownTimer m_waveTimer; + CountdownTimer m_fleeTimer; + CountdownTimer m_disagreeTimer; + CountdownTimer m_escapeTimer; + CountdownTimer m_askTimer; + IntervalTimer m_intimidatedTimer; + CountdownTimer m_pleadTimer; + + enum + { + NotMoving = 0, + Moving, + MoveDone, + MoveFailed, + } m_moveState; + + bool m_mustFlee; +}; + +class HostageEscapeToCoverState: public HostageState { +public: + virtual ~HostageEscapeToCoverState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Escape:ToCover"; } + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) {} +public: + void SetRescueGoal(const Vector &rescueGoal) { m_rescueGoal = rescueGoal; } + +private: + Vector m_rescueGoal; + Vector m_spot; + bool m_canEscape; +}; + +class HostageEscapeLookAroundState: public HostageState { +public: + virtual ~HostageEscapeLookAroundState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Escape:LookAround"; } + +private: + CountdownTimer m_timer; +}; + +class HostageEscapeState: public HostageState { +public: + virtual ~HostageEscapeState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Escape"; } + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) {} +public: + void ToCover() { m_behavior.SetState(&m_toCoverState); } + void LookAround() { m_behavior.SetState(&m_lookAroundState); } +private: + HostageEscapeToCoverState m_toCoverState; + HostageEscapeLookAroundState m_lookAroundState; + HostageStateMachine m_behavior; + bool m_canEscape; + CountdownTimer m_runTimer; +}; + +class HostageRetreatState: public HostageState { +public: + virtual ~HostageRetreatState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Retreat"; } +}; + +class HostageFollowState: public HostageState { +public: + virtual ~HostageFollowState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Follow"; } + virtual void UpdateStationaryAnimation(CHostageImprov *improv) {} +public: + void SetLeader(CBaseEntity *leader) { m_leader = leader; } + CBaseEntity *GetLeader() const { return m_leader; } +private: + mutable EHANDLE m_leader; + Vector m_lastLeaderPos; + bool m_isWaiting; + float m_stopRange; + CountdownTimer m_makeWayTimer; + CountdownTimer m_impatientTimer; + CountdownTimer m_repathTimer; + bool m_isWaitingForFriend; + CountdownTimer m_waitForFriendTimer; +}; + +class HostageAnimateState: public HostageState { +public: + virtual ~HostageAnimateState() {} + virtual void OnEnter(CHostageImprov *improv) {} + virtual void OnUpdate(CHostageImprov *improv) {} + virtual void OnExit(CHostageImprov *improv) {} + virtual const char *GetName() const { return "Animate"; } +public: + struct SeqInfo + { + int seqID; + float holdTime; + float rate; + }; + + enum PerformanceType + { + None = 0, + Walk, + Run, + Jump, + Fall, + Crouch, + CrouchWalk, + Calm, + Anxious, + Afraid, + Sitting, + GettingUp, + Waving, + LookingAround, + Disagreeing, + Flinching, + }; + + bool IsBusy() const { return (m_sequenceCount > 0); } + int GetCurrentSequenceID() { return m_currentSequence; } + PerformanceType GetPerformance() const { return m_performance; } + void SetPerformance(PerformanceType performance) { m_performance = performance; } +private: + enum { MAX_SEQUENCES = 8 }; + struct SeqInfo m_sequence[MAX_SEQUENCES]; + int m_sequenceCount; + int m_currentSequence; + enum PerformanceType m_performance; + bool m_isHolding; + CountdownTimer m_holdTimer; +}; diff --git a/cssdk/dlls/items.h b/cssdk/dlls/items.h new file mode 100644 index 0000000..e485295 --- /dev/null +++ b/cssdk/dlls/items.h @@ -0,0 +1,155 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +enum ItemRestType +{ + ITEM_TYPE_BUYING, // when a player buying items + ITEM_TYPE_TOUCHED, // when the player touches with a weaponbox or armoury_entity + ITEM_TYPE_EQUIPPED // when a entity game_player_equip gives item to player or default item's on player spawn +}; + +// constant items +#define ITEM_ID_ANTIDOTE 2 +#define ITEM_ID_SECURITY 3 + +enum ItemID +{ + ITEM_NONE = -1, + ITEM_SHIELDGUN, + ITEM_P228, + ITEM_GLOCK, + ITEM_SCOUT, + ITEM_HEGRENADE, + ITEM_XM1014, + ITEM_C4, + ITEM_MAC10, + ITEM_AUG, + ITEM_SMOKEGRENADE, + ITEM_ELITE, + ITEM_FIVESEVEN, + ITEM_UMP45, + ITEM_SG550, + ITEM_GALIL, + ITEM_FAMAS, + ITEM_USP, + ITEM_GLOCK18, + ITEM_AWP, + ITEM_MP5N, + ITEM_M249, + ITEM_M3, + ITEM_M4A1, + ITEM_TMP, + ITEM_G3SG1, + ITEM_FLASHBANG, + ITEM_DEAGLE, + ITEM_SG552, + ITEM_AK47, + ITEM_KNIFE, + ITEM_P90, + ITEM_NVG, + ITEM_DEFUSEKIT, + ITEM_KEVLAR, + ITEM_ASSAULT, + ITEM_LONGJUMP, + ITEM_SODACAN, + ITEM_HEALTHKIT, + ITEM_ANTIDOTE, + ITEM_BATTERY +}; + +class CItem: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual CBaseEntity *Respawn() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CWorldItem: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +public: + int m_iType; +}; + +class CItemSuit: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemBattery: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemAntidote: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemSecurity: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemLongJump: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemKevlar: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemAssaultSuit: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; + +class CItemThighPack: public CItem { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual BOOL MyTouch(CBasePlayer *pPlayer) = 0; +}; diff --git a/cssdk/dlls/lights.h b/cssdk/dlls/lights.h new file mode 100644 index 0000000..df0fb68 --- /dev/null +++ b/cssdk/dlls/lights.h @@ -0,0 +1,50 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_LIGHT_START_OFF 1 + +class CLight: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +private: + int m_iStyle; + int m_iszPattern; + BOOL m_iStartedOff; +}; + +class CEnvLight: public CLight { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +}; diff --git a/cssdk/dlls/mapinfo.h b/cssdk/dlls/mapinfo.h new file mode 100644 index 0000000..8e3c2de --- /dev/null +++ b/cssdk/dlls/mapinfo.h @@ -0,0 +1,40 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class CMapInfo: public CPointEntity +{ +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + +public: + InfoMapBuyParam m_iBuyingStatus; + float m_flBombRadius; +}; diff --git a/cssdk/dlls/maprules.h b/cssdk/dlls/maprules.h new file mode 100644 index 0000000..dde173e --- /dev/null +++ b/cssdk/dlls/maprules.h @@ -0,0 +1,236 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define MAX_EQUIP 32 +#define SF_SCORE_NEGATIVE 0x0001 +#define SF_SCORE_TEAM 0x0002 + +#define SF_ENVTEXT_ALLPLAYERS 0x0001 + +#define SF_TEAMMASTER_FIREONCE 0x0001 +#define SF_TEAMMASTER_ANYTEAM 0x0002 + +#define SF_TEAMSET_FIREONCE 0x0001 +#define SF_TEAMSET_CLEARTEAM 0x0002 + +#define SF_PKILL_FIREONCE 0x0001 + +#define SF_GAMECOUNT_FIREONCE 0x0001 +#define SF_GAMECOUNT_RESET 0x0002 + +#define SF_GAMECOUNTSET_FIREONCE 0x0001 + +#define SF_PLAYEREQUIP_USEONLY 0x0001 + +#define SF_PTEAM_FIREONCE 0x0001 +#define SF_PTEAM_KILL 0x0002 +#define SF_PTEAM_GIB 0x0004 + +class CRuleEntity: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; +public: + void SetMaster(int iszMaster) { m_iszMaster = iszMaster; } + +private: + string_t m_iszMaster; +}; + +// CRulePointEntity -- base class for all rule "point" entities (not brushes) +class CRulePointEntity: public CRuleEntity { +public: + virtual void Spawn() = 0; +}; + +// CRuleBrushEntity -- base class for all rule "brush" entities (not brushes) +// Default behavior is to set up like a trigger, invisible, but keep the model for volume testing +class CRuleBrushEntity: public CRuleEntity { +public: + virtual void Spawn() = 0; +}; + +// CGameScore / game_score -- award points to player / team +// Points +/- total +// Flag: Allow negative scores SF_SCORE_NEGATIVE +// Flag: Award points to team in teamplay SF_SCORE_TEAM +class CGameScore: public CRulePointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + int Points() const { return int(pev->frags); } + BOOL AllowNegativeScore() { return pev->spawnflags & SF_SCORE_NEGATIVE; } + BOOL AwardToTeam() const { return pev->spawnflags & SF_SCORE_TEAM; } + void SetPoints(int points) { pev->frags = points; } +}; + +// CGameEnd / game_end -- Ends the game in MP +class CGameEnd: public CRulePointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +// CGameText / game_text -- NON-Localized HUD Message (use env_message to display a titles.txt message) +// Flag: All players SF_ENVTEXT_ALLPLAYERS +class CGameText: public CRulePointEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + +public: + BOOL MessageToAll() const { return (pev->spawnflags & SF_ENVTEXT_ALLPLAYERS) == SF_ENVTEXT_ALLPLAYERS; } + void MessageSet(const char *pMessage) { pev->message = ALLOC_STRING(pMessage); } + const char *MessageGet() const { return STRING(pev->message); } + +private: + hudtextparms_t m_textParms; +}; + +// CGameTeamMaster / game_team_master -- "Masters" like multisource, but based on the team of the activator +// Only allows mastered entity to fire if the team matches my team +// +// team index (pulled from server team list "mp_teamlist" +// Flag: Remove on Fire +// Flag: Any team until set? -- Any team can use this until the team is set (otherwise no teams can use it) +class CGameTeamMaster: public CRulePointEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int ObjectCaps() = 0; + virtual BOOL IsTriggered(CBaseEntity *pActivator) = 0; + virtual const char *TeamID() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_TEAMMASTER_FIREONCE) == SF_TEAMMASTER_FIREONCE; } + BOOL AnyTeam() const { return (pev->spawnflags & SF_TEAMMASTER_ANYTEAM) == SF_TEAMMASTER_ANYTEAM; } + +public: + int m_teamIndex; + USE_TYPE triggerType; +}; + +// CGameTeamSet / game_team_set -- Changes the team of the entity it targets to the activator's team +// Flag: Fire once +// Flag: Clear team -- Sets the team to "NONE" instead of activator +class CGameTeamSet: public CRulePointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_TEAMSET_FIREONCE) == SF_TEAMSET_FIREONCE; } + BOOL ShouldClearTeam() const { return (pev->spawnflags & SF_TEAMSET_CLEARTEAM) == SF_TEAMSET_CLEARTEAM; } +}; + +// CGamePlayerZone / game_player_zone -- players in the zone fire my target when I'm fired +// Needs master? +class CGamePlayerZone: public CRuleBrushEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +private: + string_t m_iszInTarget; + string_t m_iszOutTarget; + string_t m_iszInCount; + string_t m_iszOutCount; +}; + +// CGamePlayerHurt / game_player_hurt -- Damages the player who fires it +// Flag: Fire once +class CGamePlayerHurt: public CRulePointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_PKILL_FIREONCE) == SF_PKILL_FIREONCE; } +}; + +// CGameCounter / game_counter -- Counts events and fires target +// Flag: Fire once +// Flag: Reset on Fire +class CGameCounter: public CRulePointEntity { +public: + virtual void Spawn() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_GAMECOUNT_FIREONCE) == SF_GAMECOUNT_FIREONCE; } + BOOL ResetOnFire() const { return (pev->spawnflags & SF_GAMECOUNT_RESET) == SF_GAMECOUNT_RESET; } + + void CountUp() { pev->frags++; } + void CountDown() { pev->frags--; } + void ResetCount() { pev->frags = pev->dmg; } + + int CountValue() const { return int(pev->frags); } + int LimitValue() const { return int(pev->health); } + BOOL HitLimit() const { return CountValue() == LimitValue(); } + +private: + void SetCountValue(int value) { pev->frags = value; } + void SetInitialValue(int value) { pev->dmg = value; } +}; + +// CGameCounterSet / game_counter_set -- Sets the counter's value +// Flag: Fire once +class CGameCounterSet: public CRulePointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_GAMECOUNTSET_FIREONCE) == SF_GAMECOUNTSET_FIREONCE; } +}; + +// CGamePlayerEquip / game_playerequip -- Sets the default player equipment +// Flag: USE Only +class CGamePlayerEquip: public CRulePointEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + BOOL UseOnly() const { return (pev->spawnflags & SF_PLAYEREQUIP_USEONLY) == SF_PLAYEREQUIP_USEONLY; } +public: + string_t m_weaponNames[ MAX_EQUIP ]; + int m_weaponCount[ MAX_EQUIP ]; +}; + +// CGamePlayerTeam / game_player_team -- Changes the team of the player who fired it +// Flag: Fire once +// Flag: Kill Player +// Flag: Gib Player +class CGamePlayerTeam: public CRulePointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +private: + BOOL RemoveOnFire() const { return (pev->spawnflags & SF_PTEAM_FIREONCE) == SF_PTEAM_FIREONCE; } + BOOL ShouldKillPlayer() const { return (pev->spawnflags & SF_PTEAM_KILL) == SF_PTEAM_KILL; } + BOOL ShouldGibPlayer() const { return (pev->spawnflags & SF_PTEAM_GIB) == SF_PTEAM_GIB; } +}; diff --git a/cssdk/dlls/monsterevent.h b/cssdk/dlls/monsterevent.h new file mode 100644 index 0000000..d3f3205 --- /dev/null +++ b/cssdk/dlls/monsterevent.h @@ -0,0 +1,44 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +typedef struct MonsterEvent_s +{ + int event; + char *options; + +} MonsterEvent_t; + +#define EVENT_SPECIFIC 0 +#define EVENT_SCRIPTED 1000 +#define EVENT_SHARED 2000 +#define EVENT_CLIENT 5000 + +#define MONSTER_EVENT_BODYDROP_LIGHT 2001 +#define MONSTER_EVENT_BODYDROP_HEAVY 2002 +#define MONSTER_EVENT_SWISHSOUND 2010 diff --git a/cssdk/dlls/monsters.h b/cssdk/dlls/monsters.h new file mode 100644 index 0000000..842e058 --- /dev/null +++ b/cssdk/dlls/monsters.h @@ -0,0 +1,113 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define LOCALMOVE_INVALID 0 // move is not possible +#define LOCALMOVE_INVALID_DONT_TRIANGULATE 1 // move is not possible, don't try to triangulate +#define LOCALMOVE_VALID 2 // move is possible + +#define SF_MONSTER_WAIT_TILL_SEEN 1 // spawnflag that makes monsters wait until player can see them before attacking. +#define SF_MONSTER_GAG 2 // no idle noises from this monster +#define SF_MONSTER_HITMONSTERCLIP 4 +#define SF_MONSTER_PRISONER 16 // monster won't attack anyone, no one will attacke him. + +#define SF_MONSTER_WAIT_FOR_SCRIPT 128 //spawnflag that makes monsters wait to check for attacking until the script is done or they've been attacked +#define SF_MONSTER_PREDISASTER 256 //this is a predisaster scientist or barney. Influences how they speak. +#define SF_MONSTER_FADECORPSE 512 // Fade out corpse after death +#define SF_MONSTER_FALL_TO_GROUND 0x80000000 + +#define SF_MONSTER_TURRET_AUTOACTIVATE 32 +#define SF_MONSTER_TURRET_STARTINACTIVE 64 +#define SF_MONSTER_WAIT_UNTIL_PROVOKED 64 // don't attack the player unless provoked + +#define MOVE_START_TURN_DIST 64 // when this far away from moveGoal, start turning to face next goal +#define MOVE_STUCK_DIST 32 // if a monster can't step this far, it is stuck. + +#define MOVE_NORMAL 0 // normal move in the direction monster is facing +#define MOVE_STRAFE 1 // moves in direction specified, no matter which way monster is facing + +#define R_AL -2 // (ALLY) pals. Good alternative to R_NO when applicable. +#define R_FR -1 // (FEAR)will run +#define R_NO 0 // (NO RELATIONSHIP) disregard +#define R_DL 1 // (DISLIKE) will attack +#define R_HT 2 // (HATE)will attack this character instead of any visible DISLIKEd characters +#define R_NM 3 // (NEMESIS) A monster Will ALWAYS attack its nemsis, no matter what + +#define MEMORY_CLEAR 0 +#define bits_MEMORY_PROVOKED (1 << 0) // right now only used for houndeyes. +#define bits_MEMORY_INCOVER (1 << 1) // monster knows it is in a covered position. +#define bits_MEMORY_SUSPICIOUS (1 << 2) // Ally is suspicious of the player, and will move to provoked more easily +#define bits_MEMORY_PATH_FINISHED (1 << 3) // Finished monster path (just used by big momma for now) +#define bits_MEMORY_ON_PATH (1 << 4) // Moving on a path +#define bits_MEMORY_MOVE_FAILED (1 << 5) // Movement has already failed +#define bits_MEMORY_FLINCHED (1 << 6) // Has already flinched +#define bits_MEMORY_KILLED (1 << 7) // HACKHACK -- remember that I've already called my Killed() +#define bits_MEMORY_CUSTOM4 (1 << 28) // Monster-specific memory +#define bits_MEMORY_CUSTOM3 (1 << 29) // Monster-specific memory +#define bits_MEMORY_CUSTOM2 (1 << 30) // Monster-specific memory +#define bits_MEMORY_CUSTOM1 (1 << 31) // Monster-specific memory + +enum +{ + AITRIGGER_NONE = 0, + AITRIGGER_SEEPLAYER_ANGRY_AT_PLAYER, + AITRIGGER_TAKEDAMAGE, + AITRIGGER_HALFHEALTH, + AITRIGGER_DEATH, + AITRIGGER_SQUADMEMBERDIE, + AITRIGGER_SQUADLEADERDIE, + AITRIGGER_HEARWORLD, + AITRIGGER_HEARPLAYER, + AITRIGGER_HEARCOMBAT, + AITRIGGER_SEEPLAYER_UNCONDITIONAL, + AITRIGGER_SEEPLAYER_NOT_IN_COMBAT, +}; + +enum HitBoxGroup +{ + HITGROUP_GENERIC = 0, + HITGROUP_HEAD, + HITGROUP_CHEST, + HITGROUP_STOMACH, + HITGROUP_LEFTARM, + HITGROUP_RIGHTARM, + HITGROUP_LEFTLEG, + HITGROUP_RIGHTLEG, + HITGROUP_SHIELD, + NUM_HITGROUPS, +}; + +class CGib: public CBaseEntity { +public: + virtual int ObjectCaps() = 0; +public: + int m_bloodColor; + int m_cBloodDecals; + int m_material; + float m_lifeTime; +}; diff --git a/cssdk/dlls/mortar.h b/cssdk/dlls/mortar.h new file mode 100644 index 0000000..e74636c --- /dev/null +++ b/cssdk/dlls/mortar.h @@ -0,0 +1,55 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CFuncMortarField: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + + // Bmodels don't go across transitions + virtual int ObjectCaps() = 0; +public: + int m_iszXController; + int m_iszYController; + float m_flSpread; + float m_flDelay; + int m_iCount; + int m_fControl; +}; + +class CMortar: public CGrenade { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; +public: + int m_spriteTexture; +}; diff --git a/cssdk/dlls/observer.h b/cssdk/dlls/observer.h new file mode 100644 index 0000000..67585a5 --- /dev/null +++ b/cssdk/dlls/observer.h @@ -0,0 +1,32 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define CAMERA_MODE_SPEC_ANYONE 0 +#define CAMERA_MODE_SPEC_ONLY_TEAM 1 +#define CAMERA_MODE_SPEC_ONLY_FRIST_PERSON 2 diff --git a/cssdk/dlls/pathcorner.h b/cssdk/dlls/pathcorner.h new file mode 100644 index 0000000..5be28a3 --- /dev/null +++ b/cssdk/dlls/pathcorner.h @@ -0,0 +1,39 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CPathCorner: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual float GetDelay() = 0; +private: + float m_flWait; +}; diff --git a/cssdk/dlls/plats.h b/cssdk/dlls/plats.h new file mode 100644 index 0000000..ec67be3 --- /dev/null +++ b/cssdk/dlls/plats.h @@ -0,0 +1,178 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SF_PLAT_TOGGLE 0x0001 + +#define TRAIN_STARTPITCH 60 +#define TRAIN_MAXPITCH 200 +#define TRAIN_MAXSPEED 1000 + +#define SF_TRACK_ACTIVATETRAIN 0x00000001 +#define SF_TRACK_RELINK 0x00000002 +#define SF_TRACK_ROTMOVE 0x00000004 +#define SF_TRACK_STARTBOTTOM 0x00000008 +#define SF_TRACK_DONT_MOVE 0x00000010 + +#define FGUNTARGET_START_ON 0x0001 + +class CBasePlatTrain: public CBaseToggle { +public: + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + + // This is done to fix spawn flag collisions between this class and a derived class + virtual BOOL IsTogglePlat() = 0; +public: + byte m_bMoveSnd; + byte m_bStopSnd; + float m_volume; +}; + +class CFuncPlat: public CBasePlatTrain { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; + virtual void GoUp() = 0; + virtual void GoDown() = 0; + virtual void HitTop() = 0; + virtual void HitBottom() = 0; +}; + +class CPlatTrigger: public CBaseEntity { +public: + virtual int ObjectCaps() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +public: + CFuncPlat *m_pPlatform; +}; + +class CFuncPlatRot: public CFuncPlat { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void GoUp() = 0; + virtual void GoDown() = 0; + virtual void HitTop() = 0; + virtual void HitBottom() = 0; +public: + Vector m_end; + Vector m_start; +}; + +class CFuncTrain: public CBasePlatTrain { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Activate() = 0; + virtual void OverrideReset() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + Vector m_vStartPosition; + entvars_t *m_pevFirstTarget; + entvars_t *m_pevCurrentTarget; + int m_sounds; + BOOL m_activated; +}; + +class CFuncTrainControls: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int ObjectCaps() = 0; +}; + +class CFuncTrackChange: public CFuncPlatRot { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void OverrideReset() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual BOOL IsTogglePlat() = 0; + virtual void GoUp() = 0; + virtual void GoDown() = 0; + virtual void HitTop() = 0; + virtual void HitBottom() = 0; + virtual void UpdateAutoTargets(int toggleState) = 0; + +public: + void DisableUse() { m_use = 0; } + void EnableUse() { m_use = 1; } + + int UseEnabled() const { return m_use; } + +public: + static TYPEDESCRIPTION IMPL(m_SaveData)[9]; + + CPathTrack *m_trackTop; + CPathTrack *m_trackBottom; + CFuncTrackTrain *m_train; + + int m_trackTopName; + int m_trackBottomName; + int m_trainName; + + TRAIN_CODE m_code; + int m_targetState; + int m_use; +}; + +class CFuncTrackAuto: public CFuncTrackChange { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void UpdateAutoTargets(int toggleState) = 0; +}; + +class CGunTarget: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Activate() = 0; + virtual int Classify() = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual int BloodColor() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual Vector BodyTarget(const Vector &posSrc) = 0; +private: + BOOL m_on; +}; diff --git a/cssdk/dlls/player.h b/cssdk/dlls/player.h new file mode 100644 index 0000000..690cd93 --- /dev/null +++ b/cssdk/dlls/player.h @@ -0,0 +1,578 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "pm_materials.h" +#include "hintmessage.h" +#include "unisignals.h" + +#define MIN_BUY_TIME 15 // the minimum threshold values for cvar mp_buytime 15 sec's + +#define MAX_BUFFER_MENU 175 +#define MAX_BUFFER_MENU_BRIEFING 50 + +#define MAX_PLAYER_NAME_LENGTH 32 +#define MAX_AUTOBUY_LENGTH 256 +#define MAX_REBUY_LENGTH 256 + +#define MAX_RECENT_PATH 20 +#define MAX_HOSTAGE_ICON 4 // the maximum number of icons of the hostages in the HUD + +#define SUITUPDATETIME 3.5 +#define SUITFIRSTUPDATETIME 0.1 + +#define PLAYER_FATAL_FALL_SPEED 1100.0f +#define PLAYER_MAX_SAFE_FALL_SPEED 500.0f +#define PLAYER_USE_RADIUS 64.0f + +#define ARMOR_RATIO 0.5 // Armor Takes 50% of the damage +#define ARMOR_BONUS 0.5 // Each Point of Armor is work 1/x points of health + +#define FLASH_DRAIN_TIME 1.2 // 100 units/3 minutes +#define FLASH_CHARGE_TIME 0.2 // 100 units/20 seconds (seconds per unit) + +// damage per unit per second. +#define DAMAGE_FOR_FALL_SPEED 100.0f / (PLAYER_FATAL_FALL_SPEED - PLAYER_MAX_SAFE_FALL_SPEED) +#define PLAYER_MIN_BOUNCE_SPEED 350.0f + +// won't punch player's screen/make scrape noise unless player falling at least this fast. +#define PLAYER_FALL_PUNCH_THRESHHOLD 250.0f + +// Money blinks few of times on the freeze period +// NOTE: It works for CZ +#define MONEY_BLINK_AMOUNT 30 + +// Player physics flags bits +// CBasePlayer::m_afPhysicsFlags +#define PFLAG_ONLADDER (1<<0) +#define PFLAG_ONSWING (1<<0) +#define PFLAG_ONTRAIN (1<<1) +#define PFLAG_ONBARNACLE (1<<2) +#define PFLAG_DUCKING (1<<3) // In the process of ducking, but totally squatted yet +#define PFLAG_USING (1<<4) // Using a continuous entity +#define PFLAG_OBSERVER (1<<5) // player is locked in stationary cam mode. Spectators can move, observers can't. + +#define TRAIN_OFF 0x00 +#define TRAIN_NEUTRAL 0x01 +#define TRAIN_SLOW 0x02 +#define TRAIN_MEDIUM 0x03 +#define TRAIN_FAST 0x04 +#define TRAIN_BACK 0x05 + +#define TRAIN_ACTIVE 0x80 +#define TRAIN_NEW 0xc0 + +#define SIGNAL_BUY (1<<0) +#define SIGNAL_BOMB (1<<1) +#define SIGNAL_RESCUE (1<<2) +#define SIGNAL_ESCAPE (1<<3) +#define SIGNAL_VIPSAFETY (1<<4) + +#define IGNOREMSG_NONE 0 +#define IGNOREMSG_ENEMY 1 +#define IGNOREMSG_TEAM 2 + +// max of 4 suit sentences queued up at any time +#define CSUITPLAYLIST 4 + +#define SUIT_GROUP TRUE +#define SUIT_SENTENCE FALSE + +#define SUIT_REPEAT_OK 0 +#define SUIT_NEXT_IN_30SEC 30 +#define SUIT_NEXT_IN_1MIN 60 +#define SUIT_NEXT_IN_5MIN 300 +#define SUIT_NEXT_IN_10MIN 600 +#define SUIT_NEXT_IN_30MIN 1800 +#define SUIT_NEXT_IN_1HOUR 3600 + +#define TEAM_NAME_LENGTH 16 + +#define MAX_ID_RANGE 2048.0f +#define MAX_SPECTATOR_ID_RANGE 8192.0f +#define SBAR_STRING_SIZE 128 + +#define SBAR_TARGETTYPE_TEAMMATE 1 +#define SBAR_TARGETTYPE_ENEMY 2 +#define SBAR_TARGETTYPE_HOSTAGE 3 + +#define CHAT_INTERVAL 1.0f +#define CSUITNOREPEAT 32 + +#define AUTOAIM_2DEGREES 0.0348994967025 +#define AUTOAIM_5DEGREES 0.08715574274766 +#define AUTOAIM_8DEGREES 0.1391731009601 +#define AUTOAIM_10DEGREES 0.1736481776669 + +#define SOUND_FLASHLIGHT_ON "items/flashlight1.wav" +#define SOUND_FLASHLIGHT_OFF "items/flashlight1.wav" + +// custom enum +enum RewardType +{ + RT_NONE, + RT_ROUND_BONUS, + RT_PLAYER_RESET, + RT_PLAYER_BOUGHT_SOMETHING, + RT_HOSTAGE_TOOK, + RT_HOSTAGE_RESCUED, + RT_HOSTAGE_DAMAGED, + RT_HOSTAGE_KILLED, + RT_TEAMMATES_KILLED, + RT_ENEMY_KILLED, + RT_INTO_GAME, + RT_VIP_KILLED, + RT_VIP_RESCUED_MYSELF +}; + +enum PLAYER_ANIM +{ + PLAYER_IDLE, + PLAYER_WALK, + PLAYER_JUMP, + PLAYER_SUPERJUMP, + PLAYER_DIE, + PLAYER_ATTACK1, + PLAYER_ATTACK2, + PLAYER_FLINCH, + PLAYER_LARGE_FLINCH, + PLAYER_RELOAD, + PLAYER_HOLDBOMB +}; + +enum _Menu +{ + Menu_OFF, + Menu_ChooseTeam, + Menu_IGChooseTeam, + Menu_ChooseAppearance, + Menu_Buy, + Menu_BuyPistol, + Menu_BuyRifle, + Menu_BuyMachineGun, + Menu_BuyShotgun, + Menu_BuySubMachineGun, + Menu_BuyItem, + Menu_Radio1, + Menu_Radio2, + Menu_Radio3, + Menu_ClientBuy +}; + +enum TeamName +{ + UNASSIGNED, + TERRORIST, + CT, + SPECTATOR, +}; + +enum ModelName +{ + MODEL_UNASSIGNED, + MODEL_URBAN, + MODEL_TERROR, + MODEL_LEET, + MODEL_ARCTIC, + MODEL_GSG9, + MODEL_GIGN, + MODEL_SAS, + MODEL_GUERILLA, + MODEL_VIP, + MODEL_MILITIA, + MODEL_SPETSNAZ, + MODEL_AUTO +}; + +enum JoinState +{ + JOINED, + SHOWLTEXT, + READINGLTEXT, + SHOWTEAMSELECT, + PICKINGTEAM, + GETINTOGAME +}; + +enum TrackCommands +{ + CMD_SAY = 0, + CMD_SAYTEAM, + CMD_FULLUPDATE, + CMD_VOTE, + CMD_VOTEMAP, + CMD_LISTMAPS, + CMD_LISTPLAYERS, + CMD_NIGHTVISION, + COMMANDS_TO_TRACK, +}; + +struct RebuyStruct +{ + int m_primaryWeapon; + int m_primaryAmmo; + int m_secondaryWeapon; + int m_secondaryAmmo; + int m_heGrenade; + int m_flashbang; + int m_smokeGrenade; + int m_defuser; + int m_nightVision; + ArmorType m_armor; +}; + +enum ThrowDirection +{ + THROW_NONE, + THROW_FORWARD, + THROW_BACKWARD, + THROW_HITVEL, + THROW_BOMB, + THROW_GRENADE, + THROW_HITVEL_MINUS_AIRVEL +}; + +enum sbar_data +{ + SBAR_ID_TARGETTYPE = 1, + SBAR_ID_TARGETNAME, + SBAR_ID_TARGETHEALTH, + SBAR_END +}; + +enum MusicState { SILENT, CALM, INTENSE }; + +class CCSPlayer; + +class CStripWeapons: public CPointEntity { +public: + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +// Multiplayer intermission spots. +class CInfoIntermission: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void Think() = 0; +}; + +// Dead HEV suit prop +class CDeadHEV: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Classify() = 0; +public: + int m_iPose; // which sequence to display -- temporary, don't need to save + static char *m_szPoses[4]; +}; + +class CSprayCan: public CBaseEntity { +public: + virtual void Think() = 0; + virtual int ObjectCaps() = 0; +}; + +class CBloodSplat: public CBaseEntity { +public: +}; + +class CBasePlayer: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual int Classify() = 0; + virtual void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) = 0; + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + virtual BOOL TakeHealth(float flHealth, int bitsDamageType) = 0; + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual void AddPoints(int score, BOOL bAllowNegativeScore) = 0; + virtual void AddPointsToTeam(int score, BOOL bAllowNegativeScore) = 0; + virtual BOOL AddPlayerItem(CBasePlayerItem *pItem) = 0; + virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem) = 0; + virtual int GiveAmmo(int iAmount, char *szName, int iMax) = 0; + virtual void StartSneaking() = 0; + virtual void StopSneaking() = 0; + virtual BOOL IsSneaking() = 0; + virtual BOOL IsAlive() = 0; + virtual BOOL IsPlayer() = 0; + virtual BOOL IsNetClient() = 0; + virtual const char *TeamID() = 0; + virtual BOOL FBecomeProne() = 0; + virtual Vector BodyTarget(const Vector &posSrc) = 0; + virtual int Illumination() = 0; + virtual BOOL ShouldFadeOnDeath() = 0; + virtual void ResetMaxSpeed() = 0; + virtual void Jump() = 0; + virtual void Duck() = 0; + virtual void PreThink() = 0; + virtual void PostThink() = 0; + virtual Vector GetGunPosition() = 0; + virtual BOOL IsBot() = 0; + virtual void UpdateClientData() = 0; + virtual void ImpulseCommands() = 0; + virtual void RoundRespawn() = 0; + virtual Vector GetAutoaimVector(float flDelta) = 0; + virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha) = 0; + virtual void OnTouchingWeapon(CWeaponBox *pWeapon) = 0; +public: + static CBasePlayer *Instance(edict_t *pent) { return (CBasePlayer *)GET_PRIVATE(pent ? pent : ENT(0)); } + static CBasePlayer *Instance(entvars_t *pev) { return Instance(ENT(pev)); } + static CBasePlayer *Instance(int offset) { return Instance(ENT(offset)); } + + int IsObserver() { return pev->iuser1; } + void SetWeaponAnimType(const char *szExtention) { strcpy(m_szAnimExtention, szExtention); } + bool IsProtectedByShield() { return m_bOwnsShield && m_bShieldDrawn; } + bool IsReloading() const; + bool IsBlind() const { return (m_blindUntilTime > gpGlobals->time); } + bool IsAutoFollowAllowed() const { return (gpGlobals->time > m_allowAutoFollowTime); } + void InhibitAutoFollow(float duration) { m_allowAutoFollowTime = gpGlobals->time + duration; } + void AllowAutoFollow() { m_allowAutoFollowTime = 0; } + void SetObserverAutoDirector(bool val) { m_bObserverAutoDirector = val; } + bool CanSwitchObserverModes() const { return m_canSwitchObserverModes; } + CCSPlayer *CSPlayer() const; +public: + enum { MaxLocationLen = 32 }; + + int random_seed; + unsigned short m_usPlayerBleed; + EHANDLE m_hObserverTarget; + float m_flNextObserverInput; + int m_iObserverWeapon; + int m_iObserverC4State; + bool m_bObserverHasDefuser; + int m_iObserverLastMode; + float m_flFlinchTime; + float m_flAnimTime; + bool m_bHighDamage; + float m_flVelocityModifier; + int m_iLastZoom; + bool m_bResumeZoom; + float m_flEjectBrass; + ArmorType m_iKevlar; + bool m_bNotKilled; + TeamName m_iTeam; + int m_iAccount; + bool m_bHasPrimary; + float m_flDeathThrowTime; + int m_iThrowDirection; + float m_flLastTalk; + bool m_bJustConnected; + bool m_bContextHelp; + JoinState m_iJoiningState; + CBaseEntity *m_pIntroCamera; + float m_fIntroCamTime; + float m_fLastMovement; + bool m_bMissionBriefing; + bool m_bTeamChanged; + ModelName m_iModelName; + int m_iTeamKills; + int m_iIgnoreGlobalChat; + bool m_bHasNightVision; + bool m_bNightVisionOn; + Vector m_vRecentPath[MAX_RECENT_PATH]; + float m_flIdleCheckTime; + float m_flRadioTime; + int m_iRadioMessages; + bool m_bIgnoreRadio; + bool m_bHasC4; + bool m_bHasDefuser; + bool m_bKilledByBomb; + Vector m_vBlastVector; + bool m_bKilledByGrenade; + CHintMessageQueue m_hintMessageQueue; + int m_flDisplayHistory; + _Menu m_iMenu; + int m_iChaseTarget; + CBaseEntity *m_pChaseTarget; + float m_fCamSwitch; + bool m_bEscaped; + bool m_bIsVIP; + float m_tmNextRadarUpdate; + Vector m_vLastOrigin; + int m_iCurrentKickVote; + float m_flNextVoteTime; + bool m_bJustKilledTeammate; + int m_iHostagesKilled; + int m_iMapVote; + bool m_bCanShoot; + float m_flLastFired; + float m_flLastAttackedTeammate; + bool m_bHeadshotKilled; + bool m_bPunishedForTK; + bool m_bReceivesNoMoneyNextRound; + int m_iTimeCheckAllowed; + bool m_bHasChangedName; + char m_szNewName[MAX_PLAYER_NAME_LENGTH]; + bool m_bIsDefusing; + float m_tmHandleSignals; + CUnifiedSignals m_signals; + edict_t *m_pentCurBombTarget; + int m_iPlayerSound; + int m_iTargetVolume; + int m_iWeaponVolume; + int m_iExtraSoundTypes; + int m_iWeaponFlash; + float m_flStopExtraSoundTime; + float m_flFlashLightTime; + int m_iFlashBattery; + int m_afButtonLast; + int m_afButtonPressed; + int m_afButtonReleased; + edict_t *m_pentSndLast; + float m_flSndRoomtype; + float m_flSndRange; + float m_flFallVelocity; + int m_rgItems[MAX_ITEMS]; + int m_fNewAmmo; + unsigned int m_afPhysicsFlags; + float m_fNextSuicideTime; + float m_flTimeStepSound; + float m_flTimeWeaponIdle; + float m_flSwimTime; + float m_flDuckTime; + float m_flWallJumpTime; + float m_flSuitUpdate; + int m_rgSuitPlayList[CSUITPLAYLIST]; + int m_iSuitPlayNext; + int m_rgiSuitNoRepeat[CSUITNOREPEAT]; + float m_rgflSuitNoRepeatTime[CSUITNOREPEAT]; + int m_lastDamageAmount; + float m_tbdPrev; + float m_flgeigerRange; + float m_flgeigerDelay; + int m_igeigerRangePrev; + int m_iStepLeft; + char m_szTextureName[CBTEXTURENAMEMAX]; + char m_chTextureType; + int m_idrowndmg; + int m_idrownrestored; + int m_bitsHUDDamage; + BOOL m_fInitHUD; + BOOL m_fGameHUDInitialized; + int m_iTrain; + BOOL m_fWeapon; + EHANDLE m_pTank; + float m_fDeadTime; + BOOL m_fNoPlayerSound; + BOOL m_fLongJump; + float m_tSneaking; + int m_iUpdateTime; + int m_iClientHealth; + int m_iClientBattery; + int m_iHideHUD; + int m_iClientHideHUD; + int m_iFOV; + int m_iClientFOV; + int m_iNumSpawns; + CBaseEntity *m_pObserver; + CBasePlayerItem *m_rgpPlayerItems[MAX_ITEM_TYPES]; + CBasePlayerItem *m_pActiveItem; + CBasePlayerItem *m_pClientActiveItem; + CBasePlayerItem *m_pLastItem; + int m_rgAmmo[MAX_AMMO_SLOTS]; + int m_rgAmmoLast[MAX_AMMO_SLOTS]; + Vector m_vecAutoAim; + BOOL m_fOnTarget; + int m_iDeaths; + int m_izSBarState[SBAR_END]; + float m_flNextSBarUpdateTime; + float m_flStatusBarDisappearDelay; + char m_SbarString0[SBAR_STRING_SIZE]; + int m_lastx; + int m_lasty; + int m_nCustomSprayFrames; + float m_flNextDecalTime; + char m_szTeamName[TEAM_NAME_LENGTH]; + int m_modelIndexPlayer; + char m_szAnimExtention[32]; + int m_iGaitsequence; + float m_flGaitframe; + float m_flGaityaw; + Vector m_prevgaitorigin; + float m_flPitch; + float m_flYaw; + float m_flGaitMovement; + int m_iAutoWepSwitch; + bool m_bVGUIMenus; + bool m_bShowHints; + bool m_bShieldDrawn; + bool m_bOwnsShield; + bool m_bWasFollowing; + float m_flNextFollowTime; + float m_flYawModifier; + float m_blindUntilTime; + float m_blindStartTime; + float m_blindHoldTime; + float m_blindFadeTime; + int m_blindAlpha; + float m_allowAutoFollowTime; + char m_autoBuyString[MAX_AUTOBUY_LENGTH]; + char *m_rebuyString; + RebuyStruct m_rebuyStruct; + bool m_bIsInRebuy; + float m_flLastUpdateTime; + char m_lastLocation[MaxLocationLen]; + float m_progressStart; + float m_progressEnd; + bool m_bObserverAutoDirector; + bool m_canSwitchObserverModes; + float m_heartBeatTime; + float m_intenseTimestamp; + float m_silentTimestamp; + MusicState m_musicState; + float m_flLastCommandTime[COMMANDS_TO_TRACK]; +}; + +class CWShield: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +public: + void SetCantBePickedUpByUser(CBaseEntity *pEntity, float time) { m_hEntToIgnoreTouchesFrom = pEntity; m_flTimeToIgnoreTouches = gpGlobals->time + time; } +public: + EHANDLE m_hEntToIgnoreTouchesFrom; + float m_flTimeToIgnoreTouches; +}; + +inline bool CBasePlayer::IsReloading() const +{ + CBasePlayerWeapon *weapon = static_cast(m_pActiveItem); + + if (weapon != NULL && weapon->m_fInReload) + return true; + + return false; +} + +inline CCSPlayer *CBasePlayer::CSPlayer() const { + return reinterpret_cast(this->m_pEntity); +} diff --git a/cssdk/dlls/regamedll_api.h b/cssdk/dlls/regamedll_api.h new file mode 100644 index 0000000..afc362d --- /dev/null +++ b/cssdk/dlls/regamedll_api.h @@ -0,0 +1,413 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once +#include "archtypes.h" +#include "regamedll_interfaces.h" +#include "hookchains.h" +#include "interface.h" +#include "player.h" +#include "gamerules.h" +#include "client.h" +#include "items.h" + +#define REGAMEDLL_API_VERSION_MAJOR 4 +#define REGAMEDLL_API_VERSION_MINOR 1 + +// CBasePlayer::Spawn hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Spawn; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Spawn; + +// CBasePlayer::Precache hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Precache; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Precache; + +// CBasePlayer::ObjectCaps hook +typedef IHookChainClass IReGameHook_CBasePlayer_ObjectCaps; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_ObjectCaps; + +// CBasePlayer::Classify hook +typedef IHookChainClass IReGameHook_CBasePlayer_Classify; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Classify; + +// CBasePlayer::TraceAttack hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_TraceAttack; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_TraceAttack; + +// CBasePlayer::TakeDamage hook +typedef IHookChainClass IReGameHook_CBasePlayer_TakeDamage; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_TakeDamage; + +// CBasePlayer::TakeHealth hook +typedef IHookChainClass IReGameHook_CBasePlayer_TakeHealth; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_TakeHealth; + +// CBasePlayer::Killed hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Killed; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Killed; + +// CBasePlayer::AddPoints hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_AddPoints; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_AddPoints; + +// CBasePlayer::AddPointsToTeam hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_AddPointsToTeam; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_AddPointsToTeam; + +// CBasePlayer::AddPlayerItem hook +typedef IHookChainClass IReGameHook_CBasePlayer_AddPlayerItem; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_AddPlayerItem; + +// CBasePlayer::RemovePlayerItem hook +typedef IHookChainClass IReGameHook_CBasePlayer_RemovePlayerItem; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_RemovePlayerItem; + +// CBasePlayer::GiveAmmo hook +typedef IHookChainClass IReGameHook_CBasePlayer_GiveAmmo; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_GiveAmmo; + +// CBasePlayer::ResetMaxSpeed hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_ResetMaxSpeed; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_ResetMaxSpeed; + +// CBasePlayer::Jump hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Jump; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Jump; + +// CBasePlayer::Duck hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Duck; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Duck; + +// CBasePlayer::PreThink hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_PreThink; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_PreThink; + +// CBasePlayer::PostThink hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_PostThink; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_PostThink; + +// CBasePlayer::UpdateClientData hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_UpdateClientData; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_UpdateClientData; + +// CBasePlayer::ImpulseCommands hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_ImpulseCommands; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_ImpulseCommands; + +// CBasePlayer::RoundRespawn hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_RoundRespawn; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_RoundRespawn; + +// CBasePlayer::Blind hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_Blind; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Blind; + +// CBasePlayer::Observer_IsValidTarget hook +typedef IHookChainClass IReGameHook_CBasePlayer_Observer_IsValidTarget; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget; + +// CBasePlayer::SetAnimation hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_SetAnimation; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_SetAnimation; + +// CBasePlayer::GiveDefaultItems hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_GiveDefaultItems; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_GiveDefaultItems; + +// CBasePlayer::GiveNamedItem hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_GiveNamedItem; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_GiveNamedItem; + +// CBasePlayer::AddAccount hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_AddAccount; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_AddAccount; + +// CBasePlayer::GiveShield hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_GiveShield; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_GiveShield; + +// CBasePlayer:SetClientUserInfoModel hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_SetClientUserInfoModel; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel; + +// CBasePlayer:SetClientUserInfoName hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_SetClientUserInfoName; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_SetClientUserInfoName; + +// CBasePlayer::HasRestrictItem hook +typedef IHookChainClass IReGameHook_CBasePlayer_HasRestrictItem; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_HasRestrictItem; + +// CBasePlayer::DropPlayerItem hook +typedef IVoidHookChainClass IReGameHook_CBasePlayer_DropPlayerItem; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBasePlayer_DropPlayerItem; + +// CBaseAnimating::ResetSequenceInfo hook +typedef IVoidHookChainClass IReGameHook_CBaseAnimating_ResetSequenceInfo; +typedef IVoidHookChainRegistryClass IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo; + +// GetForceCamera hook +typedef IHookChain IReGameHook_GetForceCamera; +typedef IHookChainRegistry IReGameHookRegistry_GetForceCamera; + +// PlayerBlind hook +typedef IVoidHookChain IReGameHook_PlayerBlind; +typedef IVoidHookChainRegistry IReGameHookRegistry_PlayerBlind; + +// RadiusFlash_TraceLine hook +typedef IVoidHookChain IReGameHook_RadiusFlash_TraceLine; +typedef IVoidHookChainRegistry IReGameHookRegistry_RadiusFlash_TraceLine; + +// RoundEnd hook +typedef IHookChain IReGameHook_RoundEnd; +typedef IHookChainRegistry IReGameHookRegistry_RoundEnd; + +// InstallGameRules hook +typedef IHookChain IReGameHook_InstallGameRules; +typedef IHookChainRegistry IReGameHookRegistry_InstallGameRules; + +// PM_Init hook +typedef IVoidHookChain IReGameHook_PM_Init; +typedef IVoidHookChainRegistry IReGameHookRegistry_PM_Init; + +// PM_Move hook +typedef IVoidHookChain IReGameHook_PM_Move; +typedef IVoidHookChainRegistry IReGameHookRegistry_PM_Move; + +// PM_AirMove hook +typedef IVoidHookChain IReGameHook_PM_AirMove; +typedef IVoidHookChainRegistry IReGameHookRegistry_PM_AirMove; + +// HandleMenu_ChooseAppearance hook +typedef IVoidHookChain IReGameHook_HandleMenu_ChooseAppearance; +typedef IVoidHookChainRegistry IReGameHookRegistry_HandleMenu_ChooseAppearance; + +// HandleMenu_ChooseTeam hook +typedef IHookChain IReGameHook_HandleMenu_ChooseTeam; +typedef IHookChainRegistry IReGameHookRegistry_HandleMenu_ChooseTeam; + +// ShowMenu hook +typedef IVoidHookChain IReGameHook_ShowMenu; +typedef IVoidHookChainRegistry IReGameHookRegistry_ShowMenu; + +// ShowVGUIMenu hook +typedef IVoidHookChain IReGameHook_ShowVGUIMenu; +typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu; + +// CHalfLifeMultiplay::FShouldSwitchWeapon hook +typedef IHookChain IReGameHook_CSGameRules_FShouldSwitchWeapon; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_FShouldSwitchWeapon; + +// CHalfLifeMultiplay::GetNextBestWeapon hook +typedef IHookChain IReGameHook_CSGameRules_GetNextBestWeapon; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_GetNextBestWeapon; + +// CHalfLifeMultiplay::FlPlayerFallDamage hook +typedef IHookChain IReGameHook_CSGameRules_FlPlayerFallDamage; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_FlPlayerFallDamage; + +// CHalfLifeMultiplay::FPlayerCanTakeDamage hook +typedef IHookChain IReGameHook_CSGameRules_FPlayerCanTakeDamage; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_FPlayerCanTakeDamage; + +// CHalfLifeMultiplay::PlayerSpawn hook +typedef IVoidHookChain IReGameHook_CSGameRules_PlayerSpawn; +typedef IVoidHookChainRegistry IReGameHookRegistry_CSGameRules_PlayerSpawn; + +// CHalfLifeMultiplay::FPlayerCanRespawn hook +typedef IHookChain IReGameHook_CSGameRules_FPlayerCanRespawn; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_FPlayerCanRespawn; + +// CHalfLifeMultiplay::GetPlayerSpawnSpot hook +typedef IHookChain IReGameHook_CSGameRules_GetPlayerSpawnSpot; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_GetPlayerSpawnSpot; + +// CHalfLifeMultiplay::ClientUserInfoChanged hook +typedef IVoidHookChain IReGameHook_CSGameRules_ClientUserInfoChanged; +typedef IVoidHookChainRegistry IReGameHookRegistry_CSGameRules_ClientUserInfoChanged; + +// CHalfLifeMultiplay::PlayerKilled hook +typedef IVoidHookChain IReGameHook_CSGameRules_PlayerKilled; +typedef IVoidHookChainRegistry IReGameHookRegistry_CSGameRules_PlayerKilled; + +// CHalfLifeMultiplay::DeathNotice hook +typedef IVoidHookChain IReGameHook_CSGameRules_DeathNotice; +typedef IVoidHookChainRegistry IReGameHookRegistry_CSGameRules_DeathNotice; + +// CHalfLifeMultiplay::CanHavePlayerItem hook +typedef IHookChain IReGameHook_CSGameRules_CanHavePlayerItem; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_CanHavePlayerItem; + +// CHalfLifeMultiplay::DeadPlayerWeapons hook +typedef IHookChain IReGameHook_CSGameRules_DeadPlayerWeapons; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_DeadPlayerWeapons; + +// CHalfLifeMultiplay::ServerDeactivate hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_ServerDeactivate; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_ServerDeactivate; + +// CHalfLifeMultiplay::CheckMapConditions hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_CheckMapConditions; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CheckMapConditions; + +// CHalfLifeMultiplay::CleanUpMap hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_CleanUpMap; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CleanUpMap; + +// CHalfLifeMultiplay::RestartRound hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_RestartRound; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_RestartRound; + +// CHalfLifeMultiplay::CheckWinConditions hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_CheckWinConditions; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CheckWinConditions; + +// CHalfLifeMultiplay::RemoveGuns hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_RemoveGuns; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_RemoveGuns; + +// CHalfLifeMultiplay::GiveC4 hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_GiveC4; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_GiveC4; + +// CHalfLifeMultiplay::ChangeLevel hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_ChangeLevel; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_ChangeLevel; + +// CHalfLifeMultiplay::GoToIntermission hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_GoToIntermission; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_GoToIntermission; + +// CHalfLifeMultiplay::BalanceTeams hook +typedef IVoidHookChain<> IReGameHook_CSGameRules_BalanceTeams; +typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_BalanceTeams; + +class IReGameHookchains { +public: + virtual ~IReGameHookchains() {} + // CBasePlayer virtual + virtual IReGameHookRegistry_CBasePlayer_Spawn* CBasePlayer_Spawn() = 0; + virtual IReGameHookRegistry_CBasePlayer_Precache* CBasePlayer_Precache() = 0; + virtual IReGameHookRegistry_CBasePlayer_ObjectCaps* CBasePlayer_ObjectCaps() = 0; + virtual IReGameHookRegistry_CBasePlayer_Classify* CBasePlayer_Classify() = 0; + virtual IReGameHookRegistry_CBasePlayer_TraceAttack* CBasePlayer_TraceAttack() = 0; + virtual IReGameHookRegistry_CBasePlayer_TakeDamage* CBasePlayer_TakeDamage() = 0; + virtual IReGameHookRegistry_CBasePlayer_TakeHealth* CBasePlayer_TakeHealth() = 0; + virtual IReGameHookRegistry_CBasePlayer_Killed* CBasePlayer_Killed() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPoints* CBasePlayer_AddPoints() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPointsToTeam* CBasePlayer_AddPointsToTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPlayerItem* CBasePlayer_AddPlayerItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_RemovePlayerItem* CBasePlayer_RemovePlayerItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveAmmo* CBasePlayer_GiveAmmo() = 0; + virtual IReGameHookRegistry_CBasePlayer_ResetMaxSpeed* CBasePlayer_ResetMaxSpeed() = 0; + virtual IReGameHookRegistry_CBasePlayer_Jump* CBasePlayer_Jump() = 0; + virtual IReGameHookRegistry_CBasePlayer_Duck* CBasePlayer_Duck() = 0; + virtual IReGameHookRegistry_CBasePlayer_PreThink* CBasePlayer_PreThink() = 0; + virtual IReGameHookRegistry_CBasePlayer_PostThink* CBasePlayer_PostThink() = 0; + virtual IReGameHookRegistry_CBasePlayer_UpdateClientData* CBasePlayer_UpdateClientData() = 0; + virtual IReGameHookRegistry_CBasePlayer_ImpulseCommands* CBasePlayer_ImpulseCommands() = 0; + virtual IReGameHookRegistry_CBasePlayer_RoundRespawn* CBasePlayer_RoundRespawn() = 0; + virtual IReGameHookRegistry_CBasePlayer_Blind* CBasePlayer_Blind() = 0; + + virtual IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget* CBasePlayer_Observer_IsValidTarget() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetAnimation* CBasePlayer_SetAnimation() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveDefaultItems* CBasePlayer_GiveDefaultItems() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveNamedItem* CBasePlayer_GiveNamedItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddAccount* CBasePlayer_AddAccount() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveShield* CBasePlayer_GiveShield() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel* CBasePlayer_SetClientUserInfoModel() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoName* CBasePlayer_SetClientUserInfoName() = 0; + virtual IReGameHookRegistry_CBasePlayer_HasRestrictItem* CBasePlayer_HasRestrictItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_DropPlayerItem* CBasePlayer_DropPlayerItem() = 0; + virtual IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo* CBaseAnimating_ResetSequenceInfo() = 0; + + virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0; + virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0; + virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 0; + virtual IReGameHookRegistry_RoundEnd* RoundEnd() = 0; + virtual IReGameHookRegistry_InstallGameRules* InstallGameRules() = 0; + virtual IReGameHookRegistry_PM_Init* PM_Init() = 0; + virtual IReGameHookRegistry_PM_Move* PM_Move() = 0; + virtual IReGameHookRegistry_PM_AirMove* PM_AirMove() = 0; + virtual IReGameHookRegistry_HandleMenu_ChooseAppearance* HandleMenu_ChooseAppearance() = 0; + virtual IReGameHookRegistry_HandleMenu_ChooseTeam* HandleMenu_ChooseTeam() = 0; + virtual IReGameHookRegistry_ShowMenu* ShowMenu() = 0; + virtual IReGameHookRegistry_ShowVGUIMenu* ShowVGUIMenu() = 0; + + virtual IReGameHookRegistry_CSGameRules_FShouldSwitchWeapon* CSGameRules_FShouldSwitchWeapon() = 0; + virtual IReGameHookRegistry_CSGameRules_GetNextBestWeapon* CSGameRules_GetNextBestWeapon() = 0; + virtual IReGameHookRegistry_CSGameRules_FlPlayerFallDamage* CSGameRules_FlPlayerFallDamage() = 0; + virtual IReGameHookRegistry_CSGameRules_FPlayerCanTakeDamage* CSGameRules_FPlayerCanTakeDamage() = 0; + virtual IReGameHookRegistry_CSGameRules_PlayerSpawn* CSGameRules_PlayerSpawn() = 0; + virtual IReGameHookRegistry_CSGameRules_FPlayerCanRespawn* CSGameRules_FPlayerCanRespawn() = 0; + virtual IReGameHookRegistry_CSGameRules_GetPlayerSpawnSpot* CSGameRules_GetPlayerSpawnSpot() = 0; + virtual IReGameHookRegistry_CSGameRules_ClientUserInfoChanged* CSGameRules_ClientUserInfoChanged() = 0; + virtual IReGameHookRegistry_CSGameRules_PlayerKilled* CSGameRules_PlayerKilled() = 0; + virtual IReGameHookRegistry_CSGameRules_DeathNotice* CSGameRules_DeathNotice() = 0; + virtual IReGameHookRegistry_CSGameRules_CanHavePlayerItem* CSGameRules_CanHavePlayerItem() = 0; + virtual IReGameHookRegistry_CSGameRules_DeadPlayerWeapons* CSGameRules_DeadPlayerWeapons() = 0; + virtual IReGameHookRegistry_CSGameRules_ServerDeactivate* CSGameRules_ServerDeactivate() = 0; + virtual IReGameHookRegistry_CSGameRules_CheckMapConditions* CSGameRules_CheckMapConditions() = 0; + virtual IReGameHookRegistry_CSGameRules_CleanUpMap* CSGameRules_CleanUpMap() = 0; + virtual IReGameHookRegistry_CSGameRules_RestartRound* CSGameRules_RestartRound() = 0; + virtual IReGameHookRegistry_CSGameRules_CheckWinConditions* CSGameRules_CheckWinConditions() = 0; + virtual IReGameHookRegistry_CSGameRules_RemoveGuns* CSGameRules_RemoveGuns() = 0; + virtual IReGameHookRegistry_CSGameRules_GiveC4* CSGameRules_GiveC4() = 0; + virtual IReGameHookRegistry_CSGameRules_ChangeLevel* CSGameRules_ChangeLevel() = 0; + virtual IReGameHookRegistry_CSGameRules_GoToIntermission* CSGameRules_GoToIntermission() = 0; + virtual IReGameHookRegistry_CSGameRules_BalanceTeams* CSGameRules_BalanceTeams() = 0; +}; + +struct ReGameFuncs_t { + class CBasePlayer *(*UTIL_PlayerByIndex)(int playerIndex); + struct edict_s *(*CREATE_NAMED_ENTITY2)(string_t iClass); + void (*ChangeString)(char *&dest, const char *source); + void (*RadiusDamage)(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); + void (*ClearMultiDamage)(); + void (*ApplyMultiDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker); + void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); + class CBaseEntity *(*UTIL_FindEntityByString)(class CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue); +}; + +class IReGameApi { +public: + virtual ~IReGameApi() {} + + virtual int GetMajorVersion() = 0; + virtual int GetMinorVersion() = 0; + virtual const ReGameFuncs_t* GetFuncs() = 0; + virtual IReGameHookchains* GetHookchains() = 0; + + virtual class CGameRules* GetGameRules() = 0; + virtual struct WeaponInfoStruct* GetWeaponInfo(int weaponID) = 0; + virtual struct WeaponInfoStruct* GetWeaponInfo(const char* weaponName) = 0; + virtual struct playermove_s* GetPlayerMove() = 0; + virtual struct WeaponSlotInfo* GetWeaponSlot(WeaponIdType weaponID) = 0; + virtual struct WeaponSlotInfo* GetWeaponSlot(const char* weaponName) = 0; +}; + +#define VRE_GAMEDLL_API_VERSION "VRE_GAMEDLL_API_VERSION001" diff --git a/cssdk/dlls/regamedll_common.h b/cssdk/dlls/regamedll_common.h new file mode 100644 index 0000000..638d5dc --- /dev/null +++ b/cssdk/dlls/regamedll_common.h @@ -0,0 +1,95 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#ifndef _WIN32 +#define _strlwr(p) for (int i = 0; p[i] != 0; i++) p[i] = tolower(p[i]); +#endif + +#define Q_isspace isspace +#define Q_isalnum isalnum +#define Q_isalpha isalpha + +#define Q_malloc malloc +#define Q_calloc calloc +#define Q_alloca alloca +#define Q_free free + +#define Q_min min +#define Q_max max +#define Q_clamp clamp +#define Q_access _access +#define Q_close _close +#define Q_write _write +#define Q_memset memset +#define Q_memcpy memcpy +#define Q_strlen strlen +#define Q_memcmp memcmp +#define Q_strcpy strcpy +#define Q_strncpy strncpy +#define Q_strrchr strrchr +#define Q_strcat strcat +#define Q_strncat strncat +#define Q_strcmp strcmp +#define Q_strncmp strncmp +#define Q_sscanf sscanf +#define Q_strdup _strdup +#define Q_stricmp _stricmp +#define Q_strnicmp _strnicmp +#define Q_strstr strstr +#define Q_strchr strchr +#define Q_strrchr strrchr +#define Q_strlwr _strlwr +#define Q_sprintf sprintf +#define Q_snprintf _snprintf +#define Q_atoi atoi +#define Q_atof atof +#define Q_toupper toupper +#define Q_memmove memmove +#define Q_vsnprintf _vsnprintf +#define Q_vsnwprintf _vsnwprintf +#define Q_abs abs +#define Q_fabs fabs +#define Q_tan tan +#define Q_atan atan +#define Q_atan2 atan2 +#define Q_acos acos +#define Q_cos cos +#define Q_sin sin +#define Q_pow pow +#define Q_fmod fmod +#define Q_fopen fopen +#define Q_fprintf fprintf +#define Q_fclose fclose + +#ifdef REGAMEDLL_FIXES +#define Q_sqrt M_sqrt +#else +#define Q_sqrt sqrt +#endif diff --git a/cssdk/dlls/regamedll_const.h b/cssdk/dlls/regamedll_const.h new file mode 100644 index 0000000..36d038b --- /dev/null +++ b/cssdk/dlls/regamedll_const.h @@ -0,0 +1,104 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// These are caps bits to indicate what an object's capabilities (currently used for save/restore and level transitions) +#define FCAP_CUSTOMSAVE 0x00000001 +#define FCAP_ACROSS_TRANSITION 0x00000002 // should transfer between transitions +#define FCAP_MUST_SPAWN 0x00000004 // Spawn after restore +#define FCAP_DONT_SAVE 0x80000000 // Don't save this +#define FCAP_IMPULSE_USE 0x00000008 // can be used by the player +#define FCAP_CONTINUOUS_USE 0x00000010 // can be used by the player +#define FCAP_ONOFF_USE 0x00000020 // can be used by the player +#define FCAP_DIRECTIONAL_USE 0x00000040 // Player sends +/- 1 when using (currently only tracktrains) +#define FCAP_MASTER 0x00000080 // Can be used to "master" other entities (like multisource) + +// UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!! +#define FCAP_FORCE_TRANSITION 0x00000080 // ALWAYS goes across transitions + +// for Classify +#define CLASS_NONE 0 +#define CLASS_MACHINE 1 +#define CLASS_PLAYER 2 +#define CLASS_HUMAN_PASSIVE 3 +#define CLASS_HUMAN_MILITARY 4 +#define CLASS_ALIEN_MILITARY 5 +#define CLASS_ALIEN_PASSIVE 6 +#define CLASS_ALIEN_MONSTER 7 +#define CLASS_ALIEN_PREY 8 +#define CLASS_ALIEN_PREDATOR 9 +#define CLASS_INSECT 10 +#define CLASS_PLAYER_ALLY 11 +#define CLASS_PLAYER_BIOWEAPON 12 // hornets and snarks.launched by players +#define CLASS_ALIEN_BIOWEAPON 13 // hornets and snarks.launched by the alien menace +#define CLASS_VEHICLE 14 +#define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures. + +#define SF_NORESPAWN (1 << 30) // set this bit on guns and stuff that should never respawn. + +#define DMG_GENERIC 0 // generic damage was done +#define DMG_CRUSH (1<<0) // crushed by falling or moving object +#define DMG_BULLET (1<<1) // shot +#define DMG_SLASH (1<<2) // cut, clawed, stabbed +#define DMG_BURN (1<<3) // heat burned +#define DMG_FREEZE (1<<4) // frozen +#define DMG_FALL (1<<5) // fell too far +#define DMG_BLAST (1<<6) // explosive blast damage +#define DMG_CLUB (1<<7) // crowbar, punch, headbutt +#define DMG_SHOCK (1<<8) // electric shock +#define DMG_SONIC (1<<9) // sound pulse shockwave +#define DMG_ENERGYBEAM (1<<10) // laser or other high energy beam +#define DMG_NEVERGIB (1<<12) // with this bit OR'd in, no damage type will be able to gib victims upon death +#define DMG_ALWAYSGIB (1<<13) // with this bit OR'd in, any damage type can be made to gib victims upon death +#define DMG_DROWN (1<<14) // Drowning + +// time-based damage +#define DMG_TIMEBASED (~(0x3FFF)) // mask for time-based damage + +#define DMG_PARALYZE (1<<15) // slows affected creature down +#define DMG_NERVEGAS (1<<16) // nerve toxins, very bad +#define DMG_POISON (1<<17) // blood poisioning +#define DMG_RADIATION (1<<18) // radiation exposure +#define DMG_DROWNRECOVER (1<<19) // drowning recovery +#define DMG_ACID (1<<20) // toxic chemicals or acid burns +#define DMG_SLOWBURN (1<<21) // in an oven +#define DMG_SLOWFREEZE (1<<22) // in a subzero freezer +#define DMG_MORTAR (1<<23) // Hit by air raid (done to distinguish grenade from mortar) +#define DMG_EXPLOSION (1<<24) + +// these are the damage types that are allowed to gib corpses +#define DMG_GIB_CORPSE (DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB) + +// these are the damage types that have client hud art +#define DMG_SHOWNHUD (DMG_POISON | DMG_ACID | DMG_FREEZE | DMG_SLOWFREEZE | DMG_DROWN | DMG_BURN | DMG_SLOWBURN | DMG_NERVEGAS | DMG_RADIATION | DMG_SHOCK) + +// when calling KILLED(), a value that governs gib behavior is expected to be +// one of these three values +#define GIB_NORMAL 0 // gib if entity was overkilled +#define GIB_NEVER 1 // never gib, no matter how much death damage is done ( freezing, etc ) +#define GIB_ALWAYS 2 // always gib ( Houndeye Shock, Barnacle Bite ) diff --git a/cssdk/dlls/regamedll_interfaces.h b/cssdk/dlls/regamedll_interfaces.h new file mode 100644 index 0000000..84a749f --- /dev/null +++ b/cssdk/dlls/regamedll_interfaces.h @@ -0,0 +1,296 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class CBaseEntity; +class CBasePlayer; + +// Implementation wrapper +class CCSEntity { +public: + virtual ~CCSEntity() {} + virtual void FireBullets(int iShots, Vector &vecSrc, Vector &vecDirShooting, Vector &vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker); + virtual Vector FireBullets3(Vector &vecSrc, Vector &vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand); +public: + CBaseEntity *m_pContainingEntity; +}; + +class CCSDelay: public CCSEntity {}; +class CCSAnimating: public CCSDelay {}; +class CCSPlayerItem: public CCSAnimating {}; +class CCSToggle: public CCSAnimating {}; +class CCSMonster: public CCSToggle {}; +class CCSWeaponBox: public CCSEntity {}; +class CCSArmoury: public CCSEntity {}; + +class CCSPlayer: public CCSMonster { +public: + CCSPlayer() : m_bForceShowMenu(false) + { + m_szModel[0] = '\0'; + } + + virtual bool IsConnected() const; + virtual void SetAnimation(PLAYER_ANIM playerAnim); + virtual void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); + virtual void GiveNamedItem(const char *pszName); + virtual void GiveNamedItemEx(const char *pszName); + virtual void GiveDefaultItems(); + virtual void GiveShield(bool bDeploy = true); + virtual void DropShield(bool bDeploy = true); + virtual void DropPlayerItem(const char *pszItemName); + virtual void RemoveShield(); + virtual void RemoveAllItems(bool bRemoveSuit); + virtual bool RemovePlayerItem(const char* pszItemName); + virtual void SetPlayerModel(bool bHasC4); + virtual void SetPlayerModelEx(const char *modelName); + virtual void SetNewPlayerModel(const char *modelName); + virtual void ClientCommand(const char *cmd, const char *arg1 = nullptr, const char *arg2 = nullptr, const char *arg3 = nullptr); + virtual void SetProgressBarTime(int time); + virtual void SetProgressBarTime2(int time, float timeElapsed); + virtual struct edict_s *EntSelectSpawnPoint(); + virtual void SetBombIcon(bool bFlash = false); + virtual void SetScoreAttrib(CBasePlayer *dest); + virtual void SendItemStatus(); + virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); + virtual void Observer_SetMode(int iMode); + virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); + virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); + virtual void SwitchTeam(); + virtual bool JoinTeam(TeamName team); + virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); + virtual void TeamChangeUpdate(); + virtual void DropSecondary(); + virtual void DropPrimary(); + virtual bool HasPlayerItem(CBasePlayerItem *pCheckItem); + virtual bool HasNamedPlayerItem(const char *pszItemName); + + CBasePlayer *BasePlayer() const; +public: + char m_szModel[32]; + bool m_bForceShowMenu; +}; + +class CAPI_Bot: public CCSPlayer {}; +class CAPI_CSBot: public CAPI_Bot {}; +class CCSShield: public CCSEntity {}; +class CCSDeadHEV: public CCSMonster {}; +class CCSSprayCan: public CCSEntity {}; +class CCSBloodSplat: public CCSEntity {}; +class CCSPlayerWeapon: public CCSPlayerItem {}; +class CCSWorld: public CCSEntity {}; +class CCSDecal: public CCSEntity {}; +class CCSCorpse: public CCSEntity {}; +class CCSGrenade: public CCSMonster {}; +class CCSAirtank: public CCSGrenade {}; +class CCSPlayerAmmo: public CCSEntity {}; +class CCS9MMAmmo: public CCSPlayerAmmo {}; +class CCSBuckShotAmmo: public CCSPlayerAmmo {}; +class CCS556NatoAmmo: public CCSPlayerAmmo {}; +class CCS556NatoBoxAmmo: public CCSPlayerAmmo {}; +class CCS762NatoAmmo: public CCSPlayerAmmo {}; +class CCS45ACPAmmo: public CCSPlayerAmmo {}; +class CCS50AEAmmo: public CCSPlayerAmmo {}; +class CCS338MagnumAmmo: public CCSPlayerAmmo {}; +class CCS57MMAmmo: public CCSPlayerAmmo {}; +class CCS357SIGAmmo: public CCSPlayerAmmo {}; +class CCSFuncWall: public CCSEntity {}; +class CCSFuncWallToggle: public CCSFuncWall {}; +class CCSFuncConveyor: public CCSFuncWall {}; +class CCSFuncIllusionary: public CCSToggle {}; +class CCSFuncMonsterClip: public CCSFuncWall {}; +class CCSFuncRotating: public CCSEntity {}; +class CCSPendulum: public CCSEntity {}; +class CCSPointEntity: public CCSEntity {}; +class CCSStripWeapons: public CCSPointEntity {}; +class CCSInfoIntermission: public CCSPointEntity {}; +class CCSRevertSaved: public CCSPointEntity {}; +class CCSEnvGlobal: public CCSPointEntity {}; +class CCSMultiSource: public CCSPointEntity {}; +class CCSButton: public CCSToggle {}; +class CCSRotButton: public CCSButton {}; +class CCSMomentaryRotButton: public CCSToggle {}; +class CCSEnvSpark: public CCSEntity {}; +class CCSButtonTarget: public CCSEntity {}; +class CCSDoor: public CCSToggle {}; +class CCSRotDoor: public CCSDoor {}; +class CCSMomentaryDoor: public CCSToggle {}; +class CCSGib: public CCSEntity {}; +class CCSBubbling: public CCSEntity {}; +class CCSBeam: public CCSEntity {}; +class CCSLightning: public CCSBeam {}; +class CCSLaser: public CCSBeam {}; +class CCSGlow: public CCSPointEntity {}; +class CCSSprite: public CCSPointEntity {}; +class CCSBombGlow: public CCSSprite {}; +class CCSGibShooter: public CCSDelay {}; +class CCSEnvShooter: public CCSGibShooter {}; +class CCSTestEffect: public CCSDelay {}; +class CCSBlood: public CCSPointEntity {}; +class CCSShake: public CCSPointEntity {}; +class CCSFade: public CCSPointEntity {}; +class CCSMessage: public CCSPointEntity {}; +class CCSEnvFunnel: public CCSDelay {}; +class CCSEnvBeverage: public CCSDelay {}; +class CCSItemSoda: public CCSEntity {}; +class CCSShower: public CCSEntity {}; +class CCSEnvExplosion: public CCSMonster {}; +class CCSBreakable: public CCSDelay {}; +class CCSPushable: public CCSBreakable {}; +class CCSFuncTank: public CCSEntity {}; +class CCSFuncTankGun: public CCSFuncTank {}; +class CCSFuncTankLaser: public CCSFuncTank {}; +class CCSFuncTankRocket: public CCSFuncTank {}; +class CCSFuncTankMortar: public CCSFuncTank {}; +class CCSFuncTankControls: public CCSEntity {}; +class CCSRecharge: public CCSToggle {}; +class CCSCycler: public CCSMonster {}; +class CCSGenericCycler: public CCSCycler {}; +class CCSCyclerProbe: public CCSCycler {}; +class CCSCyclerSprite: public CCSEntity {}; +class CCSWeaponCycler: public CCSPlayerWeapon {}; +class CCSWreckage: public CCSMonster {}; +class CCSWorldItem: public CCSEntity {}; +class CCSItem: public CCSEntity {}; +class CCSHealthKit: public CCSItem {}; +class CCSWallHealth: public CCSToggle {}; +class CCSItemSuit: public CCSItem {}; +class CCSItemBattery: public CCSItem {}; +class CCSItemAntidote: public CCSItem {}; +class CCSItemSecurity: public CCSItem {}; +class CCSItemLongJump: public CCSItem {}; +class CCSItemKevlar: public CCSItem {}; +class CCSItemAssaultSuit: public CCSItem {}; +class CCSItemThighPack: public CCSItem {}; +class CCSGrenCatch: public CCSEntity {}; +class CCSFuncWeaponCheck: public CCSEntity {}; +class CCSHostage: public CCSMonster {}; +class CCSLight: public CCSPointEntity {}; +class CCSEnvLight: public CCSLight {}; +class CCSRuleEntity: public CCSEntity {}; +class CCSRulePointEntity: public CCSRuleEntity {}; +class CCSRuleBrushEntity: public CCSRuleEntity {}; +class CCSGameScore: public CCSRulePointEntity {}; +class CCSGameEnd: public CCSRulePointEntity {}; +class CCSGameText: public CCSRulePointEntity {}; +class CCSGameTeamMaster: public CCSRulePointEntity {}; +class CCSGameTeamSet: public CCSRulePointEntity {}; +class CCSGamePlayerZone: public CCSRuleBrushEntity {}; +class CCSGamePlayerHurt: public CCSRulePointEntity {}; +class CCSGameCounter: public CCSRulePointEntity {}; +class CCSGameCounterSet: public CCSRulePointEntity {}; +class CCSGamePlayerEquip: public CCSRulePointEntity {}; +class CCSGamePlayerTeam: public CCSRulePointEntity {}; +class CCSFuncMortarField: public CCSToggle {}; +class CCSMortar: public CCSGrenade {}; +class CCSMapInfo: public CCSPointEntity {}; +class CCSPathCorner: public CCSPointEntity {}; +class CCSPathTrack: public CCSPointEntity {}; +class CCSFuncTrackTrain: public CCSEntity {}; +class CCSFuncVehicleControls: public CCSEntity {}; +class CCSFuncVehicle: public CCSEntity {}; +class CCSPlatTrain: public CCSToggle {}; +class CCSFuncPlat: public CCSPlatTrain {}; +class CCSPlatTrigger: public CCSEntity {}; +class CCSFuncPlatRot: public CCSFuncPlat {}; +class CCSFuncTrain: public CCSPlatTrain {}; +class CCSFuncTrainControls: public CCSEntity {}; +class CCSFuncTrackChange: public CCSFuncPlatRot {}; +class CCSFuncTrackAuto: public CCSFuncTrackChange {}; +class CCSGunTarget: public CCSMonster {}; +class CCSAmbientGeneric: public CCSEntity {}; +class CCSEnvSound: public CCSPointEntity {}; +class CCSSpeaker: public CCSEntity {}; +class CCSSoundEnt: public CCSEntity {}; +class CCSUSP: public CCSPlayerWeapon {}; +class CCSMP5N: public CCSPlayerWeapon {}; +class CCSSG552: public CCSPlayerWeapon {}; +class CCSAK47: public CCSPlayerWeapon {}; +class CCSAUG: public CCSPlayerWeapon {}; +class CCSAWP: public CCSPlayerWeapon {}; +class CCSC4: public CCSPlayerWeapon {}; +class CCSDEAGLE: public CCSPlayerWeapon {}; +class CCSFlashbang: public CCSPlayerWeapon {}; +class CCSG3SG1: public CCSPlayerWeapon {}; +class CCSGLOCK18: public CCSPlayerWeapon {}; +class CCSHEGrenade: public CCSPlayerWeapon {}; +class CCSKnife: public CCSPlayerWeapon {}; +class CCSM249: public CCSPlayerWeapon {}; +class CCSM3: public CCSPlayerWeapon {}; +class CCSM4A1: public CCSPlayerWeapon {}; +class CCSMAC10: public CCSPlayerWeapon {}; +class CCSP228: public CCSPlayerWeapon {}; +class CCSP90: public CCSPlayerWeapon {}; +class CCSSCOUT: public CCSPlayerWeapon {}; +class CCSSmokeGrenade: public CCSPlayerWeapon {}; +class CCSTMP: public CCSPlayerWeapon {}; +class CCSXM1014: public CCSPlayerWeapon {}; +class CCSELITE: public CCSPlayerWeapon {}; +class CCSFiveSeven: public CCSPlayerWeapon {}; +class CCSUMP45: public CCSPlayerWeapon {}; +class CCSSG550: public CCSPlayerWeapon {}; +class CCSGalil: public CCSPlayerWeapon {}; +class CCSFamas: public CCSPlayerWeapon {}; +class CCSNullEntity: public CCSEntity {}; +class CCSDMStart: public CCSPointEntity {}; +class CCSFrictionModifier: public CCSEntity {}; +class CCSAutoTrigger: public CCSDelay {}; +class CCSTriggerRelay: public CCSDelay {}; +class CCSMultiManager: public CCSToggle {}; +class CCSRenderFxManager: public CCSEntity {}; +class CCSTrigger: public CCSToggle {}; +class CCSTriggerHurt: public CCSTrigger {}; +class CCSTriggerMonsterJump: public CCSTrigger {}; +class CCSTriggerCDAudio: public CCSTrigger {}; +class CCSTargetCDAudio: public CCSPointEntity {}; +class CCSTriggerMultiple: public CCSTrigger {}; +class CCSTriggerOnce: public CCSTriggerMultiple {}; +class CCSTriggerCounter: public CCSTrigger {}; +class CCSTriggerVolume: public CCSPointEntity {}; +class CCSFireAndDie: public CCSDelay {}; +class CCSChangeLevel: public CCSTrigger {}; +class CCSLadder: public CCSTrigger {}; +class CCSTriggerPush: public CCSTrigger {}; +class CCSTriggerTeleport: public CCSTrigger {}; +class CCSBuyZone: public CCSTrigger {}; +class CCSBombTarget: public CCSTrigger {}; +class CCSHostageRescue: public CCSTrigger {}; +class CCSEscapeZone: public CCSTrigger {}; +class CCSVIP_SafetyZone: public CCSTrigger {}; +class CCSTriggerSave: public CCSTrigger {}; +class CCSTriggerEndSection: public CCSTrigger {}; +class CCSTriggerGravity: public CCSTrigger {}; +class CCSTriggerChangeTarget: public CCSDelay {}; +class CCSTriggerCamera: public CCSDelay {}; +class CCSWeather: public CCSTrigger {}; +class CCSClientFog: public CCSEntity {}; + +inline CBasePlayer *CCSPlayer::BasePlayer() const { + return reinterpret_cast(this->m_pContainingEntity); +} diff --git a/cssdk/dlls/revert_saved.h b/cssdk/dlls/revert_saved.h new file mode 100644 index 0000000..f8bb4ee --- /dev/null +++ b/cssdk/dlls/revert_saved.h @@ -0,0 +1,49 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CRevertSaved: public CPointEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float Duration() const { return pev->dmg_take; } + float HoldTime() const { return pev->dmg_save; } + float MessageTime() const { return m_messageTime; } + float LoadTime() const { return m_loadTime; } + + void SetDuration(float duration) { pev->dmg_take = duration; } + void SetHoldTime(float hold) { pev->dmg_save = hold; } + void SetMessageTime(float time) { m_messageTime = time; } + void SetLoadTime(float time) { m_loadTime = time; } +public: + float m_messageTime; + float m_loadTime; +}; diff --git a/cssdk/dlls/skill.h b/cssdk/dlls/skill.h new file mode 100644 index 0000000..95e2084 --- /dev/null +++ b/cssdk/dlls/skill.h @@ -0,0 +1,53 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define SKILL_EASY 1 +#define SKILL_MEDIUM 2 +#define SKILL_HARD 3 + +struct skilldata_t +{ + int iSkillLevel; + float plrDmg9MM; + float plrDmg357; + float plrDmgMP5; + float plrDmgM203Grenade; + float plrDmgBuckshot; + float plrDmgCrossbowClient; + float plrDmgRPG; + float monDmg9MM; + float monDmgMP5; + float monDmg12MM; + float suitchargerCapacity; + float batteryCapacity; + float healthchargerCapacity; + float healthkitCapacity; +}; + +extern skilldata_t gSkillData; diff --git a/cssdk/dlls/sound.h b/cssdk/dlls/sound.h new file mode 100644 index 0000000..c4e636c --- /dev/null +++ b/cssdk/dlls/sound.h @@ -0,0 +1,141 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define CSENTENCEG_MAX 200 // max number of sentence groups +#define CSENTENCE_LRU_MAX 32 // max number of elements per sentence group +#define CDPVPRESETMAX 27 + +// spawnflags +#define AMBIENT_SOUND_STATIC 0 // medium radius attenuation +#define AMBIENT_SOUND_EVERYWHERE 1 +#define AMBIENT_SOUND_SMALLRADIUS 2 +#define AMBIENT_SOUND_MEDIUMRADIUS 4 +#define AMBIENT_SOUND_LARGERADIUS 8 +#define AMBIENT_SOUND_START_SILENT 16 +#define AMBIENT_SOUND_NOT_LOOPING 32 + +#define ANNOUNCE_MINUTES_MIN 0.25 +#define ANNOUNCE_MINUTES_MAX 2.25 + +#define SPEAKER_START_SILENT 1 // wait for trigger 'on' to start announcements + +#define LFO_SQUARE 1 // square +#define LFO_TRIANGLE 2 // triangle +#define LFO_RANDOM 3 // random + +// group of related sentences +struct sentenceg +{ + char szgroupname[16]; + int count; + unsigned char rgblru[ CSENTENCE_LRU_MAX ]; +}; + +// runtime pitch shift and volume fadein/out structure + +// NOTE: IF YOU CHANGE THIS STRUCT YOU MUST CHANGE THE SAVE/RESTORE VERSION NUMBER +// SEE BELOW (in the typedescription for the class) +typedef struct dynpitchvol +{ + // NOTE: do not change the order of these parameters + // NOTE: unless you also change order of rgdpvpreset array elements! + int preset; + + int pitchrun; // pitch shift % when sound is running 0 - 255 + int pitchstart; // pitch shift % when sound stops or starts 0 - 255 + int spinup; // spinup time 0 - 100 + int spindown; // spindown time 0 - 100 + + int volrun; // volume change % when sound is running 0 - 10 + int volstart; // volume change % when sound stops or starts 0 - 10 + int fadein; // volume fade in time 0 - 100 + int fadeout; // volume fade out time 0 - 100 + + // Low Frequency Oscillator + int lfotype; // 0) off 1) square 2) triangle 3) random + int lforate; // 0 - 1000, how fast lfo osciallates + + int lfomodpitch; // 0-100 mod of current pitch. 0 is off. + int lfomodvol; // 0-100 mod of current volume. 0 is off. + + int cspinup; // each trigger hit increments counter and spinup pitch + + int cspincount; + int pitch; + int spinupsav; + int spindownsav; + int pitchfrac; + int vol; + int fadeinsav; + int fadeoutsav; + int volfrac; + int lfofrac; + int lfomult; + +} dynpitchvol_t; + +class CAmbientGeneric: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; +public: + float m_flAttenuation; // attenuation value + dynpitchvol_t m_dpv; + BOOL m_fActive; // only TRUE when the entity is playing a looping sound + BOOL m_fLooping; // TRUE when the sound played will loop +}; + +class CEnvSound: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Think() = 0; +public: + float m_flRadius; + float m_flRoomtype; +}; + +class CSpeaker: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; +public: + int m_preset; // preset number +}; diff --git a/cssdk/dlls/spectator.h b/cssdk/dlls/spectator.h new file mode 100644 index 0000000..d42e05a --- /dev/null +++ b/cssdk/dlls/spectator.h @@ -0,0 +1,33 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CBaseSpectator: public CBaseEntity { +public: + virtual void Spawn(); +}; diff --git a/cssdk/dlls/subs.h b/cssdk/dlls/subs.h new file mode 100644 index 0000000..8cae347 --- /dev/null +++ b/cssdk/dlls/subs.h @@ -0,0 +1,40 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class CNullEntity: public CBaseEntity { +public: + virtual void Spawn() = 0; +}; + +class CBaseDMStart: public CPointEntity { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual BOOL IsTriggered(CBaseEntity *pEntity) = 0; +}; diff --git a/cssdk/dlls/training_gamerules.h b/cssdk/dlls/training_gamerules.h new file mode 100644 index 0000000..079e2be --- /dev/null +++ b/cssdk/dlls/training_gamerules.h @@ -0,0 +1,84 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CHalfLifeTraining: public CHalfLifeMultiplay { +protected: + virtual ~CHalfLifeTraining() {}; +public: + virtual BOOL IsMultiplayer() = 0; + virtual BOOL IsDeathmatch() = 0; + virtual void InitHUD(CBasePlayer *pl) = 0; + virtual void PlayerSpawn(CBasePlayer *pPlayer) = 0; + virtual void PlayerThink(CBasePlayer *pPlayer) = 0; + virtual BOOL FPlayerCanRespawn(CBasePlayer *pPlayer) = 0; + virtual edict_t *GetPlayerSpawnSpot(CBasePlayer *pPlayer) = 0; + virtual void PlayerKilled(CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor) = 0; + virtual int ItemShouldRespawn(CItem *pItem) = 0; + virtual void CheckMapConditions() = 0; + virtual void CheckWinConditions() = 0; +public: + float FillAccountTime; + float ServerRestartTime; + BOOL fInBuyArea; + BOOL fVisitedBuyArea; + bool fVGUIMenus; +}; + +class CBaseGrenCatch: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Think() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +public: + int m_NeedGrenadeType; + string_t sTriggerOnGrenade; + string_t sDisableOnGrenade; + bool m_fSmokeTouching; + bool m_fFlashTouched; +}; + +class CFuncWeaponCheck: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +private: + string_t sTriggerWithItems; + string_t sTriggerNoItems; + string_t sMaster; + unsigned int sItemName[32]; + int iItemCount; + int iAnyWeapon; +}; diff --git a/cssdk/dlls/trains.h b/cssdk/dlls/trains.h new file mode 100644 index 0000000..10927b6 --- /dev/null +++ b/cssdk/dlls/trains.h @@ -0,0 +1,149 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// Tracktrain spawn flags +#define SF_TRACKTRAIN_NOPITCH 0x0001 +#define SF_TRACKTRAIN_NOCONTROL 0x0002 +#define SF_TRACKTRAIN_FORWARDONLY 0x0004 +#define SF_TRACKTRAIN_PASSABLE 0x0008 + +// Spawnflag for CPathTrack +#define SF_PATH_DISABLED 0x00000001 +#define SF_PATH_FIREONCE 0x00000002 +#define SF_PATH_ALTREVERSE 0x00000004 +#define SF_PATH_DISABLE_TRAIN 0x00000008 +#define SF_PATH_ALTERNATE 0x00008000 + +// Spawnflags of CPathCorner +#define SF_CORNER_WAITFORTRIG 0x001 +#define SF_CORNER_TELEPORT 0x002 +#define SF_CORNER_FIREONCE 0x004 + +class CPathTrack: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData* pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void Activate() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + float m_length; + string_t m_altName; + CPathTrack *m_pnext; + CPathTrack *m_pprevious; + CPathTrack *m_paltpath; +}; + +class CFuncTrackTrain: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData* pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void OverrideReset() = 0; + virtual BOOL OnControls(entvars_t *pev) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + CPathTrack *m_ppath; + float m_length; + float m_height; + float m_speed; + float m_dir; + float m_startSpeed; + Vector m_controlMins; + Vector m_controlMaxs; + int m_soundPlaying; + int m_sounds; + float m_flVolume; + float m_flBank; + float m_oldSpeed; + float m_fTurnAngle; + float m_flSteeringWheelDecay; + float m_flAcceleratorDecay; + +private: + unsigned short m_usAdjustPitch; +}; + +class CFuncVehicle: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual int Classify() = 0; + virtual void OverrideReset() = 0; + virtual BOOL OnControls(entvars_t *pev) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void Blocked(CBaseEntity *pOther) = 0; +public: + CPathTrack *m_ppath; + float m_length; + float m_width; + float m_height; + float m_speed; + float m_dir; + float m_startSpeed; + Vector m_controlMins; + Vector m_controlMaxs; + int m_soundPlaying; + int m_sounds; + int m_acceleration; + float m_flVolume; + float m_flBank; + float m_oldSpeed; + int m_iTurnAngle; + float m_flSteeringWheelDecay; + float m_flAcceleratorDecay; + float m_flTurnStartTime; + float m_flLaunchTime; + float m_flLastNormalZ; + float m_flCanTurnNow; + float m_flUpdateSound; + Vector m_vFrontLeft; + Vector m_vFront; + Vector m_vFrontRight; + Vector m_vBackLeft; + Vector m_vBack; + Vector m_vBackRight; + Vector m_vSurfaceNormal; + Vector m_vVehicleDirection; + CBaseEntity *m_pDriver; + +private: + unsigned short m_usAdjustPitch; +}; diff --git a/cssdk/dlls/triggers.h b/cssdk/dlls/triggers.h new file mode 100644 index 0000000..3e87253 --- /dev/null +++ b/cssdk/dlls/triggers.h @@ -0,0 +1,358 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define GRENADETYPE_SMOKE 1 +#define GRENADETYPE_FLASH 2 + +#define MAX_ITEM_COUNTS 32 +#define MAX_ENTITY 512 // We can only ever move 512 entities across a transition + +// triggers +#define SF_TRIGGER_ALLOWMONSTERS 1 // monsters allowed to fire this trigger +#define SF_TRIGGER_NOCLIENTS 2 // players not allowed to fire this trigger +#define SF_TRIGGER_PUSHABLES 4 // only pushables can fire this trigger + +#define SF_TRIGGER_PUSH_START_OFF 2 // spawnflag that makes trigger_push spawn turned OFF +#define SF_TRIGGER_HURT_TARGETONCE 1 // Only fire hurt target once +#define SF_TRIGGER_HURT_START_OFF 2 // spawnflag that makes trigger_push spawn turned OFF +#define SF_TRIGGER_HURT_NO_CLIENTS 8 // spawnflag that makes trigger_push spawn turned OFF +#define SF_TRIGGER_HURT_CLIENTONLYFIRE 16 // trigger hurt will only fire its target if it is hurting a client +#define SF_TRIGGER_HURT_CLIENTONLYTOUCH 32 // only clients may touch this trigger. + +#define SF_AUTO_FIREONCE 0x0001 +#define SF_RELAY_FIREONCE 0x0001 +#define SF_ENDSECTION_USEONLY 0x0001 + +#define SF_MULTIMAN_CLONE 0x80000000 +#define SF_MULTIMAN_THREAD 0x00000001 + +#define SF_CHANGELEVEL_USEONLY 0x0002 +#define SF_CAMERA_PLAYER_POSITION 1 +#define SF_CAMERA_PLAYER_TARGET 2 +#define SF_CAMERA_PLAYER_TAKECONTROL 4 + +// Flags to indicate masking off various render parameters that are normally copied to the targets +#define SF_RENDER_MASKFX (1 << 0) +#define SF_RENDER_MASKAMT (1 << 1) +#define SF_RENDER_MASKMODE (1 << 2) +#define SF_RENDER_MASKCOLOR (1 << 3) + +class CFrictionModifier: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; +public: + float m_frictionFraction; +}; + +// This trigger will fire when the level spawns (or respawns if not fire once) +// It will check a global state before firing. It supports delay and killtargets +class CAutoTrigger: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Think() = 0; +public: + int m_globalstate; + USE_TYPE triggerType; +}; + +class CTriggerRelay: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + USE_TYPE triggerType; +}; + +// The Multimanager Entity - when fired, will fire up to 16 targets +// at specified times. +// FLAG: THREAD (create clones when triggered) +// FLAG: CLONE (this is a clone for a threaded execution) +class CMultiManager: public CBaseToggle { +public: + virtual void Spawn() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual BOOL HasTarget(string_t targetname) = 0; +public: + int m_cTargets; + int m_index; + float m_startTime; + int m_iTargetName[MAX_MULTI_TARGETS]; + float m_flTargetDelay[MAX_MULTI_TARGETS]; +}; + +// Render parameters trigger +// +// This entity will copy its render parameters (renderfx, rendermode, rendercolor, renderamt) +// to its targets when triggered. +class CRenderFxManager: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +class CBaseTrigger: public CBaseToggle { +public: + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int ObjectCaps() = 0; +}; + +// trigger_hurt - hurts anything that touches it. if the trigger has a targetname, firing it will toggle state +// int gfToggleState = 0; // used to determine when all radiation trigger hurts have called 'RadiationThink' +class CTriggerHurt: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CTriggerMonsterJump: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void Think() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +}; + +// trigger_cdaudio - starts/stops cd audio tracks +class CTriggerCDAudio: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +// This plays a CD track when fired or when the player enters it's radius +class CTargetCDAudio: public CPointEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Think() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +}; + +// QUAKED trigger_multiple (.5 .5 .5) ? notouch +// Variable sized repeatable trigger. Must be targeted at one or more entities. +// If "health" is set, the trigger must be killed to activate each time. +// If "delay" is set, the trigger waits some time after activating before firing. +// "wait" : Seconds between triggerings. (.2 default) +// If notouch is set, the trigger is only fired by other entities, not by touching. +// NOTOUCH has been obsoleted by trigger_relay! +// sounds +// 1) secret +// 2) beep beep +// 3) large switch +// 4) +// NEW +// if a trigger has a NETNAME, that NETNAME will become the TARGET of the triggered object. +class CTriggerMultiple: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +// QUAKED trigger_once (.5 .5 .5) ? notouch +// Variable sized trigger. Triggers once, then removes itself. You must set the key "target" to the name of another object in the level that has a matching +// "targetname". If "health" is set, the trigger must be killed to activate. +// If notouch is set, the trigger is only fired by other entities, not by touching. +// if "killtarget" is set, any objects that have a matching "target" will be removed when the trigger is fired. +// if "angle" is set, the trigger will only fire when someone is facing the direction of the angle. Use "360" for an angle of 0. +// sounds +// 1) secret +// 2) beep beep +// 3) large switch +// 4) +class CTriggerOnce: public CTriggerMultiple { +public: + virtual void Spawn() = 0; +}; + +// QUAKED trigger_counter (.5 .5 .5) ? nomessage +// Acts as an intermediary for an action that takes multiple inputs. +// If nomessage is not set, it will print "1 more.. " etc when triggered and +// "sequence complete" when finished. After the counter has been triggered "cTriggersLeft" +// times (default 2), it will fire all of it's targets and remove itself. +class CTriggerCounter: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +// Derive from point entity so this doesn't move across levels +class CTriggerVolume: public CPointEntity { +public: + virtual void Spawn() = 0; +}; + +// Fires a target after level transition and then dies +class CFireAndDie: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int ObjectCaps() = 0; // Always go across transitions + virtual void Think() = 0; +}; + +// QUAKED trigger_changelevel (0.5 0.5 0.5) ? NO_INTERMISSION +// When the player touches this, he gets sent to the map listed in the "map" variable. Unless the NO_INTERMISSION flag is set, the view will go to the info_intermission spot and display stats. +class CChangeLevel: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; +public: + char m_szMapName[cchMapNameMost]; // trigger_changelevel only: next map + char m_szLandmarkName[cchMapNameMost]; // trigger_changelevel only: landmark on next map + int m_changeTarget; + float m_changeTargetDelay; +}; + +class CLadder: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +}; + +class CTriggerPush: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +}; + +class CTriggerTeleport: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CBuyZone: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CBombTarget: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CHostageRescue: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CEscapeZone: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CVIP_SafetyZone: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CTriggerSave: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CTriggerEndSection: public CBaseTrigger { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +}; + +class CTriggerGravity: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +// this is a really bad idea. +class CTriggerChangeTarget: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +private: + int m_iszNewTarget; +}; + +class CTriggerCamera: public CBaseDelay { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; +public: + EHANDLE m_hPlayer; + EHANDLE m_hTarget; + CBaseEntity *m_pentPath; + int m_sPath; + float m_flWait; + float m_flReturnTime; + float m_flStopTime; + float m_moveDistance; + float m_targetSpeed; + float m_initialSpeed; + float m_acceleration; + float m_deceleration; + int m_state; +}; + +class CWeather: public CBaseTrigger { +public: + virtual void Spawn() = 0; +}; + +class CClientFog: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +public: + int m_iStartDist; + int m_iEndDist; + float m_fDensity; +}; diff --git a/cssdk/dlls/unisignals.h b/cssdk/dlls/unisignals.h new file mode 100644 index 0000000..054bdc5 --- /dev/null +++ b/cssdk/dlls/unisignals.h @@ -0,0 +1,57 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef UNISIGNALS_H +#define UNISIGNALS_H +#ifdef _WIN32 +#pragma once +#endif + +class CUnifiedSignals +{ +public: + CUnifiedSignals() + { + m_flSignal = 0; + m_flState = 0; + } +public: + void Update() + { + m_flState = m_flSignal; + m_flSignal = 0; + } + void Signal(int flags) { m_flSignal |= flags; } + int GetSignal() const { return m_flSignal; } + int GetState() const { return m_flState; } +public: + int m_flSignal; + int m_flState; +}; + +#endif // UNISIGNALS_H diff --git a/cssdk/dlls/util.h b/cssdk/dlls/util.h new file mode 100644 index 0000000..e0d1d30 --- /dev/null +++ b/cssdk/dlls/util.h @@ -0,0 +1,182 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "enginecallback.h" + +#define eoNullEntity 0 // Testing the three types of "entity" for nullity +#define iStringNull 0 // Testing strings for nullity + +#define cchMapNameMost 32 + +#define CBSENTENCENAME_MAX 16 +#define CVOXFILESENTENCEMAX 1536 // max number of sentences in game. NOTE: this must match CVOXFILESENTENCEMAX in engine\sound.h + +#define GROUP_OP_AND 0 +#define GROUP_OP_NAND 1 + +extern globalvars_t *gpGlobals; + +// Use this instead of ALLOC_STRING on constant strings +#define STRING(offset) ((const char *)(gpGlobals->pStringBase + (unsigned int)(offset))) +#define MAKE_STRING(str) ((uint64)(str) - (uint64)(STRING(0))) + +// Dot products for view cone checking +#define VIEW_FIELD_FULL -1.0 // +-180 degrees +#define VIEW_FIELD_WIDE -0.7 // +-135 degrees 0.1 // +-85 degrees, used for full FOV checks +#define VIEW_FIELD_NARROW 0.7 // +-45 degrees, more narrow check used to set up ranged attacks +#define VIEW_FIELD_ULTRA_NARROW 0.9 // +-25 degrees, more narrow check used to set up ranged attacks + +#define SND_SPAWNING (1<<8) // duplicated in protocol.h we're spawing, used in some cases for ambients +#define SND_STOP (1<<5) // duplicated in protocol.h stop sound +#define SND_CHANGE_VOL (1<<6) // duplicated in protocol.h change sound vol +#define SND_CHANGE_PITCH (1<<7) // duplicated in protocol.h change sound pitch + +// All monsters need this data +#define DONT_BLEED -1 +#define BLOOD_COLOR_RED (byte)247 +#define BLOOD_COLOR_YELLOW (byte)195 +#define BLOOD_COLOR_GREEN BLOOD_COLOR_YELLOW + +#define GERMAN_GIB_COUNT 4 +#define HUMAN_GIB_COUNT 6 +#define ALIEN_GIB_COUNT 4 + +#define LANGUAGE_ENGLISH 0 +#define LANGUAGE_GERMAN 1 +#define LANGUAGE_FRENCH 2 +#define LANGUAGE_BRITISH 3 + +#define SVC_TEMPENTITY 23 +#define SVC_INTERMISSION 30 +#define SVC_CDTRACK 32 +#define SVC_WEAPONANIM 35 +#define SVC_ROOMTYPE 37 +#define SVC_DIRECTOR 51 + +#define SF_TRIG_PUSH_ONCE 1 + +// func_rotating +#define SF_BRUSH_ROTATE_Y_AXIS 0 +#define SF_BRUSH_ROTATE_INSTANT 1 +#define SF_BRUSH_ROTATE_BACKWARDS 2 +#define SF_BRUSH_ROTATE_Z_AXIS 4 +#define SF_BRUSH_ROTATE_X_AXIS 8 +#define SF_PENDULUM_AUTO_RETURN 16 +#define SF_PENDULUM_PASSABLE 32 + +#define SF_BRUSH_ROTATE_SMALLRADIUS 128 +#define SF_BRUSH_ROTATE_MEDIUMRADIUS 256 +#define SF_BRUSH_ROTATE_LARGERADIUS 512 + +#define SPAWNFLAG_NOMESSAGE 1 +#define SPAWNFLAG_NOTOUCH 1 +#define SPAWNFLAG_DROIDONLY 4 + +#define VEC_HULL_MIN_Z Vector(0, 0, -36) +#define VEC_DUCK_HULL_MIN_Z Vector(0, 0, -18) + +#define VEC_HULL_MIN Vector(-16, -16, -36) +#define VEC_HULL_MAX Vector(16, 16, 36) + +#define VEC_VIEW Vector(0, 0, 17) + +#define VEC_DUCK_HULL_MIN Vector(-16, -16, -18) +#define VEC_DUCK_HULL_MAX Vector(16, 16, 32) +#define VEC_DUCK_VIEW Vector(0, 0, 12) + +#define PRECACHE_SOUND_ARRAY(a) \ + { for (int i = 0; i < ARRAYSIZE(a); ++i) PRECACHE_SOUND((char *)a[i]); } + +// Inlines +inline edict_t *FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, const char *pszName) { return FIND_ENTITY_BY_STRING(entStart, "classname", pszName); } +inline edict_t *FIND_ENTITY_BY_TARGETNAME(edict_t *entStart, const char *pszName) { return FIND_ENTITY_BY_STRING(entStart, "targetname", pszName); } + +inline edict_t *ENT(const entvars_t *pev) { return pev->pContainingEntity; } +inline edict_t *ENT(EOFFSET eoffset) { return (*g_engfuncs.pfnPEntityOfEntOffset)(eoffset); } +inline EOFFSET OFFSET(const edict_t *pent) { return (*g_engfuncs.pfnEntOffsetOfPEntity)(pent); } +inline EOFFSET OFFSET(const entvars_t *pev) { return OFFSET(ENT(pev)); } + +inline entvars_t *VARS(edict_t *pent) +{ + if (!pent) + return NULL; + + return &pent->v; +} + +inline entvars_t *VARS(EOFFSET eoffset) { return VARS(ENT(eoffset)); } +inline int ENTINDEX(const edict_t *pEdict) { return (*g_engfuncs.pfnIndexOfEdict)(pEdict); } +inline int ENTINDEX(const entvars_t *pev) { return (*g_engfuncs.pfnIndexOfEdict)(ENT(pev)); } +inline edict_t *INDEXENT(int iEdictNum) { return (*g_engfuncs.pfnPEntityOfEntIndex)(iEdictNum); } +inline void MESSAGE_BEGIN(int msg_dest, int msg_type, const float *pOrigin, entvars_t *ent) { MESSAGE_BEGIN(msg_dest, msg_type, pOrigin, ENT(ent)); } +inline BOOL FNullEnt(EOFFSET eoffset) { return (eoffset == 0); } +inline BOOL FNullEnt(entvars_t *pev) { return (pev == NULL || FNullEnt(OFFSET(pev))); } +inline BOOL FNullEnt(const edict_t *pent) { return (pent == NULL || FNullEnt(OFFSET(pent))); } +inline BOOL FStringNull(int iString) { return (iString == iStringNull); } +inline BOOL FStrEq(const char *sz1, const char *sz2) { return (strcmp(sz1, sz2) == 0); } +inline BOOL FClassnameIs(entvars_t *pev, const char *szClassname) { return FStrEq(STRING(pev->classname), szClassname); } +inline BOOL FClassnameIs(edict_t *pent, const char *szClassname) { return FStrEq(STRING(VARS(pent)->classname), szClassname); } + +inline void UTIL_MakeVectorsPrivate(Vector vecAngles, float *p_vForward, float *p_vRight, float *p_vUp) { g_engfuncs.pfnAngleVectors(vecAngles, p_vForward, p_vRight, p_vUp); } + +// NOTE: use EMIT_SOUND_DYN to set the pitch of a sound. Pitch of 100 +// is no pitch shift. Pitch > 100 up to 255 is a higher pitch, pitch < 100 +// down to 1 is a lower pitch. 150 to 70 is the realistic range. +// EMIT_SOUND_DYN with pitch != 100 should be used sparingly, as it's not quite as +// fast as EMIT_SOUND (the pitchshift mixer is not native coded). +inline void EMIT_SOUND(edict_t *entity, int channel, const char *sample, float volume, float attenuation) +{ + EMIT_SOUND_DYN2(entity, channel, sample, volume, attenuation, 0, PITCH_NORM); +} + +inline void STOP_SOUND(edict_t *entity, int channel, const char *sample) +{ + EMIT_SOUND_DYN2(entity, channel, sample, 0, 0, SND_STOP, PITCH_NORM); +} + +inline void UTIL_SetSize(entvars_t *pev, const Vector &vecMin, const Vector &vecMax) +{ + SET_SIZE(ENT(pev), vecMin, vecMax); +} + +inline void UTIL_SetOrigin(entvars_t *pev, const Vector &vecOrigin) +{ + edict_t *ent = ENT(pev); + + if (ent != NULL) + SET_ORIGIN(ent, vecOrigin); +} + +inline void UTIL_TraceLine(const Vector &vecStart, const Vector &vecEnd, IGNORE_MONSTERS igmon, edict_t *pentIgnore, TraceResult *ptr) +{ + TRACE_LINE(vecStart, vecEnd, (igmon == ignore_monsters), pentIgnore, ptr); +} + +extern char *UTIL_VarArgs(char *format, ...); +extern void UTIL_LogPrintf(const char *fmt, ...); diff --git a/cssdk/dlls/vector.h b/cssdk/dlls/vector.h new file mode 100644 index 0000000..6427e1e --- /dev/null +++ b/cssdk/dlls/vector.h @@ -0,0 +1,176 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// 2DVector - used for many pathfinding and many other +// operations that are treated as planar rather than 3d. +class Vector2D { +public: + inline Vector2D() : x(), y() {} + inline Vector2D(float X, float Y) : x(X), y(Y) {} + inline Vector2D(const Vector2D &v) { *(int*)&x = *(int*)&v.x; *(int*)&y = *(int*)&v.y; } + inline Vector2D operator+(const Vector2D &v) const { return Vector2D(x + v.x, y + v.y); } + inline Vector2D operator-(const Vector2D &v) const { return Vector2D(x - v.x, y - v.y); } + inline Vector2D operator*(float fl) const { return Vector2D(x * fl, y * fl); } + inline Vector2D operator/(float fl) const { return Vector2D(x / fl, y / fl); } + inline Vector2D operator/=(float fl) const { return Vector2D(x / fl, y / fl); } + + inline float Length() const { return sqrt(x * x + y * y); } + inline float LengthSquared() const { return (x * x + y * y); } + + operator float*() { return &x; } + operator const float*() const { return &x; } + + inline Vector2D Normalize() const + { + float flLen = Length(); + if (flLen == 0) + return Vector2D(0, 0); + + flLen = 1 / flLen; + return Vector2D(x * flLen, y * flLen); + } + + inline bool IsLengthLessThan(float length) const { return (LengthSquared() < length * length); } + inline bool IsLengthGreaterThan(float length) const { return (LengthSquared() > length * length); } + inline float NormalizeInPlace() + { + float flLen = Length(); + if (flLen == 0) + { + x = 1; y = 0; + } + else + { + flLen = 1 / flLen; + x *= flLen; y *= flLen; + } + + return flLen; + } + inline bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance); + } + + // Members + vec_t x, y; +}; + +inline float DotProduct(const Vector2D &a, const Vector2D &b) { return (a.x * b.x + a.y * b.y); } +inline Vector2D operator*(float fl, const Vector2D &v) { return v * fl; } + +// 3D Vector +// same data-layout as engine's vec3_t, which is a vec_t[3] +class Vector { +public: + // Construction/destruction + inline Vector() : x(), y(), z() {} + inline Vector(float X, float Y, float Z) : x(X), y(Y), z(Z) {} + inline Vector(const Vector &v) { *(int*)&x = *(int*)&v.x; *(int*)&y = *(int*)&v.y; *(int*)&z = *(int*)&v.z; } + inline Vector(const float rgfl[3]) { *(int*)&x = *(int*)&rgfl[0]; *(int*)&y = *(int*)&rgfl[1]; *(int*)&z = *(int*)&rgfl[2]; } + + // Operators + inline Vector operator-() const { return Vector(-x, -y, -z); } + inline int operator==(const Vector &v) const { return x == v.x && y == v.y && z == v.z; } + inline int operator!=(const Vector &v) const { return !(*this == v); } + inline Vector operator+(const Vector &v) const { return Vector(x + v.x, y + v.y, z + v.z); } + inline Vector operator-(const Vector &v) const { return Vector(x - v.x, y - v.y, z - v.z); } + inline Vector operator*(float fl) const { return Vector(x * fl, y * fl, z * fl); } + inline Vector operator/(float fl) const { return Vector(x / fl, y / fl, z / fl); } + inline Vector operator/=(float fl) const{ return Vector(x / fl, y / fl, z / fl); } + + // Methods + inline void CopyToArray(float *rgfl) const { *(int*)&rgfl[0] = *(int*)&x; *(int*)&rgfl[1] = *(int*)&y; *(int*)&rgfl[2] = *(int*)&z; } + inline float Length() const { return sqrt(x * x + y * y + z * z); } + inline float LengthSquared() const { return (x * x + y * y + z * z); } + + operator float*() { return &x; } // Vectors will now automatically convert to float * when needed + operator const float*() const { return &x; } // Vectors will now automatically convert to float * when needed + + inline Vector Normalize() + { + float flLen = Length(); + if (flLen == 0) + return Vector(0, 0, 1); + + flLen = 1 / flLen; + return Vector(x * flLen, y * flLen, z * flLen); + } + inline Vector2D Make2D() const + { + Vector2D Vec2; + *(int*)&Vec2.x = *(int*)&x; + *(int*)&Vec2.y = *(int*)&y; + return Vec2; + } + + inline float Length2D() const { return sqrt(x * x + y * y); } + + inline bool IsLengthLessThan(float length) const { return (LengthSquared() < length * length); } + inline bool IsLengthGreaterThan(float length) const { return (LengthSquared() > length * length); } + + inline float NormalizeInPlace() + { + float flLen = Length(); + if (flLen == 0) + { + x = 0; y = 0; z = 1; + } + else + { + flLen = 1 / flLen; + x *= flLen; y *= flLen; z *= flLen; + } + + return flLen; + } + inline bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance && + z > -tolerance && z < tolerance); + } + + // Members + vec_t x, y, z; +}; + +inline Vector operator*(float fl, const Vector &v) { return v * fl; } +inline float DotProduct(const Vector &a, const Vector &b) { return (a.x * b.x + a.y * b.y + a.z * b.z); } +inline float DotProduct2D(const Vector &a, const Vector &b) { return (a.x * b.x + a.y * b.y); } +inline Vector CrossProduct(const Vector &a, const Vector &b) { return Vector(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); } + +template +inline void SWAP(T &first, T &second) +{ + T temp = first; + first = second; + second = temp; +} diff --git a/cssdk/dlls/vehicle.h b/cssdk/dlls/vehicle.h new file mode 100644 index 0000000..8b7a0d0 --- /dev/null +++ b/cssdk/dlls/vehicle.h @@ -0,0 +1,53 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define VEHICLE_SPEED0_ACCELERATION 0.005000000000000000 +#define VEHICLE_SPEED1_ACCELERATION 0.002142857142857143 +#define VEHICLE_SPEED2_ACCELERATION 0.003333333333333334 +#define VEHICLE_SPEED3_ACCELERATION 0.004166666666666667 +#define VEHICLE_SPEED4_ACCELERATION 0.004000000000000000 +#define VEHICLE_SPEED5_ACCELERATION 0.003800000000000000 +#define VEHICLE_SPEED6_ACCELERATION 0.004500000000000000 +#define VEHICLE_SPEED7_ACCELERATION 0.004250000000000000 +#define VEHICLE_SPEED8_ACCELERATION 0.002666666666666667 +#define VEHICLE_SPEED9_ACCELERATION 0.002285714285714286 +#define VEHICLE_SPEED10_ACCELERATION 0.001875000000000000 +#define VEHICLE_SPEED11_ACCELERATION 0.001444444444444444 +#define VEHICLE_SPEED12_ACCELERATION 0.001200000000000000 +#define VEHICLE_SPEED13_ACCELERATION 0.000916666666666666 + +#define VEHICLE_STARTPITCH 60 +#define VEHICLE_MAXPITCH 200 +#define VEHICLE_MAXSPEED 1500 + +class CFuncVehicleControls: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual int ObjectCaps() = 0; +}; diff --git a/cssdk/dlls/weapons.h b/cssdk/dlls/weapons.h new file mode 100644 index 0000000..e17cc27 --- /dev/null +++ b/cssdk/dlls/weapons.h @@ -0,0 +1,894 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#include "weapontype.h" + +class CBasePlayer; + +#define MAX_WEAPONS 32 +#define MAX_NORMAL_BATTERY 100.0f +#define DISTANCE_RELOAD_SOUND 512.0f + +#define ITEM_FLAG_SELECTONEMPTY 1 +#define ITEM_FLAG_NOAUTORELOAD 2 +#define ITEM_FLAG_NOAUTOSWITCHEMPTY 4 +#define ITEM_FLAG_LIMITINWORLD 8 +#define ITEM_FLAG_EXHAUSTIBLE 16 // A player can totally exhaust their ammo supply and lose this weapon + +#define WEAPON_IS_ONTARGET 0x40 + +// the maximum amount of ammo each weapon's clip can hold +#define WEAPON_NOCLIP -1 + +#define LOUD_GUN_VOLUME 1000 +#define NORMAL_GUN_VOLUME 600 +#define QUIET_GUN_VOLUME 200 + +#define BRIGHT_GUN_FLASH 512 +#define NORMAL_GUN_FLASH 256 +#define DIM_GUN_FLASH 128 + +#define BIG_EXPLOSION_VOLUME 2048 +#define NORMAL_EXPLOSION_VOLUME 1024 +#define SMALL_EXPLOSION_VOLUME 512 + +#define WEAPON_ACTIVITY_VOLUME 64 + +// spawn flags +#define SF_DETONATE 0x0001 // Grenades flagged with this will be triggered when the owner calls detonateSatchelCharges + +// custom enum +enum ArmorType +{ + ARMOR_NONE, // no armor + ARMOR_KEVLAR, // body vest only + ARMOR_VESTHELM, // vest and helmet +}; + +enum ArmouryItemPack +{ + ARMOURY_MP5NAVY, + ARMOURY_TMP, + ARMOURY_P90, + ARMOURY_MAC10, + ARMOURY_AK47, + ARMOURY_SG552, + ARMOURY_M4A1, + ARMOURY_AUG, + ARMOURY_SCOUT, + ARMOURY_G3SG1, + ARMOURY_AWP, + ARMOURY_M3, + ARMOURY_XM1014, + ARMOURY_M249, + ARMOURY_FLASHBANG, + ARMOURY_HEGRENADE, + ARMOURY_KEVLAR, + ARMOURY_ASSAULT, + ARMOURY_SMOKEGRENADE +}; + +struct ItemInfo +{ + int iSlot; + int iPosition; + const char *pszAmmo1; + int iMaxAmmo1; + const char *pszAmmo2; + int iMaxAmmo2; + const char *pszName; + int iMaxClip; + int iId; + int iFlags; + int iWeight; +}; + +struct AmmoInfo +{ + const char *pszName; + int iId; +}; + +struct MULTIDAMAGE +{ + CBaseEntity *pEntity; + float amount; + int type; +}; + +class CArmoury: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void Restart() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; +public: + ArmouryItemPack m_iItem; + int m_iCount; + int m_iInitialCount; + bool m_bAlreadyCounted; +}; + +// Smoke Grenade / HE grenade / Flashbang grenade / C4 +class CGrenade: public CBaseMonster { +public: + virtual void Spawn() = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual int ObjectCaps() = 0; + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual int BloodColor() = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual void BounceSound() = 0; +public: + bool m_bStartDefuse; + bool m_bIsC4; + EHANDLE m_pBombDefuser; + float m_flDefuseCountDown; + float m_flC4Blow; + float m_flNextFreqInterval; + float m_flNextBeep; + float m_flNextFreq; + char *m_sBeepName; + float m_fAttenu; + float m_flNextBlink; + float m_fNextDefuse; + bool m_bJustBlew; + int m_iTeam; + int m_iCurWave; + edict_t *m_pentCurBombTarget; + int m_SGSmoke; + int m_angle; + unsigned short m_usEvent; + bool m_bLightSmoke; + bool m_bDetonated; + Vector m_vSmokeDetonate; + int m_iBounceCount; + BOOL m_fRegisteredSound; // whether or not this grenade has issued its DANGER sound to the world sound list yet. +}; + +// Items that the player has in their inventory that they can use +class CBasePlayerItem: public CBaseAnimating { +public: + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void SetObjectCollisionBox() = 0; + virtual CBaseEntity *Respawn() = 0; + virtual int AddToPlayer(CBasePlayer *pPlayer) = 0; // return TRUE if the item you want the item added to the player inventory + virtual int AddDuplicate(CBasePlayerItem *pItem) = 0; // return TRUE if you want your duplicate removed from world + virtual int GetItemInfo(ItemInfo *p) = 0; // returns 0 if struct not filled out + virtual BOOL CanDeploy() = 0; + virtual BOOL CanDrop() = 0; // returns is deploy was successful + virtual BOOL Deploy() = 0; + virtual BOOL IsWeapon() = 0; + virtual BOOL CanHolster() = 0; // can this weapon be put away right now? + virtual void Holster(int skiplocal = 0) = 0; + virtual void UpdateItemInfo() = 0; + virtual void ItemPreFrame() = 0; // called each frame by the player PreThink + virtual void ItemPostFrame() = 0; // called each frame by the player PostThink + virtual void Drop() = 0; + virtual void Kill() = 0; + virtual void AttachToPlayer(CBasePlayer *pPlayer) = 0; + virtual int PrimaryAmmoIndex() = 0; + virtual int SecondaryAmmoIndex() = 0; + virtual int UpdateClientData(CBasePlayer *pPlayer) = 0; + virtual CBasePlayerItem *GetWeaponPtr() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; // return 0 to MAX_ITEMS_SLOTS, used in hud +public: + CBasePlayer *m_pPlayer; + CBasePlayerItem *m_pNext; + int m_iId; // WEAPON_??? +}; + +// inventory items that +class CBasePlayerWeapon: public CBasePlayerItem { +public: + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + + // generic weapon versions of CBasePlayerItem calls + virtual int AddToPlayer(CBasePlayer *pPlayer) = 0; + virtual int AddDuplicate(CBasePlayerItem *pItem) = 0; + virtual BOOL CanDeploy() = 0; + virtual BOOL IsWeapon() = 0; + virtual void Holster(int skiplocal = 0) = 0; + virtual void UpdateItemInfo() = 0; + virtual void ItemPostFrame() = 0; + virtual int PrimaryAmmoIndex() = 0; + virtual int SecondaryAmmoIndex() = 0; + virtual int UpdateClientData(CBasePlayer *pPlayer) = 0; + virtual CBasePlayerItem *GetWeaponPtr() = 0; + virtual int ExtractAmmo(CBasePlayerWeapon *pWeapon) = 0; + virtual int ExtractClipAmmo(CBasePlayerWeapon *pWeapon) = 0; + virtual int AddWeapon() = 0; + virtual BOOL PlayEmptySound() = 0; + virtual void ResetEmptySound() = 0; + virtual void SendWeaponAnim(int iAnim, int skiplocal = 0) = 0; + virtual BOOL IsUseable() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual void RetireWeapon() = 0; + virtual BOOL ShouldWeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + BOOL IsPistol() { return (m_iId == WEAPON_USP || m_iId == WEAPON_GLOCK18 || m_iId == WEAPON_P228 || m_iId == WEAPON_DEAGLE || m_iId == WEAPON_ELITE || m_iId == WEAPON_FIVESEVEN); } + + int m_iPlayEmptySound; + int m_fFireOnEmpty; + float m_flNextPrimaryAttack; // soonest time ItemPostFrame will call PrimaryAttack + float m_flNextSecondaryAttack; // soonest time ItemPostFrame will call SecondaryAttack + float m_flTimeWeaponIdle; // soonest time ItemPostFrame will call WeaponIdle + int m_iPrimaryAmmoType; // "primary" ammo index into players m_rgAmmo[] + int m_iSecondaryAmmoType; // "secondary" ammo index into players m_rgAmmo[] + int m_iClip; // number of shots left in the primary weapon clip, -1 it not used + int m_iClientClip; // the last version of m_iClip sent to hud dll + int m_iClientWeaponState; // the last version of the weapon state sent to hud dll (is current weapon, is on target) + int m_fInReload; // Are we in the middle of a reload; + int m_fInSpecialReload; // Are we in the middle of a reload for the shotguns + int m_iDefaultAmmo; // how much ammo you get when you pick up this weapon as placed by a level designer. + int m_iShellId; + float m_fMaxSpeed; + bool m_bDelayFire; + int m_iDirection; + bool m_bSecondarySilencerOn; + float m_flAccuracy; + float m_flLastFire; + int m_iShotsFired; + Vector m_vVecAiming; + string_t model_name; + float m_flGlock18Shoot; // time to shoot the remaining bullets of the glock18 burst fire + int m_iGlock18ShotsFired; // used to keep track of the shots fired during the Glock18 burst fire mode. + float m_flFamasShoot; + int m_iFamasShotsFired; + float m_fBurstSpread; + int m_iWeaponState; + float m_flNextReload; + float m_flDecreaseShotsFired; + unsigned short m_usFireGlock18; + unsigned short m_usFireFamas; + + // hle time creep vars + float m_flPrevPrimaryAttack; + float m_flLastFireTime; +}; + +class CBasePlayerAmmo: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual BOOL AddAmmo(CBaseEntity *pOther) = 0; + virtual CBaseEntity *Respawn() = 0; +}; + +class CWeaponBox: public CBaseEntity { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual int Save(CSave &save) = 0; + virtual int Restore(CRestore &restore) = 0; + virtual void SetObjectCollisionBox() = 0; + virtual void Touch(CBaseEntity *pOther) = 0; +public: + CBasePlayerItem *m_rgpPlayerItems[MAX_ITEM_TYPES]; + int m_rgiszAmmo[MAX_AMMO_SLOTS]; + int m_rgAmmo[MAX_AMMO_SLOTS]; + int m_cAmmoTypes; + bool m_bIsBomb; +}; + +class CUSP: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; + +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireUSP; } +private: + unsigned short m_usFireUSP; +}; + +class CMP5N: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireMP5N; } +private: + unsigned short m_usFireMP5N; +}; + +class CSG552: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireSG552; } +private: + unsigned short m_usFireSG552; +}; + +class CAK47: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireAK47; } +private: + unsigned short m_usFireAK47; +}; + +class CAUG: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireAug; } +private: + unsigned short m_usFireAug; +}; + +class CAWP: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireAWP; } +private: + unsigned short m_usFireAWP; +}; + +class CC4: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual void KeyValue(KeyValueData *pkvd) = 0; + virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal) = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + bool m_bStartedArming; + bool m_bBombPlacedAnimation; + float m_fArmedTime; + bool HasShield() const { return m_bHasShield; } +private: + bool m_bHasShield; +}; + +class CDEAGLE: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireDeagle; } +private: + unsigned short m_usFireDeagle; +}; + +class CFlashbang: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL CanDeploy() = 0; + virtual BOOL CanDrop() = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal) = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +}; + +class CG3SG1: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireG3SG1; } +private: + unsigned short m_usFireG3SG1; +}; + +class CGLOCK18: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +public: + int m_iShell; + bool m_bBurstFire; +}; + +class CHEGrenade: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL CanDeploy() = 0; + virtual BOOL CanDrop() = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal) = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + unsigned short m_usCreateExplosion; +}; + +class CKnife: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL CanDrop() = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal) = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual BOOL UseDecrement() = 0; + virtual void WeaponIdle() = 0; +public: + TraceResult m_trHit; + unsigned short m_usKnife; +}; + +class CM249: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireM249; } +private: + unsigned short m_usFireM249; +}; + +class CM3: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + float m_flPumpTime; + unsigned short GetEventID() const { return m_usFireM3; } +private: + unsigned short m_usFireM3; +}; + +class CM4A1: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireM4A1; } +private: + unsigned short m_usFireM4A1; +}; + +class CMAC10: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireMAC10; } +private: + unsigned short m_usFireMAC10; +}; + +class CP228: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireP228; } +private: + unsigned short m_usFireP228; +}; + +class CP90: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireP90; } +private: + unsigned short m_usFireP90; +}; + +class CSCOUT: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireScout; } +private: + unsigned short m_usFireScout; +}; + +class CSmokeGrenade: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL CanDeploy() = 0; + virtual BOOL CanDrop() = 0; + virtual BOOL Deploy() = 0; + virtual void Holster(int skiplocal) = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + unsigned short m_usCreateSmoke; +}; + +class CTMP: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireTMP; } +private: + unsigned short m_usFireTMP; +}; + +class CXM1014: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + float m_flPumpTime; + unsigned short GetEventID() const { return m_usFireXM1014; } +private: + unsigned short m_usFireXM1014; +}; + +class CELITE: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +public: + int m_iShell; + unsigned short GetEventID_Left() const { return m_usFireELITE_LEFT; } + unsigned short GetEventID_Right() const { return m_usFireELITE_RIGHT; } +private: + unsigned short m_usFireELITE_LEFT; + unsigned short m_usFireELITE_RIGHT; +}; + +class CFiveSeven: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; + virtual BOOL IsPistol() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireFiveSeven; } +private: + unsigned short m_usFireFiveSeven; +}; + +class CUMP45: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireUMP45; } +private: + unsigned short m_usFireUMP45; +}; + +class CSG550: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + unsigned short GetEventID() const { return m_usFireSG550; } +private: + unsigned short m_usFireSG550; +}; + +class CGalil: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; + unsigned short GetEventID() const { return m_usFireGalil; } +private: + unsigned short m_usFireGalil; +}; + +class CFamas: public CBasePlayerWeapon { +public: + virtual void Spawn() = 0; + virtual void Precache() = 0; + virtual int GetItemInfo(ItemInfo *p) = 0; + virtual BOOL Deploy() = 0; + virtual float GetMaxSpeed() = 0; + virtual int iItemSlot() = 0; + virtual void PrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + virtual void WeaponIdle() = 0; + virtual BOOL UseDecrement() = 0; +public: + int m_iShell; + int iShellOn; +}; diff --git a/cssdk/dlls/weapontype.h b/cssdk/dlls/weapontype.h new file mode 100644 index 0000000..10e5b67 --- /dev/null +++ b/cssdk/dlls/weapontype.h @@ -0,0 +1,412 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +enum WeaponIdType +{ + WEAPON_NONE, + WEAPON_P228, + WEAPON_GLOCK, + WEAPON_SCOUT, + WEAPON_HEGRENADE, + WEAPON_XM1014, + WEAPON_C4, + WEAPON_MAC10, + WEAPON_AUG, + WEAPON_SMOKEGRENADE, + WEAPON_ELITE, + WEAPON_FIVESEVEN, + WEAPON_UMP45, + WEAPON_SG550, + WEAPON_GALIL, + WEAPON_FAMAS, + WEAPON_USP, + WEAPON_GLOCK18, + WEAPON_AWP, + WEAPON_MP5N, + WEAPON_M249, + WEAPON_M3, + WEAPON_M4A1, + WEAPON_TMP, + WEAPON_G3SG1, + WEAPON_FLASHBANG, + WEAPON_DEAGLE, + WEAPON_SG552, + WEAPON_AK47, + WEAPON_KNIFE, + WEAPON_P90, + WEAPON_SHIELDGUN = 99 +}; + +enum AutoBuyClassType +{ + AUTOBUYCLASS_NONE = 0, + AUTOBUYCLASS_PRIMARY = (1 << 0), + AUTOBUYCLASS_SECONDARY = (1 << 1), + AUTOBUYCLASS_AMMO = (1 << 2), + AUTOBUYCLASS_ARMOR = (1 << 3), + AUTOBUYCLASS_DEFUSER = (1 << 4), + AUTOBUYCLASS_PISTOL = (1 << 5), + AUTOBUYCLASS_SMG = (1 << 6), + AUTOBUYCLASS_RIFLE = (1 << 7), + AUTOBUYCLASS_SNIPERRIFLE = (1 << 8), + AUTOBUYCLASS_SHOTGUN = (1 << 9), + AUTOBUYCLASS_MACHINEGUN = (1 << 10), + AUTOBUYCLASS_GRENADE = (1 << 11), + AUTOBUYCLASS_NIGHTVISION = (1 << 12), + AUTOBUYCLASS_SHIELD = (1 << 13), +}; + +enum AmmoCostType +{ + AMMO_338MAG_PRICE = 125, + AMMO_357SIG_PRICE = 50, + AMMO_45ACP_PRICE = 25, + AMMO_50AE_PRICE = 40, + AMMO_556MM_PRICE = 60, + AMMO_57MM_PRICE = 50, + AMMO_762MM_PRICE = 80, + AMMO_9MM_PRICE = 20, + AMMO_BUCKSHOT_PRICE = 65, +}; + +enum WeaponCostType +{ + AK47_PRICE = 2500, + AWP_PRICE = 4750, + DEAGLE_PRICE = 650, + G3SG1_PRICE = 5000, + SG550_PRICE = 4200, + GLOCK18_PRICE = 400, + M249_PRICE = 5750, + M3_PRICE = 1700, + M4A1_PRICE = 3100, + AUG_PRICE = 3500, + MP5NAVY_PRICE = 1500, + P228_PRICE = 600, + P90_PRICE = 2350, + UMP45_PRICE = 1700, + MAC10_PRICE = 1400, + SCOUT_PRICE = 2750, + SG552_PRICE = 3500, + TMP_PRICE = 1250, + USP_PRICE = 500, + ELITE_PRICE = 800, + FIVESEVEN_PRICE = 750, + XM1014_PRICE = 3000, + GALIL_PRICE = 2000, + FAMAS_PRICE = 2250, + SHIELDGUN_PRICE = 2200, +}; + +enum WeaponState +{ + WPNSTATE_USP_SILENCED = (1 << 0), + WPNSTATE_GLOCK18_BURST_MODE = (1 << 1), + WPNSTATE_M4A1_SILENCED = (1 << 2), + WPNSTATE_ELITE_LEFT = (1 << 3), + WPNSTATE_FAMAS_BURST_MODE = (1 << 4), + WPNSTATE_SHIELD_DRAWN = (1 << 5), +}; + +// custom enum +// the default amount of ammo that comes with each gun when it spawns +enum ClipGiveDefault +{ + P228_DEFAULT_GIVE = 13, + GLOCK18_DEFAULT_GIVE = 20, + SCOUT_DEFAULT_GIVE = 10, + HEGRENADE_DEFAULT_GIVE = 1, + XM1014_DEFAULT_GIVE = 7, + C4_DEFAULT_GIVE = 1, + MAC10_DEFAULT_GIVE = 30, + AUG_DEFAULT_GIVE = 30, + SMOKEGRENADE_DEFAULT_GIVE = 1, + ELITE_DEFAULT_GIVE = 30, + FIVESEVEN_DEFAULT_GIVE = 20, + UMP45_DEFAULT_GIVE = 25, + SG550_DEFAULT_GIVE = 30, + GALIL_DEFAULT_GIVE = 35, + FAMAS_DEFAULT_GIVE = 25, + USP_DEFAULT_GIVE = 12, + AWP_DEFAULT_GIVE = 10, + MP5NAVY_DEFAULT_GIVE = 30, + M249_DEFAULT_GIVE = 100, + M3_DEFAULT_GIVE = 8, + M4A1_DEFAULT_GIVE = 30, + TMP_DEFAULT_GIVE = 30, + G3SG1_DEFAULT_GIVE = 20, + FLASHBANG_DEFAULT_GIVE = 1, + DEAGLE_DEFAULT_GIVE = 7, + SG552_DEFAULT_GIVE = 30, + AK47_DEFAULT_GIVE = 30, + /*KNIFE_DEFAULT_GIVE = 1,*/ + P90_DEFAULT_GIVE = 50, +}; + +enum ClipSizeType +{ + P228_MAX_CLIP = 13, + GLOCK18_MAX_CLIP = 20, + SCOUT_MAX_CLIP = 10, + XM1014_MAX_CLIP = 7, + MAC10_MAX_CLIP = 30, + AUG_MAX_CLIP = 30, + ELITE_MAX_CLIP = 30, + FIVESEVEN_MAX_CLIP = 20, + UMP45_MAX_CLIP = 25, + SG550_MAX_CLIP = 30, + GALIL_MAX_CLIP = 35, + FAMAS_MAX_CLIP = 25, + USP_MAX_CLIP = 12, + AWP_MAX_CLIP = 10, + MP5N_MAX_CLIP = 30, + M249_MAX_CLIP = 100, + M3_MAX_CLIP = 8, + M4A1_MAX_CLIP = 30, + TMP_MAX_CLIP = 30, + G3SG1_MAX_CLIP = 20, + DEAGLE_MAX_CLIP = 7, + SG552_MAX_CLIP = 30, + AK47_MAX_CLIP = 30, + P90_MAX_CLIP = 50, +}; + +enum WeightWeapon +{ + P228_WEIGHT = 5, + GLOCK18_WEIGHT = 5, + SCOUT_WEIGHT = 30, + HEGRENADE_WEIGHT = 2, + XM1014_WEIGHT = 20, + C4_WEIGHT = 3, + MAC10_WEIGHT = 25, + AUG_WEIGHT = 25, + SMOKEGRENADE_WEIGHT = 1, + ELITE_WEIGHT = 5, + FIVESEVEN_WEIGHT = 5, + UMP45_WEIGHT = 25, + SG550_WEIGHT = 20, + GALIL_WEIGHT = 25, + FAMAS_WEIGHT = 75, + USP_WEIGHT = 5, + AWP_WEIGHT = 30, + MP5NAVY_WEIGHT = 25, + M249_WEIGHT = 25, + M3_WEIGHT = 20, + M4A1_WEIGHT = 25, + TMP_WEIGHT = 25, + G3SG1_WEIGHT = 20, + FLASHBANG_WEIGHT = 1, + DEAGLE_WEIGHT = 7, + SG552_WEIGHT = 25, + AK47_WEIGHT = 25, + P90_WEIGHT = 26, + KNIFE_WEIGHT = 0, +}; + +enum MaxAmmoType +{ + MAX_AMMO_BUCKSHOT = 32, + MAX_AMMO_9MM = 120, + MAX_AMMO_556NATO = 90, + MAX_AMMO_556NATOBOX = 200, + MAX_AMMO_762NATO = 90, + MAX_AMMO_45ACP = 100, + MAX_AMMO_50AE = 35, + MAX_AMMO_338MAGNUM = 30, + MAX_AMMO_57MM = 100, + MAX_AMMO_357SIG = 52, + + // custom + MAX_AMMO_SMOKEGRENADE = 1, + MAX_AMMO_HEGRENADE = 1, + MAX_AMMO_FLASHBANG = 2, +}; + +enum AmmoType +{ + AMMO_NONE = -1, + AMMO_BUCKSHOT, + AMMO_9MM, + AMMO_556NATO, + AMMO_556NATOBOX, + AMMO_762NATO, + AMMO_45ACP, + AMMO_50AE, + AMMO_338MAGNUM, + AMMO_57MM, + AMMO_357SIG, + AMMO_MAX_TYPES, +}; + +enum WeaponClassType +{ + WEAPONCLASS_NONE, + WEAPONCLASS_KNIFE, + WEAPONCLASS_PISTOL, + WEAPONCLASS_GRENADE, + WEAPONCLASS_SUBMACHINEGUN, + WEAPONCLASS_SHOTGUN, + WEAPONCLASS_MACHINEGUN, + WEAPONCLASS_RIFLE, + WEAPONCLASS_SNIPERRIFLE, + WEAPONCLASS_MAX, +}; + +enum AmmoBuyAmount +{ + AMMO_338MAG_BUY = 10, + AMMO_357SIG_BUY = 13, + AMMO_45ACP_BUY = 12, + AMMO_50AE_BUY = 7, + AMMO_556NATO_BUY = 30, + AMMO_556NATOBOX_BUY = 30, + AMMO_57MM_BUY = 50, + AMMO_762NATO_BUY = 30, + AMMO_9MM_BUY = 30, + AMMO_BUCKSHOT_BUY = 8, +}; + +enum ItemCostType +{ + ASSAULTSUIT_PRICE = 1000, + FLASHBANG_PRICE = 200, + HEGRENADE_PRICE = 300, + SMOKEGRENADE_PRICE = 300, + KEVLAR_PRICE = 650, + HELMET_PRICE = 350, + NVG_PRICE = 1250, + DEFUSEKIT_PRICE = 200, +}; + +enum shieldgun_e +{ + SHIELDGUN_IDLE, + SHIELDGUN_SHOOT1, + SHIELDGUN_SHOOT2, + SHIELDGUN_SHOOT_EMPTY, + SHIELDGUN_RELOAD, + SHIELDGUN_DRAW, + SHIELDGUN_DRAWN_IDLE, + SHIELDGUN_UP, + SHIELDGUN_DOWN, +}; + +// custom +enum shieldgren_e +{ + SHIELDREN_IDLE = 4, + SHIELDREN_UP, + SHIELDREN_DOWN +}; + +enum InventorySlotType +{ + NONE_SLOT, + PRIMARY_WEAPON_SLOT, + PISTOL_SLOT, + KNIFE_SLOT, + GRENADE_SLOT, + C4_SLOT, +}; + +enum Bullet +{ + BULLET_NONE, + BULLET_PLAYER_9MM, + BULLET_PLAYER_MP5, + BULLET_PLAYER_357, + BULLET_PLAYER_BUCKSHOT, + BULLET_PLAYER_CROWBAR, + BULLET_MONSTER_9MM, + BULLET_MONSTER_MP5, + BULLET_MONSTER_12MM, + BULLET_PLAYER_45ACP, + BULLET_PLAYER_338MAG, + BULLET_PLAYER_762MM, + BULLET_PLAYER_556MM, + BULLET_PLAYER_50AE, + BULLET_PLAYER_57MM, + BULLET_PLAYER_357SIG, +}; + +struct WeaponStruct +{ + int m_type; + int m_price; + int m_side; + int m_slot; + int m_ammoPrice; +}; + +struct AutoBuyInfoStruct +{ + AutoBuyClassType m_class; + char *m_command; + char *m_classname; +}; + +struct WeaponAliasInfo +{ + char *alias; + WeaponIdType id; +}; + +struct WeaponBuyAliasInfo +{ + char *alias; + WeaponIdType id; + char *failName; +}; + +struct WeaponClassAliasInfo +{ + char *alias; + WeaponClassType id; +}; + +struct WeaponInfoStruct +{ + int id; + int cost; + int clipCost; + int buyClipSize; + int gunClipSize; + int maxRounds; + int ammoType; + char *entityName; + const char *ammoName; +}; + +struct WeaponSlotInfo +{ + WeaponIdType id; + InventorySlotType slot; + const char *weaponName; +}; diff --git a/cssdk/dlls/wpn_shared.h b/cssdk/dlls/wpn_shared.h new file mode 100644 index 0000000..1ed2eea --- /dev/null +++ b/cssdk/dlls/wpn_shared.h @@ -0,0 +1,598 @@ +#pragma once + +//AK47 +#define AK47_MAX_SPEED 221 +#define AK47_DAMAGE 36 +#define AK47_RANGE_MODIFER 0.98 +#define AK47_RELOAD_TIME 2.45 + +enum ak47_e +{ + AK47_IDLE1, + AK47_RELOAD, + AK47_DRAW, + AK47_SHOOT1, + AK47_SHOOT2, + AK47_SHOOT3 +}; + + + +//AUG +#define AUG_MAX_SPEED 240 +#define AUG_DAMAGE 32 +#define AUG_RANGE_MODIFER 0.96 +#define AUG_RELOAD_TIME 3.3 + +enum aug_e +{ + AUG_IDLE1, + AUG_RELOAD, + AUG_DRAW, + AUG_SHOOT1, + AUG_SHOOT2, + AUG_SHOOT3 +}; + + + +//AWP +#define AWP_MAX_SPEED 210 +#define AWP_MAX_SPEED_ZOOM 150 +#define AWP_DAMAGE 115 +#define AWP_RANGE_MODIFER 0.99 +#define AWP_RELOAD_TIME 2.5 + +enum awp_e +{ + AWP_IDLE, + AWP_SHOOT, + AWP_SHOOT2, + AWP_SHOOT3, + AWP_RELOAD, + AWP_DRAW, +}; + + + +//C4 +#define C4_MAX_AMMO 1 +#define C4_MAX_SPEED 250.0 +#define C4_ARMING_ON_TIME 3.0 + +enum c4_e +{ + C4_IDLE1, + C4_DRAW, + C4_DROP, + C4_ARM +}; + + + +//Deagle +#define DEAGLE_MAX_SPEED 250 +#define DEAGLE_DAMAGE 54 +#define DEAGLE_RANGE_MODIFER 0.81 +#define DEAGLE_RELOAD_TIME 2.2 + +enum deagle_e +{ + DEAGLE_IDLE1, + DEAGLE_SHOOT1, + DEAGLE_SHOOT2, + DEAGLE_SHOOT_EMPTY, + DEAGLE_RELOAD, + DEAGLE_DRAW +}; + + + +//Elites +#define ELITE_MAX_SPEED 250 +#define ELITE_RELOAD_TIME 4.5 +#define ELITE_DAMAGE 36 +#define ELITE_RANGE_MODIFER 0.75 + +enum elite_e +{ + ELITE_IDLE, + ELITE_IDLE_LEFTEMPTY, + ELITE_SHOOTLEFT1, + ELITE_SHOOTLEFT2, + ELITE_SHOOTLEFT3, + ELITE_SHOOTLEFT4, + ELITE_SHOOTLEFT5, + ELITE_SHOOTLEFTLAST, + ELITE_SHOOTRIGHT1, + ELITE_SHOOTRIGHT2, + ELITE_SHOOTRIGHT3, + ELITE_SHOOTRIGHT4, + ELITE_SHOOTRIGHT5, + ELITE_SHOOTRIGHTLAST, + ELITE_RELOAD, + ELITE_DRAW +}; + + + +//Famas +#define FAMAS_MAX_SPEED 240 +#define FAMAS_RELOAD_TIME 3.3 +#define FAMAS_DAMAGE 30 +#define FAMAS_DAMAGE_BURST 34 +#define FAMAS_RANGE_MODIFER 0.96 + +enum famas_e +{ + FAMAS_IDLE1, + FAMAS_RELOAD, + FAMAS_DRAW, + FAMAS_SHOOT1, + FAMAS_SHOOT2, + FAMAS_SHOOT3 +}; + + + +//Fiveseven +#define FIVESEVEN_MAX_SPEED 250 +#define FIVESEVEN_DAMAGE 20 +#define FIVESEVEN_RANGE_MODIFER 0.885 +#define FIVESEVEN_RELOAD_TIME 2.7 + +enum fiveseven_e +{ + FIVESEVEN_IDLE, + FIVESEVEN_SHOOT1, + FIVESEVEN_SHOOT2, + FIVESEVEN_SHOOT_EMPTY, + FIVESEVEN_RELOAD, + FIVESEVEN_DRAW +}; + + + +//Flashbang +#define FLASHBANG_MAX_SPEED 250 +#define FLASHBANG_MAX_SPEED_SHIELD 180 + +enum flashbang_e +{ + FLASHBANG_IDLE, + FLASHBANG_PULLPIN, + FLASHBANG_THROW, + FLASHBANG_DRAW +}; + + + +//g3sg1 +#define G3SG1_MAX_SPEED 210 +#define G3SG1_MAX_SPEED_ZOOM 150 +#define G3SG1_DAMAGE 80 +#define G3SG1_RANGE_MODIFER 0.98 +#define G3SG1_RELOAD_TIME 3.5 + +enum g3sg1_e +{ + G3SG1_IDLE, + G3SG1_SHOOT, + G3SG1_SHOOT2, + G3SG1_RELOAD, + G3SG1_DRAW +}; + + + +//galil +#define GALIL_MAX_SPEED 240 +#define GALIL_DAMAGE 30 +#define GALIL_RANGE_MODIFER 0.98 +#define GALIL_RELOAD_TIME 2.45 + +enum galil_e +{ + GALIL_IDLE1, + GALIL_RELOAD, + GALIL_DRAW, + GALIL_SHOOT1, + GALIL_SHOOT2, + GALIL_SHOOT3 +}; + + + +//glock18 +#define GLOCK18_MAX_SPEED 250 +#define GLOCK18_DAMAGE 25 +#define GLOCK18_RANGE_MODIFER 0.75 +#define GLOCK18_RELOAD_TIME 2.2 + +enum glock18_e +{ + GLOCK18_IDLE1, + GLOCK18_IDLE2, + GLOCK18_IDLE3, + GLOCK18_SHOOT, + GLOCK18_SHOOT2, + GLOCK18_SHOOT3, + GLOCK18_SHOOT_EMPTY, + GLOCK18_RELOAD, + GLOCK18_DRAW, + GLOCK18_HOLSTER, + GLOCK18_ADD_SILENCER, + GLOCK18_DRAW2, + GLOCK18_RELOAD2 +}; + +enum glock18_shield_e +{ + GLOCK18_SHIELD_IDLE1, + GLOCK18_SHIELD_SHOOT, + GLOCK18_SHIELD_SHOOT2, + GLOCK18_SHIELD_SHOOT_EMPTY, + GLOCK18_SHIELD_RELOAD, + GLOCK18_SHIELD_DRAW, + GLOCK18_SHIELD_IDLE, + GLOCK18_SHIELD_UP, + GLOCK18_SHIELD_DOWN +}; + + + +//hegrenade +#define HEGRENADE_MAX_SPEED 250 +#define HEGRENADE_MAX_SPEED_SHIELD 180 + +enum hegrenade_e +{ + HEGRENADE_IDLE, + HEGRENADE_PULLPIN, + HEGRENADE_THROW, + HEGRENADE_DRAW +}; + + + +//knife +#define KNIFE_BODYHIT_VOLUME 128 +#define KNIFE_WALLHIT_VOLUME 512 +#define KNIFE_MAX_SPEED 250 +#define KNIFE_MAX_SPEED_SHIELD 180 + +enum knife_e +{ + KNIFE_IDLE, + KNIFE_ATTACK1HIT, + KNIFE_ATTACK2HIT, + KNIFE_DRAW, + KNIFE_STABHIT, + KNIFE_STABMISS, + KNIFE_MIDATTACK1HIT, + KNIFE_MIDATTACK2HIT +}; + +enum knife_shield_e +{ + KNIFE_SHIELD_IDLE, + KNIFE_SHIELD_SLASH, + KNIFE_SHIELD_ATTACKHIT, + KNIFE_SHIELD_DRAW, + KNIFE_SHIELD_UPIDLE, + KNIFE_SHIELD_UP, + KNIFE_SHIELD_DOWN +}; + + + +//m3 +#define M3_MAX_SPEED 230 +#define M3_CONE_VECTOR Vector(0.0675, 0.0675, 0.0) // special shotgun spreads + +enum m3_e +{ + M3_IDLE, + M3_FIRE1, + M3_FIRE2, + M3_RELOAD, + M3_PUMP, + M3_START_RELOAD, + M3_DRAW, + M3_HOLSTER +}; + + + +//m4a1 +#define M4A1_MAX_SPEED 230 +#define M4A1_DAMAGE 32 +#define M4A1_DAMAGE_SIL 33 +#define M4A1_RANGE_MODIFER 0.97 +#define M4A1_RANGE_MODIFER_SIL 0.95 +#define M4A1_RELOAD_TIME 3.05 + +enum m4a1_e +{ + M4A1_IDLE, + M4A1_SHOOT1, + M4A1_SHOOT2, + M4A1_SHOOT3, + M4A1_RELOAD, + M4A1_DRAW, + M4A1_ATTACH_SILENCER, + M4A1_UNSIL_IDLE, + M4A1_UNSIL_SHOOT1, + M4A1_UNSIL_SHOOT2, + M4A1_UNSIL_SHOOT3, + M4A1_UNSIL_RELOAD, + M4A1_UNSIL_DRAW, + M4A1_DETACH_SILENCER +}; + + + +//m249 +#define M249_MAX_SPEED 220 +#define M249_DAMAGE 32 +#define M249_RANGE_MODIFER 0.97 +#define M249_RELOAD_TIME 4.7 + +enum m249_e +{ + M249_IDLE1, + M249_SHOOT1, + M249_SHOOT2, + M249_RELOAD, + M249_DRAW +}; + + + +//mac10 +#define MAC10_MAX_SPEED 250 +#define MAC10_DAMAGE 29 +#define MAC10_RANGE_MODIFER 0.82 +#define MAC10_RELOAD_TIME 3.15 + +enum mac10_e +{ + MAC10_IDLE1, + MAC10_RELOAD, + MAC10_DRAW, + MAC10_SHOOT1, + MAC10_SHOOT2, + MAC10_SHOOT3 +}; + + + +//mp5navy +#define MP5N_MAX_SPEED 250 +#define MP5N_DAMAGE 26 +#define MP5N_RANGE_MODIFER 0.84 +#define MP5N_RELOAD_TIME 2.63 + +enum mp5n_e +{ + MP5N_IDLE1, + MP5N_RELOAD, + MP5N_DRAW, + MP5N_SHOOT1, + MP5N_SHOOT2, + MP5N_SHOOT3 +}; + + + +//p90 +#define P90_MAX_SPEED 245 +#define P90_DAMAGE 21 +#define P90_RANGE_MODIFER 0.885 +#define P90_RELOAD_TIME 3.4 + +enum p90_e +{ + P90_IDLE1, + P90_RELOAD, + P90_DRAW, + P90_SHOOT1, + P90_SHOOT2, + P90_SHOOT3 +}; + + + +//p228 +#define P228_MAX_SPEED 250 +#define P228_DAMAGE 32 +#define P228_RANGE_MODIFER 0.8 +#define P228_RELOAD_TIME 2.7 + +enum p228_e +{ + P228_IDLE, + P228_SHOOT1, + P228_SHOOT2, + P228_SHOOT3, + P228_SHOOT_EMPTY, + P228_RELOAD, + P228_DRAW +}; + +enum p228_shield_e +{ + P228_SHIELD_IDLE, + P228_SHIELD_SHOOT1, + P228_SHIELD_SHOOT2, + P228_SHIELD_SHOOT_EMPTY, + P228_SHIELD_RELOAD, + P228_SHIELD_DRAW, + P228_SHIELD_IDLE_UP, + P228_SHIELD_UP, + P228_SHIELD_DOWN +}; + + + +//scout +#define SCOUT_MAX_SPEED 260 +#define SCOUT_MAX_SPEED_ZOOM 220 +#define SCOUT_DAMAGE 75 +#define SCOUT_RANGE_MODIFER 0.98 +#define SCOUT_RELOAD_TIME 2 + +enum scout_e +{ + SCOUT_IDLE, + SCOUT_SHOOT, + SCOUT_SHOOT2, + SCOUT_RELOAD, + SCOUT_DRAW +}; + + + +//sg550 +#define SG550_MAX_SPEED 210 +#define SG550_MAX_SPEED_ZOOM 150 +#define SG550_DAMAGE 70 +#define SG550_RANGE_MODIFER 0.98 +#define SG550_RELOAD_TIME 3.35 + +enum sg550_e +{ + SG550_IDLE, + SG550_SHOOT, + SG550_SHOOT2, + SG550_RELOAD, + SG550_DRAW +}; + + + +//sg552 +#define SG552_MAX_SPEED 235 +#define SG552_MAX_SPEED_ZOOM 200 +#define SG552_DAMAGE 33 +#define SG552_RANGE_MODIFER 0.955 +#define SG552_RELOAD_TIME 3 + +enum sg552_e +{ + SG552_IDLE1, + SG552_RELOAD, + SG552_DRAW, + SG552_SHOOT1, + SG552_SHOOT2, + SG552_SHOOT3 +}; + + + +//smokegrenade +#define SMOKEGRENADE_MAX_SPEED 250 +#define SMOKEGRENADE_MAX_SPEED_SHIELD 180 + +enum smokegrenade_e +{ + SMOKEGRENADE_IDLE, + SMOKEGRENADE_PINPULL, + SMOKEGRENADE_THROW, + SMOKEGRENADE_DRAW +}; + + + +//tmp +#define TMP_MAX_SPEED 250 +#define TMP_DAMAGE 20 +#define TMP_RANGE_MODIFER 0.85 +#define TMP_RELOAD_TIME 2.12 + +enum tmp_e +{ + TMP_IDLE1, + TMP_RELOAD, + TMP_DRAW, + TMP_SHOOT1, + TMP_SHOOT2, + TMP_SHOOT3 +}; + + + +//ump45 +#define UMP45_MAX_SPEED 250 +#define UMP45_DAMAGE 30 +#define UMP45_RANGE_MODIFER 0.82 +#define UMP45_RELOAD_TIME 3.5 + +enum ump45_e +{ + UMP45_IDLE1, + UMP45_RELOAD, + UMP45_DRAW, + UMP45_SHOOT1, + UMP45_SHOOT2, + UMP45_SHOOT3 +}; + + + +//tmp +#define USP_MAX_SPEED 250 +#define USP_DAMAGE 34 +#define USP_DAMAGE_SIL 30 +#define USP_RANGE_MODIFER 0.79 +#define USP_RELOAD_TIME 2.7 + +enum usp_e +{ + USP_IDLE, + USP_SHOOT1, + USP_SHOOT2, + USP_SHOOT3, + USP_SHOOT_EMPTY, + USP_RELOAD, + USP_DRAW, + USP_ATTACH_SILENCER, + USP_UNSIL_IDLE, + USP_UNSIL_SHOOT1, + USP_UNSIL_SHOOT2, + USP_UNSIL_SHOOT3, + USP_UNSIL_SHOOT_EMPTY, + USP_UNSIL_RELOAD, + USP_UNSIL_DRAW, + USP_DETACH_SILENCER +}; + +enum usp_shield_e +{ + USP_SHIELD_IDLE, + USP_SHIELD_SHOOT1, + USP_SHIELD_SHOOT2, + USP_SHIELD_SHOOT_EMPTY, + USP_SHIELD_RELOAD, + USP_SHIELD_DRAW, + USP_SHIELD_UP_IDLE, + USP_SHIELD_UP, + USP_SHIELD_DOWN +}; + + + +//xm1014 +#define XM1014_MAX_SPEED 240 +#define XM1014_CONE_VECTOR Vector(0.0725, 0.0725, 0.0) // special shotgun spreads + +enum xm1014_e +{ + XM1014_IDLE, + XM1014_FIRE1, + XM1014_FIRE2, + XM1014_RELOAD, + XM1014_PUMP, + XM1014_START_RELOAD, + XM1014_DRAW +}; diff --git a/cssdk/engine/FlightRecorder.h b/cssdk/engine/FlightRecorder.h new file mode 100644 index 0000000..66a6477 --- /dev/null +++ b/cssdk/engine/FlightRecorder.h @@ -0,0 +1,61 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "archtypes.h" + +class IRehldsFlightRecorder +{ +public: + virtual ~IRehldsFlightRecorder() { } + + virtual uint16 RegisterMessage(const char* module, const char *message, unsigned int version, bool inOut) = 0; + + virtual void StartMessage(uint16 msg, bool entrance) = 0; + virtual void EndMessage(uint16 msg, bool entrance) = 0; + + virtual void WriteInt8(int8 v) = 0; + virtual void WriteUInt8(uint8 v) = 0; + + virtual void WriteInt16(int16 v) = 0; + virtual void WriteUInt16(uint16 v) = 0; + + virtual void WriteInt32(int32 v) = 0; + virtual void WriteUInt32(uint32 v) = 0; + + virtual void WriteInt64(int64 v) = 0; + virtual void WriteUInt64(uint64 v) = 0; + + virtual void WriteFloat(float v) = 0; + virtual void WriteDouble(double v) = 0; + + virtual void WriteString(const char* s) = 0; + + virtual void WriteBuffer(const void* data ,unsigned int len) = 0; + +}; diff --git a/cssdk/engine/Sequence.h b/cssdk/engine/Sequence.h new file mode 100644 index 0000000..6253018 --- /dev/null +++ b/cssdk/engine/Sequence.h @@ -0,0 +1,201 @@ +//--------------------------------------------------------------------------- +// +// S c r i p t e d S e q u e n c e s +// +//--------------------------------------------------------------------------- +#ifndef _INCLUDE_SEQUENCE_H_ +#define _INCLUDE_SEQUENCE_H_ + + +#ifndef _DEF_BYTE_ +typedef unsigned char byte; +#endif + +//--------------------------------------------------------------------------- +// client_textmessage_t +//--------------------------------------------------------------------------- +typedef struct client_textmessage_s +{ + int effect; + byte r1, g1, b1, a1; // 2 colors for effects + byte r2, g2, b2, a2; + float x; + float y; + float fadein; + float fadeout; + float holdtime; + float fxtime; + const char *pName; + const char *pMessage; +} client_textmessage_t; + + +//-------------------------------------------------------------------------- +// sequenceDefaultBits_e +// +// Enumerated list of possible modifiers for a command. This enumeration +// is used in a bitarray controlling what modifiers are specified for a command. +//--------------------------------------------------------------------------- +enum sequenceModifierBits +{ + SEQUENCE_MODIFIER_EFFECT_BIT = (1 << 1), + SEQUENCE_MODIFIER_POSITION_BIT = (1 << 2), + SEQUENCE_MODIFIER_COLOR_BIT = (1 << 3), + SEQUENCE_MODIFIER_COLOR2_BIT = (1 << 4), + SEQUENCE_MODIFIER_FADEIN_BIT = (1 << 5), + SEQUENCE_MODIFIER_FADEOUT_BIT = (1 << 6), + SEQUENCE_MODIFIER_HOLDTIME_BIT = (1 << 7), + SEQUENCE_MODIFIER_FXTIME_BIT = (1 << 8), + SEQUENCE_MODIFIER_SPEAKER_BIT = (1 << 9), + SEQUENCE_MODIFIER_LISTENER_BIT = (1 << 10), + SEQUENCE_MODIFIER_TEXTCHANNEL_BIT = (1 << 11), +}; +typedef enum sequenceModifierBits sequenceModifierBits_e ; + + +//--------------------------------------------------------------------------- +// sequenceCommandEnum_e +// +// Enumerated sequence command types. +//--------------------------------------------------------------------------- +enum sequenceCommandEnum_ +{ + SEQUENCE_COMMAND_ERROR = -1, + SEQUENCE_COMMAND_PAUSE = 0, + SEQUENCE_COMMAND_FIRETARGETS, + SEQUENCE_COMMAND_KILLTARGETS, + SEQUENCE_COMMAND_TEXT, + SEQUENCE_COMMAND_SOUND, + SEQUENCE_COMMAND_GOSUB, + SEQUENCE_COMMAND_SENTENCE, + SEQUENCE_COMMAND_REPEAT, + SEQUENCE_COMMAND_SETDEFAULTS, + SEQUENCE_COMMAND_MODIFIER, + SEQUENCE_COMMAND_POSTMODIFIER, + SEQUENCE_COMMAND_NOOP, + + SEQUENCE_MODIFIER_EFFECT, + SEQUENCE_MODIFIER_POSITION, + SEQUENCE_MODIFIER_COLOR, + SEQUENCE_MODIFIER_COLOR2, + SEQUENCE_MODIFIER_FADEIN, + SEQUENCE_MODIFIER_FADEOUT, + SEQUENCE_MODIFIER_HOLDTIME, + SEQUENCE_MODIFIER_FXTIME, + SEQUENCE_MODIFIER_SPEAKER, + SEQUENCE_MODIFIER_LISTENER, + SEQUENCE_MODIFIER_TEXTCHANNEL, +}; +typedef enum sequenceCommandEnum_ sequenceCommandEnum_e; + + +//--------------------------------------------------------------------------- +// sequenceCommandType_e +// +// Typeerated sequence command types. +//--------------------------------------------------------------------------- +enum sequenceCommandType_ +{ + SEQUENCE_TYPE_COMMAND, + SEQUENCE_TYPE_MODIFIER, +}; +typedef enum sequenceCommandType_ sequenceCommandType_e; + + +//--------------------------------------------------------------------------- +// sequenceCommandMapping_s +// +// A mapping of a command enumerated-value to its name. +//--------------------------------------------------------------------------- +typedef struct sequenceCommandMapping_ sequenceCommandMapping_s; +struct sequenceCommandMapping_ +{ + sequenceCommandEnum_e commandEnum; + const char* commandName; + sequenceCommandType_e commandType; +}; + + +//--------------------------------------------------------------------------- +// sequenceCommandLine_s +// +// Structure representing a single command (usually 1 line) from a +// .SEQ file entry. +//--------------------------------------------------------------------------- +typedef struct sequenceCommandLine_ sequenceCommandLine_s; +struct sequenceCommandLine_ +{ + int commandType; // Specifies the type of command + client_textmessage_t clientMessage; // Text HUD message struct + char* speakerName; // Targetname of speaking entity + char* listenerName; // Targetname of entity being spoken to + char* soundFileName; // Name of sound file to play + char* sentenceName; // Name of sentences.txt to play + char* fireTargetNames; // List of targetnames to fire + char* killTargetNames; // List of targetnames to remove + float delay; // Seconds 'till next command + int repeatCount; // If nonzero, reset execution pointer to top of block (N times, -1 = infinite) + int textChannel; // Display channel on which text message is sent + int modifierBitField; // Bit field to specify what clientmessage fields are valid + sequenceCommandLine_s* nextCommandLine; // Next command (linked list) +}; + + +//--------------------------------------------------------------------------- +// sequenceEntry_s +// +// Structure representing a single command (usually 1 line) from a +// .SEQ file entry. +//--------------------------------------------------------------------------- +typedef struct sequenceEntry_ sequenceEntry_s; +struct sequenceEntry_ +{ + char* fileName; // Name of sequence file without .SEQ extension + char* entryName; // Name of entry label in file + sequenceCommandLine_s* firstCommand; // Linked list of commands in entry + sequenceEntry_s* nextEntry; // Next loaded entry + qboolean isGlobal; // Is entry retained over level transitions? +}; + + + +//--------------------------------------------------------------------------- +// sentenceEntry_s +// Structure representing a single sentence of a group from a .SEQ +// file entry. Sentences are identical to entries in sentences.txt, but +// can be unique per level and are loaded/unloaded with the level. +//--------------------------------------------------------------------------- +typedef struct sentenceEntry_ sentenceEntry_s; +struct sentenceEntry_ +{ + char* data; // sentence data (ie "We have hostiles" ) + sentenceEntry_s* nextEntry; // Next loaded entry + qboolean isGlobal; // Is entry retained over level transitions? + unsigned int index; // this entry's position in the file. +}; + +//-------------------------------------------------------------------------- +// sentenceGroupEntry_s +// Structure representing a group of sentences found in a .SEQ file. +// A sentence group is defined by all sentences with the same name, ignoring +// the number at the end of the sentence name. Groups enable a sentence +// to be picked at random across a group. +//-------------------------------------------------------------------------- +typedef struct sentenceGroupEntry_ sentenceGroupEntry_s; +struct sentenceGroupEntry_ +{ + char* groupName; // name of the group (ie CT_ALERT ) + unsigned int numSentences; // number of sentences in group + sentenceEntry_s* firstSentence; // head of linked list of sentences in group + sentenceGroupEntry_s* nextEntry; // next loaded group +}; + +//--------------------------------------------------------------------------- +// Function declarations +//--------------------------------------------------------------------------- +sequenceEntry_s* SequenceGet( const char* fileName, const char* entryName ); +void Sequence_ParseFile( const char* fileName, qboolean isGlobal ); +void Sequence_OnLevelLoad( const char* mapName ); +sentenceEntry_s* SequencePickSentence( const char *groupName, int pickMethod, int *picked ); + +#endif /* _INCLUDE_SEQUENCE_H_ */ diff --git a/cssdk/engine/archtypes.h b/cssdk/engine/archtypes.h new file mode 100644 index 0000000..e528a6d --- /dev/null +++ b/cssdk/engine/archtypes.h @@ -0,0 +1,66 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/#ifndef ARCHTYPES_H +#define ARCHTYPES_H + +#ifdef __x86_64__ +#define X64BITS +#endif + +#if defined( _WIN32 ) && (! defined( __MINGW32__ )) + +typedef __int8 int8; +typedef unsigned __int8 uint8; +typedef __int16 int16; +typedef unsigned __int16 uint16; +typedef __int32 int32; +typedef unsigned __int32 uint32; +typedef __int64 int64; +typedef unsigned __int64 uint64; +typedef __int32 intp; // intp is an integer that can accomodate a pointer +typedef unsigned __int32 uintp; // (ie, sizeof(intp) >= sizeof(int) && sizeof(intp) >= sizeof(void *) + +#else /* _WIN32 */ +typedef char int8; +typedef unsigned char uint8; +typedef short int16; +typedef unsigned short uint16; +typedef int int32; +typedef unsigned int uint32; +typedef long long int64; +typedef unsigned long long uint64; +#ifdef X64BITS +typedef long long intp; +typedef unsigned long long uintp; +#else +typedef int intp; +typedef unsigned int uintp; +#endif + +#endif /* else _WIN32 */ + +#endif /* ARCHTYPES_H */ diff --git a/cssdk/engine/bspfile.h b/cssdk/engine/bspfile.h new file mode 100644 index 0000000..fd3ae92 --- /dev/null +++ b/cssdk/engine/bspfile.h @@ -0,0 +1,169 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define BSPVERSION 30 +#define MAX_MAP_HULLS 4 + +#define CONTENTS_ORIGIN -7 // removed at csg time +#define CONTENTS_CLIP -8 // changed to contents_solid +#define CONTENTS_CURRENT_0 -9 +#define CONTENTS_CURRENT_90 -10 +#define CONTENTS_CURRENT_180 -11 +#define CONTENTS_CURRENT_270 -12 +#define CONTENTS_CURRENT_UP -13 +#define CONTENTS_CURRENT_DOWN -14 + +#define CONTENTS_TRANSLUCENT -15 + +#define LUMP_ENTITIES 0 +#define LUMP_PLANES 1 +#define LUMP_TEXTURES 2 +#define LUMP_VERTEXES 3 +#define LUMP_VISIBILITY 4 +#define LUMP_NODES 5 +#define LUMP_TEXINFO 6 +#define LUMP_FACES 7 +#define LUMP_LIGHTING 8 +#define LUMP_CLIPNODES 9 +#define LUMP_LEAFS 10 +#define LUMP_MARKSURFACES 11 +#define LUMP_EDGES 12 +#define LUMP_SURFEDGES 13 +#define LUMP_MODELS 14 + +#define HEADER_LUMPS 15 + +/* ../engine/bspfile.h:41 */ +typedef struct lump_s +{ + int fileofs; + int filelen; +} lump_t; + +/* ../engine/bspfile.h:64 */ +typedef struct dmodel_s +{ + float mins[3], maxs[3]; + float origin[3]; + int headnode[MAX_MAP_HULLS]; + int visleafs; // not including the solid leaf 0 + int firstface, numfaces; +} dmodel_t; + +/* ../engine/bspfile.h:73 */ +typedef struct dheader_s +{ + int version; + lump_t lumps[15]; +} dheader_t; + +/* <485b2> ../engine/bspfile.h:79 */ +typedef struct dmiptexlump_s +{ + int _nummiptex; + int dataofs[4]; +} dmiptexlump_t; + +/* <1ce18> ../engine/bspfile.h:86 */ +typedef struct miptex_s +{ + char name[16]; + unsigned width; + unsigned height; + unsigned offsets[4]; +} miptex_t; + +/* <48652> ../engine/bspfile.h:94 */ +typedef struct dvertex_s +{ + float point[3]; +} dvertex_t; + +/* <48674> ../engine/bspfile.h:110 */ +typedef struct dplane_s +{ + float normal[3]; + float dist; + int type; +} dplane_t; + +/* <486b2> ../engine/bspfile.h:132 */ +typedef struct dnode_s +{ + int planenum; + short children[2]; + short mins[3]; + short maxs[3]; + unsigned short firstface; + unsigned short numfaces; +} dnode_t; + +/* ../engine/bspfile.h:142 */ +typedef struct dclipnode_s +{ + int planenum; + short children[2]; // negative numbers are contents +} dclipnode_t; + +/* <4876a> ../engine/bspfile.h:149 */ +typedef struct texinfo_s +{ + float vecs[2][4]; + int _miptex; + int flags; +} texinfo_t; + +/* <487c2> ../engine/bspfile.h:159 */ +typedef struct dedge_s +{ + unsigned short v[2]; +} dedge_t; + +/* <487f2> ../engine/bspfile.h:165 */ +typedef struct dface_s +{ + short planenum; + short side; + int firstedge; + short numedges; + short texinfo; + byte styles[4]; + int lightofs; +} dface_t; + +typedef struct dleaf_s +{ + int contents; + int visofs; + short mins[3]; + short maxs[3]; + unsigned short firstmarksurface; + unsigned short nummarksurfaces; + byte ambient_level[4]; +} dleaf_t; diff --git a/cssdk/engine/cmd_rehlds.h b/cssdk/engine/cmd_rehlds.h new file mode 100644 index 0000000..9302f63 --- /dev/null +++ b/cssdk/engine/cmd_rehlds.h @@ -0,0 +1,50 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "archtypes.h" + +typedef void(*xcommand_t)(void); + +typedef struct cmd_function_s +{ + struct cmd_function_s *next; + char *name; + xcommand_t function; + int flags; +} cmd_function_t; + +typedef enum cmd_source_s +{ + src_client = 0, // came in over a net connection as a clc_stringcmd. host_client will be valid during this state. + src_command = 1, // from the command buffer. +} cmd_source_t; + +#define FCMD_HUD_COMMAND BIT(0) +#define FCMD_GAME_COMMAND BIT(1) +#define FCMD_WRAPPER_COMMAND BIT(2) diff --git a/cssdk/engine/common_rehlds.h b/cssdk/engine/common_rehlds.h new file mode 100644 index 0000000..c0f4c39 --- /dev/null +++ b/cssdk/engine/common_rehlds.h @@ -0,0 +1,73 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#include "const.h" +#include "qlimits.h" + +// Don't allow overflow +#define SIZEBUF_CHECK_OVERFLOW 0 +#define SIZEBUF_ALLOW_OVERFLOW BIT(0) +#define SIZEBUF_OVERFLOWED BIT(1) + +#define MAX_NUM_ARGVS 50 +#define NUM_SAFE_ARGVS 7 + +#define COM_COPY_CHUNK_SIZE 1024 +#define COM_MAX_CMD_LINE 256 + +typedef struct sizebuf_s +{ + const char *buffername; + uint16 flags; + byte *data; + int maxsize; + int cursize; +} sizebuf_t; + +typedef struct downloadtime_s +{ + qboolean bUsed; + float fTime; + int nBytesRemaining; +} downloadtime_t; + +typedef struct incomingtransfer_s +{ + qboolean doneregistering; + int percent; + qboolean downloadrequested; + downloadtime_t rgStats[8]; + int nCurStat; + int nTotalSize; + int nTotalToTransfer; + int nRemainingToTransfer; + float fLastStatusUpdate; + qboolean custom; +} incomingtransfer_t; diff --git a/cssdk/engine/crc32c.cpp b/cssdk/engine/crc32c.cpp new file mode 100644 index 0000000..1220c50 --- /dev/null +++ b/cssdk/engine/crc32c.cpp @@ -0,0 +1,143 @@ +/* +Copyright (C) 2010 by Ronnie Sahlberg +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. +This program 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 Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, see . +*/ + +#include "crc32c.h" +#include "sys_shared.h" +#include "immintrin.h" + +/*****************************************************************/ +/* */ +/* CRC LOOKUP TABLE */ +/* ================ */ +/* The following CRC lookup table was generated automagically */ +/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ +/* Program V1.0 using the following model parameters: */ +/* */ +/* Width : 4 bytes. */ +/* Poly : 0x1EDC6F41L */ +/* Reverse : TRUE. */ +/* */ +/* For more information on the Rocksoft^tm Model CRC Algorithm, */ +/* see the document titled "A Painless Guide to CRC Error */ +/* Detection Algorithms" by Ross Williams */ +/* (ross@guest.adelaide.edu.au.). This document is likely to be */ +/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ +/* */ +/*****************************************************************/ + +static uint32 crctable[256] = { + 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, + 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, + 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, + 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, + 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, + 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, + 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, + 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, + 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, + 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, + 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, + 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, + 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, + 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, + 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, + 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, + 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, + 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, + 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, + 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, + 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, + 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, + 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, + 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, + 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, + 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, + 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, + 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, + 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, + 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, + 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, + 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, + 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, + 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, + 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, + 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, + 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, + 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, + 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, + 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, + 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, + 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, + 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, + 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, + 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, + 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, + 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, + 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, + 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, + 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, + 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, + 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, + 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, + 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, + 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, + 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, + 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, + 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, + 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, + 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, + 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, + 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, + 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, + 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L +}; + +uint32 crc32c_t8_nosse(uint32 iCRC, uint8 u8) { + return (iCRC >> 8) ^ crctable[(iCRC ^ u8) & 0xFF]; +} + +uint32 crc32c_t_nosse(uint32 iCRC, const uint8 *buf, int len) { + uint32 crc = iCRC; + while (len-- > 0) { + crc = (crc >> 8) ^ crctable[(crc ^ (*buf++)) & 0xFF]; + } + return crc; +} + +uint32 crc32c_t8_sse(uint32 iCRC, uint8 u8) { + return _mm_crc32_u8(iCRC, u8); +} + +uint32 crc32c_t_sse(uint32 iCRC, const uint8 *buf, unsigned int len) { + uint32 crc32cval = iCRC; + unsigned int i = 0; + + for (; i < (len >> 2); i += 4) { + crc32cval = _mm_crc32_u32(crc32cval, *(uint32*)&buf[i]); + } + + for (; i < len; i++) { + crc32cval = _mm_crc32_u8(crc32cval, buf[i]); + } + + return crc32cval; +} + +uint32 crc32c_t(uint32 iCRC, const uint8 *buf, unsigned int len) { + return cpuinfo.sse4_2 ? crc32c_t_sse(iCRC, buf, len) : crc32c_t_nosse(iCRC, buf, len); +} + +uint32 crc32c(const uint8 *buf, int len) { + return crc32c_t(0xffffffff, buf, len); +} diff --git a/cssdk/engine/crc32c.h b/cssdk/engine/crc32c.h new file mode 100644 index 0000000..892919b --- /dev/null +++ b/cssdk/engine/crc32c.h @@ -0,0 +1,22 @@ +/* +Copyright (C) 2010 by Ronnie Sahlberg +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. +This program 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 Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, see . +*/ +#pragma once +#include "archtypes.h" + +extern uint32 crc32c_t8_nosse(uint32 iCRC, uint8 u8); +extern uint32 crc32c_t8_sse(uint32 iCRC, uint8 u8); +extern uint32 crc32c_t_nosse(uint32 iCRC, const uint8 *buf, int len); +extern uint32 crc32c_t_sse(uint32 iCRC, const uint8 *buf, unsigned int len); +extern uint32 crc32c_t(uint32 iCRC, const uint8 *buf, unsigned int len); +extern uint32 crc32c(const uint8 *buf, int len); diff --git a/cssdk/engine/custom.h b/cssdk/engine/custom.h new file mode 100644 index 0000000..5a5156e --- /dev/null +++ b/cssdk/engine/custom.h @@ -0,0 +1,96 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// Customization.h +#pragma once + +#include "const.h" + +#define MAX_QPATH 64 // Must match value in quakedefs.h +#define MAX_RESOURCE_LIST 1280 + +///////////////// +// Customization +// passed to pfnPlayerCustomization +// For automatic downloading. +typedef enum +{ + t_sound = 0, + t_skin, + t_model, + t_decal, + t_generic, + t_eventscript, + t_world, // Fake type for world, is really t_model + rt_unk, + + rt_max +} resourcetype_t; + + +typedef struct +{ + int size; +} _resourceinfo_t; + +typedef struct resourceinfo_s +{ + _resourceinfo_t info[ rt_max ]; +} resourceinfo_t; + +#define RES_FATALIFMISSING (1<<0) // Disconnect if we can't get this file. +#define RES_WASMISSING (1<<1) // Do we have the file locally, did we get it ok? +#define RES_CUSTOM (1<<2) // Is this resource one that corresponds to another player's customization + // or is it a server startup resource. +#define RES_REQUESTED (1<<3) // Already requested a download of this one +#define RES_PRECACHED (1<<4) // Already precached +#define RES_ALWAYS (1<<5) // download always even if available on client +#define RES_UNK_6 (1<<6) // TODO: what is it? +#define RES_CHECKFILE (1<<7) // check file on client + +#include "crc.h" + +typedef struct resource_s +{ + char szFileName[MAX_QPATH]; // File name to download/precache. + resourcetype_t type; // t_sound, t_skin, t_model, t_decal. + int nIndex; // For t_decals + int nDownloadSize; // Size in Bytes if this must be downloaded. + unsigned char ucFlags; + +// For handling client to client resource propagation + unsigned char rgucMD5_hash[16]; // To determine if we already have it. + unsigned char playernum; // Which player index this resource is associated with, if it's a custom resource. + + unsigned char rguc_reserved[ 32 ]; // For future expansion + struct resource_s *pNext; // Next in chain. + struct resource_s *pPrev; +} resource_t; + +typedef struct customization_s +{ + qboolean bInUse; // Is this customization in use; + resource_t resource; // The resource_t for this customization + qboolean bTranslated; // Has the raw data been translated into a useable format? + // (e.g., raw decal .wad make into texture_t *) + int nUserData1; // Customization specific data + int nUserData2; // Customization specific data + void *pInfo; // Buffer that holds the data structure that references the data (e.g., the cachewad_t) + void *pBuffer; // Buffer that holds the data for the customization (the raw .wad data) + struct customization_s *pNext; // Next in chain +} customization_t; + +#define FCUST_FROMHPAK ( 1<<0 ) +#define FCUST_WIPEDATA ( 1<<1 ) +#define FCUST_IGNOREINIT ( 1<<2 ) diff --git a/cssdk/engine/customentity.h b/cssdk/engine/customentity.h new file mode 100644 index 0000000..0895bee --- /dev/null +++ b/cssdk/engine/customentity.h @@ -0,0 +1,38 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef CUSTOMENTITY_H +#define CUSTOMENTITY_H + +// Custom Entities + +// Start/End Entity is encoded as 12 bits of entity index, and 4 bits of attachment (4:12) +#define BEAMENT_ENTITY(x) ((x)&0xFFF) +#define BEAMENT_ATTACHMENT(x) (((x)>>12)&0xF) + +// Beam types, encoded as a byte +enum +{ + BEAM_POINTS = 0, + BEAM_ENTPOINT, + BEAM_ENTS, + BEAM_HOSE, +}; + +#define BEAM_FSINE 0x10 +#define BEAM_FSOLID 0x20 +#define BEAM_FSHADEIN 0x40 +#define BEAM_FSHADEOUT 0x80 + +#endif //CUSTOMENTITY_H diff --git a/cssdk/engine/d_local.h b/cssdk/engine/d_local.h new file mode 100644 index 0000000..8bf396d --- /dev/null +++ b/cssdk/engine/d_local.h @@ -0,0 +1,46 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + + + +/* <82286> ../engine/d_local.h:20 */ +typedef struct surfcache_s +{ + struct surfcache_s *next; + struct surfcache_s **owner; + int lightadj[4]; + int dlight; + int size; + unsigned width; + unsigned height; + float mipscale; + struct texture_s *texture; + unsigned char data[4]; +} surfcache_t; diff --git a/cssdk/engine/edict.h b/cssdk/engine/edict.h new file mode 100644 index 0000000..9a38993 --- /dev/null +++ b/cssdk/engine/edict.h @@ -0,0 +1,36 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined EDICT_H +#define EDICT_H +#ifdef _WIN32 +#pragma once +#endif +#define MAX_ENT_LEAFS 48 + +#include "progdefs.h" + +struct edict_s +{ + qboolean free; + int serialnumber; + link_t area; // linked to a division node or leaf + + int headnode; // -1 to use normal leaf check + int num_leafs; + short leafnums[MAX_ENT_LEAFS]; + + float freetime; // sv.time when the object was freed + + void* pvPrivateData; // Alloced and freed by engine, used by DLLs + + entvars_t v; // C exported fields from progs + + // other fields from progs come immediately after +}; + +#endif diff --git a/cssdk/engine/eiface.h b/cssdk/engine/eiface.h new file mode 100644 index 0000000..e146133 --- /dev/null +++ b/cssdk/engine/eiface.h @@ -0,0 +1,536 @@ +/*** +* +* Copyright (c) 1999, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#pragma once + +#include "archtypes.h" // DAL + +#ifdef HLDEMO_BUILD +#define INTERFACE_VERSION 001 +#else // !HLDEMO_BUILD, i.e., regular version of HL +#define INTERFACE_VERSION 140 +#endif // !HLDEMO_BUILD + +#include +#include "custom.h" +#include "cvardef.h" +#include "Sequence.h" +// +// Defines entity interface between engine and DLLs. +// This header file included by engine files and DLL files. +// +// Before including this header, DLLs must: +// include progdefs.h +// This is conveniently done for them in extdll.h +// + +/* +#ifdef _WIN32 +#define DLLEXPORT __stdcall +#else +#define DLLEXPORT __attribute__ ((visibility("default"))) +#endif +*/ + +enum ALERT_TYPE +{ + at_notice, + at_console, // same as at_notice, but forces a ConPrintf, not a message box + at_aiconsole, // same as at_console, but only shown if developer level is 2! + at_warning, + at_error, + at_logged // Server print to console ( only in multiplayer games ). +}; + +// 4-22-98 JOHN: added for use in pfnClientPrintf +enum PRINT_TYPE +{ + print_console, + print_center, + print_chat, +}; + +// For integrity checking of content on clients +enum FORCE_TYPE +{ + force_exactfile, // File on client must exactly match server's file + force_model_samebounds, // For model files only, the geometry must fit in the same bbox + force_model_specifybounds, // For model files only, the geometry must fit in the specified bbox + force_model_specifybounds_if_avail, // For Steam model files only, the geometry must fit in the specified bbox (if the file is available) +}; + +// Returned by TraceLine +struct TraceResult +{ + int fAllSolid; // if true, plane is not valid + int fStartSolid; // if true, the initial point was in a solid area + int fInOpen; + int fInWater; + float flFraction; // time completed, 1.0 = didn't hit anything + vec3_t vecEndPos; // final position + float flPlaneDist; + vec3_t vecPlaneNormal; // surface normal at impact + edict_t *pHit; // entity the surface is on + int iHitgroup; // 0 == generic, non zero is specific body part +}; + +// CD audio status +typedef struct +{ + int fPlaying;// is sound playing right now? + int fWasPlaying;// if not, CD is paused if WasPlaying is true. + int fInitialized; + int fEnabled; + int fPlayLooping; + float cdvolume; + //byte remap[100]; + int fCDRom; + int fPlayTrack; +} CDStatus; + +#include "../common/crc.h" + + +// Engine hands this to DLLs for functionality callbacks +typedef struct enginefuncs_s +{ + int (*pfnPrecacheModel) (const char* s); + int (*pfnPrecacheSound) (const char* s); + void (*pfnSetModel) (edict_t *e, const char *m); + int (*pfnModelIndex) (const char *m); + int (*pfnModelFrames) (int modelIndex); + void (*pfnSetSize) (edict_t *e, const float *rgflMin, const float *rgflMax); + void (*pfnChangeLevel) (const char* s1, const char* s2); + void (*pfnGetSpawnParms) (edict_t *ent); + void (*pfnSaveSpawnParms) (edict_t *ent); + float (*pfnVecToYaw) (const float *rgflVector); + void (*pfnVecToAngles) (const float *rgflVectorIn, float *rgflVectorOut); + void (*pfnMoveToOrigin) (edict_t *ent, const float *pflGoal, float dist, int iMoveType); + void (*pfnChangeYaw) (edict_t* ent); + void (*pfnChangePitch) (edict_t* ent); + edict_t* (*pfnFindEntityByString) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); + int (*pfnGetEntityIllum) (edict_t* pEnt); + edict_t* (*pfnFindEntityInSphere) (edict_t *pEdictStartSearchAfter, const float *org, float rad); + edict_t* (*pfnFindClientInPVS) (edict_t *pEdict); + edict_t* (*pfnEntitiesInPVS) (edict_t *pplayer); + void (*pfnMakeVectors) (const float *rgflVector); + void (*pfnAngleVectors) (const float *rgflVector, float *forward, float *right, float *up); + edict_t* (*pfnCreateEntity) (void); + void (*pfnRemoveEntity) (edict_t* e); + edict_t* (*pfnCreateNamedEntity) (int className); + void (*pfnMakeStatic) (edict_t *ent); + int (*pfnEntIsOnFloor) (edict_t *e); + int (*pfnDropToFloor) (edict_t* e); + int (*pfnWalkMove) (edict_t *ent, float yaw, float dist, int iMode); + void (*pfnSetOrigin) (edict_t *e, const float *rgflOrigin); + void (*pfnEmitSound) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); + void (*pfnEmitAmbientSound) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); + void (*pfnTraceLine) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceToss) (edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr); + int (*pfnTraceMonsterHull) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceHull) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceModel) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); + const char *(*pfnTraceTexture) (edict_t *pTextureEntity, const float *v1, const float *v2 ); + void (*pfnTraceSphere) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnGetAimVector) (edict_t* ent, float speed, float *rgflReturn); + void (*pfnServerCommand) (char* str); + void (*pfnServerExecute) (void); + void (*pfnClientCommand) (edict_t* pEdict, char* szFmt, ...); + void (*pfnParticleEffect) (const float *org, const float *dir, float color, float count); + void (*pfnLightStyle) (int style, char* val); + int (*pfnDecalIndex) (const char *name); + int (*pfnPointContents) (const float *rgflVector); + void (*pfnMessageBegin) (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); + void (*pfnMessageEnd) (void); + void (*pfnWriteByte) (int iValue); + void (*pfnWriteChar) (int iValue); + void (*pfnWriteShort) (int iValue); + void (*pfnWriteLong) (int iValue); + void (*pfnWriteAngle) (float flValue); + void (*pfnWriteCoord) (float flValue); + void (*pfnWriteString) (const char *sz); + void (*pfnWriteEntity) (int iValue); + void (*pfnCVarRegister) (cvar_t *pCvar); + float (*pfnCVarGetFloat) (const char *szVarName); + const char* (*pfnCVarGetString) (const char *szVarName); + void (*pfnCVarSetFloat) (const char *szVarName, float flValue); + void (*pfnCVarSetString) (const char *szVarName, const char *szValue); + void (*pfnAlertMessage) (ALERT_TYPE atype, const char *szFmt, ...); + void (*pfnEngineFprintf) (void *pfile, const char *szFmt, ...); + void* (*pfnPvAllocEntPrivateData) (edict_t *pEdict, int32 cb); + void* (*pfnPvEntPrivateData) (edict_t *pEdict); + void (*pfnFreeEntPrivateData) (edict_t *pEdict); + const char* (*pfnSzFromIndex) (int iString); + int (*pfnAllocString) (const char *szValue); + struct entvars_s* (*pfnGetVarsOfEnt) (edict_t *pEdict); + edict_t* (*pfnPEntityOfEntOffset) (int iEntOffset); + int (*pfnEntOffsetOfPEntity) (const edict_t *pEdict); + int (*pfnIndexOfEdict) (const edict_t *pEdict); + edict_t* (*pfnPEntityOfEntIndex) (int iEntIndex); + edict_t* (*pfnFindEntityByVars) (struct entvars_s* pvars); + void* (*pfnGetModelPtr) (edict_t* pEdict); + int (*pfnRegUserMsg) (const char *pszName, int iSize); + void (*pfnAnimationAutomove) (const edict_t* pEdict, float flTime); + void (*pfnGetBonePosition) (const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); + uint32 (*pfnFunctionFromName) ( const char *pName ); + const char *(*pfnNameForFunction) ( uint32 function ); + void (*pfnClientPrintf) ( edict_t* pEdict, PRINT_TYPE ptype, const char *szMsg ); // JOHN: engine callbacks so game DLL can print messages to individual clients + void (*pfnServerPrint) ( const char *szMsg ); + const char *(*pfnCmd_Args) ( void ); // these 3 added + const char *(*pfnCmd_Argv) ( int argc ); // so game DLL can easily + int (*pfnCmd_Argc) ( void ); // access client 'cmd' strings + void (*pfnGetAttachment) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); + void (*pfnCRC32_Init) (CRC32_t *pulCRC); + void (*pfnCRC32_ProcessBuffer) (CRC32_t *pulCRC, void *p, int len); + void (*pfnCRC32_ProcessByte) (CRC32_t *pulCRC, unsigned char ch); + CRC32_t (*pfnCRC32_Final) (CRC32_t pulCRC); + int32 (*pfnRandomLong) (int32 lLow, int32 lHigh); + float (*pfnRandomFloat) (float flLow, float flHigh); + void (*pfnSetView) (const edict_t *pClient, const edict_t *pViewent ); + float (*pfnTime) ( void ); + void (*pfnCrosshairAngle) (const edict_t *pClient, float pitch, float yaw); + byte * (*pfnLoadFileForMe) (char *filename, int *pLength); + void (*pfnFreeFile) (void *buffer); + void (*pfnEndSection) (const char *pszSectionName); // trigger_endsection + int (*pfnCompareFileTime) (char *filename1, char *filename2, int *iCompare); + void (*pfnGetGameDir) (char *szGetGameDir); + void (*pfnCvar_RegisterVariable) (cvar_t *variable); + void (*pfnFadeClientVolume) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); + void (*pfnSetClientMaxspeed) (edict_t *pEdict, float fNewMaxspeed); + edict_t * (*pfnCreateFakeClient) (const char *netname); // returns NULL if fake client can't be created + void (*pfnRunPlayerMove) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); + int (*pfnNumberOfEntities) (void); + char* (*pfnGetInfoKeyBuffer) (edict_t *e); // passing in NULL gets the serverinfo + char* (*pfnInfoKeyValue) (char *infobuffer, const char *key); + void (*pfnSetKeyValue) (char *infobuffer, const char *key, const char *value); + void (*pfnSetClientKeyValue) (int clientIndex, char *infobuffer, const char *key, const char *value); + int (*pfnIsMapValid) (char *filename); + void (*pfnStaticDecal) ( const float *origin, int decalIndex, int entityIndex, int modelIndex ); + int (*pfnPrecacheGeneric) (char* s); + int (*pfnGetPlayerUserId) (edict_t *e ); // returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients + void (*pfnBuildSoundMsg) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); + int (*pfnIsDedicatedServer) (void);// is this a dedicated server? + cvar_t *(*pfnCVarGetPointer) (const char *szVarName); + unsigned int (*pfnGetPlayerWONId) (edict_t *e); // returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients + + // YWB 8/1/99 TFF Physics additions + void (*pfnInfo_RemoveKey) ( char *s, const char *key ); + const char *(*pfnGetPhysicsKeyValue) ( const edict_t *pClient, const char *key ); + void (*pfnSetPhysicsKeyValue) ( const edict_t *pClient, const char *key, const char *value ); + const char *(*pfnGetPhysicsInfoString) ( const edict_t *pClient ); + unsigned short (*pfnPrecacheEvent) ( int type, const char*psz ); + void (*pfnPlaybackEvent) ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + + unsigned char *(*pfnSetFatPVS) ( float *org ); + unsigned char *(*pfnSetFatPAS) ( float *org ); + + int (*pfnCheckVisibility ) ( edict_t *entity, unsigned char *pset ); + + void (*pfnDeltaSetField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaUnsetField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaAddEncoder) ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); + int (*pfnGetCurrentPlayer) ( void ); + int (*pfnCanSkipPlayer) ( const edict_t *player ); + int (*pfnDeltaFindField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaSetFieldByIndex) ( struct delta_s *pFields, int fieldNumber ); + void (*pfnDeltaUnsetFieldByIndex)( struct delta_s *pFields, int fieldNumber ); + + void (*pfnSetGroupMask) ( int mask, int op ); + + int (*pfnCreateInstancedBaseline) ( int classname, struct entity_state_s *baseline ); + void (*pfnCvar_DirectSet) ( struct cvar_s *var, const char *value ); + + // Forces the client and server to be running with the same version of the specified file + // ( e.g., a player model ). + // Calling this has no effect in single player + void (*pfnForceUnmodified) ( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); + + void (*pfnGetPlayerStats) ( const edict_t *pClient, int *ping, int *packet_loss ); + + void (*pfnAddServerCommand) ( char *cmd_name, void (*function) (void) ); + + // For voice communications, set which clients hear eachother. + // NOTE: these functions take player entity indices (starting at 1). + qboolean (*pfnVoice_GetClientListening)(int iReceiver, int iSender); + qboolean (*pfnVoice_SetClientListening)(int iReceiver, int iSender, qboolean bListen); + + const char *(*pfnGetPlayerAuthId) ( edict_t *e ); + + // PSV: Added for CZ training map +// const char *(*pfnKeyNameForBinding) ( const char* pBinding ); + + sequenceEntry_s* (*pfnSequenceGet) ( const char* fileName, const char* entryName ); + sentenceEntry_s* (*pfnSequencePickSentence) ( const char* groupName, int pickMethod, int *picked ); + + // LH: Give access to filesize via filesystem + int (*pfnGetFileSize) ( char *filename ); + + unsigned int (*pfnGetApproxWavePlayLen) (const char *filepath); + // MDC: Added for CZ career-mode + int (*pfnIsCareerMatch) ( void ); + + // BGC: return the number of characters of the localized string referenced by using "label" + int (*pfnGetLocalizedStringLength) (const char *label); + + // BGC: added to facilitate persistent storage of tutor message decay values for + // different career game profiles. Also needs to persist regardless of mp.dll being + // destroyed and recreated. + void (*pfnRegisterTutorMessageShown) (int mid); + int (*pfnGetTimesTutorMessageShown) (int mid); + void (*pfnProcessTutorMessageDecayBuffer) (int *buffer, int bufferLength); + void (*pfnConstructTutorMessageDecayBuffer) (int *buffer, int bufferLength); + void (*pfnResetTutorMessageDecayData) ( void ); + + // Added 2005/08/11 (no SDK update): + void(*pfnQueryClientCvarValue) (const edict_t *player, const char *cvarName); + + // Added 2005/11/21 (no SDK update): + void(*pfnQueryClientCvarValue2) (const edict_t *player, const char *cvarName, int requestID); + + // Added 2009/06/19 (no SDK update): + // int(*pfnEngCheckParm) (const char *pchCmdLineToken, char **ppnext); // s1lent: comment out this, for compatibility with older versions metamod +} enginefuncs_t; + + +// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138 + +// Passed to pfnKeyValue +typedef struct KeyValueData_s +{ + char *szClassName; // in: entity classname + char *szKeyName; // in: name of key + char *szValue; // in: value of key + qboolean fHandled; // out: DLL sets to true if key-value pair was understood +} KeyValueData; + + +typedef struct +{ + char mapName[ 32 ]; + char landmarkName[ 32 ]; + edict_t *pentLandmark; + vec3_t vecLandmarkOrigin; +} LEVELLIST; +#define MAX_LEVEL_CONNECTIONS 16 // These are encoded in the lower 16bits of ENTITYTABLE->flags + +typedef struct +{ + int id; // Ordinal ID of this entity (used for entity <--> pointer conversions) + edict_t *pent; // Pointer to the in-game entity + + int location; // Offset from the base data of this entity + int size; // Byte size of this entity's data + int flags; // This could be a short -- bit mask of transitions that this entity is in the PVS of + string_t classname; // entity class name + +} ENTITYTABLE; + +#define FENTTABLE_PLAYER 0x80000000 +#define FENTTABLE_REMOVED 0x40000000 +#define FENTTABLE_MOVEABLE 0x20000000 +#define FENTTABLE_GLOBAL 0x10000000 + +typedef struct saverestore_s SAVERESTOREDATA; + +#ifdef _WIN32 +typedef +#endif +struct saverestore_s +{ + char *pBaseData; // Start of all entity save data + char *pCurrentData; // Current buffer pointer for sequential access + int size; // Current data size + int bufferSize; // Total space for data + int tokenSize; // Size of the linear list of tokens + int tokenCount; // Number of elements in the pTokens table + char **pTokens; // Hash table of entity strings (sparse) + int currentIndex; // Holds a global entity table ID + int tableCount; // Number of elements in the entity table + int connectionCount;// Number of elements in the levelList[] + ENTITYTABLE *pTable; // Array of ENTITYTABLE elements (1 for each entity) + LEVELLIST levelList[ MAX_LEVEL_CONNECTIONS ]; // List of connections from this level + + // smooth transition + int fUseLandmark; + char szLandmarkName[20];// landmark we'll spawn near in next level + vec3_t vecLandmarkOffset;// for landmark transitions + float time; + char szCurrentMapName[32]; // To check global entities + +} +#ifdef _WIN32 +SAVERESTOREDATA +#endif +; + +typedef enum _fieldtypes +{ + FIELD_FLOAT = 0, // Any floating point value + FIELD_STRING, // A string ID (return from ALLOC_STRING) + FIELD_ENTITY, // An entity offset (EOFFSET) + FIELD_CLASSPTR, // CBaseEntity * + FIELD_EHANDLE, // Entity handle + FIELD_EVARS, // EVARS * + FIELD_EDICT, // edict_t *, or edict_t * (same thing) + FIELD_VECTOR, // Any vector + FIELD_POSITION_VECTOR, // A world coordinate (these are fixed up across level transitions automagically) + FIELD_POINTER, // Arbitrary data pointer... to be removed, use an array of FIELD_CHARACTER + FIELD_INTEGER, // Any integer or enum + FIELD_FUNCTION, // A class function pointer (Think, Use, etc) + FIELD_BOOLEAN, // boolean, implemented as an int, I may use this as a hint for compression + FIELD_SHORT, // 2 byte integer + FIELD_CHARACTER, // a byte + FIELD_TIME, // a floating point time (these are fixed up automatically too!) + FIELD_MODELNAME, // Engine string that is a model name (needs precache) + FIELD_SOUNDNAME, // Engine string that is a sound name (needs precache) + + FIELD_TYPECOUNT, // MUST BE LAST +} FIELDTYPE; + +#if !defined(offsetof) && !defined(GNUC) +#define offsetof(s,m) (size_t)&(((s *)0)->m) +#endif + +#define _FIELD(type,name,fieldtype,count,flags) { fieldtype, #name, offsetof(type, name), count, flags } +#define DEFINE_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, 0) +#define DEFINE_ARRAY(type,name,fieldtype,count) _FIELD(type, name, fieldtype, count, 0) +#define DEFINE_ENTITY_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, 0 ) +#define DEFINE_ENTITY_GLOBAL_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, FTYPEDESC_GLOBAL ) +#define DEFINE_GLOBAL_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, FTYPEDESC_GLOBAL ) + + +#define FTYPEDESC_GLOBAL 0x0001 // This field is masked for global entity save/restore + +typedef struct +{ + FIELDTYPE fieldType; + char *fieldName; + int fieldOffset; + short fieldSize; + short flags; +} TYPEDESCRIPTION; + +#ifndef ARRAYSIZE +#define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) +#endif + +typedef struct +{ + // Initialize/shutdown the game (one-time call after loading of game .dll ) + void (*pfnGameInit) ( void ); + int (*pfnSpawn) ( edict_t *pent ); + void (*pfnThink) ( edict_t *pent ); + void (*pfnUse) ( edict_t *pentUsed, edict_t *pentOther ); + void (*pfnTouch) ( edict_t *pentTouched, edict_t *pentOther ); + void (*pfnBlocked) ( edict_t *pentBlocked, edict_t *pentOther ); + void (*pfnKeyValue) ( edict_t *pentKeyvalue, KeyValueData *pkvd ); + void (*pfnSave) ( edict_t *pent, SAVERESTOREDATA *pSaveData ); + int (*pfnRestore) ( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); + void (*pfnSetAbsBox) ( edict_t *pent ); + + void (*pfnSaveWriteFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int ); + void (*pfnSaveReadFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int ); + + void (*pfnSaveGlobalState) ( SAVERESTOREDATA * ); + void (*pfnRestoreGlobalState) ( SAVERESTOREDATA * ); + void (*pfnResetGlobalState) ( void ); + + qboolean (*pfnClientConnect) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); + + void (*pfnClientDisconnect) ( edict_t *pEntity ); + void (*pfnClientKill) ( edict_t *pEntity ); + void (*pfnClientPutInServer) ( edict_t *pEntity ); + void (*pfnClientCommand) ( edict_t *pEntity ); + void (*pfnClientUserInfoChanged)( edict_t *pEntity, char *infobuffer ); + + void (*pfnServerActivate) ( edict_t *pEdictList, int edictCount, int clientMax ); + void (*pfnServerDeactivate) ( void ); + + void (*pfnPlayerPreThink) ( edict_t *pEntity ); + void (*pfnPlayerPostThink) ( edict_t *pEntity ); + + void (*pfnStartFrame) ( void ); + void (*pfnParmsNewLevel) ( void ); + void (*pfnParmsChangeLevel) ( void ); + + // Returns string describing current .dll. E.g., TeamFotrress 2, Half-Life + const char *(*pfnGetGameDescription)( void ); + + // Notify dll about a player customization. + void (*pfnPlayerCustomization) ( edict_t *pEntity, customization_t *pCustom ); + + // Spectator funcs + void (*pfnSpectatorConnect) ( edict_t *pEntity ); + void (*pfnSpectatorDisconnect) ( edict_t *pEntity ); + void (*pfnSpectatorThink) ( edict_t *pEntity ); + + // Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. + void (*pfnSys_Error) ( const char *error_string ); + + void (*pfnPM_Move) ( struct playermove_s *ppmove, qboolean server ); + void (*pfnPM_Init) ( struct playermove_s *ppmove ); + char (*pfnPM_FindTextureType)( char *name ); + void (*pfnSetupVisibility)( struct edict_s *pViewEntity, struct edict_s *pClient, unsigned char **pvs, unsigned char **pas ); + void (*pfnUpdateClientData) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); + int (*pfnAddToFullPack)( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); + void (*pfnCreateBaseline) ( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); + void (*pfnRegisterEncoders) ( void ); + int (*pfnGetWeaponData) ( struct edict_s *player, struct weapon_data_s *info ); + + void (*pfnCmdStart) ( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); + void (*pfnCmdEnd) ( const edict_t *player ); + + // Return 1 if the packet is valid. Set response_buffer_size if you want to send a response packet. Incoming, it holds the max + // size of the response_buffer, so you must zero it out if you choose not to respond. + int (*pfnConnectionlessPacket ) ( const struct netadr_s *net_from_, const char *args, char *response_buffer, int *response_buffer_size ); + + // Enumerates player hulls. Returns 0 if the hull number doesn't exist, 1 otherwise + int (*pfnGetHullBounds) ( int hullnumber, float *mins, float *maxs ); + + // Create baselines for certain "unplaced" items. + void (*pfnCreateInstancedBaselines) ( void ); + + // One of the pfnForceUnmodified files failed the consistency check for the specified player + // Return 0 to allow the client to continue, 1 to force immediate disconnection ( with an optional disconnect message of up to 256 characters ) + int (*pfnInconsistentFile)( const struct edict_s *player, const char *filename, char *disconnect_message ); + + // The game .dll should return 1 if lag compensation should be allowed ( could also just set + // the sv_unlag cvar. + // Most games right now should return 0, until client-side weapon prediction code is written + // and tested for them. + int (*pfnAllowLagCompensation)( void ); +} DLL_FUNCTIONS; + +extern DLL_FUNCTIONS gEntityInterface; + +// Current version. +#define NEW_DLL_FUNCTIONS_VERSION 1 + +typedef struct +{ + // Called right before the object's memory is freed. + // Calls its destructor. + void (*pfnOnFreeEntPrivateData)(edict_t *pEnt); + void (*pfnGameShutdown)(void); + int (*pfnShouldCollide)( edict_t *pentTouched, edict_t *pentOther ); + void (*pfnCvarValue)( const edict_t *pEnt, const char *value ); + void (*pfnCvarValue2)( const edict_t *pEnt, int requestID, const char *cvarName, const char *value ); +} NEW_DLL_FUNCTIONS; +typedef int(*NEW_DLL_FUNCTIONS_FN)(NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); + +// Pointers will be null if the game DLL doesn't support this API. +extern NEW_DLL_FUNCTIONS gNewDLLFunctions; + +typedef int(*APIFUNCTION)(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion); +typedef int(*APIFUNCTION2)(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); diff --git a/cssdk/engine/keydefs.h b/cssdk/engine/keydefs.h new file mode 100644 index 0000000..ef9b2fc --- /dev/null +++ b/cssdk/engine/keydefs.h @@ -0,0 +1,131 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +// keydefs.h +#ifndef KEYDEFS_H +#define KEYDEFS_H +#ifdef _WIN32 +#ifndef __MINGW32__ +#pragma once +#endif /* not __MINGW32__ */ +#endif + +// +// these are the key numbers that should be passed to Key_Event +// +#define K_TAB 9 +#define K_ENTER 13 +#define K_ESCAPE 27 +#define K_SPACE 32 + +// normal keys should be passed as lowercased ascii + +#define K_BACKSPACE 127 +#define K_UPARROW 128 +#define K_DOWNARROW 129 +#define K_LEFTARROW 130 +#define K_RIGHTARROW 131 + +#define K_ALT 132 +#define K_CTRL 133 +#define K_SHIFT 134 +#define K_F1 135 +#define K_F2 136 +#define K_F3 137 +#define K_F4 138 +#define K_F5 139 +#define K_F6 140 +#define K_F7 141 +#define K_F8 142 +#define K_F9 143 +#define K_F10 144 +#define K_F11 145 +#define K_F12 146 +#define K_INS 147 +#define K_DEL 148 +#define K_PGDN 149 +#define K_PGUP 150 +#define K_HOME 151 +#define K_END 152 + +#define K_KP_HOME 160 +#define K_KP_UPARROW 161 +#define K_KP_PGUP 162 +#define K_KP_LEFTARROW 163 +#define K_KP_5 164 +#define K_KP_RIGHTARROW 165 +#define K_KP_END 166 +#define K_KP_DOWNARROW 167 +#define K_KP_PGDN 168 +#define K_KP_ENTER 169 +#define K_KP_INS 170 +#define K_KP_DEL 171 +#define K_KP_SLASH 172 +#define K_KP_MINUS 173 +#define K_KP_PLUS 174 +#define K_CAPSLOCK 175 + + +// +// joystick buttons +// +#define K_JOY1 203 +#define K_JOY2 204 +#define K_JOY3 205 +#define K_JOY4 206 + +// +// aux keys are for multi-buttoned joysticks to generate so they can use +// the normal binding process +// +#define K_AUX1 207 +#define K_AUX2 208 +#define K_AUX3 209 +#define K_AUX4 210 +#define K_AUX5 211 +#define K_AUX6 212 +#define K_AUX7 213 +#define K_AUX8 214 +#define K_AUX9 215 +#define K_AUX10 216 +#define K_AUX11 217 +#define K_AUX12 218 +#define K_AUX13 219 +#define K_AUX14 220 +#define K_AUX15 221 +#define K_AUX16 222 +#define K_AUX17 223 +#define K_AUX18 224 +#define K_AUX19 225 +#define K_AUX20 226 +#define K_AUX21 227 +#define K_AUX22 228 +#define K_AUX23 229 +#define K_AUX24 230 +#define K_AUX25 231 +#define K_AUX26 232 +#define K_AUX27 233 +#define K_AUX28 234 +#define K_AUX29 235 +#define K_AUX30 236 +#define K_AUX31 237 +#define K_AUX32 238 +#define K_MWHEELDOWN 239 +#define K_MWHEELUP 240 + +#define K_PAUSE 255 + +// +// mouse buttons generate virtual keys +// +#define K_MOUSE1 241 +#define K_MOUSE2 242 +#define K_MOUSE3 243 +#define K_MOUSE4 244 +#define K_MOUSE5 245 + +#endif // KEYDEFS_H diff --git a/cssdk/engine/maintypes.h b/cssdk/engine/maintypes.h new file mode 100644 index 0000000..40ae20c --- /dev/null +++ b/cssdk/engine/maintypes.h @@ -0,0 +1,52 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef MAINTYPES_H +#define MAINTYPES_H +#ifdef _WIN32 +#pragma once +#endif + + +#include "osconfig.h" +#include "mathlib.h" + + +// Has no references on server side. +#define NOXREF +// Function body is not implemented. +#define NOBODY +// Function is not tested at all. +#define UNTESTED + +#define BIT(n) (1<<(n)) + + +typedef unsigned int string_t; // from engine's pr_comp.h; + +#endif // MAINTYPES_H diff --git a/cssdk/engine/model.h b/cssdk/engine/model.h new file mode 100644 index 0000000..2c155d5 --- /dev/null +++ b/cssdk/engine/model.h @@ -0,0 +1,415 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "const.h" +#include "modelgen.h" +#include "spritegn.h" +#include "bspfile.h" +#include "crc.h" +#include "com_model.h" + +#define SURF_PLANEBACK 2 +#define SURF_DRAWSKY 4 +#define SURF_DRAWSPRITE 8 +#define SURF_DRAWTURB 0x10 +#define SURF_DRAWTILED 0x20 +#define SURF_DRAWBACKGROUND 0x40 +#define ALIAS_MODEL_VERSION 0x006 + +#define MAX_MODEL_NAME 64 +#define MIPLEVELS 4 +#define NUM_AMBIENTS 4 // automatic ambient sounds +#define MAXLIGHTMAPS 4 +#define MAX_KNOWN_MODELS 1024 + +/* <6816> ../engine/model.h:27 */ +typedef struct mvertex_s +{ + vec3_t position; +} mvertex_t; + +/* <6838> ../engine/model.h:39 */ +typedef struct mplane_s +{ + vec3_t normal; // surface normal + float dist; // closest appoach to origin + byte type; // for texture axis selection and fast side tests + byte signbits; // signx + signy<<1 + signz<<1 + byte pad[2]; +} mplane_t; + +/* <68a6> ../engine/model.h:48 */ +typedef struct texture_s +{ + char name[16]; + unsigned width, height; + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frame 1 use these + unsigned offsets[MIPLEVELS]; // four mip maps stored + unsigned paloffset; +} texture_t; + +/* <6950> ../engine/model.h:71 */ +typedef struct medge_s +{ + unsigned short v[2]; + unsigned int cachededgeoffset; +} medge_t; + +/* <697e> ../engine/model.h:78 */ +typedef struct mtexinfo_s +{ + float vecs[2][4]; // [s/t] unit vectors in world space. + // [i][3] is the s/t offset relative to the origin. + // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] + float mipadjust; // ?? mipmap limits for very small surfaces + texture_t *texture; + int flags; // sky or slime, no lightmap or 256 subdivision +} mtexinfo_t; +#define TEX_SPECIAL 1 // sky or slime, no lightmap or 256 subdivision + +/* <69d0> ../engine/model.h:91 */ +typedef struct msurface_s msurface_t; +/* <1db66> ../engine/model.h:92 */ +typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +/* <1db71> ../engine/model.h:96 */ +struct decal_s +{ + decal_t *pnext; // linked list for each surface + msurface_t *psurface; // Surface id for persistence / unlinking + short dx; // Offsets into surface texture (in texture coordinates, so we don't need floats) + short dy; + short texture; // Decal texture + byte scale; // Pixel scale + byte flags; // Decal flags + + short entityIndex; // Entity this is attached to +}; + +/* <69db> ../engine/model.h:118 */ +struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + int dlightframe; // last frame the surface was checked by an animated light + int dlightbits; // dynamically generated. Indicates if the surface illumination + // is modified by an animated light. + + mplane_t *plane; // pointer to shared plane + int flags; // see SURF_ #defines + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + + // surface generation data + struct surfcache_s *cachespots[MIPLEVELS]; + + short texturemins[2]; // smallest s/t position on the surface. + short extents[2]; // ?? s/t texture size, 1..256 for all non-sky surfaces + + mtexinfo_t *texinfo; + + // lighting info + byte styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights + // no one surface can be effected by more than 4 + // animated lights. + color24 *samples; + + decal_t *pdecals; +}; + +/* <6b6c> ../engine/model.h:149 */ +typedef struct mnode_s +{ + // common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + + // node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +/* <1dcd4> ../engine/model.h:169 */ +typedef struct mleaf_s +{ + // common with node + int contents; // wil be a negative contents number + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + + // leaf specific + byte *compressed_vis; + struct efrag_s *efrags; + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; +} mleaf_t; + +/* <1ddbe> ../engine/model.h:190 */ +typedef struct hull_s +{ + dclipnode_t *clipnodes; + mplane_t *planes; + int firstclipnode; + int lastclipnode; + vec3_t clip_mins, clip_maxs; +} hull_t; + +/* <4b3fe> ../engine/model.h:210 */ +typedef struct mspriteframe_t +{ + int width; + int height; + void *pcachespot; + float up, down, left, right; + byte pixels[4]; +} mspriteframe_s; + +/* <4b485> ../engine/model.h:219 */ +typedef struct mspritegroup_s +{ + int numframes; + float *intervals; + mspriteframe_t *frames[1]; +} mspritegroup_t; + +/* <4b4df> ../engine/model.h:226 */ +typedef struct mspriteframedesc_s +{ + spriteframetype_t type; + mspriteframe_t *frameptr; +} mspriteframedesc_t; + +/* <4b50f> ../engine/model.h:232 */ +typedef struct msprite_s +{ + short int type; + short int texFormat; + int maxwidth, maxheight; + int numframes; + int paloffset; + float beamlength; + void *cachespot; + mspriteframedesc_t frames[1]; +} msprite_t; + +/* <4b5b5> ../engine/model.h:255 */ +typedef struct maliasframedesc_s +{ + aliasframetype_t type; + trivertx_t bboxmin, bboxmax; + int frame; + char name[16]; +} maliasframedesc_t; + +/* <4b615> ../engine/model.h:264 */ +typedef struct maliasskindesc_s +{ + aliasskintype_t type; + void *pcachespot; + int skin; +} maliasskindesc_t; + +/* <4b658> ../engine/model.h:271 */ +typedef struct maliasgroupframedesc_s +{ + trivertx_t bboxmin, bboxmax; + int frame; +} maliasgroupframedesc_t; + +/* <4b69b> ../engine/model.h:278 */ +typedef struct maliasgroup_s +{ + int numframes; + int intervals; + maliasgroupframedesc_t frames[1]; +} maliasgroup_t; + +/* <4b6ee> ../engine/model.h:285 */ +typedef struct maliasskingroup_s +{ + int numskins; + int intervals; + maliasskindesc_t skindescs[1]; +} maliasskingroup_t; + +/* <4b741> ../engine/model.h:293 */ +typedef struct mtriangle_s +{ + int facesfront; + int vertindex[3]; +} mtriangle_t; + +/* <4b779> ../engine/model.h:298 */ +typedef struct aliashdr_s +{ + int model; + int stverts; + int skindesc; + int triangles; + int palette; + maliasframedesc_t frames[1]; +} aliashdr_t; + +/* <1de30> ../engine/model.h:315 */ +typedef enum modtype_e +{ + mod_brush, + mod_sprite, + mod_alias, + mod_studio, +} modtype_t; + +/* <1de5e> ../engine/model.h:331 */ +typedef struct model_s +{ + char name[MAX_MODEL_NAME]; + + //TODO: qboolean? seriously? + int needload; // bmodels and sprites don't cache normally + + modtype_t type; + int numframes; + synctype_t synctype; + + int flags; + + // + // volume occupied by the model + // + vec3_t mins, maxs; + float radius; + + // + // brush model + // + int firstmodelsurface, nummodelsurfaces; + + int numsubmodels; + dmodel_t *submodels; + + int numplanes; + mplane_t *planes; + + int numleafs; // number of visible leafs, not counting 0 + struct mleaf_s *leafs; + + int numvertexes; + mvertex_t *vertexes; + + int numedges; + medge_t *edges; + + int numnodes; + mnode_t *nodes; + + int numtexinfo; + mtexinfo_t *texinfo; + + int numsurfaces; + msurface_t *surfaces; + + int numsurfedges; + int *surfedges; + + int numclipnodes; + dclipnode_t *clipnodes; + + int nummarksurfaces; + msurface_t **marksurfaces; + + hull_t hulls[MAX_MAP_HULLS]; + + int numtextures; + texture_t **textures; + + byte *visdata; + + color24 *lightdata; + + char *entities; + + // + // additional model data + // + cache_user_t cache; // only access through Mod_Extradata +} model_t; + +typedef struct cachepic_s +{ + char name[64]; + cache_user_t cache; +} cachepic_t; + +typedef struct cachewad_s cachewad_t; + +typedef void(*PFNCACHE)(cachewad_t *, unsigned char *); + +typedef struct cachewad_s +{ + char *name; + cachepic_t *cache; + int cacheCount; + int cacheMax; + struct lumpinfo_s *lumps; + int lumpCount; + int cacheExtra; + PFNCACHE pfnCacheBuild; + int numpaths; + char **basedirs; + int *lumppathindices; +#ifndef SWDS + int tempWad; +#endif // SWDS +} cachewad_t; + +typedef struct mod_known_info_s +{ + qboolean shouldCRC; + qboolean firstCRCDone; + CRC32_t initialCRC; +} mod_known_info_t; + diff --git a/cssdk/engine/modelgen.h b/cssdk/engine/modelgen.h new file mode 100644 index 0000000..3d90bdd --- /dev/null +++ b/cssdk/engine/modelgen.h @@ -0,0 +1,144 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef MODELGEN_H +#define MODELGEN_H +#ifdef _WIN32 +#pragma once +#endif + + +/* <67f6> ../engine/modelgen.h:37 */ +typedef enum synctype_e +{ + ST_SYNC = 0, + ST_RAND = 1, +} synctype_t; + +/* <4abae> ../engine/modelgen.h:40 */ +typedef enum aliasframetype_s +{ + ALIAS_SINGLE = 0, + ALIAS_GROUP = 1, +} aliasframetype_t; + +/* 203 */ +/* <4abce> ../engine/modelgen.h:42 */ +typedef enum aliasskintype_s +{ + ALIAS_SKIN_SINGLE = 0, + ALIAS_SKIN_GROUP = 1, +} aliasskintype_t; + +/* <4abee> ../engine/modelgen.h:44 */ +typedef struct mdl_s +{ + int ident; + int version; + vec3_t scale; + vec3_t scale_origin; + float boundingradius; + vec3_t eyeposition; + int numskins; + int skinwidth; + int skinheight; + int numverts; + int numtris; + int numframes; + synctype_t synctype; + int flags; + float size; +} mdl_t; + +/* <4acd4> ../engine/modelgen.h:64 */ +typedef struct stvert_s +{ + int onseam; + int s; + int t; +} stvert_t; + +/* <4ad0e> ../engine/modelgen.h:70 */ +typedef struct dtriangle_s +{ + int facesfront; + int vertindex[3]; +} dtriangle_t; + +/* <4ad42> ../engine/modelgen.h:80 */ +typedef struct trivertx_s +{ + byte v[3]; + byte lightnormalindex; +} trivertx_t; + +/* <4ad80> ../engine/modelgen.h:85 */ +typedef struct daliasframe_s +{ + trivertx_t bboxmin, bboxmax; + char name[16]; +} daliasframe_t; + +/* <4adbe> ../engine/modelgen.h:91 */ +typedef struct daliasgroup_s +{ + int numframes; + trivertx_t bboxmin, bboxmax; +} daliasgroup_t; + +/* <4adfc> ../engine/modelgen.h:97 */ +typedef struct daliasskingroup_s +{ + int numskins; +} daliasskingroup_t; + +/* <4ae1e> ../engine/modelgen.h:101 */ +typedef struct daliasinterval_s +{ + float interval; +} daliasinterval_t; + +/* <4ae40> ../engine/modelgen.h:105 */ +typedef struct daliasskininterval_s +{ + float interval; +} daliasskininterval_t; + +/* <4ae62> ../engine/modelgen.h:109 */ +typedef struct daliasframetype_s +{ + aliasframetype_t type; +} daliasframetype_t; + +/* <4ae84> ../engine/modelgen.h:113 */ +typedef struct daliasskintype_s +{ + aliasskintype_t type; +} daliasskintype_t; + +#endif // MODELGEN_H diff --git a/cssdk/engine/osconfig.h b/cssdk/engine/osconfig.h new file mode 100644 index 0000000..bb45a62 --- /dev/null +++ b/cssdk/engine/osconfig.h @@ -0,0 +1,194 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef _OSCONFIG_H +#define _OSCONFIG_H + +#ifdef _WIN32 // WINDOWS + #pragma warning(disable : 4005) +#endif // _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef _WIN32 // WINDOWS + #include + #include + #include // for support IPX + #define PSAPI_VERSION 1 + #include + #include + #include + #include + #include + #include +#else // _WIN32 + #include + #include + //#include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + // Deail with stupid macro in kernel.h + #undef __FUNCTION__ +#endif // _WIN32 + +#include +#include +#include +#include + +#include +#include + +#ifdef _WIN32 // WINDOWS + #define _CRT_SECURE_NO_WARNINGS + #define WIN32_LEAN_AND_MEAN + + #ifndef CDECL + #define CDECL __cdecl + #endif + #define STDCALL __stdcall + #define HIDDEN + #define NOINLINE __declspec(noinline) + #define ALIGN16 __declspec(align(16)) + #define FORCE_STACK_ALIGN + + //inline bool SOCKET_FIONBIO(SOCKET s, int m) { return (ioctlsocket(s, FIONBIO, (u_long*)&m) == 0); } + //inline int SOCKET_MSGLEN(SOCKET s, u_long& r) { return ioctlsocket(s, FIONREAD, (u_long*)&r); } + typedef int socklen_t; + #define SOCKET_FIONBIO(s, m) ioctlsocket(s, FIONBIO, (u_long*)&m) + #define SOCKET_MSGLEN(s, r) ioctlsocket(s, FIONREAD, (u_long*)&r) + #define SIN_GET_ADDR(saddr, r) r = (saddr)->S_un.S_addr + #define SIN_SET_ADDR(saddr, r) (saddr)->S_un.S_addr = (r) + #define SOCKET_CLOSE(s) closesocket(s) + #define SOCKET_AGAIN() (WSAGetLastError() == WSAEWOULDBLOCK) + + inline void* sys_allocmem(unsigned int size) { + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + } + + inline void sys_freemem(void* ptr, unsigned int size) { + VirtualFree(ptr, 0, MEM_RELEASE); + } +#else // _WIN32 + #ifdef __FUNCTION__ + #undef __FUNCTION__ + #endif + #define __FUNCTION__ __func__ + + #ifndef PAGESIZE + #define PAGESIZE 4096 + #endif + #define ALIGN(addr) (size_t)((size_t)addr & ~(PAGESIZE-1)) + #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + + #define _MAX_FNAME NAME_MAX + #define MAX_PATH 260 + + typedef void *HWND; + + typedef unsigned long DWORD; + typedef unsigned short WORD; + typedef unsigned int UNINT32; + + #define CDECL __attribute__ ((cdecl)) + #define STDCALL __attribute__ ((stdcall)) + #define HIDDEN __attribute__((visibility("hidden"))) + #define NOINLINE __attribute__((noinline)) + #define ALIGN16 __attribute__((aligned(16))) + #define FORCE_STACK_ALIGN __attribute__((force_align_arg_pointer)) + + //inline bool SOCKET_FIONBIO(SOCKET s, int m) { return (ioctl(s, FIONBIO, (int*)&m) == 0); } + //inline int SOCKET_MSGLEN(SOCKET s, u_long& r) { return ioctl(s, FIONREAD, (int*)&r); } + typedef int SOCKET; + #define INVALID_SOCKET (SOCKET)(~0) + #define SOCKET_FIONBIO(s, m) ioctl(s, FIONBIO, (char*)&m) + #define SOCKET_MSGLEN(s, r) ioctl(s, FIONREAD, (char*)&r) + #define SIN_GET_ADDR(saddr, r) r = (saddr)->s_addr + #define SIN_SET_ADDR(saddr, r) (saddr)->s_addr = (r) + #define SOCKET_CLOSE(s) close(s) + #define SOCKET_AGAIN() (errno == EAGAIN) + #define SOCKET_ERROR -1 + + inline void* sys_allocmem(unsigned int size) { + return mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + } + inline void sys_freemem(void* ptr, unsigned int size) { + munmap(ptr, size); + } + + #define WSAENOPROTOOPT ENOPROTOOPT + + #ifndef FALSE + #define FALSE 0 + #endif + #ifndef TRUE + #define TRUE 1 + #endif +#endif // _WIN32 + +#ifdef _WIN32 + static const bool __isWindows = true; + static const bool __isLinux = false; +#else + static const bool __isWindows = false; + static const bool __isLinux = true; +#endif + +#define EXT_FUNC FORCE_STACK_ALIGN + +extern void __declspec(noreturn) rehlds_syserror(const char* fmt, ...); + +#endif // _OSCONFIG_H diff --git a/cssdk/engine/progdefs.h b/cssdk/engine/progdefs.h new file mode 100644 index 0000000..e27dc50 --- /dev/null +++ b/cssdk/engine/progdefs.h @@ -0,0 +1,224 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef PROGDEFS_H +#define PROGDEFS_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct globalvars_s +{ + float time; + float frametime; + float force_retouch; + string_t mapname; + string_t startspot; + float deathmatch_; + float coop_; + float teamplay; + float serverflags; + float found_secrets; + vec3_t v_forward; + vec3_t v_up; + vec3_t v_right; + float trace_allsolid; + float trace_startsolid; + float trace_fraction; + vec3_t trace_endpos; + vec3_t trace_plane_normal; + float trace_plane_dist; + edict_t *trace_ent; + float trace_inopen; + float trace_inwater; + int trace_hitgroup; + int trace_flags; + int msg_entity; + int cdAudioTrack; + int maxClients; + int maxEntities; + const char *pStringBase; + + void *pSaveData; + vec3_t vecLandmarkOffset; +} globalvars_t; + + +typedef struct entvars_s +{ + string_t classname; + string_t globalname; + + vec3_t origin; + vec3_t oldorigin; + vec3_t velocity; + vec3_t basevelocity; + vec3_t clbasevelocity; // Base velocity that was passed in to server physics so + // client can predict conveyors correctly. Server zeroes it, so we need to store here, too. + vec3_t movedir; + + vec3_t angles; // Model angles + vec3_t avelocity; // angle velocity (degrees per second) + vec3_t punchangle; // auto-decaying view angle adjustment + vec3_t v_angle; // Viewing angle (player only) + + // For parametric entities + vec3_t endpos; + vec3_t startpos; + float impacttime; + float starttime; + + int fixangle; // 0:nothing, 1:force view angles, 2:add avelocity + float idealpitch; + float pitch_speed; + float ideal_yaw; + float yaw_speed; + + int modelindex; + string_t model; + + int viewmodel; // player's viewmodel + int weaponmodel; // what other players see + + vec3_t absmin; // BB max translated to world coord + vec3_t absmax; // BB max translated to world coord + vec3_t mins; // local BB min + vec3_t maxs; // local BB max + vec3_t size; // maxs - mins + + float ltime; + float nextthink; + + int movetype; + int solid; + + int skin; + int body; // sub-model selection for studiomodels + int effects; + + float gravity; // % of "normal" gravity + float friction; // inverse elasticity of MOVETYPE_BOUNCE + + int light_level; + + int sequence; // animation sequence + int gaitsequence; // movement animation sequence for player (0 for none) + float frame; // % playback position in animation sequences (0..255) + float animtime; // world time when frame was set + float framerate; // animation playback rate (-8x to 8x) + byte controller[4]; // bone controller setting (0..255) + byte blending[2]; // blending amount between sub-sequences (0..255) + + float scale; // sprite rendering scale (0..255) + + int rendermode; + float renderamt; + vec3_t rendercolor; + int renderfx; + + float health; + float frags; + int weapons; // bit mask for available weapons + float takedamage; + + int deadflag; + vec3_t view_ofs; // eye position + + int button; + int impulse; + + edict_t *chain; // Entity pointer when linked into a linked list + edict_t *dmg_inflictor; + edict_t *enemy; + edict_t *aiment; // entity pointer when MOVETYPE_FOLLOW + edict_t *owner; + edict_t *groundentity; + + int spawnflags; + int flags; + + int colormap; // lowbyte topcolor, highbyte bottomcolor + int team; + + float max_health; + float teleport_time; + float armortype; + float armorvalue; + int waterlevel; + int watertype; + + string_t target; + string_t targetname; + string_t netname; + string_t message; + + float dmg_take; + float dmg_save; + float dmg; + float dmgtime; + + string_t noise; + string_t noise1; + string_t noise2; + string_t noise3; + + float speed; + float air_finished; + float pain_finished; + float radsuit_finished; + + edict_t *pContainingEntity; + + int playerclass; + float maxspeed; + + float fov; + int weaponanim; + + int pushmsec; + + int bInDuck; + int flTimeStepSound; + int flSwimTime; + int flDuckTime; + int iStepLeft; + float flFallVelocity; + + int gamestate; + + int oldbuttons; + + int groupinfo; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + edict_t *euser1; + edict_t *euser2; + edict_t *euser3; + edict_t *euser4; +} entvars_t; + + +#endif // PROGDEFS_H diff --git a/cssdk/engine/progs.h b/cssdk/engine/progs.h new file mode 100644 index 0000000..fe4796e --- /dev/null +++ b/cssdk/engine/progs.h @@ -0,0 +1,82 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef PROGS_H +#define PROGS_H + +#include "progdefs.h" + +// 16 simultaneous events, max +#define MAX_EVENT_QUEUE 64 + +#define DEFAULT_EVENT_RESENDS 1 + +#include "event_flags.h" + +typedef struct event_info_s event_info_t; + +#include "event_args.h" + +struct event_info_s +{ + unsigned short index; // 0 implies not in use + + short packet_index; // Use data from state info for entity in delta_packet . -1 implies separate info based on event + // parameter signature + short entity_index; // The edict this event is associated with + + float fire_time; // if non-zero, the time when the event should be fired ( fixed up on the client ) + + event_args_t args; + +// CLIENT ONLY + int flags; // Reliable or not, etc. + +}; + +typedef struct event_state_s event_state_t; + +struct event_state_s +{ + struct event_info_s ei[ MAX_EVENT_QUEUE ]; +}; + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( EDICT_H ) +#include "edict.h" +#endif + +#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m))) +#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area) + +//============================================================================ + +extern char *pr_strings; +extern globalvars_t gGlobalVariables; + +//============================================================================ + +edict_t *ED_Alloc (void); +void ED_Free (edict_t *ed); +void ED_LoadFromFile (char *data); + +edict_t *EDICT_NUM(int n); +int NUM_FOR_EDICT(const edict_t *e); + +#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e)) + +#endif // PROGS_H diff --git a/cssdk/engine/rehlds_api.h b/cssdk/engine/rehlds_api.h new file mode 100644 index 0000000..3e7fb2a --- /dev/null +++ b/cssdk/engine/rehlds_api.h @@ -0,0 +1,299 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once +#include "archtypes.h" +#include "cmd_rehlds.h" +#include "rehlds_interfaces.h" +#include "hookchains.h" +#include "FlightRecorder.h" +#include "interface.h" +#include "model.h" + +#define REHLDS_API_VERSION_MAJOR 2 +#define REHLDS_API_VERSION_MINOR 13 + +//Steam_NotifyClientConnect hook +typedef IHookChain IRehldsHook_Steam_NotifyClientConnect; +typedef IHookChainRegistry IRehldsHookRegistry_Steam_NotifyClientConnect; + +//SV_ConnectClient hook +typedef IVoidHookChain<> IRehldsHook_SV_ConnectClient; +typedef IVoidHookChainRegistry<> IRehldsHookRegistry_SV_ConnectClient; + +//SV_GetIDString hook +typedef IHookChain IRehldsHook_SV_GetIDString; +typedef IHookChainRegistry IRehldsHookRegistry_SV_GetIDString; + +//SV_SendServerinfo hook +typedef IVoidHookChain IRehldsHook_SV_SendServerinfo; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_SendServerinfo; + +//SV_CheckProtocol hook +typedef IHookChain IRehldsHook_SV_CheckProtocol; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CheckProtocol; + +//SVC_GetChallenge_mod hook +typedef IVoidHookChain IRehldsHook_SVC_GetChallenge_mod; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SVC_GetChallenge_mod; + +//SV_CheckKeyInfo hook +typedef IHookChain IRehldsHook_SV_CheckKeyInfo; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CheckKeyInfo; + +//SV_CheckIPRestrictions hook +typedef IHookChain IRehldsHook_SV_CheckIPRestrictions; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CheckIPRestrictions; + +//SV_FinishCertificateCheck hook +typedef IHookChain IRehldsHook_SV_FinishCertificateCheck; +typedef IHookChainRegistry IRehldsHookRegistry_SV_FinishCertificateCheck; + +//Steam_NotifyBotConnect hook +typedef IHookChain IRehldsHook_Steam_NotifyBotConnect; +typedef IHookChainRegistry IRehldsHookRegistry_Steam_NotifyBotConnect; + +//SerializeSteamId +typedef IVoidHookChain IRehldsHook_SerializeSteamId; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SerializeSteamId; + +//SV_CompareUserID hook +typedef IHookChain IRehldsHook_SV_CompareUserID; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CompareUserID; + +//Steam_NotifyClientDisconnect +typedef IVoidHookChain IRehldsHook_Steam_NotifyClientDisconnect; +typedef IVoidHookChainRegistry IRehldsHookRegistry_Steam_NotifyClientDisconnect; + +//PreProcessPacket +typedef IHookChain IRehldsHook_PreprocessPacket; +typedef IHookChainRegistry IRehldsHookRegistry_PreprocessPacket; + +//ValidateCommand +typedef IHookChain IRehldsHook_ValidateCommand; +typedef IHookChainRegistry IRehldsHookRegistry_ValidateCommand; + +//ExecuteServerStringCmd +typedef IVoidHookChain IRehldsHook_ExecuteServerStringCmd; +typedef IVoidHookChainRegistry IRehldsHookRegistry_ExecuteServerStringCmd; + +//ClientConnected +typedef IVoidHookChain IRehldsHook_ClientConnected; +typedef IVoidHookChainRegistry IRehldsHookRegistry_ClientConnected; + +//HandleNetCommand +typedef IVoidHookChain IRehldsHook_HandleNetCommand; +typedef IVoidHookChainRegistry IRehldsHookRegistry_HandleNetCommand; + +//Mod_LoadBrushModel +typedef IVoidHookChain IRehldsHook_Mod_LoadBrushModel; +typedef IVoidHookChainRegistry IRehldsHookRegistry_Mod_LoadBrushModel; + +//Mod_LoadStudioModel +typedef IVoidHookChain IRehldsHook_Mod_LoadStudioModel; +typedef IVoidHookChainRegistry IRehldsHookRegistry_Mod_LoadStudioModel; + +//SV_EmitEvents hook +typedef IVoidHookChain IRehldsHook_SV_EmitEvents; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_EmitEvents; + +//EV_PlayReliableEvent hook +typedef IVoidHookChain IRehldsHook_EV_PlayReliableEvent; +typedef IVoidHookChainRegistry IRehldsHookRegistry_EV_PlayReliableEvent; + +//SV_StartSound hook +typedef IVoidHookChain IRehldsHook_SV_StartSound; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_StartSound; + +//PF_Remove_I hook +typedef IVoidHookChain IRehldsHook_PF_Remove_I; +typedef IVoidHookChainRegistry IRehldsHookRegistry_PF_Remove_I; + +//PF_BuildSoundMsg_I hook +typedef IVoidHookChain IRehldsHook_PF_BuildSoundMsg_I; +typedef IVoidHookChainRegistry IRehldsHookRegistry_PF_BuildSoundMsg_I; + +//SV_WriteFullClientUpdate hook +typedef IVoidHookChain IRehldsHook_SV_WriteFullClientUpdate; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_WriteFullClientUpdate; + +//SV_CheckConsistencyResponse hook +typedef IHookChain IRehldsHook_SV_CheckConsistencyResponse; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CheckConsistencyResponse; + +//SV_DropClient hook +typedef IVoidHookChain IRehldsHook_SV_DropClient; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_DropClient; + +//SV_ActivateServer hook +typedef IVoidHookChain IRehldsHook_SV_ActivateServer; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_ActivateServer; + +//SV_WriteVoiceCodec hook +typedef IVoidHookChain IRehldsHook_SV_WriteVoiceCodec; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_WriteVoiceCodec; + +//Steam_GSGetSteamID hook +typedef IHookChain IRehldsHook_Steam_GSGetSteamID; +typedef IHookChainRegistry IRehldsHookRegistry_Steam_GSGetSteamID; + +//SV_TransferConsistencyInfo hook +typedef IHookChain IRehldsHook_SV_TransferConsistencyInfo; +typedef IHookChainRegistry IRehldsHookRegistry_SV_TransferConsistencyInfo; + +//Steam_GSBUpdateUserData hook +typedef IHookChain IRehldsHook_Steam_GSBUpdateUserData; +typedef IHookChainRegistry IRehldsHookRegistry_Steam_GSBUpdateUserData; + +//Cvar_DirectSet hook +typedef IVoidHookChain IRehldsHook_Cvar_DirectSet; +typedef IVoidHookChainRegistry IRehldsHookRegistry_Cvar_DirectSet; + +//SV_EstablishTimeBase hook +typedef IVoidHookChain IRehldsHook_SV_EstablishTimeBase; +typedef IVoidHookChainRegistry IRehldsHookRegistry_SV_EstablishTimeBase; + +//SV_Spawn_f hook +typedef IVoidHookChain<> IRehldsHook_SV_Spawn_f; +typedef IVoidHookChainRegistry<> IRehldsHookRegistry_SV_Spawn_f; + +//SV_CreatePacketEntities hook +typedef IHookChain IRehldsHook_SV_CreatePacketEntities; +typedef IHookChainRegistry IRehldsHookRegistry_SV_CreatePacketEntities; + +//SV_EmitSound2 hook +typedef IHookChain IRehldsHook_SV_EmitSound2; +typedef IHookChainRegistry IRehldsHookRegistry_SV_EmitSound2; + +class IRehldsHookchains { +public: + virtual ~IRehldsHookchains() { } + + virtual IRehldsHookRegistry_Steam_NotifyClientConnect* Steam_NotifyClientConnect() = 0; + virtual IRehldsHookRegistry_SV_ConnectClient* SV_ConnectClient() = 0; + virtual IRehldsHookRegistry_SV_GetIDString* SV_GetIDString() = 0; + virtual IRehldsHookRegistry_SV_SendServerinfo* SV_SendServerinfo() = 0; + virtual IRehldsHookRegistry_SV_CheckProtocol* SV_CheckProtocol() = 0; + virtual IRehldsHookRegistry_SVC_GetChallenge_mod* SVC_GetChallenge_mod() = 0; + virtual IRehldsHookRegistry_SV_CheckKeyInfo* SV_CheckKeyInfo() = 0; + virtual IRehldsHookRegistry_SV_CheckIPRestrictions* SV_CheckIPRestrictions() = 0; + virtual IRehldsHookRegistry_SV_FinishCertificateCheck* SV_FinishCertificateCheck() = 0; + virtual IRehldsHookRegistry_Steam_NotifyBotConnect* Steam_NotifyBotConnect() = 0; + virtual IRehldsHookRegistry_SerializeSteamId* SerializeSteamId() = 0; + virtual IRehldsHookRegistry_SV_CompareUserID* SV_CompareUserID() = 0; + virtual IRehldsHookRegistry_Steam_NotifyClientDisconnect* Steam_NotifyClientDisconnect() = 0; + virtual IRehldsHookRegistry_PreprocessPacket* PreprocessPacket() = 0; + virtual IRehldsHookRegistry_ValidateCommand* ValidateCommand() = 0; + virtual IRehldsHookRegistry_ClientConnected* ClientConnected() = 0; + virtual IRehldsHookRegistry_HandleNetCommand* HandleNetCommand() = 0; + virtual IRehldsHookRegistry_Mod_LoadBrushModel* Mod_LoadBrushModel() = 0; + virtual IRehldsHookRegistry_Mod_LoadStudioModel* Mod_LoadStudioModel() = 0; + virtual IRehldsHookRegistry_ExecuteServerStringCmd* ExecuteServerStringCmd() = 0; + virtual IRehldsHookRegistry_SV_EmitEvents* SV_EmitEvents() = 0; + virtual IRehldsHookRegistry_EV_PlayReliableEvent* EV_PlayReliableEvent() = 0; + virtual IRehldsHookRegistry_SV_StartSound* SV_StartSound() = 0; + virtual IRehldsHookRegistry_PF_Remove_I* PF_Remove_I() = 0; + virtual IRehldsHookRegistry_PF_BuildSoundMsg_I* PF_BuildSoundMsg_I() = 0; + virtual IRehldsHookRegistry_SV_WriteFullClientUpdate* SV_WriteFullClientUpdate() = 0; + virtual IRehldsHookRegistry_SV_CheckConsistencyResponse* SV_CheckConsistencyResponse() = 0; + virtual IRehldsHookRegistry_SV_DropClient* SV_DropClient() = 0; + virtual IRehldsHookRegistry_SV_ActivateServer* SV_ActivateServer() = 0; + virtual IRehldsHookRegistry_SV_WriteVoiceCodec* SV_WriteVoiceCodec() = 0; + virtual IRehldsHookRegistry_Steam_GSGetSteamID* Steam_GSGetSteamID() = 0; + virtual IRehldsHookRegistry_SV_TransferConsistencyInfo* SV_TransferConsistencyInfo() = 0; + virtual IRehldsHookRegistry_Steam_GSBUpdateUserData* Steam_GSBUpdateUserData() = 0; + virtual IRehldsHookRegistry_Cvar_DirectSet* Cvar_DirectSet() = 0; + virtual IRehldsHookRegistry_SV_EstablishTimeBase* SV_EstablishTimeBase() = 0; + virtual IRehldsHookRegistry_SV_Spawn_f* SV_Spawn_f() = 0; + virtual IRehldsHookRegistry_SV_CreatePacketEntities* SV_CreatePacketEntities() = 0; + virtual IRehldsHookRegistry_SV_EmitSound2* SV_EmitSound2() = 0; +}; + +struct RehldsFuncs_t { + void(*DropClient)(IGameClient* cl, bool crash, const char* fmt, ...); + void(*RejectConnection)(netadr_t *adr, char *fmt, ...); + qboolean(*SteamNotifyBotConnect)(IGameClient* cl); + sizebuf_t*(*GetNetMessage)(); + IGameClient*(*GetHostClient)(); + int*(*GetMsgReadCount)(); + qboolean(*FilterUser)(USERID_t*); + void(*NET_SendPacket)(unsigned int length, void *data, const netadr_t &to); + void(*TokenizeString)(char* s); + bool(*CheckChallenge)(const netadr_t& adr, int challenge); + void(*SendUserReg)(sizebuf_t* msg); + void(*WriteDeltaDescriptionsToClient)(sizebuf_t* msg); + void(*SetMoveVars)(); + void(*WriteMovevarsToClient)(sizebuf_t* msg); + char*(*GetClientFallback)(); + int*(*GetAllowCheats)(); + bool(*GSBSecure)(); + int(*GetBuildNumber)(); + double(*GetRealTime)(); + int*(*GetMsgBadRead)(); + cmd_source_t*(*GetCmdSource)(); + void(*Log)(const char* prefix, const char* msg); + DLL_FUNCTIONS *(*GetEntityInterface)(); + void(*EV_PlayReliableEvent)(IGameClient *cl, int entindex, short unsigned int eventindex, float delay, struct event_args_s *pargs); + int(*SV_LookupSoundIndex)(const char *sample); + void(*MSG_StartBitWriting)(sizebuf_t *buf); + void(*MSG_WriteBits)(uint32 data, int numbits); + void(*MSG_WriteBitVec3Coord)(const float *fa); + void(*MSG_EndBitWriting)(sizebuf_t *buf); + void*(*SZ_GetSpace)(sizebuf_t *buf, int length); + cvar_t*(*GetCvarVars)(); + int (*SV_GetChallenge)(const netadr_t& adr); + void (*SV_AddResource)(resourcetype_t type, const char *name, int size, unsigned char flags, int index); + int(*MSG_ReadShort)(void); + int(*MSG_ReadBuf)(int iSize, void *pbuf); + void(*MSG_WriteBuf)(sizebuf_t *sb, int iSize, void *buf); + void(*MSG_WriteByte)(sizebuf_t *sb, int c); + void(*MSG_WriteShort)(sizebuf_t *sb, int c); + void(*MSG_WriteString)(sizebuf_t *sb, const char *s); + void*(*GetPluginApi)(const char *name); + void(*RegisterPluginApi)(const char *name, void *impl); + qboolean(*SV_FileInConsistencyList)(const char *filename, struct consistency_s **ppconsist); + qboolean(*Steam_NotifyClientConnect)(IGameClient *cl, const void *pvSteam2Key, unsigned int ucbSteam2Key); + void(*Steam_NotifyClientDisconnect)(IGameClient* cl); + void(*SV_StartSound)(int recipients, edict_t *entity, int channel, const char *sample, int volume, float attenuation, int flags, int pitch); + bool(*SV_EmitSound2)(edict_t *entity, IGameClient *receiver, int channel, const char *sample, float volume, float attenuation, int flags, int pitch, int emitFlags, const float *pOrigin); + void (* SV_UpdateUserInfo)(IGameClient *pGameClient); +}; + +class IRehldsApi { +public: + virtual ~IRehldsApi() { } + + virtual int GetMajorVersion() = 0; + virtual int GetMinorVersion() = 0; + virtual const RehldsFuncs_t* GetFuncs() = 0; + virtual IRehldsHookchains* GetHookchains() = 0; + virtual IRehldsServerStatic* GetServerStatic() = 0; + virtual IRehldsServerData* GetServerData() = 0; + virtual IRehldsFlightRecorder* GetFlightRecorder() = 0; +}; + +#define VREHLDS_HLDS_API_VERSION "VREHLDS_HLDS_API_VERSION001" \ No newline at end of file diff --git a/cssdk/engine/rehlds_interfaces.h b/cssdk/engine/rehlds_interfaces.h new file mode 100644 index 0000000..e2b909f --- /dev/null +++ b/cssdk/engine/rehlds_interfaces.h @@ -0,0 +1,132 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class INetChan; +class IGameClient; + +#include "archtypes.h" +#include "const.h" +#include "netadr.h" + +#include "common_rehlds.h" +#include "userid_rehlds.h" + +#ifdef REHLDS_SELF +#include "server.h" +#endif + +class INetChan; +class IGameClient; + +class IGameClient { +public: + virtual int GetId() = 0; + + virtual bool IsActive() = 0; + virtual void SetActive(bool active) = 0; + + virtual bool IsSpawned() = 0; + virtual void SetSpawned(bool spawned) = 0; + + virtual INetChan* GetNetChan() = 0; + + virtual sizebuf_t* GetDatagram() = 0; + + virtual edict_t* GetEdict() = 0; + + virtual USERID_t* GetNetworkUserID() = 0; + + virtual const char* GetName() = 0; + + virtual bool IsConnected() = 0; + virtual void SetConnected(bool connected) = 0; + + virtual uint32 GetVoiceStream(int stream_id) = 0; + virtual void SetLastVoiceTime(double time) = 0; + virtual double GetLastVoiceTime() = 0; + virtual bool GetLoopback() = 0; + virtual struct usercmd_s *GetLastCmd() = 0; + + // this must be the last virtual function in class +#ifdef REHLDS_SELF + virtual client_t* GetClient() = 0; +#endif +}; + +class INetChan { +public: + virtual const netadr_t* GetRemoteAdr() = 0; + virtual sizebuf_t* GetMessageBuf() = 0; + + + // this must be the last virtual function in class +#ifdef REHLDS_SELF + virtual netchan_t* GetChan() = 0; +#endif +}; + +#ifndef REHLDS_SELF +struct client_t; +#endif + +class IRehldsServerStatic { +public: + virtual ~IRehldsServerStatic() { } + + virtual int GetMaxClients() = 0; + virtual bool IsLogActive() = 0; + virtual IGameClient* GetClient(int id) = 0; + virtual client_t* GetClient_t(int id) = 0; + virtual int GetIndexOfClient_t(client_t* client) = 0; +}; + +class IRehldsServerData { +public: + virtual ~IRehldsServerData() { } + + virtual const char* GetModelName() = 0; + virtual const char* GetName() = 0; + virtual uint32 GetWorldmapCrc() = 0; + virtual uint8* GetClientDllMd5() = 0; + virtual sizebuf_t* GetDatagram() = 0; + virtual sizebuf_t* GetReliableDatagram() = 0; + + virtual void SetModelName(const char* modelname) = 0; + virtual void SetConsistencyNum(int num) = 0; + virtual int GetConsistencyNum() = 0; + virtual int GetResourcesNum() = 0; + virtual int GetDecalNameNum() = 0; + + virtual double GetTime() = 0; + virtual void SetResourcesNum(int num) = 0; + virtual struct resource_s *GetResource(int index) = 0; + virtual void SetName(const char* name) = 0; + virtual class ISteamGameServer *GetSteamGameServer() = 0; + virtual struct netadr_s *GetNetFrom() = 0; +}; diff --git a/cssdk/engine/shake.h b/cssdk/engine/shake.h new file mode 100644 index 0000000..1146a5e --- /dev/null +++ b/cssdk/engine/shake.h @@ -0,0 +1,57 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#ifndef SHAKE_H +#define SHAKE_H + +// Screen / View effects + +// screen shake +extern int gmsgShake; + +// This structure is sent over the net to describe a screen shake event +typedef struct +{ + unsigned short amplitude; // FIXED 4.12 amount of shake + unsigned short duration; // FIXED 4.12 seconds duration + unsigned short frequency; // FIXED 8.8 noise frequency (low frequency is a jerk,high frequency is a rumble) +} ScreenShake; + +extern void V_ApplyShake( float *origin, float *angles, float factor ); +extern void V_CalcShake( void ); +extern int V_ScreenShake( const char *pszName, int iSize, void *pbuf ); +extern int V_ScreenFade( const char *pszName, int iSize, void *pbuf ); + + +// Fade in/out +extern int gmsgFade; + +#define FFADE_IN 0x0000 // Just here so we don't pass 0 into the function +#define FFADE_OUT 0x0001 // Fade out (not in) +#define FFADE_MODULATE 0x0002 // Modulate (don't blend) +#define FFADE_STAYOUT 0x0004 // ignores the duration, stays faded out until new ScreenFade message received +#define FFADE_LONGFADE 0x0008 // used to indicate the fade can be longer than 16 seconds (added for czero) + + +// This structure is sent over the net to describe a screen fade event +typedef struct +{ + unsigned short duration; // FIXED 4.12 seconds duration + unsigned short holdTime; // FIXED 4.12 seconds duration until reset (fade & hold) + short fadeFlags; // flags + byte r, g, b, a; // fade to color ( max alpha ) +} ScreenFade; + +#endif // SHAKE_H + diff --git a/cssdk/engine/spritegn.h b/cssdk/engine/spritegn.h new file mode 100644 index 0000000..96d8b03 --- /dev/null +++ b/cssdk/engine/spritegn.h @@ -0,0 +1,90 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef SPRITEGN_H +#define SPRITEGN_H +#ifdef _WIN32 +#pragma once +#endif + +#include "modelgen.h" + + +#define IDSPRITEHEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') +#define SPRITE_VERSION 2 + + +typedef enum spriteframetype_e +{ + SPR_SINGLE = 0, + SPR_GROUP, + SPR_ANGLED +} spriteframetype_t; + +/* <4aea6> ../engine/spritegn.h:50 */ +typedef struct dsprite_s +{ + int ident; + int version; + int type; + int texFormat; + float boundingradius; + int width; + int height; + int numframes; + float beamlength; + synctype_t synctype; +} dsprite_t; + +/* <4af46> ../engine/spritegn.h:74 */ +typedef struct dspriteframe_s +{ + int origin[2]; + int width; + int height; +} dspriteframe_t; + +/* <4af84> ../engine/spritegn.h:80 */ +typedef struct dspritegroup_s +{ + int numframes; +} dspritegroup_t; + +/* <4afa6> ../engine/spritegn.h:84 */ +typedef struct dspriteinterval_s +{ + float interval; +} dspriteinterval_t; + +/* <4afe8> ../engine/spritegn.h:90 */ +typedef struct dspriteframetype_s +{ + spriteframetype_t type; +} dspriteframetype_t; + +#endif // SPRITEGN_H diff --git a/cssdk/engine/static_map.h b/cssdk/engine/static_map.h new file mode 100644 index 0000000..593cc39 --- /dev/null +++ b/cssdk/engine/static_map.h @@ -0,0 +1,257 @@ +#pragma once + +#include "archtypes.h" +#include "crc32c.h" + +template +class CStaticMap { +protected: + virtual uint32 hash(const T_KEY& val) { + return crc32c((const unsigned char*)&val, sizeof(T_KEY)); + } + + virtual bool equals(const T_KEY& val1, const T_KEY& val2) { + return 0 == memcmp(&val1, &val2, sizeof(T_KEY)); + } + + struct map_node_t { + map_node_t* prev; + map_node_t* next; + T_KEY key; + T_VAL val; + }; + +private: + map_node_t* m_RootNodes[1 << ASSOC_2N]; + map_node_t m_AllNodes[MAX_VALS]; + map_node_t* m_FreeRoot; + + unsigned int GetRoodNodeId(const T_KEY& val) { return hash(val) & (0xFFFFFFFF >> (32 - ASSOC_2N)); } + + void unlink(map_node_t* node) { + map_node_t* prev = node->prev; + map_node_t* next = node->next; + + if (prev) { + prev->next = next; + } + + if (next) { + next->prev = prev; + } + + if (!prev) { + // this was a root node + unsigned int rootId = GetRoodNodeId(node->key); + if (m_RootNodes[rootId] != node) { + util_syserror("%s: invlid root node", __FUNCTION__); + return; + } + + m_RootNodes[rootId] = next; + } + } + + void link(map_node_t* node) { + unsigned int rootId = GetRoodNodeId(node->key); + map_node_t* root = m_RootNodes[rootId]; + node->prev = NULL; + node->next = root; + + if (root) { + root->prev = node; + } + + m_RootNodes[rootId] = node; + } + + void linkToFreeStack(map_node_t* node) { + node->next = m_FreeRoot; + if (m_FreeRoot) { + m_FreeRoot->prev = node; + } + m_FreeRoot = node; + } + +public: + CStaticMap() { + clear(); + } + + void clear() { + memset(m_RootNodes, 0, sizeof(m_RootNodes)); + memset(m_AllNodes, 0, sizeof(m_AllNodes)); + m_FreeRoot = NULL; + + for (int i = 0; i < MAX_VALS; i++) { + linkToFreeStack(&m_AllNodes[i]); + } + } + + map_node_t* get(const T_KEY& key) { + unsigned int rootId = GetRoodNodeId(key); + map_node_t* n = m_RootNodes[rootId]; + while (n) { + if (equals(n->key, key)) { + return n; + } + n = n->next; + } + return NULL; + } + + bool put(const T_KEY& key, T_VAL& val) { + map_node_t* n = get(key); + if (n) { + n->val = val; + return true; + } + + if (!m_FreeRoot) { + return false; + } + + n = m_FreeRoot; + m_FreeRoot = m_FreeRoot->next; + + n->key = key; + n->val = val; + + unsigned int rootId = GetRoodNodeId(key); + map_node_t* root = m_RootNodes[rootId]; + + if (root) { + root->prev = n; + } + + n->prev = NULL; + n->next = root; + m_RootNodes[rootId] = n; + + return true; + } + + void remove(map_node_t* node) { + unlink(node); + linkToFreeStack(node); + } + + bool remove(const T_KEY& key) { + map_node_t* n = get(key); + if (!n) { + return false; + } + + remove(n); + return true; + } + + class Iterator { + friend class CStaticMap; + protected: + CStaticMap* m_Map; + map_node_t** m_RootNodes; + unsigned int m_NextRootNode; + map_node_t* m_CurNode; + + void searchForNextNode() { + if (m_CurNode && m_CurNode->next) { + m_CurNode = m_CurNode->next; + return; + } + + m_CurNode = NULL; + while (!m_CurNode) { + if (m_NextRootNode >= (1 << ASSOC_2N)) { + return; + } + m_CurNode = m_RootNodes[m_NextRootNode++]; + } + } + + + Iterator(CStaticMap* m) { + m_Map = m; + m_RootNodes = m_Map->m_RootNodes; + m_NextRootNode = 0; + m_CurNode = NULL; + searchForNextNode(); + } + + public: + map_node_t* next() { + searchForNextNode(); + return m_CurNode; + } + + map_node_t* current() { + return m_CurNode; + } + + void remove() { + m_Map->remove(m_CurNode); + m_CurNode = NULL; + } + + bool hasElement() { + return m_CurNode != NULL; + } + }; + + Iterator iterator() { + return Iterator(this); + } +}; + +template +class CStringKeyStaticMap : public CStaticMap { +protected: + virtual uint32 hash(const char* const &val) { + return crc32c((const unsigned char*)val, strlen(val)); + } + + virtual bool equals(const char* const &val1, const char* const &val2) { + return !strcmp(val1, val2); + } + +public: + CStringKeyStaticMap() { + } + +}; + +template +class CICaseStringKeyStaticMap : public CStaticMap { +protected: + virtual uint32 hash(const char* const &val) { + uint32 cksum = 0; + const char* pcc = val; + if (cpuinfo.sse4_2) { + while (*pcc) { + char cc = *(pcc++); + if (cc >= 'A' || cc <= 'Z') { + cc |= 0x20; + } + cksum = crc32c_t8_sse(cksum, cc); + } + } else { + while (*pcc) { + char cc = *(pcc++); + if (cc >= 'A' || cc <= 'Z') { + cc |= 0x20; + } + cksum = crc32c_t8_nosse(cksum, cc); + } + } + return cksum; + } + + virtual bool equals(const char* const &val1, const char* const &val2) { + return !_stricmp(val1, val2); + } + +public: + CICaseStringKeyStaticMap() { + } + +}; diff --git a/cssdk/engine/studio.h b/cssdk/engine/studio.h new file mode 100644 index 0000000..1da691e --- /dev/null +++ b/cssdk/engine/studio.h @@ -0,0 +1,358 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#pragma once + +/* +============================================================================== + +STUDIO MODELS + +Studio models are position independent, so the cache manager can move them. +============================================================================== +*/ + + +#define MAXSTUDIOTRIANGLES 20000 // TODO: tune this +#define MAXSTUDIOVERTS 2048 // TODO: tune this +#define MAXSTUDIOSEQUENCES 2048 // total animation sequences +#define MAXSTUDIOSKINS 100 // total textures +#define MAXSTUDIOSRCBONES 512 // bones allowed at source movement +#define MAXSTUDIOBONES 128 // total bones actually used +#define MAXSTUDIOMODELS 32 // sub-models per model +#define MAXSTUDIOBODYPARTS 32 +#define MAXSTUDIOGROUPS 16 +#define MAXSTUDIOANIMATIONS 2048 // per sequence +#define MAXSTUDIOMESHES 256 +#define MAXSTUDIOEVENTS 1024 +#define MAXSTUDIOPIVOTS 256 +#define MAXSTUDIOCONTROLLERS 8 + +typedef struct +{ + int id; + int version; + + char name[64]; + int length; + + vec3_t eyeposition; // ideal eye position + vec3_t min; // ideal movement hull size + vec3_t max; + + vec3_t bbmin; // clipping bounding box + vec3_t bbmax; + + int flags; + + int numbones; // bones + int boneindex; + + int numbonecontrollers; // bone controllers + int bonecontrollerindex; + + int numhitboxes; // complex bounding boxes + int hitboxindex; + + int numseq; // animation sequences + int seqindex; + + int numseqgroups; // demand loaded sequences + int seqgroupindex; + + int numtextures; // raw textures + int textureindex; + int texturedataindex; + + int numskinref; // replaceable textures + int numskinfamilies; + int skinindex; + + int numbodyparts; + int bodypartindex; + + int numattachments; // queryable attachable points + int attachmentindex; + + int soundtable; + int soundindex; + int soundgroups; + int soundgroupindex; + + int numtransitions; // animation node to animation node transition graph + int transitionindex; +} studiohdr_t; + +// header for demand loaded sequence group data +typedef struct +{ + int id; + int version; + + char name[64]; + int length; +} studioseqhdr_t; + +// bones +typedef struct +{ + char name[32]; // bone name for symbolic links + int parent; // parent bone + int flags; // ?? + int bonecontroller[6]; // bone controller index, -1 == none + float value[6]; // default DoF values + float scale[6]; // scale for delta DoF values +} mstudiobone_t; + + +// bone controllers +typedef struct +{ + int bone; // -1 == 0 + int type; // X, Y, Z, XR, YR, ZR, M + float start; + float end; + int rest; // byte index value at rest + int index; // 0-3 user set controller, 4 mouth +} mstudiobonecontroller_t; + +// intersection boxes +typedef struct +{ + int bone; + int group; // intersection group + vec3_t bbmin; // bounding box + vec3_t bbmax; +} mstudiobbox_t; + +// demand loaded sequence groups +typedef struct +{ + char label[32]; // textual name + char name[64]; // file name + int32 unused1; // was "cache" - index pointer + int unused2; // was "data" - hack for group 0 +} mstudioseqgroup_t; + +// sequence descriptions +typedef struct +{ + char label[32]; // sequence label + + float fps; // frames per second + int flags; // looping/non-looping flags + + int activity; + int actweight; + + int numevents; + int eventindex; + + int numframes; // number of frames per sequence + + int numpivots; // number of foot pivots + int pivotindex; + + int motiontype; + int motionbone; + vec3_t linearmovement; + int automoveposindex; + int automoveangleindex; + + vec3_t bbmin; // per sequence bounding box + vec3_t bbmax; + + int numblends; + int animindex; // mstudioanim_t pointer relative to start of sequence group data + // [blend][bone][X, Y, Z, XR, YR, ZR] + + int blendtype[2]; // X, Y, Z, XR, YR, ZR + float blendstart[2]; // starting value + float blendend[2]; // ending value + int blendparent; + + int seqgroup; // sequence group for demand loading + + int entrynode; // transition node at entry + int exitnode; // transition node at exit + int nodeflags; // transition rules + + int nextseq; // auto advancing sequences +} mstudioseqdesc_t; + +// events +#include "studio_event.h" +/* +typedef struct +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; +*/ + +// pivots +typedef struct +{ + vec3_t org; // pivot point + int start; + int end; +} mstudiopivot_t; + +// attachment +typedef struct +{ + char name[32]; + int type; + int bone; + vec3_t org; // attachment point + vec3_t vectors[3]; +} mstudioattachment_t; + +typedef struct +{ + unsigned short offset[6]; +} mstudioanim_t; + +// animation frames +typedef union +{ + struct { + byte valid; + byte total; + } num; + short value; +} mstudioanimvalue_t; + + + +// body part index +typedef struct +{ + char name[64]; + int nummodels; + int base; + int modelindex; // index into models array +} mstudiobodyparts_t; + + + +// skin info +typedef struct +{ + char name[64]; + int flags; + int width; + int height; + int index; +} mstudiotexture_t; + + +// skin families +// short index[skinfamilies][skinref] + +// studio models +typedef struct +{ + char name[64]; + + int type; + + float boundingradius; + + int nummesh; + int meshindex; + + int numverts; // number of unique vertices + int vertinfoindex; // vertex bone info + int vertindex; // vertex vec3_t + int numnorms; // number of unique surface normals + int norminfoindex; // normal bone info + int normindex; // normal vec3_t + + int numgroups; // deformation groups + int groupindex; +} mstudiomodel_t; + + +// vec3_t boundingbox[model][bone][2]; // complex intersection info + + +// meshes +typedef struct +{ + int numtris; + int triindex; + int skinref; + int numnorms; // per mesh normals + int normindex; // normal vec3_t +} mstudiomesh_t; + +// triangles +#if 0 +typedef struct +{ + short vertindex; // index into vertex array + short normindex; // index into normal array + short s,t; // s,t position on skin +} mstudiotrivert_t; +#endif + +// lighting options +#define STUDIO_NF_FLATSHADE 0x0001 +#define STUDIO_NF_CHROME 0x0002 +#define STUDIO_NF_FULLBRIGHT 0x0004 +#define STUDIO_NF_NOMIPS 0x0008 +#define STUDIO_NF_ALPHA 0x0010 +#define STUDIO_NF_ADDITIVE 0x0020 +#define STUDIO_NF_MASKED 0x0040 + +// motion flags +#define STUDIO_X 0x0001 +#define STUDIO_Y 0x0002 +#define STUDIO_Z 0x0004 +#define STUDIO_XR 0x0008 +#define STUDIO_YR 0x0010 +#define STUDIO_ZR 0x0020 +#define STUDIO_LX 0x0040 +#define STUDIO_LY 0x0080 +#define STUDIO_LZ 0x0100 +#define STUDIO_AX 0x0200 +#define STUDIO_AY 0x0400 +#define STUDIO_AZ 0x0800 +#define STUDIO_AXR 0x1000 +#define STUDIO_AYR 0x2000 +#define STUDIO_AZR 0x4000 +#define STUDIO_TYPES 0x7FFF +#define STUDIO_RLOOP 0x8000 // controller that wraps shortest distance + +// sequence flags +#define STUDIO_LOOPING 0x0001 + +// bone flags +#define STUDIO_HAS_NORMALS 0x0001 +#define STUDIO_HAS_VERTICES 0x0002 +#define STUDIO_HAS_BBOX 0x0004 +#define STUDIO_HAS_CHROME 0x0008 // if any of the textures have chrome on them + +#define RAD_TO_STUDIO (32768.0/M_PI) +#define STUDIO_TO_RAD (M_PI/32768.0) + + +#define STUDIO_NUM_HULLS 128 +#define STUDIO_NUM_PLANES (STUDIO_NUM_HULLS * 6) +#define STUDIO_CACHE_SIZE 16 + + diff --git a/cssdk/engine/sys_shared.cpp b/cssdk/engine/sys_shared.cpp new file mode 100644 index 0000000..a642c76 --- /dev/null +++ b/cssdk/engine/sys_shared.cpp @@ -0,0 +1,72 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#include "sys_shared.h" + +#if defined(__GNUC__) +#include +#endif + +#define SSE3_FLAG (1<<0) +#define SSSE3_FLAG (1<<9) +#define SSE4_1_FLAG (1<<19) +#define SSE4_2_FLAG (1<<20) +#define POPCNT_FLAG (1<<23) +#define AVX_FLAG (1<<28) +#define AVX2_FLAG (1<<5) + +cpuinfo_t cpuinfo; + +void Sys_CheckCpuInstructionsSupport(void) +{ + unsigned int cpuid_data[4]; + +#if defined ASMLIB_H + cpuid_ex((int *)cpuid_data, 1, 0); +#elif defined(__GNUC__) + __get_cpuid(0x1, &cpuid_data[0], &cpuid_data[1], &cpuid_data[2], &cpuid_data[3]); +#else + __cpuidex((int *)cpuid_data, 1, 0); +#endif + + cpuinfo.sse3 = (cpuid_data[2] & SSE3_FLAG) ? 1 : 0; // ecx + cpuinfo.ssse3 = (cpuid_data[2] & SSSE3_FLAG) ? 1 : 0; + cpuinfo.sse4_1 = (cpuid_data[2] & SSE4_1_FLAG) ? 1 : 0; + cpuinfo.sse4_2 = (cpuid_data[2] & SSE4_2_FLAG) ? 1 : 0; + cpuinfo.popcnt = (cpuid_data[2] & POPCNT_FLAG) ? 1 : 0; + cpuinfo.avx = (cpuid_data[2] & AVX_FLAG) ? 1 : 0; + +#if defined ASMLIB_H + cpuid_ex((int *)cpuid_data, 7, 0); +#elif defined(__GNUC__) + __get_cpuid(0x7, &cpuid_data[0], &cpuid_data[1], &cpuid_data[2], &cpuid_data[3]); +#else + __cpuidex((int *)cpuid_data, 7, 0); +#endif + + cpuinfo.avx2 = (cpuid_data[1] & AVX2_FLAG) ? 1 : 0; // ebx +} \ No newline at end of file diff --git a/cssdk/engine/sys_shared.h b/cssdk/engine/sys_shared.h new file mode 100644 index 0000000..5b5da98 --- /dev/null +++ b/cssdk/engine/sys_shared.h @@ -0,0 +1,39 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include + +typedef struct cpuinfo_s +{ + uint8 sse3, ssse3, sse4_1, sse4_2, avx, avx2, popcnt; +} cpuinfo_t; + +extern cpuinfo_t cpuinfo; + +void Sys_CheckCpuInstructionsSupport(void); diff --git a/cssdk/engine/userid_rehlds.h b/cssdk/engine/userid_rehlds.h new file mode 100644 index 0000000..ff73c5d --- /dev/null +++ b/cssdk/engine/userid_rehlds.h @@ -0,0 +1,47 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "archtypes.h" + +// Authentication types +enum AUTH_IDTYPE +{ + AUTH_IDTYPE_UNKNOWN = 0, + AUTH_IDTYPE_STEAM = 1, + AUTH_IDTYPE_VALVE = 2, + AUTH_IDTYPE_LOCAL = 3 +}; + +/* <2e915> ../engine/userid.h:22 */ +typedef struct USERID_s +{ + int idtype; + uint64 m_SteamID; + unsigned int clientip; +} USERID_t; diff --git a/cssdk/game_shared/GameEvent.h b/cssdk/game_shared/GameEvent.h new file mode 100644 index 0000000..c585fff --- /dev/null +++ b/cssdk/game_shared/GameEvent.h @@ -0,0 +1,138 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +enum GameEventType +{ + EVENT_INVALID = 0, + EVENT_WEAPON_FIRED, // tell bots the player is attack (argumens: 1 = attacker, 2 = NULL) + EVENT_WEAPON_FIRED_ON_EMPTY, // tell bots the player is attack without clip ammo (argumens: 1 = attacker, 2 = NULL) + EVENT_WEAPON_RELOADED, // tell bots the player is reloading his weapon (argumens: 1 = reloader, 2 = NULL) + + EVENT_HE_GRENADE_EXPLODED, // tell bots the HE grenade is exploded (argumens: 1 = grenade thrower, 2 = NULL) + EVENT_FLASHBANG_GRENADE_EXPLODED, // tell bots the flashbang grenade is exploded (argumens: 1 = grenade thrower, 2 = explosion origin) + EVENT_SMOKE_GRENADE_EXPLODED, // tell bots the smoke grenade is exploded (argumens: 1 = grenade thrower, 2 = NULL) + EVENT_GRENADE_BOUNCED, + + EVENT_BEING_SHOT_AT, + EVENT_PLAYER_BLINDED_BY_FLASHBANG, // tell bots the player is flashed (argumens: 1 = flashed player, 2 = NULL) + EVENT_PLAYER_FOOTSTEP, // tell bots the player is running (argumens: 1 = runner, 2 = NULL) + EVENT_PLAYER_JUMPED, // tell bots the player is jumped (argumens: 1 = jumper, 2 = NULL) + EVENT_PLAYER_DIED, // tell bots the player is killed (argumens: 1 = victim, 2 = killer) + EVENT_PLAYER_LANDED_FROM_HEIGHT, // tell bots the player is fell with some damage (argumens: 1 = felled player, 2 = NULL) + EVENT_PLAYER_TOOK_DAMAGE, // tell bots the player is take damage (argumens: 1 = victim, 2 = attacker) + EVENT_HOSTAGE_DAMAGED, // tell bots the player has injured a hostage (argumens: 1 = hostage, 2 = injurer) + EVENT_HOSTAGE_KILLED, // tell bots the player has killed a hostage (argumens: 1 = hostage, 2 = killer) + + EVENT_DOOR, // tell bots the door is moving (argumens: 1 = door, 2 = NULL) + EVENT_BREAK_GLASS, // tell bots the glass has break (argumens: 1 = glass, 2 = NULL) + EVENT_BREAK_WOOD, // tell bots the wood has break (argumens: 1 = wood, 2 = NULL) + EVENT_BREAK_METAL, // tell bots the metal/computer has break (argumens: 1 = metal/computer, 2 = NULL) + EVENT_BREAK_FLESH, // tell bots the flesh has break (argumens: 1 = flesh, 2 = NULL) + EVENT_BREAK_CONCRETE, // tell bots the concrete has break (argumens: 1 = concrete, 2 = NULL) + + EVENT_BOMB_PLANTED, // tell bots the bomb has been planted (argumens: 1 = planter, 2 = NULL) + EVENT_BOMB_DROPPED, // tell bots the bomb has been dropped (argumens: 1 = NULL, 2 = NULL) + EVENT_BOMB_PICKED_UP, // let the bots hear the bomb pickup (argumens: 1 = player that pickup c4, 2 = NULL) + EVENT_BOMB_BEEP, // let the bots hear the bomb beeping (argumens: 1 = c4, 2 = NULL) + EVENT_BOMB_DEFUSING, // tell the bots someone has started defusing (argumens: 1 = defuser, 2 = NULL) + EVENT_BOMB_DEFUSE_ABORTED, // tell the bots someone has aborted defusing (argumens: 1 = NULL, 2 = NULL) + EVENT_BOMB_DEFUSED, // tell the bots the bomb is defused (argumens: 1 = defuser, 2 = NULL) + EVENT_BOMB_EXPLODED, // let the bots hear the bomb exploding (argumens: 1 = NULL, 2 = NULL) + + EVENT_HOSTAGE_USED, // tell bots the hostage is used (argumens: 1 = user, 2 = NULL) + EVENT_HOSTAGE_RESCUED, // tell bots the hostage is rescued (argumens: 1 = rescuer (CBasePlayer *), 2 = hostage (CHostage *)) + EVENT_ALL_HOSTAGES_RESCUED, // tell bots the all hostages are rescued (argumens: 1 = NULL, 2 = NULL) + + EVENT_VIP_ESCAPED, // tell bots the VIP is escaped (argumens: 1 = NULL, 2 = NULL) + EVENT_VIP_ASSASSINATED, // tell bots the VIP is assassinated (argumens: 1 = NULL, 2 = NULL) + EVENT_TERRORISTS_WIN, // tell bots the terrorists won the round (argumens: 1 = NULL, 2 = NULL) + EVENT_CTS_WIN, // tell bots the CTs won the round (argumens: 1 = NULL, 2 = NULL) + EVENT_ROUND_DRAW, // tell bots the round was a draw (argumens: 1 = NULL, 2 = NULL) + EVENT_ROUND_WIN, // tell carreer the round was a win (argumens: 1 = NULL, 2 = NULL) + EVENT_ROUND_LOSS, // tell carreer the round was a loss (argumens: 1 = NULL, 2 = NULL) + EVENT_ROUND_START, // tell bots the round was started (when freeze period is expired) (argumens: 1 = NULL, 2 = NULL) + EVENT_PLAYER_SPAWNED, // tell bots the player is spawned (argumens: 1 = spawned player, 2 = NULL) + EVENT_CLIENT_CORPSE_SPAWNED, + EVENT_BUY_TIME_START, + EVENT_PLAYER_LEFT_BUY_ZONE, + EVENT_DEATH_CAMERA_START, + EVENT_KILL_ALL, + EVENT_ROUND_TIME, + EVENT_DIE, + EVENT_KILL, + EVENT_HEADSHOT, + EVENT_KILL_FLASHBANGED, + EVENT_TUTOR_BUY_MENU_OPENNED, + EVENT_TUTOR_AUTOBUY, + EVENT_PLAYER_BOUGHT_SOMETHING, + EVENT_TUTOR_NOT_BUYING_ANYTHING, + EVENT_TUTOR_NEED_TO_BUY_PRIMARY_WEAPON, + EVENT_TUTOR_NEED_TO_BUY_PRIMARY_AMMO, + EVENT_TUTOR_NEED_TO_BUY_SECONDARY_AMMO, + EVENT_TUTOR_NEED_TO_BUY_ARMOR, + EVENT_TUTOR_NEED_TO_BUY_DEFUSE_KIT, + EVENT_TUTOR_NEED_TO_BUY_GRENADE, + EVENT_CAREER_TASK_DONE, + + EVENT_START_RADIO_1, + EVENT_RADIO_COVER_ME, + EVENT_RADIO_YOU_TAKE_THE_POINT, + EVENT_RADIO_HOLD_THIS_POSITION, + EVENT_RADIO_REGROUP_TEAM, + EVENT_RADIO_FOLLOW_ME, + EVENT_RADIO_TAKING_FIRE, + EVENT_START_RADIO_2, + EVENT_RADIO_GO_GO_GO, + EVENT_RADIO_TEAM_FALL_BACK, + EVENT_RADIO_STICK_TOGETHER_TEAM, + EVENT_RADIO_GET_IN_POSITION_AND_WAIT, + EVENT_RADIO_STORM_THE_FRONT, + EVENT_RADIO_REPORT_IN_TEAM, + EVENT_START_RADIO_3, + EVENT_RADIO_AFFIRMATIVE, + EVENT_RADIO_ENEMY_SPOTTED, + EVENT_RADIO_NEED_BACKUP, + EVENT_RADIO_SECTOR_CLEAR, + EVENT_RADIO_IN_POSITION, + EVENT_RADIO_REPORTING_IN, + EVENT_RADIO_GET_OUT_OF_THERE, + EVENT_RADIO_NEGATIVE, + EVENT_RADIO_ENEMY_DOWN, + EVENT_END_RADIO, + + EVENT_NEW_MATCH, // tell bots the game is new (argumens: 1 = NULL, 2 = NULL) + EVENT_PLAYER_CHANGED_TEAM, // tell bots the player is switch his team (also called from ClientPutInServer()) (argumens: 1 = switcher, 2 = NULL) + EVENT_BULLET_IMPACT, // tell bots the player is shoot at wall (argumens: 1 = shooter, 2 = shoot trace end position) + EVENT_GAME_COMMENCE, // tell bots the game is commencing (argumens: 1 = NULL, 2 = NULL) + EVENT_WEAPON_ZOOMED, // tell bots the player is switch weapon zoom (argumens: 1 = zoom switcher, 2 = NULL) + EVENT_HOSTAGE_CALLED_FOR_HELP, // tell bots the hostage is talking (argumens: 1 = listener, 2 = NULL) + NUM_GAME_EVENTS, +}; + +extern const char *GameEventName[ NUM_GAME_EVENTS + 1 ]; diff --git a/cssdk/game_shared/bitvec.h b/cssdk/game_shared/bitvec.h new file mode 100644 index 0000000..f541bff --- /dev/null +++ b/cssdk/game_shared/bitvec.h @@ -0,0 +1,157 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CBitVecAccessor { +public: + CBitVecAccessor(uint32 *pDWords, int iBit); + + void operator=(int val); + operator uint32(); + +private: + uint32 *m_pDWords; + int m_iBit; +}; + +// CBitVec allows you to store a list of bits and do operations on them like they were +// an atomic type +template +class CBitVec { +public: + CBitVec(); + + // Set all values to the specified value (0 or 1..) + void Init(int val = 0); + + // Access the bits like an array. + CBitVecAccessor operator[](int i); + + // Operations on other bit vectors. + CBitVec &operator=(CBitVec const &other); + bool operator==(CBitVec const &other); + bool operator!=(CBitVec const &other); + + // Get underlying dword representations of the bits. + int GetNumDWords() { return NUM_DWORDS; } + uint32 GetDWord(int i); + void SetDWord(int i, uint32 val); + int GetNumBits(); + +private: + enum { NUM_DWORDS = NUM_BITS / 32 + !!(NUM_BITS & 31) }; + + unsigned int m_DWords[ NUM_DWORDS ]; +}; + +inline CBitVecAccessor::CBitVecAccessor(uint32 *pDWords, int iBit) +{ + m_pDWords = pDWords; + m_iBit = iBit; +} + +inline void CBitVecAccessor::operator=(int val) +{ + if (val) + m_pDWords[m_iBit >> 5] |= (1 << (m_iBit & 31)); + else + m_pDWords[m_iBit >> 5] &= ~(uint32)(1 << (m_iBit & 31)); +} + +inline CBitVecAccessor::operator uint32() +{ + return m_pDWords[m_iBit >> 5] & (1 << (m_iBit & 31)); +} + +template +inline int CBitVec::GetNumBits() +{ + return NUM_BITS; +} + +template +inline CBitVec::CBitVec() +{ + for (int i = 0; i < NUM_DWORDS; ++i) + m_DWords[i] = 0; +} + +template +inline void CBitVec::Init(int val) +{ + for (int i = 0; i < GetNumBits(); ++i) + { + (*this)[i] = val; + } +} + +template +inline CBitVec &CBitVec::operator=(CBitVec const &other) +{ + Q_memcpy(m_DWords, other.m_DWords, sizeof(m_DWords)); + return *this; +} + +template +inline CBitVecAccessor CBitVec::operator[](int i) +{ + assert(i >= 0 && i < GetNumBits()); + return CBitVecAccessor(m_DWords, i); +} + +template +inline bool CBitVec::operator==(CBitVec const &other) +{ + for (int i = 0; i < NUM_DWORDS; ++i) + { + if (m_DWords[i] != other.m_DWords[i]) + return false; + } + + return true; +} + +template +inline bool CBitVec::operator!=(CBitVec const &other) +{ + return !(*this == other); +} + +template +inline uint32 CBitVec::GetDWord(int i) +{ + assert(i >= 0 && i < NUM_DWORDS); + return m_DWords[i]; +} + +template +inline void CBitVec::SetDWord(int i, uint32 val) +{ + assert(i >= 0 && i < NUM_DWORDS); + m_DWords[i] = val; +} diff --git a/cssdk/game_shared/bot/bot.h b/cssdk/game_shared/bot/bot.h new file mode 100644 index 0000000..c391ec2 --- /dev/null +++ b/cssdk/game_shared/bot/bot.h @@ -0,0 +1,164 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class BotProfile; + +// The base bot class from which bots for specific games are derived +class CBot: public CBasePlayer { +public: + virtual void Spawn() = 0; + + // invoked when injured by something + virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; + + // invoked when killed + virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual BOOL IsNetClient() = 0; + virtual void Think() = 0; + virtual BOOL IsBot() = 0; + virtual Vector GetAutoaimVector(float flDelta) = 0; + + // invoked when in contact with a CWeaponBox + virtual void OnTouchingWeapon(CWeaponBox *box) = 0; + virtual bool Initialize(const BotProfile *profile) = 0; + virtual void SpawnBot() = 0; + + // lightweight maintenance, invoked frequently + virtual void Upkeep() = 0; + + // heavyweight algorithms, invoked less often + virtual void Update() = 0; + + virtual void Run() = 0; + virtual void Walk() = 0; + virtual void Crouch() = 0; + virtual void StandUp() = 0; + virtual void MoveForward() = 0; + virtual void MoveBackward() = 0; + virtual void StrafeLeft() = 0; + virtual void StrafeRight() = 0; + + // returns true if jump was started + #define MUST_JUMP true + virtual bool Jump(bool mustJump = false) = 0; + + // zero any MoveForward(), Jump(), etc + virtual void ClearMovement() = 0; + + // Weapon interface + virtual void UseEnvironment() = 0; + virtual void PrimaryAttack() = 0; + virtual void ClearPrimaryAttack() = 0; + virtual void TogglePrimaryAttack() = 0; + virtual void SecondaryAttack() = 0; + virtual void Reload() = 0; + + // invoked when event occurs in the game (some events have NULL entities) + virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL) = 0; + + // return true if we can see the point + virtual bool IsVisible(const Vector *pos, bool testFOV = false) const = 0; + + // return true if we can see any part of the player + virtual bool IsVisible(CBasePlayer *player, bool testFOV = false, unsigned char *visParts = NULL) const = 0; + + enum VisiblePartType:uint8 + { + NONE = 0x00, + CHEST = 0x01, + HEAD = 0x02, + LEFT_SIDE = 0x04, // the left side of the object from our point of view (not their left side) + RIGHT_SIDE = 0x08, // the right side of the object from our point of view (not their right side) + FEET = 0x10 + }; + + // if enemy is visible, return the part we see + virtual bool IsEnemyPartVisible(VisiblePartType part) const = 0; + + // return true if player is facing towards us + virtual bool IsPlayerFacingMe(CBasePlayer *other) const = 0; + + // returns true if other player is pointing right at us + virtual bool IsPlayerLookingAtMe(CBasePlayer *other) const = 0; + virtual void ExecuteCommand() = 0; + virtual void SetModel(const char *modelName) = 0; + +public: + unsigned int GetID() const { return m_id; } + bool IsRunning() const { return m_isRunning; } + bool IsCrouching() const { return m_isCrouching; } + + // return time last jump began + float GetJumpTimestamp() const { return m_jumpTimestamp; } + + // return our personality profile + const BotProfile *GetProfile() const { return m_profile; } + +public: + // the "personality" profile of this bot + const BotProfile *m_profile; + + // unique bot ID + unsigned int m_id; + + // Think mechanism variables + float m_flNextBotThink; + float m_flNextFullBotThink; + + // Command interface variables + float m_flPreviousCommandTime; + + // run/walk mode + bool m_isRunning; + + // true if crouching (ducking) + bool m_isCrouching; + float m_forwardSpeed; + float m_strafeSpeed; + float m_verticalSpeed; + + // bitfield of movement buttons + unsigned short m_buttonFlags; + + // time when we last began a jump + float m_jumpTimestamp; + + // the PostureContext represents the current settings of walking and crouching + struct PostureContext + { + bool isRunning; + bool isCrouching; + }; + + enum { MAX_POSTURE_STACK = 8 }; + PostureContext m_postureStack[MAX_POSTURE_STACK]; + + // index of top of stack + int m_postureStackIndex; +}; diff --git a/cssdk/game_shared/bot/bot_constants.h b/cssdk/game_shared/bot/bot_constants.h new file mode 100644 index 0000000..14438b5 --- /dev/null +++ b/cssdk/game_shared/bot/bot_constants.h @@ -0,0 +1,47 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// We'll define our own version of this, because everyone else does. +// This needs to stay in sync with MAX_CLIENTS, but there's no header with the #define. +#define BOT_MAX_CLIENTS 32 + +// version number is MAJOR.MINOR +#define BOT_VERSION_MAJOR 1 +#define BOT_VERSION_MINOR 50 + +// Difficulty levels +enum BotDifficultyType +{ + BOT_EASY = 0, + BOT_NORMAL, + BOT_HARD, + BOT_EXPERT, + + NUM_DIFFICULTY_LEVELS +}; diff --git a/cssdk/game_shared/bot/bot_manager.h b/cssdk/game_shared/bot/bot_manager.h new file mode 100644 index 0000000..e232753 --- /dev/null +++ b/cssdk/game_shared/bot/bot_manager.h @@ -0,0 +1,70 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// STL uses exceptions, but we are not compiling with them - ignore warning +#pragma warning(disable : 4530) + +#include + +class CNavArea; +class CGrenade; + +class ActiveGrenade { +public: + int m_id; + CGrenade *m_entity; + Vector m_detonationPosition; + float m_dieTimestamp; +}; + +typedef std::list ActiveGrenadeList; + +class CBotManager { +public: + virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0; + virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0; + + virtual void ServerActivate() = 0; + virtual void ServerDeactivate() = 0; + + virtual void ServerCommand(const char *pcmd) = 0; + virtual void AddServerCommand(const char *cmd) = 0; + virtual void AddServerCommands() = 0; + + virtual void RestartRound() = 0; + virtual void StartFrame() = 0; + + // Events are propogated to all bots. + virtual void OnEvent(GameEventType event, CBaseEntity *entity = NULL, CBaseEntity *other = NULL) = 0; // Invoked when event occurs in the game (some events have NULL entity). + virtual unsigned int GetPlayerPriority(CBasePlayer *player) const = 0; // return priority of player (0 = max pri) + +public: + // the list of active grenades the bots are aware of + ActiveGrenadeList m_activeGrenadeList; +}; diff --git a/cssdk/game_shared/bot/bot_profile.h b/cssdk/game_shared/bot/bot_profile.h new file mode 100644 index 0000000..5f000f5 --- /dev/null +++ b/cssdk/game_shared/bot/bot_profile.h @@ -0,0 +1,116 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// long STL names get truncated in browse info. +#pragma warning(disable : 4786) + +#ifndef _WIN32 +#include +#include +#endif // _WIN32 + +#undef min +#undef max + +#include +#include + +#include "bot_constants.h" + +enum +{ + FirstCustomSkin = 100, + NumCustomSkins = 100, + LastCustomSkin = FirstCustomSkin + NumCustomSkins - 1, +}; + +enum BotProfileTeamType +{ + BOT_TEAM_T, + BOT_TEAM_CT, + BOT_TEAM_ANY +}; + +class BotProfile { +public: + const char *GetName() const { return m_name; } + float GetAggression() const { return m_aggression; } + float GetSkill() const { return m_skill; } + float GetTeamwork() const { return m_teamwork; } + int GetWeaponPreference(int i) const { return m_weaponPreference[i]; } + int GetWeaponPreferenceCount() const { return m_weaponPreferenceCount; } + int GetCost() const { return m_cost; } + int GetSkin() const { return m_skin; } + int GetVoicePitch() const { return m_voicePitch; } + float GetReactionTime() const { return m_reactionTime; } + float GetAttackDelay() const { return m_attackDelay; } + int GetVoiceBank() const { return m_voiceBank; } + bool PrefersSilencer() const { return m_prefersSilencer; } +public: + friend class BotProfileManager; + + char *m_name; + float m_aggression; + float m_skill; + float m_teamwork; + + enum { MAX_WEAPON_PREFS = 16 }; + + int m_weaponPreference[MAX_WEAPON_PREFS]; + int m_weaponPreferenceCount; + + int m_cost; + int m_skin; + + unsigned char m_difficultyFlags; + int m_voicePitch; + float m_reactionTime; + float m_attackDelay; + enum BotProfileTeamType m_teams; + bool m_prefersSilencer; + int m_voiceBank; +}; + +typedef std::list BotProfileList; + +class BotProfileManager { +public: + typedef std::vector VoiceBankList; + const BotProfileList *GetProfileList() const { return &m_profileList; } + const VoiceBankList *GetVoiceBanks() const { return &m_voiceBanks; } + +public: + BotProfileList m_profileList; + VoiceBankList m_voiceBanks; + + char *m_skins[NumCustomSkins]; + char *m_skinModelnames[NumCustomSkins]; + char *m_skinFilenames[NumCustomSkins]; + int m_nextSkin; +}; diff --git a/cssdk/game_shared/bot/bot_util.h b/cssdk/game_shared/bot/bot_util.h new file mode 100644 index 0000000..776d421 --- /dev/null +++ b/cssdk/game_shared/bot/bot_util.h @@ -0,0 +1,141 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define COS_TABLE_SIZE 256 + +#define RAD_TO_DEG(deg) ((deg) * 180.0 / M_PI) +#define DEG_TO_RAD(rad) ((rad) * M_PI / 180.0) + +#define SIGN(num) (((num) < 0) ? -1 : 1) +#define ABS(num) (SIGN(num) * (num)) + +class CBasePlayer; +class BotProfile; + +enum PriorityType +{ + PRIORITY_LOW, PRIORITY_MEDIUM, PRIORITY_HIGH, PRIORITY_UNINTERRUPTABLE +}; + +// Simple class for tracking intervals of game time +class IntervalTimer { +public: + IntervalTimer() { m_timestamp = -1.0f; } + void Reset() { m_timestamp = gpGlobals->time; } + void Start() { m_timestamp = gpGlobals->time; } + void Invalidate() { m_timestamp = -1.0f; } + + bool HasStarted() const { return (m_timestamp > 0.0f); } + + // if not started, elapsed time is very large + float GetElapsedTime() const { return (HasStarted()) ? (gpGlobals->time - m_timestamp) : 99999.9f; } + bool IsLessThen(float duration) const { return (gpGlobals->time - m_timestamp < duration) ? true : false; } + bool IsGreaterThen(float duration) const { return (gpGlobals->time - m_timestamp > duration) ? true : false; } + +private: + float m_timestamp; +}; + +// Simple class for counting down a short interval of time +class CountdownTimer { +public: + CountdownTimer() { m_timestamp = -1.0f; m_duration = 0.0f; } + void Reset() { m_timestamp = gpGlobals->time + m_duration; } + + void Start(float duration) { m_timestamp = gpGlobals->time + duration; m_duration = duration; } + bool HasStarted() const { return (m_timestamp > 0.0f); } + + void Invalidate() { m_timestamp = -1.0f; } + bool IsElapsed() const { return (gpGlobals->time > m_timestamp); } + +private: + float m_duration; + float m_timestamp; +}; + +// Return true if the given entity is valid +inline bool IsEntityValid(CBaseEntity *entity) +{ + if (entity == NULL) + return false; + + if (FNullEnt(entity->pev)) + return false; + + if (FStrEq(STRING(entity->pev->netname), "")) + return false; + + if (entity->pev->flags & FL_DORMANT) + return false; + + return true; +} + +// Given two line segments: startA to endA, and startB to endB, return true if they intesect +// and put the intersection point in "result". +// Note that this computes the intersection of the 2D (x,y) projection of the line segments. +inline bool IsIntersecting2D(const Vector &startA, const Vector &endA, const Vector &startB, const Vector &endB, Vector *result = NULL) +{ + float denom = (endA.x - startA.x) * (endB.y - startB.y) - (endA.y - startA.y) * (endB.x - startB.x); + if (denom == 0.0f) + { + // parallel + return false; + } + + float numS = (startA.y - startB.y) * (endB.x - startB.x) - (startA.x - startB.x) * (endB.y - startB.y); + if (numS == 0.0f) + { + // coincident + return true; + } + + float numT = (startA.y - startB.y) * (endA.x - startA.x) - (startA.x - startB.x) * (endA.y - startA.y); + float s = numS / denom; + if (s < 0.0f || s > 1.0f) + { + // intersection is not within line segment of startA to endA + return false; + } + + float t = numT / denom; + if (t < 0.0f || t > 1.0f) + { + // intersection is not within line segment of startB to endB + return false; + } + + // compute intesection point + if (result != NULL) + { + *result = startA + s * (endA - startA); + } + + return true; +} diff --git a/cssdk/game_shared/bot/improv.h b/cssdk/game_shared/bot/improv.h new file mode 100644 index 0000000..e04d26d --- /dev/null +++ b/cssdk/game_shared/bot/improv.h @@ -0,0 +1,120 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CBaseEntity; +class CNavLadder; + +// Improv-specific events +class IImprovEvent { +public: + virtual void OnMoveToSuccess(const Vector &goal) {}; // invoked when an improv reaches its MoveTo goal + + enum MoveToFailureType + { + FAIL_INVALID_PATH = 0, + FAIL_STUCK, + FAIL_FELL_OFF, + }; + + virtual void OnMoveToFailure(const Vector &goal, MoveToFailureType reason) {} // invoked when an improv fails to reach a MoveTo goal + virtual void OnInjury(float amount) {} // invoked when the improv is injured +}; + +// The Improv interface definition +// An "Improv" is an improvisational actor that simulates the +// behavor of a human in an unscripted, "make it up as you go" manner. +class CImprov: public IImprovEvent { +public: + virtual ~CImprov() {} + virtual bool IsAlive() const = 0; // return true if this improv is alive + + virtual void MoveTo(const Vector &goal) = 0; // move improv towards far-away goal (pathfind) + virtual void LookAt(const Vector &target) = 0; // define desired view target + virtual void ClearLookAt() = 0; // remove view goal + virtual void FaceTo(const Vector &goal) = 0; // orient body towards goal + virtual void ClearFaceTo() = 0; // remove body orientation goal + + virtual bool IsAtMoveGoal(float error = 20.0f) const = 0; // return true if improv is standing on its movement goal + virtual bool HasLookAt() const = 0; // return true if improv has a look at goal + virtual bool HasFaceTo() const = 0; // return true if improv has a face to goal + virtual bool IsAtFaceGoal() const = 0; // return true if improv is facing towards its face goal + virtual bool IsFriendInTheWay(const Vector &goalPos) const = 0; // return true if a friend is blocking our line to the given goal position + virtual bool IsFriendInTheWay(CBaseEntity *myFriend, const Vector &goalPos) const = 0; // return true if the given friend is blocking our line to the given goal position + + virtual void MoveForward() = 0; + virtual void MoveBackward() = 0; + virtual void StrafeLeft() = 0; + virtual void StrafeRight() = 0; + virtual bool Jump() = 0; + virtual void Crouch() = 0; + virtual void StandUp() = 0; // "un-crouch" + + virtual void TrackPath(const Vector &pathGoal, float deltaT) = 0; // move along path by following "pathGoal" + virtual void StartLadder(const CNavLadder *ladder, enum NavTraverseType how, const Vector *approachPos, const Vector *departPos) = 0; // invoked when a ladder is encountered while following a path + + virtual bool TraverseLadder(const CNavLadder *ladder, enum NavTraverseType how, const Vector *approachPos, const Vector *departPos, float deltaT) = 0; // traverse given ladder + virtual bool GetSimpleGroundHeightWithFloor(const Vector *pos, float *height, Vector *normal = NULL) = 0; // find "simple" ground height, treating current nav area as part of the floor + + virtual void Run() = 0; + virtual void Walk() = 0; + virtual void Stop() = 0; + + virtual float GetMoveAngle() const = 0; // return direction of movement + virtual float GetFaceAngle() const = 0; // return direction of view + + virtual const Vector &GetFeet() const = 0; // return position of "feet" - point below centroid of improv at feet level + virtual const Vector &GetCentroid() const = 0; + virtual const Vector &GetEyes() const = 0; + + virtual bool IsRunning() const = 0; + virtual bool IsWalking() const = 0; + virtual bool IsStopped() const = 0; + + virtual bool IsCrouching() const = 0; + virtual bool IsJumping() const = 0; + virtual bool IsUsingLadder() const = 0; + virtual bool IsOnGround() const = 0; + virtual bool IsMoving() const = 0; // if true, improv is walking, crawling, running somewhere + + virtual bool CanRun() const = 0; + virtual bool CanCrouch() const = 0; + virtual bool CanJump() const = 0; + virtual bool IsVisible(const Vector &pos, bool testFOV = false) const = 0; // return true if improv can see position + virtual bool IsPlayerLookingAtMe(CBasePlayer *other, float cosTolerance = 0.95f) const = 0; // return true if 'other' is looking right at me + virtual CBasePlayer *IsAnyPlayerLookingAtMe(int team = 0, float cosTolerance = 0.95f) const = 0; // return player on given team that is looking right at me (team == 0 means any team), NULL otherwise + + virtual CBasePlayer *GetClosestPlayerByTravelDistance(int team = 0, float *range = NULL) const = 0; // return actual travel distance to closest player on given team (team == 0 means any team) + virtual CNavArea *GetLastKnownArea() const = 0; + + virtual void OnUpdate(float deltaT) = 0; // a less frequent, full update 'tick' + virtual void OnUpkeep(float deltaT) = 0; // a frequent, lightweight update 'tick' + virtual void OnReset() = 0; // reset improv to initial state + virtual void OnGameEvent(GameEventType event, CBaseEntity *entity, CBaseEntity *other) = 0; // invoked when an event occurs in the game + virtual void OnTouch(CBaseEntity *other) = 0; // "other" has touched us +}; diff --git a/cssdk/game_shared/bot/nav.h b/cssdk/game_shared/bot/nav.h new file mode 100644 index 0000000..65d2721 --- /dev/null +++ b/cssdk/game_shared/bot/nav.h @@ -0,0 +1,400 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// STL uses exceptions, but we are not compiling with them - ignore warning +#pragma warning(disable : 4530) + +// to help identify nav files +#define NAV_MAGIC_NUMBER 0xFEEDFACE + +// A place is a named group of navigation areas +typedef unsigned int Place; + +// ie: "no place" +#define UNDEFINED_PLACE 0 +#define ANY_PLACE 0xFFFF + +#define WALK_THRU_DOORS 0x01 +#define WALK_THRU_BREAKABLES 0x02 +#define WALK_THRU_EVERYTHING (WALK_THRU_DOORS | WALK_THRU_BREAKABLES) + +enum NavErrorType +{ + NAV_OK, + NAV_CANT_ACCESS_FILE, + NAV_INVALID_FILE, + NAV_BAD_FILE_VERSION, + NAV_CORRUPT_DATA, +}; + +enum NavAttributeType +{ + NAV_CROUCH = 0x01, // must crouch to use this node/area + NAV_JUMP = 0x02, // must jump to traverse this area + NAV_PRECISE = 0x04, // do not adjust for obstacles, just move along area + NAV_NO_JUMP = 0x08, // inhibit discontinuity jumping +}; + +enum NavDirType +{ + NORTH = 0, + EAST, + SOUTH, + WEST, + + NUM_DIRECTIONS +}; + +// Defines possible ways to move from one area to another +enum NavTraverseType +{ + // NOTE: First 4 directions MUST match NavDirType + GO_NORTH = 0, + GO_EAST, + GO_SOUTH, + GO_WEST, + GO_LADDER_UP, + GO_LADDER_DOWN, + GO_JUMP, + + NUM_TRAVERSE_TYPES +}; + +enum NavCornerType +{ + NORTH_WEST = 0, + NORTH_EAST, + SOUTH_EAST, + SOUTH_WEST, + + NUM_CORNERS +}; + +enum NavRelativeDirType +{ + FORWARD = 0, + RIGHT, + BACKWARD, + LEFT, + UP, + DOWN, + + NUM_RELATIVE_DIRECTIONS +}; + +const float GenerationStepSize = 25.0f; // (30) was 20, but bots can't fit always fit +const float StepHeight = 18.0f; // if delta Z is greater than this, we have to jump to get up +const float JumpHeight = 41.8f; // if delta Z is less than this, we can jump up on it +const float JumpCrouchHeight = 58.0f; // (48) if delta Z is less than or equal to this, we can jumpcrouch up on it + +// Strictly speaking, you CAN get up a slope of 1.643 (about 59 degrees), but you move very, very slowly +// This slope will represent the slope you can navigate without much slowdown +// rise/run - if greater than this, we can't move up it (de_survivor canyon ramps) +const float MaxSlope = 1.4f; + +// instead of MaxSlope, we are using the following max Z component of a unit normal +const float MaxUnitZSlope = 0.7f; + +const float BotRadius = 10.0f; // circular extent that contains bot +const float DeathDrop = 200.0f; // (300) distance at which we will die if we fall - should be about 600, and pay attention to fall damage during pathfind + +const float HalfHumanWidth = 16.0f; +const float HalfHumanHeight = 36.0f; +const float HumanHeight = 72.0f; + +struct Extent +{ + Vector lo; + Vector hi; + + float SizeX() const { return hi.x - lo.x; } + float SizeY() const { return hi.y - lo.y; } + float SizeZ() const { return hi.z - lo.z; } + float Area() const { return SizeX() * SizeY(); } + + // return true if 'pos' is inside of this extent + bool Contains(const Vector *pos) const + { + return (pos->x >= lo.x && pos->x <= hi.x && + pos->y >= lo.y && pos->y <= hi.y && + pos->z >= lo.z && pos->z <= hi.z); + } +}; + +struct Ray +{ + Vector from; + Vector to; +}; + +inline NavDirType OppositeDirection(NavDirType dir) +{ + switch (dir) + { + case NORTH: + return SOUTH; + case EAST: + return WEST; + case SOUTH: + return NORTH; + case WEST: + return EAST; + } + + return NORTH; +} + +inline NavDirType DirectionLeft(NavDirType dir) +{ + switch (dir) + { + case NORTH: + return WEST; + case SOUTH: + return EAST; + case EAST: + return NORTH; + case WEST: + return SOUTH; + } + + return NORTH; +} + +inline NavDirType DirectionRight(NavDirType dir) +{ + switch (dir) + { + case NORTH: + return EAST; + case SOUTH: + return WEST; + case EAST: + return SOUTH; + case WEST: + return NORTH; + } + + return NORTH; +} + +inline void AddDirectionVector(Vector *v, NavDirType dir, float amount) +{ + switch (dir) + { + case NORTH: + v->y -= amount; + return; + case SOUTH: + v->y += amount; + return; + case EAST: + v->x += amount; + return; + case WEST: + v->x -= amount; + return; + } +} + +inline float DirectionToAngle(NavDirType dir) +{ + switch (dir) + { + case NORTH: + return 270.0f; + case EAST: + return 0.0f; + case SOUTH: + return 90.0f; + case WEST: + return 180.0f; + } + + return 0.0f; +} + +inline NavDirType AngleToDirection(float angle) +{ + while (angle < 0.0f) + angle += 360.0f; + + while (angle > 360.0f) + angle -= 360.0f; + + if (angle < 45 || angle > 315) + return EAST; + + if (angle >= 45 && angle < 135) + return SOUTH; + + if (angle >= 135 && angle < 225) + return WEST; + + return NORTH; +} + +inline void DirectionToVector2D(NavDirType dir, Vector2D *v) +{ + switch (dir) + { + case NORTH: + v->x = 0.0f; + v->y = -1.0f; + break; + case SOUTH: + v->x = 0.0f; + v->y = 1.0f; + break; + case EAST: + v->x = 1.0f; + v->y = 0.0f; + break; + case WEST: + v->x = -1.0f; + v->y = 0.0f; + break; + } +} + +inline void SnapToGrid(Vector *pos) +{ + int cx = pos->x / GenerationStepSize; + int cy = pos->y / GenerationStepSize; + pos->x = cx * GenerationStepSize; + pos->y = cy * GenerationStepSize; +} + +inline void SnapToGrid(float *value) +{ + int c = *value / GenerationStepSize; + *value = c * GenerationStepSize; +} + +// custom +inline float SnapToGrid(float value) +{ + int c = value / GenerationStepSize; + return c * GenerationStepSize; +} + +inline float NormalizeAngle(float angle) +{ + while (angle < -180.0f) + angle += 360.0f; + + while (angle > 180.0f) + angle -= 360.0f; + + return angle; +} + +inline float NormalizeAnglePositive(float angle) +{ + while (angle < 0.0f) + angle += 360.0f; + + while (angle >= 360.0f) + angle -= 360.0f; + + return angle; +} + +inline float AngleDifference(float a, float b) +{ + float angleDiff = a - b; + + while (angleDiff > 180.0f) + angleDiff -= 360.0f; + + while (angleDiff < -180.0f) + angleDiff += 360.0f; + + return angleDiff; +} + +inline bool AnglesAreEqual(float a, float b, float tolerance = 5.0f) +{ + if (abs(int64(AngleDifference(a, b))) < tolerance) + return true; + + return false; +} + +inline bool VectorsAreEqual(const Vector *a, const Vector *b, float tolerance = 0.1f) +{ + if (abs(a->x - b->x) < tolerance + && abs(a->y - b->y) < tolerance + && abs(a->z - b->z) < tolerance) + return true; + + return false; +} + +inline bool IsEntityWalkable(entvars_t *entity, unsigned int flags) +{ + // if we hit a door, assume its walkable because it will open when we touch it + if (FClassnameIs(entity, "func_door") || FClassnameIs(entity, "func_door_rotating")) + return (flags & WALK_THRU_DOORS) ? true : false; + + // if we hit a breakable object, assume its walkable because we will shoot it when we touch it + if (FClassnameIs(entity, "func_breakable") && entity->takedamage == DAMAGE_YES) + return (flags & WALK_THRU_BREAKABLES) ? true : false; + + return false; +} + +// Check LOS, ignoring any entities that we can walk through +inline bool IsWalkableTraceLineClear(Vector &from, Vector &to, unsigned int flags = 0) +{ + TraceResult result; + edict_t *ignore = NULL; + Vector useFrom = from; + + while (true) + { + UTIL_TraceLine(useFrom, to, ignore_monsters, ignore, &result); + + if (result.flFraction != 1.0f && IsEntityWalkable(VARS(result.pHit), flags)) + { + ignore = result.pHit; + + Vector dir = to - from; + dir.NormalizeInPlace(); + useFrom = result.vecEndPos + 5.0f * dir; + } + else + break; + } + + if (result.flFraction == 1.0f) + return true; + + return false; +} diff --git a/cssdk/game_shared/bot/nav_area.h b/cssdk/game_shared/bot/nav_area.h new file mode 100644 index 0000000..5c40b2a --- /dev/null +++ b/cssdk/game_shared/bot/nav_area.h @@ -0,0 +1,320 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include + +class CNavArea; +enum NavEditCmdType +{ + EDIT_NONE, + EDIT_DELETE, // delete current area + EDIT_SPLIT, // split current area + EDIT_MERGE, // merge adjacent areas + EDIT_JOIN, // define connection between areas + EDIT_BREAK, // break connection between areas + EDIT_MARK, // mark an area for further operations + EDIT_ATTRIB_CROUCH, // toggle crouch attribute on current area + EDIT_ATTRIB_JUMP, // toggle jump attribute on current area + EDIT_ATTRIB_PRECISE, // toggle precise attribute on current area + EDIT_ATTRIB_NO_JUMP, // toggle inhibiting discontinuity jumping in current area + EDIT_BEGIN_AREA, // begin creating a new nav area + EDIT_END_AREA, // end creation of the new nav area + EDIT_CONNECT, // connect marked area to selected area + EDIT_DISCONNECT, // disconnect marked area from selected area + EDIT_SPLICE, // create new area in between marked and selected areas + EDIT_TOGGLE_PLACE_MODE, // switch between normal and place editing + EDIT_TOGGLE_PLACE_PAINTING, // switch between "painting" places onto areas + EDIT_PLACE_FLOODFILL, // floodfill areas out from current area + EDIT_PLACE_PICK, // "pick up" the place at the current area + EDIT_MARK_UNNAMED, // mark an unnamed area for further operations + EDIT_WARP_TO_MARK, // warp a spectating local player to the selected mark + EDIT_SELECT_CORNER, // select a corner on the current area + EDIT_RAISE_CORNER, // raise a corner on the current area + EDIT_LOWER_CORNER, // lower a corner on the current area +}; + +enum RouteType +{ + FASTEST_ROUTE, + SAFEST_ROUTE, +}; + +union NavConnect +{ + unsigned int id; + CNavArea *area; + + bool operator==(const NavConnect &other) const { return (area == other.area) ? true : false; } +}; + +typedef std::list NavConnectList; + +enum LadderDirectionType +{ + LADDER_UP = 0, + LADDER_DOWN, + NUM_LADDER_DIRECTIONS +}; + +class CNavLadder { +public: + Vector m_top; + Vector m_bottom; + float m_length; + NavDirType m_dir; + Vector2D m_dirVector; + CBaseEntity *m_entity; + + CNavArea *m_topForwardArea; + CNavArea *m_topLeftArea; + CNavArea *m_topRightArea; + CNavArea *m_topBehindArea; + CNavArea *m_bottomArea; + + bool m_isDangling; + + void OnDestroyNotify(CNavArea *dead) + { + if (dead == m_topForwardArea) + m_topForwardArea = NULL; + + if (dead == m_topLeftArea) + m_topLeftArea = NULL; + + if (dead == m_topRightArea) + m_topRightArea = NULL; + + if (dead == m_topBehindArea) + m_topBehindArea = NULL; + + if (dead == m_bottomArea) + m_bottomArea = NULL; + } +}; + +typedef std::list NavLadderList; + +class HidingSpot { +public: + enum + { + IN_COVER = 0x01, + GOOD_SNIPER_SPOT = 0x02, + IDEAL_SNIPER_SPOT = 0x04 + }; + + bool HasGoodCover() const { return (m_flags & IN_COVER) ? true : false; } + bool IsGoodSniperSpot() const { return (m_flags & GOOD_SNIPER_SPOT) ? true : false; } + bool IsIdealSniperSpot() const { return (m_flags & IDEAL_SNIPER_SPOT) ? true : false; } + + void SetFlags(unsigned char flags) { m_flags |= flags; } + unsigned char GetFlags() const { return m_flags; } + + const Vector *GetPosition() const { return &m_pos; } + unsigned int GetID() const { return m_id; } + +private: + Vector m_pos; + unsigned int m_id; + unsigned int m_marker; + unsigned char m_flags; +}; + +typedef std::list HidingSpotList; + +struct SpotOrder +{ + float t; + union + { + HidingSpot *spot; + unsigned int id; + }; +}; + +typedef std::list SpotOrderList; + +struct SpotEncounter +{ + NavConnect from; + NavDirType fromDir; + NavConnect to; + NavDirType toDir; + Ray path; // the path segment + SpotOrderList spotList; // list of spots to look at, in order of occurrence +}; + +typedef std::list SpotEncounterList; +typedef std::list NavAreaList; + +// A CNavArea is a rectangular region defining a walkable area in the map +class CNavArea { +public: + unsigned int GetID() const { return m_id; } + void SetAttributes(unsigned char bits) { m_attributeFlags = bits; } + unsigned char GetAttributes() const { return m_attributeFlags; } + void SetPlace(Place place) { m_place = place; } // set place descriptor + Place GetPlace() const { return m_place; } // get place descriptor + + int GetAdjacentCount(NavDirType dir) const { return m_connect[dir].size(); } // return number of connected areas in given direction + const NavConnectList *GetAdjacentList(NavDirType dir) const { return &m_connect[dir]; } + + const NavLadderList *GetLadderList(LadderDirectionType dir) const { return &m_ladder[dir]; } + + // for hunting algorithm + void SetClearedTimestamp(int teamID) { m_clearedTimestamp[teamID] = gpGlobals->time; } // set this area's "clear" timestamp to now + float GetClearedTimestamp(int teamID) { return m_clearedTimestamp[teamID]; } // get time this area was marked "clear" + + // hiding spots + const HidingSpotList *GetHidingSpotList() const { return &m_hidingSpotList; } + + float GetSizeX() const { return m_extent.hi.x - m_extent.lo.x; } + float GetSizeY() const { return m_extent.hi.y - m_extent.lo.y; } + + const Extent *GetExtent() const { return &m_extent; } + const Vector *GetCenter() const { return &m_center; } + + // approach areas + struct ApproachInfo + { + NavConnect here; // the approach area + NavConnect prev; // the area just before the approach area on the path + NavTraverseType prevToHereHow; + NavConnect next; // the area just after the approach area on the path + NavTraverseType hereToNextHow; + }; + + const ApproachInfo *GetApproachInfo(int i) const { return &m_approach[i]; } + int GetApproachInfoCount() const { return m_approachCount; } + + void SetParent(CNavArea *parent, NavTraverseType how = NUM_TRAVERSE_TYPES) { m_parent = parent; m_parentHow = how; } + CNavArea *GetParent() const { return m_parent; } + NavTraverseType GetParentHow() const { return m_parentHow; } + + void SetTotalCost(float value) { m_totalCost = value; } + float GetTotalCost() const { return m_totalCost; } + + void SetCostSoFar(float value) { m_costSoFar = value; } + float GetCostSoFar() const { return m_costSoFar; } + +public: + friend class CNavAreaGrid; + friend class CCSBotManager; + + unsigned int m_id; // unique area ID + Extent m_extent; // extents of area in world coords (NOTE: lo.z is not necessarily the minimum Z, but corresponds to Z at point (lo.x, lo.y), etc + Vector m_center; // centroid of area + unsigned char m_attributeFlags; // set of attribute bit flags (see NavAttributeType) + Place m_place; // place descriptor + + // height of the implicit corners + float m_neZ; + float m_swZ; + + enum { MAX_AREA_TEAMS = 2 }; + + // for hunting + float m_clearedTimestamp[MAX_AREA_TEAMS]; // time this area was last "cleared" of enemies + + // danger + float m_danger[MAX_AREA_TEAMS]; // danger of this area, allowing bots to avoid areas where they died in the past - zero is no danger + float m_dangerTimestamp[MAX_AREA_TEAMS]; // time when danger value was set - used for decaying + + // hiding spots + HidingSpotList m_hidingSpotList; + + // encounter spots + SpotEncounterList m_spotEncounterList; // list of possible ways to move thru this area, and the spots to look at as we do + + // approach areas + enum { MAX_APPROACH_AREAS = 16 }; + ApproachInfo m_approach[MAX_APPROACH_AREAS]; + unsigned char m_approachCount; + + // A* pathfinding algorithm + unsigned int m_marker; // used to flag the area as visited + CNavArea *m_parent; // the area just prior to this on in the search path + NavTraverseType m_parentHow; // how we get from parent to us + float m_totalCost; // the distance so far plus an estimate of the distance left + float m_costSoFar; // distance travelled so far + + CNavArea *m_nextOpen, *m_prevOpen; // only valid if m_openMarker == m_masterMarker + unsigned int m_openMarker; // if this equals the current marker value, we are on the open list + + // connections to adjacent areas + NavConnectList m_connect[ NUM_DIRECTIONS ]; // a list of adjacent areas for each direction + NavLadderList m_ladder[ NUM_LADDER_DIRECTIONS ]; // list of ladders leading up and down from this area + + CNavNode *m_node[ NUM_CORNERS ]; // nav nodes at each corner of the area + NavAreaList m_overlapList; // list of areas that overlap this area + + CNavArea *m_prevHash, *m_nextHash; // for hash table in CNavAreaGrid +}; + +// The CNavAreaGrid is used to efficiently access navigation areas by world position +// Each cell of the grid contains a list of areas that overlap it +// Given a world position, the corresponding grid cell is ( x/cellsize, y/cellsize ) +class CNavAreaGrid { +public: + const float m_cellSize; + NavAreaList *m_grid; + int m_gridSizeX; + int m_gridSizeY; + float m_minX; + float m_minY; + unsigned int m_areaCount; // total number of nav areas + + enum { HASH_TABLE_SIZE = 256 }; + CNavArea *m_hashTable[HASH_TABLE_SIZE]; // hash table to optimize lookup by ID + inline int ComputeHashKey(unsigned int id) const // returns a hash key for the given nav area ID + { + return id & 0xFF; + } + inline int WorldToGridX(float wx) const + { + int x = (wx - m_minX) / m_cellSize; + if (x < 0) + x = 0; + + else if (x >= m_gridSizeX) + x = m_gridSizeX - 1; + + return x; + } + inline int WorldToGridY(float wy) const + { + int y = (wy - m_minY) / m_cellSize; + if (y < 0) + y = 0; + else if (y >= m_gridSizeY) + y = m_gridSizeY - 1; + + return y; + } +}; diff --git a/cssdk/game_shared/bot/nav_node.h b/cssdk/game_shared/bot/nav_node.h new file mode 100644 index 0000000..4c434a1 --- /dev/null +++ b/cssdk/game_shared/bot/nav_node.h @@ -0,0 +1,110 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class CNavNode { +public: + // get navigation node connected in given direction, or NULL if cant go that way + CNavNode *GetConnectedNode(NavDirType dir) const; + const Vector *GetPosition() const; + const Vector *GetNormal() const { return &m_normal; } + unsigned int GetID() const { return m_id; } + + CNavNode *GetNext() { return m_next; } + + // create a connection FROM this node TO the given node, in the given direction + CNavNode *GetParent() const; + + void MarkAsVisited(NavDirType dir); // mark the given direction as having been visited + BOOL HasVisited(NavDirType dir); // return TRUE if the given direction has already been searched + + void Cover() { m_isCovered = true; } // TODO: Should pass in area that is covering + BOOL IsCovered() const { return m_isCovered; } // return true if this node has been covered by an area + + void AssignArea(CNavArea *area); // assign the given area to this node + CNavArea *GetArea() const; // return associated area + + void SetAttributes(unsigned char bits) { m_attributeFlags = bits; } + unsigned char GetAttributes() const { return m_attributeFlags; } + +public: + friend void DestroyNavigationMap(); + + Vector m_pos; // position of this node in the world + Vector m_normal; // surface normal at this location + CNavNode *m_to[ NUM_DIRECTIONS ]; // links to north, south, east, and west. NULL if no link + unsigned int m_id; // unique ID of this node + unsigned char m_attributeFlags; // set of attribute bit flags (see NavAttributeType) + + CNavNode *m_next; // next link in master list + + // below are only needed when generating + // flags for automatic node generation. If direction bit is clear, that direction hasn't been explored yet. + unsigned char m_visited; + CNavNode *m_parent; // the node prior to this in the search, which we pop back to when this node's search is done (a stack) + BOOL m_isCovered; // true when this node is "covered" by a CNavArea + CNavArea *m_area; // the area this node is contained within +}; + +inline CNavNode *CNavNode::GetConnectedNode(NavDirType dir) const +{ + return m_to[ dir ]; +} + +inline const Vector *CNavNode::GetPosition() const +{ + return &m_pos; +} + +inline CNavNode *CNavNode::GetParent() const +{ + return m_parent; +} + +inline void CNavNode::MarkAsVisited(NavDirType dir) +{ + m_visited |= (1 << dir); +} + +inline BOOL CNavNode::HasVisited(NavDirType dir) +{ + if (m_visited & (1 << dir)) + return true; + + return false; +} + +inline void CNavNode::AssignArea(CNavArea *area) +{ + m_area = area; +} + +inline CNavArea *CNavNode::GetArea() const +{ + return m_area; +} diff --git a/cssdk/game_shared/bot/nav_path.h b/cssdk/game_shared/bot/nav_path.h new file mode 100644 index 0000000..614aa06 --- /dev/null +++ b/cssdk/game_shared/bot/nav_path.h @@ -0,0 +1,99 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// STL uses exceptions, but we are not compiling with them - ignore warning +#pragma warning(disable : 4530) + +class CNavPath { +public: + CNavPath() { m_segmentCount = 0; } + + struct PathSegment + { + CNavArea *area; // the area along the path + NavTraverseType how; // how to enter this area from the previous one + Vector pos; // our movement goal position at this point in the path + const CNavLadder *ladder; // if "how" refers to a ladder, this is it + }; + + const PathSegment *operator[](int i) { return (i >= 0 && i < m_segmentCount) ? &m_path[i] : NULL; } + int GetSegmentCount() const { return m_segmentCount; } + const Vector &GetEndpoint() const { return m_path[ m_segmentCount - 1 ].pos; } + + bool IsValid() const { return (m_segmentCount > 0); } + void Invalidate() { m_segmentCount = 0; } +public: + enum { MAX_PATH_SEGMENTS = 256 }; + PathSegment m_path[ MAX_PATH_SEGMENTS ]; + int m_segmentCount; + + bool ComputePathPositions(); // determine actual path positions + bool BuildTrivialPath(const Vector *start, const Vector *goal); // utility function for when start and goal are in the same area + int FindNextOccludedNode(int anchor_); // used by Optimize() +}; + +// Monitor improv movement and determine if it becomes stuck +class CStuckMonitor { +public: + bool IsStuck() const { return m_isStuck; } + float GetDuration() const { return m_isStuck ? m_stuckTimer.GetElapsedTime() : 0.0f; } +public: + bool m_isStuck; // if true, we are stuck + Vector m_stuckSpot; // the location where we became stuck + IntervalTimer m_stuckTimer; // how long we have been stuck + + enum { MAX_VEL_SAMPLES = 5 }; + + float m_avgVel[ MAX_VEL_SAMPLES ]; + int m_avgVelIndex; + int m_avgVelCount; + Vector m_lastCentroid; + float m_lastTime; +}; + +// The CNavPathFollower class implements path following behavior +class CNavPathFollower { +public: + void SetImprov(CImprov *improv) { m_improv = improv; } + void SetPath(CNavPath *path) { m_path = path; } + + void Debug(bool status) { m_isDebug = status; } // turn debugging on/off +public: + int FindOurPositionOnPath(Vector *close, bool local) const; // return the closest point to our current position on current path + int FindPathPoint(float aheadRange, Vector *point, int *prevIndex); // compute a point a fixed distance ahead along our path. + + CImprov *m_improv; // who is doing the path following + CNavPath *m_path; // the path being followed + int m_segmentIndex; // the point on the path the improv is moving towards + int m_behindIndex; // index of the node on the path just behind us + Vector m_goal; // last computed follow goal + bool m_isLadderStarted; + bool m_isDebug; + CStuckMonitor m_stuckMonitor; +}; diff --git a/cssdk/game_shared/bot/simple_state_machine.h b/cssdk/game_shared/bot/simple_state_machine.h new file mode 100644 index 0000000..baa931e --- /dev/null +++ b/cssdk/game_shared/bot/simple_state_machine.h @@ -0,0 +1,101 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +// Encapsulation of a finite-state-machine state +template +class SimpleState { +public: + SimpleState() { m_parent = NULL; } + + virtual ~SimpleState() {}; + virtual void OnEnter(T userData) {}; // when state is entered + virtual void OnUpdate(T userData) {}; // state behavior + virtual void OnExit(T userData) {}; // when state exited + virtual const char *GetName() const = 0; // return state name + + void SetParent(SimpleState *parent) + { + m_parent = parent; + } + SimpleState *GetParent() const + { + return m_parent; + } + +private: + // the parent state that contains this state + SimpleState *m_parent; +}; + +// Encapsulation of a finite state machine +template +class SimpleStateMachine { +public: + SimpleStateMachine() + { + m_state = NULL; + } + void Reset(T userData) + { + m_userData = userData; + m_state = NULL; + } + // change behavior state - WARNING: not re-entrant. Do not SetState() from within OnEnter() or OnExit() + void SetState(S *newState) + { + if (m_state) + m_state->OnExit(m_userData); + + newState->OnEnter(m_userData); + + m_state = newState; + m_stateTimer.Start(); + } + // how long have we been in the current state + float GetStateDuration() const + { + return m_stateTimer.GetElapsedTime(); + } + // return true if given state is current state of machine + bool IsState(const S *state) const + { + return (state == m_state); + } + // execute current state of machine + void Update() + { + if (m_state) + m_state->OnUpdate(m_userData); + } + +protected: + S *m_state; // current behavior state + IntervalTimer m_stateTimer; // how long have we been in the current state + T m_userData; +}; diff --git a/cssdk/game_shared/perf_counter.h b/cssdk/game_shared/perf_counter.h new file mode 100644 index 0000000..e99c700 --- /dev/null +++ b/cssdk/game_shared/perf_counter.h @@ -0,0 +1,183 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#ifdef _WIN32 + #include + #include + #include +#else + #include + #include + #include + #include + #ifdef OSX + #include + #else + #include + #endif + #include +#endif + +#include +#include +#include +#include +#include + +class CPerformanceCounter +{ +public: + CPerformanceCounter(); + + void InitializePerformanceCounter(); + double GetCurTime(); + +private: + int m_iLowShift; + double m_flPerfCounterFreq; + double m_flCurrentTime; + double m_flLastCurrentTime; +}; + +inline CPerformanceCounter::CPerformanceCounter() : + m_iLowShift(0), + m_flPerfCounterFreq(0), + m_flCurrentTime(0), + m_flLastCurrentTime(0) +{ + InitializePerformanceCounter(); +} + +inline void CPerformanceCounter::InitializePerformanceCounter() +{ +#ifdef _WIN32 + + LARGE_INTEGER performanceFreq; + QueryPerformanceFrequency(&performanceFreq); + + // get 32 out of the 64 time bits such that we have around + // 1 microsecond resolution + unsigned int lowpart, highpart; + lowpart = (unsigned int)performanceFreq.LowPart; + highpart = (unsigned int)performanceFreq.HighPart; + m_iLowShift = 0; + + while (highpart || (lowpart > 2000000.0)) + { + m_iLowShift++; + lowpart >>= 1; + lowpart |= (highpart & 1) << 31; + highpart >>= 1; + } + + m_flPerfCounterFreq = 1.0 / (double)lowpart; + +#endif // _WIN32 +} + +inline double CPerformanceCounter::GetCurTime() +{ +#ifdef _WIN32 + + static int sametimecount; + static unsigned int oldtime; + static int first = 1; + LARGE_INTEGER PerformanceCount; + unsigned int temp, t2; + double time; + + QueryPerformanceCounter(&PerformanceCount); + if (m_iLowShift == 0) + { + temp = (unsigned int)PerformanceCount.LowPart; + } + else + { + temp = ((unsigned int)PerformanceCount.LowPart >> m_iLowShift) | + ((unsigned int)PerformanceCount.HighPart << (32 - m_iLowShift)); + } + + if (first) + { + oldtime = temp; + first = 0; + } + else + { + // check for turnover or backward time + if ((temp <= oldtime) && ((oldtime - temp) < 0x10000000)) + { + // so we can't get stuck + oldtime = temp; + } + else + { + t2 = temp - oldtime; + + time = (double)t2 * m_flPerfCounterFreq; + oldtime = temp; + + m_flCurrentTime += time; + + if (m_flCurrentTime == m_flLastCurrentTime) + { + if (++sametimecount > 100000) + { + m_flCurrentTime += 1.0; + sametimecount = 0; + } + } + else + { + sametimecount = 0; + } + + m_flLastCurrentTime = m_flCurrentTime; + } + } + + return m_flCurrentTime; + +#else // _WIN32 + + struct timeval tp; + static int secbase = 0; + + gettimeofday(&tp, NULL); + + if (!secbase) + { + secbase = tp.tv_sec; + return (tp.tv_usec / 1000000.0); + } + + return ((tp.tv_sec - secbase) + tp.tv_usec / 1000000.0); + +#endif // _WIN32 +} diff --git a/cssdk/game_shared/shared_util.h b/cssdk/game_shared/shared_util.h new file mode 100644 index 0000000..c12156f --- /dev/null +++ b/cssdk/game_shared/shared_util.h @@ -0,0 +1,63 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#ifndef _WIN32 +#include +#include +#endif + +// Simple utility function to allocate memory and duplicate a string +inline char *CloneString(const char *str) +{ + if (!str) + { + char *cloneStr = new char[1]; + cloneStr[0] = '\0'; + return cloneStr; + } + + char *cloneStr = new char [strlen(str) + 1]; + strcpy(cloneStr, str); + return cloneStr; +} + +// Simple utility function to allocate memory and duplicate a wide string +inline wchar_t *CloneWString(const wchar_t *str) +{ + if (!str) + { + wchar_t *cloneStr = new wchar_t[1]; + cloneStr[0] = L'\0'; + return cloneStr; + } + + wchar_t *cloneStr = new wchar_t [wcslen(str) + 1]; + wcscpy(cloneStr, str); + return cloneStr; +} diff --git a/cssdk/game_shared/simple_checksum.h b/cssdk/game_shared/simple_checksum.h new file mode 100644 index 0000000..236e765 --- /dev/null +++ b/cssdk/game_shared/simple_checksum.h @@ -0,0 +1,49 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef SIMPLE_CHECKSUM_H +#define SIMPLE_CHECKSUM_H +#ifdef _WIN32 +#pragma once +#endif + +// Compute a simple checksum for the given data. +// Each byte in the data is multiplied by its position to track re-ordering changes +inline unsigned int ComputeSimpleChecksum(const unsigned char *dataPointer, int dataLength) +{ + unsigned int checksum = 0; + for (int i = 1; i <= dataLength; i++) + { + checksum += (*dataPointer) * i; + ++dataPointer; + } + + return checksum; +} + +#endif // SIMPLE_CHECKSUM_H diff --git a/cssdk/game_shared/steam_util.h b/cssdk/game_shared/steam_util.h new file mode 100644 index 0000000..5431679 --- /dev/null +++ b/cssdk/game_shared/steam_util.h @@ -0,0 +1,76 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +class SteamFile +{ +public: + SteamFile(const char *filename); + ~SteamFile(); + + bool IsValid() const { return (m_fileData) ? true : false; } + bool Read(void *data, int length); + +private: + byte *m_fileData; + int m_fileDataLength; + + byte *m_cursor; + int m_bytesLeft; +}; + +inline SteamFile::SteamFile(const char *filename) +{ + m_fileData = (byte *)LOAD_FILE_FOR_ME(const_cast(filename), &m_fileDataLength); + m_cursor = m_fileData; + m_bytesLeft = m_fileDataLength; +} + +inline SteamFile::~SteamFile() +{ + if (m_fileData) + { + FREE_FILE(m_fileData); + m_fileData = NULL; + } +} + +inline bool SteamFile::Read(void *data, int length) +{ + if (length > m_bytesLeft || m_cursor == NULL || m_bytesLeft <= 0) + return false; + + byte *readCursor = static_cast(data); + for (int i = 0; i < length; ++i) + { + *readCursor++ = *m_cursor++; + --m_bytesLeft; + } + + return true; +} diff --git a/cssdk/game_shared/voice_common.h b/cssdk/game_shared/voice_common.h new file mode 100644 index 0000000..82dfb39 --- /dev/null +++ b/cssdk/game_shared/voice_common.h @@ -0,0 +1,36 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "bitvec.h" + +// TODO: this should just be set to MAX_CLIENTS +#define VOICE_MAX_PLAYERS 32 +#define VOICE_MAX_PLAYERS_DW ((VOICE_MAX_PLAYERS / 32) + !!(VOICE_MAX_PLAYERS & 31)) + +typedef CBitVec< VOICE_MAX_PLAYERS > CPlayerBitVec; diff --git a/cssdk/game_shared/voice_gamemgr.h b/cssdk/game_shared/voice_gamemgr.h new file mode 100644 index 0000000..851c93a --- /dev/null +++ b/cssdk/game_shared/voice_gamemgr.h @@ -0,0 +1,56 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define UPDATE_INTERVAL 0.3 + +#include "voice_common.h" + +class CGameRules; +class CBasePlayer; + +class IVoiceGameMgrHelper { +public: + virtual ~IVoiceGameMgrHelper() = 0; + + // Called each frame to determine which players are allowed to hear each other. This overrides + // whatever squelch settings players have. + virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pTalker) = 0; +}; + +// CVoiceGameMgr manages which clients can hear which other clients. +class CVoiceGameMgr { +public: + virtual ~CVoiceGameMgr() {}; +public: + int m_msgPlayerVoiceMask; + int m_msgRequestState; + IVoiceGameMgrHelper *m_pHelper; + int m_nMaxPlayers; + double m_UpdateInterval; // How long since the last update. +}; diff --git a/cssdk/pm_shared/pm_defs.h b/cssdk/pm_shared/pm_defs.h new file mode 100644 index 0000000..04bea26 --- /dev/null +++ b/cssdk/pm_shared/pm_defs.h @@ -0,0 +1,192 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#include "pm_info.h" +#include "pmtrace.h" + +#ifndef USERCMD_H +#include "usercmd.h" +#endif + +#include "const.h" + +#define MAX_PHYSENTS 600 // Must have room for all entities in the world. +#define MAX_MOVEENTS 64 +#define MAX_CLIP_PLANES 5 + +#define PM_NORMAL 0x00000000 +#define PM_STUDIO_IGNORE 0x00000001 // Skip studio models +#define PM_STUDIO_BOX 0x00000002 // Use boxes for non-complex studio models (even in traceline) +#define PM_GLASS_IGNORE 0x00000004 // Ignore entities with non-normal rendermode +#define PM_WORLD_ONLY 0x00000008 // Only trace against the world + +#define PM_TRACELINE_PHYSENTSONLY 0 +#define PM_TRACELINE_ANYVISIBLE 1 + +typedef struct physent_s +{ + char name[32]; // Name of model, or "player" or "world". + int player; + vec3_t origin; // Model's origin in world coordinates. + struct model_s *model; // only for bsp models + struct model_s *studiomodel; // SOLID_BBOX, but studio clip intersections. + vec3_t mins, maxs; // only for non-bsp models + int info; // For client or server to use to identify (index into edicts or cl_entities) + vec3_t angles; // rotated entities need this info for hull testing to work. + + int solid; // Triggers and func_door type WATER brushes are SOLID_NOT + int skin; // BSP Contents for such things like fun_door water brushes. + int rendermode; // So we can ignore glass + + float frame; + int sequence; + byte controller[4]; + byte blending[2]; + + int movetype; + int takedamage; + int blooddecal; + int team; + int classnumber; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + +} physent_t; + +typedef struct playermove_s +{ + int player_index; // So we don't try to run the PM_CheckStuck nudging too quickly. + qboolean server; // For debugging, are we running physics code on server side? + qboolean multiplayer; // 1 == multiplayer server + float time; // realtime on host, for reckoning duck timing + float frametime; // Duration of this frame + vec3_t forward, right, up; // Vectors for angles + vec3_t origin; // Movement origin. + vec3_t angles; // Movement view angles. + vec3_t oldangles; // Angles before movement view angles were looked at. + vec3_t velocity; // Current movement direction. + vec3_t movedir; // For waterjumping, a forced forward velocity so we can fly over lip of ledge. + vec3_t basevelocity; // Velocity of the conveyor we are standing, e.g. + vec3_t view_ofs; // For ducking/dead + // Our eye position. + float flDuckTime; // Time we started duck + qboolean bInDuck; // In process of ducking or ducked already? + int flTimeStepSound; // For walking/falling + // Next time we can play a step sound + int iStepLeft; + float flFallVelocity; + vec3_t punchangle; + float flSwimTime; + float flNextPrimaryAttack; + int effects; // MUZZLE FLASH, e.g. + int flags; // FL_ONGROUND, FL_DUCKING, etc. + int usehull; // 0 = regular player hull, 1 = ducked player hull, 2 = point hull + float gravity; // Our current gravity and friction. + float friction; + int oldbuttons; // Buttons last usercmd + float waterjumptime; // Amount of time left in jumping out of water cycle. + qboolean dead; // Are we a dead player? + int deadflag; + int spectator; // Should we use spectator physics model? + int movetype; // Our movement type, NOCLIP, WALK, FLY + int onground; // -1 = in air, else pmove entity number + int waterlevel; + int watertype; + int oldwaterlevel; + char sztexturename[256]; + char chtexturetype; + float maxspeed; + float clientmaxspeed; + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + int numphysent; // world state + // Number of entities to clip against. + physent_t physents[MAX_PHYSENTS]; + int nummoveent; // Number of momvement entities (ladders) + physent_t moveents[MAX_MOVEENTS]; // just a list of ladders + int numvisent; // All things being rendered, for tracing against things you don't actually collide with + physent_t visents[MAX_PHYSENTS]; + usercmd_t cmd; // input to run through physics. + int numtouch; // Trace results for objects we collided with. + pmtrace_t touchindex[MAX_PHYSENTS]; + char physinfo[MAX_PHYSINFO_STRING]; // Physics info string + struct movevars_s *movevars; + vec_t _player_mins[4][3]; + vec_t _player_maxs[4][3]; + + const char *(*PM_Info_ValueForKey)(const char *s, const char *key); + void (*PM_Particle)(float *origin, int color, float life, int zpos, int zvel); + int (*PM_TestPlayerPosition)(float *pos, pmtrace_t *ptrace); + void (*Con_NPrintf)(int idx, char *fmt, ...); + void (*Con_DPrintf)(char *fmt, ...); + void (*Con_Printf)(char *fmt, ...); + double (*Sys_FloatTime)(); + void (*PM_StuckTouch)(int hitent, pmtrace_t *ptraceresult); + int (*PM_PointContents)(float *p, int *truecontents); + int (*PM_TruePointContents)(float *p); + int (*PM_HullPointContents)(struct hull_s *hull, int num, float *p); + pmtrace_t (*PM_PlayerTrace)(float *start, float *end, int traceFlags, int ignore_pe); + struct pmtrace_s *(*PM_TraceLine)(float *start, float *end, int flags, int usehulll, int ignore_pe); + int32 (*RandomLong)(int32 lLow, int32 lHigh); + float (*RandomFloat)(float flLow, float flHigh); + int (*PM_GetModelType)(struct model_s *mod); + void (*PM_GetModelBounds)(struct model_s *mod, float *mins, float *maxs); + void *(*PM_HullForBsp)(physent_t *pe, float *offset); + float (*PM_TraceModel)(physent_t *pEnt, float *start, float *end, trace_t *trace); + int (*COM_FileSize)(char *filename); + byte *(*COM_LoadFile)(char *path, int usehunk, int *pLength); + void (*COM_FreeFile)(void *buffer); + char *(*memfgets)(byte *pMemFile, int fileSize, int *pFilePos, char *pBuffer, int bufferSize); + qboolean runfuncs; + void (*PM_PlaySound)(int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch); + const char *(*PM_TraceTexture)(int ground, float *vstart, float *vend); + void (*PM_PlaybackEventFull)(int flags, int clientindex, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2); + +} playermove_t; diff --git a/cssdk/pm_shared/pm_info.h b/cssdk/pm_shared/pm_info.h new file mode 100644 index 0000000..68375db --- /dev/null +++ b/cssdk/pm_shared/pm_info.h @@ -0,0 +1,30 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define MAX_PHYSINFO_STRING 256 diff --git a/cssdk/pm_shared/pm_materials.h b/cssdk/pm_shared/pm_materials.h new file mode 100644 index 0000000..6468273 --- /dev/null +++ b/cssdk/pm_shared/pm_materials.h @@ -0,0 +1,45 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define CTEXTURESMAX 1024 // max number of textures loaded +#define CBTEXTURENAMEMAX 17 // only load first n chars of name + +#define CHAR_TEX_CONCRETE 'C' // texture types +#define CHAR_TEX_METAL 'M' +#define CHAR_TEX_DIRT 'D' +#define CHAR_TEX_VENT 'V' +#define CHAR_TEX_GRATE 'G' +#define CHAR_TEX_TILE 'T' +#define CHAR_TEX_SLOSH 'S' +#define CHAR_TEX_WOOD 'W' +#define CHAR_TEX_COMPUTER 'P' +#define CHAR_TEX_GRASS 'X' +#define CHAR_TEX_GLASS 'Y' +#define CHAR_TEX_FLESH 'F' +#define CHAR_TEX_SNOW 'N' diff --git a/cssdk/pm_shared/pm_movevars.h b/cssdk/pm_shared/pm_movevars.h new file mode 100644 index 0000000..9d22d02 --- /dev/null +++ b/cssdk/pm_shared/pm_movevars.h @@ -0,0 +1,59 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +typedef struct movevars_s +{ + float gravity; // Gravity for map + float stopspeed; // Deceleration when not moving + float maxspeed; // Max allowed speed + float spectatormaxspeed; + float accelerate; // Acceleration factor + float airaccelerate; // Same for when in open air + float wateraccelerate; // Same for when in water + float friction; + float edgefriction; // Extra friction near dropofs + float waterfriction; // Less in water + float entgravity; // 1.0 + float bounce; // Wall bounce value. 1.0 + float stepsize; // sv_stepsize; + float maxvelocity; // maximum server velocity. + float zmax; // Max z-buffer range (for GL) + float waveHeight; // Water wave height (for GL) + qboolean footsteps; // Play footstep sounds + char skyName[32]; // Name of the sky map + float rollangle; + float rollspeed; + float skycolor_r; // Sky color + float skycolor_g; + float skycolor_b; + float skyvec_x; // Sky vector + float skyvec_y; + float skyvec_z; + +} movevars_t; diff --git a/cssdk/pm_shared/pm_shared.h b/cssdk/pm_shared/pm_shared.h new file mode 100644 index 0000000..73a5371 --- /dev/null +++ b/cssdk/pm_shared/pm_shared.h @@ -0,0 +1,75 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ +#pragma once + +#define PM_DEAD_VIEWHEIGHT -8 + +#define OBS_NONE 0 +#define OBS_CHASE_LOCKED 1 +#define OBS_CHASE_FREE 2 +#define OBS_ROAMING 3 +#define OBS_IN_EYE 4 +#define OBS_MAP_FREE 5 +#define OBS_MAP_CHASE 6 + +#define STEP_CONCRETE 0 +#define STEP_METAL 1 +#define STEP_DIRT 2 +#define STEP_VENT 3 +#define STEP_GRATE 4 +#define STEP_TILE 5 +#define STEP_SLOSH 6 +#define STEP_WADE 7 +#define STEP_LADDER 8 +#define STEP_SNOW 9 + +#define WJ_HEIGHT 8 +#define STOP_EPSILON 0.1 +#define MAX_CLIMB_SPEED 200 +#define PLAYER_DUCKING_MULTIPLIER 0.333 +#define PM_CHECKSTUCK_MINTIME 0.05 // Don't check again too quickly. + +#define PLAYER_LONGJUMP_SPEED 350.0f // how fast we longjump + +// Ducking time +#define TIME_TO_DUCK 0.4 +#define STUCK_MOVEUP 1 + +#define PM_VEC_DUCK_HULL_MIN -18 +#define PM_VEC_HULL_MIN -36 +#define PM_VEC_DUCK_VIEW 12 +#define PM_VEC_VIEW 17 + +#define PM_PLAYER_MAX_SAFE_FALL_SPEED 580 // approx 20 feet +#define PM_PLAYER_MIN_BOUNCE_SPEED 350 +#define PM_PLAYER_FALL_PUNCH_THRESHHOLD 250 // won't punch player's screen/make scrape noise unless player falling at least this fast. + +// Only allow bunny jumping up to 1.2x server / player maxspeed setting +#define BUNNYJUMP_MAX_SPEED_FACTOR 1.2f + +extern struct playermove_s *pmove; diff --git a/cssdk/public/FileSystem.h b/cssdk/public/FileSystem.h new file mode 100644 index 0000000..e1ce53c --- /dev/null +++ b/cssdk/public/FileSystem.h @@ -0,0 +1,189 @@ +//========= Copyright � 1996-2001, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef FILESYSTEM_H +#define FILESYSTEM_H +#ifdef _WIN32 +#pragma once +#endif + +#include "interface.h" +#include +#include + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +typedef FILE * FileHandle_t; +typedef int FileFindHandle_t; +typedef int WaitForResourcesHandle_t; + + +//----------------------------------------------------------------------------- +// Enums used by the interface +//----------------------------------------------------------------------------- +#ifndef FILESYSTEM_INTERNAL_H +typedef enum +{ + FILESYSTEM_SEEK_HEAD = 0, + FILESYSTEM_SEEK_CURRENT, + FILESYSTEM_SEEK_TAIL, +} FileSystemSeek_t; + +enum +{ + FILESYSTEM_INVALID_FIND_HANDLE = -1 +}; + +typedef enum +{ + // Don't print anything + FILESYSTEM_WARNING_QUIET = 0, + + // On shutdown, report names of files left unclosed + FILESYSTEM_WARNING_REPORTUNCLOSED, + + // Report number of times a file was opened, closed + FILESYSTEM_WARNING_REPORTUSAGE, + + // Report all open/close events to console ( !slow! ) + FILESYSTEM_WARNING_REPORTALLACCESSES +} FileWarningLevel_t; + +#define FILESYSTEM_INVALID_HANDLE ( FileHandle_t )0 +#endif + +// turn off any windows defines +#undef GetCurrentDirectory + +//----------------------------------------------------------------------------- +// Purpose: Main file system interface +//----------------------------------------------------------------------------- +class IFileSystem : public IBaseInterface +{ +public: + // Mount and unmount the filesystem + virtual void Mount( void ) = 0; + virtual void Unmount( void ) = 0; + + // Remove all search paths (including write path?) + virtual void RemoveAllSearchPaths( void ) = 0; + + // Add paths in priority order (mod dir, game dir, ....) + // If one or more .pak files are in the specified directory, then they are + // added after the file system path + // If the path is the relative path to a .bsp file, then any previous .bsp file + // override is cleared and the current .bsp is searched for an embedded PAK file + // and this file becomes the highest priority search path ( i.e., it's looked at first + // even before the mod's file system path ). + virtual void AddSearchPath( const char *pPath, const char *pathID ) = 0; + virtual bool RemoveSearchPath( const char *pPath ) = 0; + + // Deletes a file + virtual void RemoveFile( const char *pRelativePath, const char *pathID ) = 0; + + // this isn't implementable on STEAM as is. + virtual void CreateDirHierarchy( const char *path, const char *pathID ) = 0; + + // File I/O and info + virtual bool FileExists( const char *pFileName ) = 0; + virtual bool IsDirectory( const char *pFileName ) = 0; + + // opens a file + // if pathID is NULL, all paths will be searched for the file + virtual FileHandle_t Open( const char *pFileName, const char *pOptions, const char *pathID = 0L ) = 0; + + virtual void Close( FileHandle_t file ) = 0; + + virtual void Seek( FileHandle_t file, int pos, FileSystemSeek_t seekType ) = 0; + virtual unsigned int Tell( FileHandle_t file ) = 0; + + virtual unsigned int Size( FileHandle_t file ) = 0; + virtual unsigned int Size( const char *pFileName ) = 0; + + virtual long GetFileTime( const char *pFileName ) = 0; + virtual void FileTimeToString( char* pStrip, int maxCharsIncludingTerminator, long fileTime ) = 0; + + virtual bool IsOk( FileHandle_t file ) = 0; + + virtual void Flush( FileHandle_t file ) = 0; + virtual bool EndOfFile( FileHandle_t file ) = 0; + + virtual int Read( void* pOutput, int size, FileHandle_t file ) = 0; + virtual int Write( void const* pInput, int size, FileHandle_t file ) = 0; + virtual char *ReadLine( char *pOutput, int maxChars, FileHandle_t file ) = 0; + virtual int FPrintf( FileHandle_t file, char *pFormat, ... ) = 0; + + // direct filesystem buffer access + // returns a handle to a buffer containing the file data + // this is the optimal way to access the complete data for a file, + // since the file preloader has probably already got it in memory + virtual void *GetReadBuffer( FileHandle_t file, int *outBufferSize, bool failIfNotInCache ) = 0; + virtual void ReleaseReadBuffer( FileHandle_t file, void *readBuffer ) = 0; + + // FindFirst/FindNext + virtual const char *FindFirst( const char *pWildCard, FileFindHandle_t *pHandle, const char *pathID = 0L ) = 0; + virtual const char *FindNext( FileFindHandle_t handle ) = 0; + virtual bool FindIsDirectory( FileFindHandle_t handle ) = 0; + virtual void FindClose( FileFindHandle_t handle ) = 0; + + virtual void GetLocalCopy( const char *pFileName ) = 0; + + virtual const char *GetLocalPath( const char *pFileName, char *pLocalPath, int localPathBufferSize ) = 0; + + // Note: This is sort of a secondary feature; but it's really useful to have it here + virtual char *ParseFile( char* pFileBytes, char* pToken, bool* pWasQuoted ) = 0; + + // Returns true on success ( based on current list of search paths, otherwise false if it can't be resolved ) + virtual bool FullPathToRelativePath( const char *pFullpath, char *pRelative ) = 0; + + // Gets the current working directory + virtual bool GetCurrentDirectory( char* pDirectory, int maxlen ) = 0; + + // Dump to printf/OutputDebugString the list of files that have not been closed + virtual void PrintOpenedFiles( void ) = 0; + + virtual void SetWarningFunc( void (*pfnWarning)( const char *fmt, ... ) ) = 0; + virtual void SetWarningLevel( FileWarningLevel_t level ) = 0; + + virtual void LogLevelLoadStarted( const char *name ) = 0; + virtual void LogLevelLoadFinished( const char *name ) = 0; + virtual int HintResourceNeed( const char *hintlist, int forgetEverything ) = 0; + virtual int PauseResourcePreloading( void ) = 0; + virtual int ResumeResourcePreloading( void ) = 0; + virtual int SetVBuf( FileHandle_t stream, char *buffer, int mode, long size ) = 0; + virtual void GetInterfaceVersion( char *p, int maxlen ) = 0; + virtual bool IsFileImmediatelyAvailable(const char *pFileName) = 0; + + // starts waiting for resources to be available + // returns FILESYSTEM_INVALID_HANDLE if there is nothing to wait on + virtual WaitForResourcesHandle_t WaitForResources( const char *resourcelist ) = 0; + // get progress on waiting for resources; progress is a float [0, 1], complete is true on the waiting being done + // returns false if no progress is available + // any calls after complete is true or on an invalid handle will return false, 0.0f, true + virtual bool GetWaitForResourcesProgress( WaitForResourcesHandle_t handle, float *progress /* out */ , bool *complete /* out */ ) = 0; + // cancels a progress call + virtual void CancelWaitForResources( WaitForResourcesHandle_t handle ) = 0; + // returns true if the appID has all its caches fully preloaded + virtual bool IsAppReadyForOfflinePlay( int appID ) = 0; + + // interface for custom pack files > 4Gb + virtual bool AddPackFile( const char *fullpath, const char *pathID ) = 0; + + // open a file but force the data to come from the steam cache, NOT from disk + virtual FileHandle_t OpenFromCacheForRead( const char *pFileName, const char *pOptions, const char *pathID = 0L ) = 0; + + virtual void AddSearchPathNoWrite( const char *pPath, const char *pathID ) = 0; +}; + +// Steam3/Src compat +#define IBaseFileSystem IFileSystem + +#define FILESYSTEM_INTERFACE_VERSION "VFileSystem009" + +#endif // FILESYSTEM_H diff --git a/cssdk/public/basetypes.h b/cssdk/public/basetypes.h new file mode 100644 index 0000000..a953ffe --- /dev/null +++ b/cssdk/public/basetypes.h @@ -0,0 +1,287 @@ +//========= Copyright 1996-2001, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef BASETYPES_H +#define BASETYPES_H +#ifdef _WIN32 +#pragma once +#endif + +#include "osconfig.h" +#include "protected_things.h" +#include "commonmacros.h" + + +// For backward compatibilty only... +#include "tier0/platform.h" + +// stdio.h +#ifndef NULL +#define NULL 0 +#endif + + +#define ExecuteNTimes( nTimes, x ) \ + { \ + static int __executeCount=0;\ + if ( __executeCount < nTimes )\ + { \ + x; \ + ++__executeCount; \ + } \ + } + + +#define ExecuteOnce( x ) ExecuteNTimes( 1, x ) + + +// Pad a number so it lies on an N byte boundary. +// So PAD_NUMBER(0,4) is 0 and PAD_NUMBER(1,4) is 4 +#define PAD_NUMBER(number, boundary) \ + ( ((number) + ((boundary)-1)) / (boundary) ) * (boundary) + +#ifndef MATHLIB_H +// In case this ever changes +#define M_PI 3.14159265358979323846 + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif +#endif // MATHLIB_H + +#ifndef FALSE +#define FALSE 0 +#define TRUE (!FALSE) +#endif + + +typedef int BOOL; +typedef int qboolean; +typedef unsigned long ULONG; +typedef unsigned char BYTE; +typedef unsigned char byte; +typedef unsigned short word; + +typedef float vec_t; + + +// FIXME: this should move +#ifndef __cplusplus +#define true TRUE +#define false FALSE +#endif + +//----------------------------------------------------------------------------- +// look for NANs, infinities, and underflows. +// This assumes the ANSI/IEEE 754-1985 standard +//----------------------------------------------------------------------------- + +#ifdef __cplusplus + +inline unsigned long& FloatBits(vec_t& f) +{ + return *reinterpret_cast(&f); +} + +inline unsigned long const& FloatBits(vec_t const& f) +{ + return *reinterpret_cast(&f); +} + +inline vec_t BitsToFloat(unsigned long i) +{ + return *reinterpret_cast(&i); +} + +inline bool IsFinite(vec_t f) +{ + return ((FloatBits(f) & 0x7F800000) != 0x7F800000); +} + +inline unsigned long FloatAbsBits(vec_t f) +{ + return FloatBits(f) & 0x7FFFFFFF; +} + +inline float FloatMakeNegative(vec_t f) +{ + return BitsToFloat(FloatBits(f) | 0x80000000); +} + +#if defined( WIN32 ) + +//#include +// Just use prototype from math.h +#ifdef __cplusplus +extern "C" +{ +#endif + double __cdecl fabs(double); +#ifdef __cplusplus +} +#endif + +// In win32 try to use the intrinsic fabs so the optimizer can do it's thing inline in the code +#pragma intrinsic( fabs ) +// Also, alias float make positive to use fabs, too +// NOTE: Is there a perf issue with double<->float conversion? +inline float FloatMakePositive(vec_t f) +{ + return fabs(f); +} +#else +inline float FloatMakePositive(vec_t f) +{ + return BitsToFloat(FloatBits(f) & 0x7FFFFFFF); +} +#endif + +inline float FloatNegate(vec_t f) +{ + return BitsToFloat(FloatBits(f) ^ 0x80000000); +} + + +#define FLOAT32_NAN_BITS (unsigned long)0x7FC00000 // not a number! +#define FLOAT32_NAN BitsToFloat( FLOAT32_NAN_BITS ) + +#define VEC_T_NAN FLOAT32_NAN + +#endif + +// FIXME: why are these here? Hardly anyone actually needs them. +struct valve_color24 +{ + byte r, g, b; +}; + +typedef struct valve_color32_s +{ + bool operator!=(const struct valve_color32_s &other) const; + + byte r, g, b, a; +} valve_color32; + +inline bool valve_color32::operator!=(const valve_color32 &other) const +{ + return r != other.r || g != other.g || b != other.b || a != other.a; +} + +struct valve_colorRGBExp32 +{ + byte r, g, b; + signed char exponent; +}; + +struct valve_colorVec +{ + unsigned r, g, b, a; +}; + + +#ifndef UNUSED +#define UNUSED(x) (x = x) // for pesky compiler / lint warnings +#endif + +#ifdef __cplusplus + +struct vrect_t +{ + int x, y, width, height; + vrect_t *pnext; +}; + +#endif + + +//----------------------------------------------------------------------------- +// MaterialRect_t struct - used for DrawDebugText +//----------------------------------------------------------------------------- +struct Rect_t +{ + int x, y; + int width, height; +}; + + +//----------------------------------------------------------------------------- +// Declares a type-safe handle type; you can't assign one handle to the next +//----------------------------------------------------------------------------- + +// 32-bit pointer handles. + +// Typesafe 8-bit and 16-bit handles. +template< class HandleType > +class CBaseIntHandle +{ +public: + + inline bool operator==(const CBaseIntHandle &other) { return m_Handle == other.m_Handle; } + inline bool operator!=(const CBaseIntHandle &other) { return m_Handle != other.m_Handle; } + + // Only the code that doles out these handles should use these functions. + // Everyone else should treat them as a transparent type. + inline HandleType GetHandleValue() { return m_Handle; } + inline void SetHandleValue(HandleType val) { m_Handle = val; } + + typedef HandleType HANDLE_TYPE; + +protected: + + HandleType m_Handle; +}; + +template< class DummyType > +class CIntHandle16 : public CBaseIntHandle < unsigned short > +{ +public: + inline CIntHandle16() {} + + static inline CIntHandle16 MakeHandle(HANDLE_TYPE val) + { + return CIntHandle16(val); + } + +protected: + inline CIntHandle16(HANDLE_TYPE val) + { + m_Handle = val; + } +}; + + +template< class DummyType > +class CIntHandle32 : public CBaseIntHandle < unsigned long > +{ +public: + inline CIntHandle32() {} + + static inline CIntHandle32 MakeHandle(HANDLE_TYPE val) + { + return CIntHandle32(val); + } + +protected: + inline CIntHandle32(HANDLE_TYPE val) + { + m_Handle = val; + } +}; + + +// NOTE: This macro is the same as windows uses; so don't change the guts of it +#define DECLARE_HANDLE_16BIT(name) typedef CIntHandle16< struct name##__handle * > name; +#define DECLARE_HANDLE_32BIT(name) typedef CIntHandle32< struct name##__handle * > name; + +#define DECLARE_POINTER_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name +#define FORWARD_DECLARE_HANDLE(name) typedef struct name##__ *name + +#endif // BASETYPES_H diff --git a/cssdk/public/commonmacros.h b/cssdk/public/commonmacros.h new file mode 100644 index 0000000..6bc9675 --- /dev/null +++ b/cssdk/public/commonmacros.h @@ -0,0 +1,30 @@ +#ifndef COMMONMACROS_H +#define COMMONMACROS_H +#pragma once + + +// ------------------------------------------------------- +// +// commonmacros.h +// +// This should contain ONLY general purpose macros that are +// appropriate for use in engine/launcher/all tools +// +// ------------------------------------------------------- + +#include "osconfig.h" +// Makes a 4-byte "packed ID" int out of 4 characters +#define MAKEID(d,c,b,a) ( ((int)(a) << 24) | ((int)(b) << 16) | ((int)(c) << 8) | ((int)(d)) ) + +// Compares a string with a 4-byte packed ID constant +#define STRING_MATCHES_ID( p, id ) ( (*((int *)(p)) == (id) ) ? true : false ) +#define ID_TO_STRING( id, p ) ( (p)[3] = (((id)>>24) & 0xFF), (p)[2] = (((id)>>16) & 0xFF), (p)[1] = (((id)>>8) & 0xFF), (p)[0] = (((id)>>0) & 0xFF) ) + +#define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + +// Keeps clutter down a bit, when using a float as a bit-vector +#define SETBITS(flBitVector, bits) ((flBitVector) = (int)(flBitVector) | (bits)) +#define CLEARBITS(flBitVector, bits) ((flBitVector) = (int)(flBitVector) & ~(bits)) +#define FBitSet(flBitVector, bit) ((flBitVector) & (bit)) + +#endif // COMMONMACROS_H diff --git a/cssdk/public/interface.cpp b/cssdk/public/interface.cpp new file mode 100644 index 0000000..9a12eef --- /dev/null +++ b/cssdk/public/interface.cpp @@ -0,0 +1,263 @@ +#include "precompiled.h" +#include "interface.h" + +#if !defined ( _WIN32 ) +// Linux doesn't have this function so this emulates its functionality +// +// +void *GetModuleHandle(const char *name) +{ + void *handle; + + if (name == NULL) + { + // hmm, how can this be handled under linux.... + // is it even needed? + return NULL; + } + + if ((handle=dlopen(name, RTLD_NOW)) == NULL) + { + //printf("Error:%s\n",dlerror()); + // couldn't open this file + return NULL; + } + + // read "man dlopen" for details + // in short dlopen() inc a ref count + // so dec the ref count by performing the close + dlclose(handle); + return handle; +} +#endif + +// ------------------------------------------------------------------------------------ // +// InterfaceReg. +// ------------------------------------------------------------------------------------ // +InterfaceReg *InterfaceReg::s_pInterfaceRegs = NULL; + + +InterfaceReg::InterfaceReg( InstantiateInterfaceFn fn, const char *pName ) : m_pName(pName) +{ + m_CreateFn = fn; + m_pNext = s_pInterfaceRegs; + s_pInterfaceRegs = this; +} + + + +// ------------------------------------------------------------------------------------ // +// CreateInterface. +// ------------------------------------------------------------------------------------ // +EXPORT_FUNCTION IBaseInterface *CreateInterface( const char *pName, int *pReturnCode ) +{ + InterfaceReg *pCur; + + for(pCur=InterfaceReg::s_pInterfaceRegs; pCur; pCur=pCur->m_pNext) + { + if(strcmp(pCur->m_pName, pName) == 0) + { + if ( pReturnCode ) + { + *pReturnCode = IFACE_OK; + } + return pCur->m_CreateFn(); + } + } + + if ( pReturnCode ) + { + *pReturnCode = IFACE_FAILED; + } + return NULL; +} + +#ifdef LINUX +static IBaseInterface *CreateInterfaceLocal( const char *pName, int *pReturnCode ) +{ + InterfaceReg *pCur; + + for(pCur=InterfaceReg::s_pInterfaceRegs; pCur; pCur=pCur->m_pNext) + { + if(strcmp(pCur->m_pName, pName) == 0) + { + if ( pReturnCode ) + { + *pReturnCode = IFACE_OK; + } + return pCur->m_CreateFn(); + } + } + + if ( pReturnCode ) + { + *pReturnCode = IFACE_FAILED; + } + return NULL; +} +#endif + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include "windows.h" +#endif + +//----------------------------------------------------------------------------- +// Purpose: returns a pointer to a function, given a module +// Input : pModuleName - module name +// *pName - proc name +//----------------------------------------------------------------------------- +//static hlds_run wants to use this function +void *Sys_GetProcAddress( const char *pModuleName, const char *pName ) +{ + return GetProcAddress( GetModuleHandle(pModuleName), pName ); +} + +//----------------------------------------------------------------------------- +// Purpose: returns a pointer to a function, given a module +// Input : pModuleName - module name +// *pName - proc name +//----------------------------------------------------------------------------- +// hlds_run wants to use this function +void *Sys_GetProcAddress( void *pModuleHandle, const char *pName ) +{ +#if defined ( _WIN32 ) + return GetProcAddress( (HINSTANCE)pModuleHandle, pName ); +#else + return GetProcAddress( pModuleHandle, pName ); +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: Loads a DLL/component from disk and returns a handle to it +// Input : *pModuleName - filename of the component +// Output : opaque handle to the module (hides system dependency) +//----------------------------------------------------------------------------- +CSysModule *Sys_LoadModule( const char *pModuleName ) +{ +#if defined ( _WIN32 ) + HMODULE hDLL = LoadLibrary( pModuleName ); +#else + HMODULE hDLL = NULL; + char szAbsoluteModuleName[1024]; + szAbsoluteModuleName[0] = 0; + if ( pModuleName[0] != '/' ) + { + char szCwd[1024]; + char szAbsoluteModuleName[1024]; + + getcwd( szCwd, sizeof( szCwd ) ); + if ( szCwd[ strlen( szCwd ) - 1 ] == '/' ) + szCwd[ strlen( szCwd ) - 1 ] = 0; + + _snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/%s", szCwd, pModuleName ); + + hDLL = dlopen( szAbsoluteModuleName, RTLD_NOW ); + } + else + { + _snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s", pModuleName ); + hDLL = dlopen( pModuleName, RTLD_NOW ); + } +#endif + + if( !hDLL ) + { + char str[512]; +#if defined ( _WIN32 ) + _snprintf( str, sizeof(str), "%s.dll", pModuleName ); + hDLL = LoadLibrary( str ); +#elif defined(OSX) + printf("Error:%s\n",dlerror()); + _snprintf( str, sizeof(str), "%s.dylib", szAbsoluteModuleName ); + hDLL = dlopen(str, RTLD_NOW); +#else + printf("Error:%s\n",dlerror()); + _snprintf( str, sizeof(str), "%s.so", szAbsoluteModuleName ); + hDLL = dlopen(str, RTLD_NOW); +#endif + } + + return reinterpret_cast(hDLL); +} + +//----------------------------------------------------------------------------- +// Purpose: Unloads a DLL/component from +// Input : *pModuleName - filename of the component +// Output : opaque handle to the module (hides system dependency) +//----------------------------------------------------------------------------- +void Sys_UnloadModule( CSysModule *pModule ) +{ + if ( !pModule ) + return; + + HMODULE hDLL = reinterpret_cast(pModule); +#if defined ( _WIN32 ) + FreeLibrary( hDLL ); +#else + dlclose((void *)hDLL); +#endif + +} + +//----------------------------------------------------------------------------- +// Purpose: returns a pointer to a function, given a module +// Input : module - windows HMODULE from Sys_LoadModule() +// *pName - proc name +// Output : factory for this module +//----------------------------------------------------------------------------- +CreateInterfaceFn Sys_GetFactory( CSysModule *pModule ) +{ + if ( !pModule ) + return NULL; + + HMODULE hDLL = reinterpret_cast(pModule); +#if defined ( _WIN32 ) + return reinterpret_cast(GetProcAddress( hDLL, CREATEINTERFACE_PROCNAME )); +#else +// Linux gives this error: +//../public/interface.cpp: In function `IBaseInterface *(*Sys_GetFactory +//(CSysModule *)) (const char *, int *)': +//../public/interface.cpp:154: ISO C++ forbids casting between +//pointer-to-function and pointer-to-object +// +// so lets get around it :) + return (CreateInterfaceFn)(GetProcAddress( hDLL, CREATEINTERFACE_PROCNAME )); +#endif +} + + + +//----------------------------------------------------------------------------- +// Purpose: returns the instance of this module +// Output : interface_instance_t +//----------------------------------------------------------------------------- +CreateInterfaceFn Sys_GetFactoryThis( void ) +{ +#ifdef LINUX + return CreateInterfaceLocal; +#else + return CreateInterface; +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: returns the instance of the named module +// Input : *pModuleName - name of the module +// Output : interface_instance_t - instance of that module +//----------------------------------------------------------------------------- +CreateInterfaceFn Sys_GetFactory( const char *pModuleName ) +{ +#if defined ( _WIN32 ) + return static_cast( Sys_GetProcAddress( pModuleName, CREATEINTERFACE_PROCNAME ) ); +#else +// Linux gives this error: +//../public/interface.cpp: In function `IBaseInterface *(*Sys_GetFactory +//(const char *)) (const char *, int *)': +//../public/interface.cpp:186: invalid static_cast from type `void *' to +//type `IBaseInterface *(*) (const char *, int *)' +// +// so lets use the old style cast. + return (CreateInterfaceFn)( Sys_GetProcAddress( pModuleName, CREATEINTERFACE_PROCNAME ) ); +#endif +} diff --git a/cssdk/public/interface.h b/cssdk/public/interface.h new file mode 100644 index 0000000..3349146 --- /dev/null +++ b/cssdk/public/interface.h @@ -0,0 +1,150 @@ + +// This header defines the interface convention used in the valve engine. +// To make an interface and expose it: +// 1. Derive from IBaseInterface. +// 2. The interface must be ALL pure virtuals, and have no data members. +// 3. Define a name for it. +// 4. In its implementation file, use EXPOSE_INTERFACE or EXPOSE_SINGLE_INTERFACE. + +// Versioning +// There are two versioning cases that are handled by this: +// 1. You add functions to the end of an interface, so it is binary compatible with the previous interface. In this case, +// you need two EXPOSE_INTERFACEs: one to expose your class as the old interface and one to expose it as the new interface. +// 2. You update an interface so it's not compatible anymore (but you still want to be able to expose the old interface +// for legacy code). In this case, you need to make a new version name for your new interface, and make a wrapper interface and +// expose it for the old interface. + +//#if _MSC_VER >= 1300 // VC7 +//#include "tier1/interface.h" +//#else + +#ifndef INTERFACE_H +#define INTERFACE_H + +#if !defined ( _WIN32 ) + +#include // dlopen,dlclose, et al +#include + +#define HMODULE void * +#define GetProcAddress dlsym + +#define _snprintf snprintf + +#endif + +void *Sys_GetProcAddress(const char *pModuleName, const char *pName); +void *Sys_GetProcAddress(void *pModuleHandle, const char *pName); + +// All interfaces derive from this. +class IBaseInterface +{ +public: + + virtual ~IBaseInterface() {} +}; + + +#define CREATEINTERFACE_PROCNAME "CreateInterface" +typedef IBaseInterface* (*CreateInterfaceFn)(const char *pName, int *pReturnCode); + + +typedef IBaseInterface* (*InstantiateInterfaceFn)(); + + +// Used internally to register classes. +class InterfaceReg +{ +public: + InterfaceReg(InstantiateInterfaceFn fn, const char *pName); + +public: + + InstantiateInterfaceFn m_CreateFn; + const char *m_pName; + + InterfaceReg *m_pNext; // For the global list. + static InterfaceReg *s_pInterfaceRegs; +}; + + +// Use this to expose an interface that can have multiple instances. +// e.g.: +// EXPOSE_INTERFACE( CInterfaceImp, IInterface, "MyInterface001" ) +// This will expose a class called CInterfaceImp that implements IInterface (a pure class) +// clients can receive a pointer to this class by calling CreateInterface( "MyInterface001" ) +// +// In practice, the shared header file defines the interface (IInterface) and version name ("MyInterface001") +// so that each component can use these names/vtables to communicate +// +// A single class can support multiple interfaces through multiple inheritance +// +// Use this if you want to write the factory function. +#define EXPOSE_INTERFACE_FN(functionName, interfaceName, versionName) \ + static InterfaceReg __g_Create##className##_reg(functionName, versionName); + +#define EXPOSE_INTERFACE(className, interfaceName, versionName) \ + static IBaseInterface* __Create##className##_interface() {return (interfaceName *)new className;}\ + static InterfaceReg __g_Create##className##_reg(__Create##className##_interface, versionName ); + +// Use this to expose a singleton interface with a global variable you've created. +#define EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, globalVarName) \ + static IBaseInterface* __Create##className##interfaceName##_interface() {return (IBaseInterface *)&globalVarName;}\ + static InterfaceReg __g_Create##className##interfaceName##_reg(__Create##className##interfaceName##_interface, versionName); + +// Use this to expose a singleton interface. This creates the global variable for you automatically. +#define EXPOSE_SINGLE_INTERFACE(className, interfaceName, versionName) \ + static className __g_##className##_singleton;\ + EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, __g_##className##_singleton) + + +#ifdef _WIN32 + #define EXPORT_FUNCTION __declspec(dllexport) +#else + #define EXPORT_FUNCTION __attribute__ ((visibility("default"))) +#endif + + +// This function is automatically exported and allows you to access any interfaces exposed with the above macros. +// if pReturnCode is set, it will return one of the following values +// extend this for other error conditions/code +enum +{ + IFACE_OK = 0, + IFACE_FAILED +}; + + +extern "C" +{ + EXPORT_FUNCTION IBaseInterface* CreateInterface(const char *pName, int *pReturnCode); +}; + + +extern CreateInterfaceFn Sys_GetFactoryThis( void ); + + +//----------------------------------------------------------------------------- +// UNDONE: This is obsolete, use the module load/unload/get instead!!! +//----------------------------------------------------------------------------- +extern CreateInterfaceFn Sys_GetFactory( const char *pModuleName ); + + +// load/unload components +class CSysModule; + +//----------------------------------------------------------------------------- +// Load & Unload should be called in exactly one place for each module +// The factory for that module should be passed on to dependent components for +// proper versioning. +//----------------------------------------------------------------------------- +extern CSysModule *Sys_LoadModule( const char *pModuleName ); +extern void Sys_UnloadModule( CSysModule *pModule ); + +extern CreateInterfaceFn Sys_GetFactory( CSysModule *pModule ); + + +#endif +//#endif // MSVC 6.0 + + diff --git a/cssdk/public/protected_things.h b/cssdk/public/protected_things.h new file mode 100644 index 0000000..201438e --- /dev/null +++ b/cssdk/public/protected_things.h @@ -0,0 +1,187 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef PROTECTED_THINGS_H +#define PROTECTED_THINGS_H +#ifdef _WIN32 +#pragma once +#endif + + +// This header tries to prevent people from using potentially dangerous functions +// (like the notorious non-null-terminating strncpy) and functions that will break +// VCR mode (like time, input, registry, etc). +// +// This header should be included by ALL of our source code. + +// Eventually, ALL of these should be protected, but one man can only accomplish so much in +// one day AND work on features too! +#if defined( PROTECT_STRING_FUNCTIONS ) +#if defined( strncpy ) +#undef strncpy +#endif +#define strncpy strncpy__HEY_YOU__USE_VSTDLIB + + +#if defined( _snprintf ) +#undef _snprintf +#endif +#define _snprintf snprintf__HEY_YOU__USE_VSTDLIB + + +#if defined( sprintf ) +#undef sprintf +#endif +#define sprintf sprintf__HEY_YOU__USE_VSTDLIB + + +#if defined( _vsnprintf ) +#undef _vsnprintf +#endif +#define _vsnprintf vsnprintf__HEY_YOU__USE_VSTDLIB + + +#if defined( strcat ) +#undef strcat +#endif +#define strcat strcat__HEY_YOU__USE_VSTDLIB +#endif + + +#if defined( PROTECT_FILEIO_FUNCTIONS ) +#if defined( fopen ) +#undef fopen +#endif +#define fopen fopen_USE_FILESYSTEM_INSTEAD +#endif + + +#if defined( PROTECTED_THINGS_ENABLE ) + +#if defined( GetTickCount ) +#undef GetTickCount +#endif +#define GetTickCount GetTickCount__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( timeGetTime ) +#undef timeGetTime +#endif +#define timeGetTime timeGetTime__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( clock ) +#undef clock +#endif +#define time time__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( recvfrom ) +#undef recvfrom +#endif +#define recvfrom recvfrom__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( GetCursorPos ) +#undef GetCursorPos +#endif +#define GetCursorPos GetCursorPos__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( ScreenToClient ) +#undef ScreenToClient +#endif +#define ScreenToClient ScreenToClient__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( GetCommandLine ) +#undef GetCommandLine +#endif +#define GetCommandLine GetCommandLine__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegOpenKeyEx ) +#undef RegOpenKeyEx +#endif +#define RegOpenKeyEx RegOpenKeyEx__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegOpenKey ) +#undef RegOpenKey +#endif +#define RegOpenKey RegOpenKey__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegSetValueEx ) +#undef RegSetValueEx +#endif +#define RegSetValueEx RegSetValueEx__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegSetValue ) +#undef RegSetValue +#endif +#define RegSetValue RegSetValue__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegQueryValueEx ) +#undef RegQueryValueEx +#endif +#define RegQueryValueEx RegQueryValueEx__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegQueryValue ) +#undef RegQueryValue +#endif +#define RegQueryValue RegQueryValue__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegCreateKeyEx ) +#undef RegCreateKeyEx +#endif +#define RegCreateKeyEx RegCreateKeyEx__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegCreateKey ) +#undef RegCreateKey +#endif +#define RegCreateKey RegCreateKey__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( RegCloseKey ) +#undef RegCloseKey +#endif +#define RegCloseKey RegCloseKey__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( GetNumberOfConsoleInputEvents ) +#undef GetNumberOfConsoleInputEvents +#endif +#define GetNumberOfConsoleInputEvents GetNumberOfConsoleInputEvents__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( ReadConsoleInput ) +#undef ReadConsoleInput +#endif +#define ReadConsoleInput ReadConsoleInput__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( GetAsyncKeyState ) +#undef GetAsyncKeyState +#endif +#define GetAsyncKeyState GetAsyncKeyState__HEY_YOU__USE_PLATFORM_LIB + + +#if defined( GetKeyState ) +#undef GetKeyState +#endif +#define GetKeyState GetKeyState__HEY_YOU__USE_PLATFORM_LIB + +#endif + + +#endif // PROTECTED_THINGS_H diff --git a/cssdk/public/tier0/dbg.cpp b/cssdk/public/tier0/dbg.cpp new file mode 100644 index 0000000..bca4c42 --- /dev/null +++ b/cssdk/public/tier0/dbg.cpp @@ -0,0 +1,444 @@ +//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. =========== +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +// $Header: $ +// $NoKeywords: $ +// +// The main debug library implementation +//============================================================================= + +#include "precompiled.h" +#include +#include +#include +#include +#include +#include +#include "tier0/dbg.h" +#include + + + +//----------------------------------------------------------------------------- +// internal structures +//----------------------------------------------------------------------------- + +#define MAX_GROUP_NAME_LENGTH 48 +//enum +//{ +// MAX_GROUP_NAME_LENGTH = 48 +//}; + +struct SpewGroup_t +{ + char m_GroupName[MAX_GROUP_NAME_LENGTH]; + int m_Level; +}; + + +//----------------------------------------------------------------------------- +// Templates to assist in validating pointers: + +void _AssertValidReadPtr(void* ptr, int count/* = 1*/) +{ +#ifdef _WIN32 + Assert(!IsBadReadPtr(ptr, count)); +#else + Assert(ptr); +#endif + +} + +void _AssertValidWritePtr(void* ptr, int count/* = 1*/) +{ +#ifdef _WIN32 + Assert(!IsBadWritePtr(ptr, count)); +#else + Assert(ptr); +#endif +} + +void _AssertValidReadWritePtr(void* ptr, int count/* = 1*/) +{ +#ifdef _WIN32 + Assert(!(IsBadWritePtr(ptr, count) || IsBadReadPtr(ptr, count))); +#else + Assert(ptr); +#endif +} + +void AssertValidStringPtr(const char* ptr, int maxchar/* = 0xFFFFFF */) +{ +#ifdef _WIN32 + Assert(!IsBadStringPtr(ptr, maxchar)); +#else + Assert(ptr); +#endif +} + + +//----------------------------------------------------------------------------- +// globals +//----------------------------------------------------------------------------- + +SpewRetval_t DefaultSpewFunc(SpewType_t type, char const *pMsg) +{ + printf("%s", pMsg); + if (type == SPEW_ASSERT) + return SPEW_DEBUGGER; + else if (type == SPEW_ERROR) + return SPEW_ABORT; + else + return SPEW_CONTINUE; +} + +static SpewOutputFunc_t s_SpewOutputFunc = DefaultSpewFunc; + +static char const* s_pFileName; +static int s_Line; +static SpewType_t s_SpewType; + +static SpewGroup_t* s_pSpewGroups = 0; +static int s_GroupCount = 0; +static int s_DefaultLevel = 0; + + + +//----------------------------------------------------------------------------- +// Spew output management. +//----------------------------------------------------------------------------- + +void SpewOutputFunc(SpewOutputFunc_t func) +{ + s_SpewOutputFunc = func ? func : DefaultSpewFunc; +} + +SpewOutputFunc_t GetSpewOutputFunc(void) +{ + if (s_SpewOutputFunc) + { + return s_SpewOutputFunc; + } + else + { + return DefaultSpewFunc; + } +} + +//----------------------------------------------------------------------------- +// Spew functions +//----------------------------------------------------------------------------- + +void _SpewInfo(SpewType_t type, char const* pFile, int line) +{ + // Only grab the file name. Ignore the path. + char const* pSlash = strrchr(pFile, '\\'); + char const* pSlash2 = strrchr(pFile, '/'); + if (pSlash < pSlash2) pSlash = pSlash2; + + s_pFileName = pSlash ? pSlash + 1 : pFile; + s_Line = line; + s_SpewType = type; +} + +SpewRetval_t _SpewMessage(SpewType_t spewType, char const* pMsgFormat, va_list args) +{ + char pTempBuffer[1024]; + + /* Printf the file and line for warning + assert only... */ + int len = 0; + if ((spewType == SPEW_ASSERT)) + { + len = sprintf(pTempBuffer, "%s (%d) : ", s_pFileName, s_Line); + } + + /* Create the message.... */ + len += vsprintf(&pTempBuffer[len], pMsgFormat, args); + + // Add \n for warning and assert + if ((spewType == SPEW_ASSERT)) + { + len += sprintf(&pTempBuffer[len], "\n"); + } + + assert(len < 1024); /* use normal assert here; to avoid recursion. */ + assert(s_SpewOutputFunc); + + /* direct it to the appropriate target(s) */ + SpewRetval_t ret = s_SpewOutputFunc(spewType, pTempBuffer); + switch (ret) + { + // Put the break into the macro so it would occur in the right place + // case SPEW_DEBUGGER: + // DebuggerBreak(); + // break; + + case SPEW_ABORT: + // MessageBox(NULL,"Error in _SpewMessage","Error",MB_OK); + exit(0); + } + + return ret; +} + +SpewRetval_t _SpewMessage(char const* pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + SpewRetval_t ret = _SpewMessage(s_SpewType, pMsgFormat, args); + va_end(args); + return ret; +} + +SpewRetval_t _DSpewMessage(char const *pGroupName, int level, char const* pMsgFormat, ...) +{ + if (!IsSpewActive(pGroupName, level)) + return SPEW_CONTINUE; + + va_list args; + va_start(args, pMsgFormat); + SpewRetval_t ret = _SpewMessage(s_SpewType, pMsgFormat, args); + va_end(args); + return ret; +} + +void Msg(char const* pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_MESSAGE, pMsgFormat, args); + va_end(args); +} + +void DMsg(char const *pGroupName, int level, char const *pMsgFormat, ...) +{ + if (!IsSpewActive(pGroupName, level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_MESSAGE, pMsgFormat, args); + va_end(args); +} + +void Warning(char const *pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_WARNING, pMsgFormat, args); + va_end(args); +} + +void DWarning(char const *pGroupName, int level, char const *pMsgFormat, ...) +{ + if (!IsSpewActive(pGroupName, level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_WARNING, pMsgFormat, args); + va_end(args); +} + +void Log(char const *pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_LOG, pMsgFormat, args); + va_end(args); +} + +void DLog(char const *pGroupName, int level, char const *pMsgFormat, ...) +{ + if (!IsSpewActive(pGroupName, level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_LOG, pMsgFormat, args); + va_end(args); +} + +void Error(char const *pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_ERROR, pMsgFormat, args); + va_end(args); +} + + +//----------------------------------------------------------------------------- +// A couple of super-common dynamic spew messages, here for convenience +// These looked at the "developer" group, print if it's level 1 or higher +//----------------------------------------------------------------------------- + +void DevMsg(int level, char const* pMsgFormat, ...) +{ + if (!IsSpewActive("developer", level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_MESSAGE, pMsgFormat, args); + va_end(args); +} + +void DevWarning(int level, char const *pMsgFormat, ...) +{ + if (!IsSpewActive("developer", level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_WARNING, pMsgFormat, args); + va_end(args); +} + +void DevLog(int level, char const *pMsgFormat, ...) +{ + if (!IsSpewActive("developer", level)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_LOG, pMsgFormat, args); + va_end(args); +} + +void DevMsg(char const *pMsgFormat, ...) +{ + if (!IsSpewActive("developer", 1)) + return; + + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_MESSAGE, pMsgFormat, args); + va_end(args); +} + +void DevWarning(char const *pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_WARNING, pMsgFormat, args); + va_end(args); +} + +void DevLog(char const *pMsgFormat, ...) +{ + va_list args; + va_start(args, pMsgFormat); + _SpewMessage(SPEW_LOG, pMsgFormat, args); + va_end(args); +} + +//----------------------------------------------------------------------------- +// Find a group, return true if found, false if not. Return in ind the +// index of the found group, or the index of the group right before where the +// group should be inserted into the list to maintain sorted order. +//----------------------------------------------------------------------------- + +bool FindSpewGroup(char const* pGroupName, int* pInd) +{ + int s = 0; + if (s_GroupCount) + { + int e = (int)(s_GroupCount - 1); + while (s <= e) + { + int m = (s + e) >> 1; + int cmp = Q_stricmp(pGroupName, s_pSpewGroups[m].m_GroupName); + if (!cmp) + { + *pInd = m; + return true; + } + if (cmp < 0) + e = m - 1; + else + s = m + 1; + } + } + *pInd = s; + return false; +} + + +//----------------------------------------------------------------------------- +// Sets the priority level for a spew group +//----------------------------------------------------------------------------- + +void SpewActivate(char const* pGroupName, int level) +{ + Assert(pGroupName); + + // check for the default group first... + if ((pGroupName[0] == '*') && (pGroupName[1] == '\0')) + { + s_DefaultLevel = level; + return; + } + + // Normal case, search in group list using binary search. + // If not found, grow the list of groups and insert it into the + // right place to maintain sorted order. Then set the level. + int ind; + if (!FindSpewGroup(pGroupName, &ind)) + { + // not defined yet, insert an entry. + ++s_GroupCount; + if (s_pSpewGroups) + { + s_pSpewGroups = (SpewGroup_t*)realloc(s_pSpewGroups, + s_GroupCount * sizeof(SpewGroup_t)); + + // shift elements down to preserve order + int numToMove = s_GroupCount - ind - 1; + memmove(&s_pSpewGroups[ind + 1], &s_pSpewGroups[ind], + numToMove * sizeof(SpewGroup_t)); + } + else + s_pSpewGroups = (SpewGroup_t*)malloc(s_GroupCount * sizeof(SpewGroup_t)); + + Assert(strlen(pGroupName) < MAX_GROUP_NAME_LENGTH); + strcpy(s_pSpewGroups[ind].m_GroupName, pGroupName); + } + s_pSpewGroups[ind].m_Level = level; +} + + +//----------------------------------------------------------------------------- +// Tests to see if a particular spew is active +//----------------------------------------------------------------------------- + +bool IsSpewActive(char const* pGroupName, int level) +{ + // If we don't find the spew group, use the default level. + int ind; + if (FindSpewGroup(pGroupName, &ind)) + return s_pSpewGroups[ind].m_Level >= level; + else + return s_DefaultLevel >= level; +} + + +// If we don't have a function from math.h, then it doesn't link certain floating-point +// functions in and printfs with %f cause runtime errors in the C libraries. +float CrackSmokingCompiler(float a) +{ + return fabs(a); +} + +void* Plat_SimpleLog(const char* file, int line) +{ + FILE* f = fopen("simple.log", "at+"); + fprintf(f, "%s:%i\n", file, line); + fclose(f); + + return NULL; +} \ No newline at end of file diff --git a/cssdk/public/tier0/dbg.h b/cssdk/public/tier0/dbg.h new file mode 100644 index 0000000..23b7b14 --- /dev/null +++ b/cssdk/public/tier0/dbg.h @@ -0,0 +1,451 @@ +//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. =========== +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +// $Header: $ +// $NoKeywords: $ +// +// The main debug library interfaces +//============================================================================= + + +#ifndef DBG_H +#define DBG_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "osconfig.h" +#include "basetypes.h" +#include "tier0/platform.h" +#include +#include +#include + +//----------------------------------------------------------------------------- +// dll export stuff +//----------------------------------------------------------------------------- + +#ifdef TIER0_DLL_EXPORT +#define DBG_INTERFACE DLL_EXPORT +#define DBG_OVERLOAD DLL_GLOBAL_EXPORT +#define DBG_CLASS DLL_CLASS_EXPORT +#else +#define DBG_INTERFACE DLL_IMPORT +#define DBG_OVERLOAD DLL_GLOBAL_IMPORT +#define DBG_CLASS DLL_CLASS_IMPORT +#endif + + +//----------------------------------------------------------------------------- +// Usage model for the Dbg library +// +// 1. Spew. +// +// Spew can be used in a static and a dynamic mode. The static +// mode allows us to display assertions and other messages either only +// in debug builds, or in non-release builds. The dynamic mode allows us to +// turn on and off certain spew messages while the application is running. +// +// Static Spew messages: +// +// Assertions are used to detect and warn about invalid states +// Spews are used to display a particular status/warning message. +// +// To use an assertion, use +// +// Assert( (f == 5) ); +// AssertMsg( (f == 5), ("F needs to be %d here!\n", 5) ); +// AssertFunc( (f == 5), BadFunc() ); +// AssertEquals( f, 5 ); +// AssertFloatEquals( f, 5.0f, 1e-3 ); +// +// The first will simply report that an assertion failed on a particular +// code file and line. The second version will display a print-f formatted message +// along with the file and line, the third will display a generic message and +// will also cause the function BadFunc to be executed, and the last two +// will report an error if f is not equal to 5 (the last one asserts within +// a particular tolerance). +// +// To use a warning, use +// +// Warning("Oh I feel so %s all over\n", "yummy"); +// +// Warning will do its magic in only Debug builds. To perform spew in *all* +// builds, use RelWarning. +// +// Three other spew types, Msg, Log, and Error, are compiled into all builds. +// These error types do *not* need two sets of parenthesis. +// +// Msg( "Isn't this exciting %d?", 5 ); +// Error( "I'm just thrilled" ); +// +// Dynamic Spew messages +// +// It is possible to dynamically turn spew on and off. Dynamic spew is +// identified by a spew group and priority level. To turn spew on for a +// particular spew group, use SpewActivate( "group", level ). This will +// cause all spew in that particular group with priority levels <= the +// level specified in the SpewActivate function to be printed. Use DSpew +// to perform the spew: +// +// DWarning( "group", level, "Oh I feel even yummier!\n" ); +// +// Priority level 0 means that the spew will *always* be printed, and group +// '*' is the default spew group. If a DWarning is encountered using a group +// whose priority has not been set, it will use the priority of the default +// group. The priority of the default group is initially set to 0. +// +// Spew output +// +// The output of the spew system can be redirected to an externally-supplied +// function which is responsible for outputting the spew. By default, the +// spew is simply printed using printf. +// +// To redirect spew output, call SpewOutput. +// +// SpewOutputFunc( OutputFunc ); +// +// This will cause OutputFunc to be called every time a spew message is +// generated. OutputFunc will be passed a spew type and a message to print. +// It must return a value indicating whether the debugger should be invoked, +// whether the program should continue running, or whether the program +// should abort. +// +// 2. Code activation +// +// To cause code to be run only in debug builds, use DBG_CODE: +// An example is below. +// +// DBG_CODE( +// { +// int x = 5; +// ++x; +// } +// ); +// +// Code can be activated based on the dynamic spew groups also. Use +// +// DBG_DCODE( "group", level, +// { int x = 5; ++x; } +// ); +// +// 3. Breaking into the debugger. +// +// To cause an unconditional break into the debugger in debug builds only, use DBG_BREAK +// +// DBG_BREAK(); +// +// You can force a break in any build (release or debug) using +// +// DebuggerBreak(); +//----------------------------------------------------------------------------- + +/* Various types of spew messages */ +// I'm sure you're asking yourself why SPEW_ instead of DBG_ ? +// It's because DBG_ is used all over the place in windows.h +// For example, DBG_CONTINUE is defined. Feh. +enum SpewType_t +{ + SPEW_MESSAGE = 0, + SPEW_WARNING, + SPEW_ASSERT, + SPEW_ERROR, + SPEW_LOG, + + SPEW_TYPE_COUNT +}; + +enum SpewRetval_t +{ + SPEW_DEBUGGER = 0, + SPEW_CONTINUE, + SPEW_ABORT +}; + +/* type of externally defined function used to display debug spew */ +typedef SpewRetval_t(*SpewOutputFunc_t)(SpewType_t spewType, char const *pMsg); + +/* Used to redirect spew output */ +void SpewOutputFunc(SpewOutputFunc_t func); + +/* Used ot get the current spew output function */ +SpewOutputFunc_t GetSpewOutputFunc(void); + +/* Used to manage spew groups and subgroups */ +void SpewActivate(char const* pGroupName, int level); +bool IsSpewActive(char const* pGroupName, int level); + +/* Used to display messages, should never be called directly. */ +void _SpewInfo(SpewType_t type, char const* pFile, int line); +SpewRetval_t _SpewMessage(char const* pMsg, ...); +SpewRetval_t _DSpewMessage(char const *pGroupName, int level, char const* pMsg, ...); + +/* Used to define macros, never use these directly. */ +#define _Assert( _exp ) do { \ + if (!(_exp)) \ + { \ + _SpewInfo( SPEW_ASSERT, __FILE__, __LINE__ ); \ + if (_SpewMessage("Assertion Failed: " #_exp) == SPEW_DEBUGGER) \ + { \ + DebuggerBreak(); \ + } \ + } \ + } while (0) + +#define _AssertMsg( _exp, _msg ) do { \ + if (!(_exp)) \ + { \ + _SpewInfo( SPEW_ASSERT, __FILE__, __LINE__ ); \ + if (_SpewMessage(_msg) == SPEW_DEBUGGER) \ + { \ + DebuggerBreak(); \ + } \ + } \ + } while (0) + +#define _AssertFunc( _exp, _f ) do { \ + if (!(_exp)) \ + { \ + _SpewInfo( SPEW_ASSERT, __FILE__, __LINE__ ); \ + SpewRetval_t ret = _SpewMessage("Assertion Failed!" #_exp); \ + _f; \ + if (ret == SPEW_DEBUGGER) \ + { \ + DebuggerBreak(); \ + } \ + } \ + } while (0) + +#define _AssertEquals( _exp, _expectedValue ) \ + do { \ + if ((_exp) != (_expectedValue)) \ + { \ + _SpewInfo( SPEW_ASSERT, __FILE__, __LINE__ ); \ + SpewRetval_t ret = _SpewMessage("Expected %d but got %d!", (_expectedValue), (_exp)); \ + if (ret == SPEW_DEBUGGER) \ + { \ + DebuggerBreak(); \ + } \ + } \ + } while (0) + +#define _AssertFloatEquals( _exp, _expectedValue, _tol ) \ + do { \ + if (fabs((_exp) - (_expectedValue)) > (_tol)) \ + { \ + _SpewInfo( SPEW_ASSERT, __FILE__, __LINE__ ); \ + SpewRetval_t ret = _SpewMessage("Expected %f but got %f!", (_expectedValue), (_exp)); \ + if (ret == SPEW_DEBUGGER) \ + { \ + DebuggerBreak(); \ + } \ + } \ + } while (0) + +/* Spew macros... */ + +#ifdef _DEBUG + +#define Assert( _exp ) _Assert( _exp ) +#define AssertMsg( _exp, _msg ) _AssertMsg( _exp, _msg ) +#define AssertFunc( _exp, _f ) _AssertFunc( _exp, _f ) +#define AssertEquals( _exp, _expectedValue ) _AssertEquals( _exp, _expectedValue ) +#define AssertFloatEquals( _exp, _expectedValue, _tol ) _AssertFloatEquals( _exp, _expectedValue, _tol ) +#define Verify( _exp ) _Assert( _exp ) + +#define AssertMsg1( _exp, _msg, a1 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1 ) ) +#define AssertMsg2( _exp, _msg, a1, a2 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2 ) ) +#define AssertMsg3( _exp, _msg, a1, a2, a3 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3 ) ) +#define AssertMsg4( _exp, _msg, a1, a2, a3, a4 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4 ) ) +#define AssertMsg5( _exp, _msg, a1, a2, a3, a4, a5 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5 ) ) +#define AssertMsg6( _exp, _msg, a1, a2, a3, a4, a5, a6 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5, a6 ) ) +#define AssertMsg6( _exp, _msg, a1, a2, a3, a4, a5, a6 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5, a6 ) ) +#define AssertMsg7( _exp, _msg, a1, a2, a3, a4, a5, a6, a7 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5, a6, a7 ) ) +#define AssertMsg8( _exp, _msg, a1, a2, a3, a4, a5, a6, a7, a8 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5, a6, a7, a8 ) ) +#define AssertMsg9( _exp, _msg, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) _AssertMsg( _exp, CDbgFmtMsg( _msg, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) ) + + +#else /* Not _DEBUG */ + +#define Assert( _exp ) ((void)0) +#define AssertMsg( _exp, _msg ) ((void)0) +#define AssertFunc( _exp, _f ) ((void)0) +#define AssertEquals( _exp, _expectedValue ) ((void)0) +#define AssertFloatEquals( _exp, _expectedValue, _tol ) ((void)0) +#define Verify( _exp ) (_exp) + +#define AssertMsg1( _exp, _msg, a1 ) ((void)0) +#define AssertMsg2( _exp, _msg, a1, a2 ) ((void)0) +#define AssertMsg3( _exp, _msg, a1, a2, a3 ) ((void)0) +#define AssertMsg4( _exp, _msg, a1, a2, a3, a4 ) ((void)0) +#define AssertMsg5( _exp, _msg, a1, a2, a3, a4, a5 ) ((void)0) +#define AssertMsg6( _exp, _msg, a1, a2, a3, a4, a5, a6 ) ((void)0) +#define AssertMsg6( _exp, _msg, a1, a2, a3, a4, a5, a6 ) ((void)0) +#define AssertMsg7( _exp, _msg, a1, a2, a3, a4, a5, a6, a7 ) ((void)0) +#define AssertMsg8( _exp, _msg, a1, a2, a3, a4, a5, a6, a7, a8 ) ((void)0) +#define AssertMsg9( _exp, _msg, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) ((void)0) + +#endif /* _DEBUG */ + + + +/* These are always compiled in */ +void Msg(char const* pMsg, ...); +void DMsg(char const *pGroupName, int level, char const *pMsg, ...); + +void Warning(char const *pMsg, ...); +void DWarning(char const *pGroupName, int level, char const *pMsg, ...); + +void Log(char const *pMsg, ...); +void DLog(char const *pGroupName, int level, char const *pMsg, ...); + +void Error(char const *pMsg, ...); + +// You can use this macro like a runtime assert macro. +// If the condition fails, then Error is called with the message. This macro is called +// like AssertMsg, where msg must be enclosed in parenthesis: +// +// ErrorIfNot( bCondition, ("a b c %d %d %d", 1, 2, 3) ); +#define ErrorIfNot( condition, msg ) \ + if ( (condition) ) \ + ; \ + else \ + { \ + Error msg; \ + } + +/* A couple of super-common dynamic spew messages, here for convenience */ +/* These looked at the "developer" group */ +void DevMsg(int level, char const* pMsg, ...); +void DevWarning(int level, char const *pMsg, ...); +void DevLog(int level, char const *pMsg, ...); + +/* default level versions (level 1) */ +void DevMsg(char const* pMsg, ...); +void DevWarning(char const *pMsg, ...); +void DevLog(char const *pMsg, ...); + +/* Code macros, debugger interface */ + +#ifdef _DEBUG + +#define DBG_CODE( _code ) if (0) ; else { _code } +#define DBG_DCODE( _g, _l, _code ) if (IsSpewActive( _g, _l )) { _code } else {} +#define DBG_BREAK() DebuggerBreak() /* defined in platform.h */ + +#else /* not _DEBUG */ + +#define DBG_CODE( _code ) ((void)0) +#define DBG_DCODE( _g, _l, _code ) ((void)0) +#define DBG_BREAK() ((void)0) + +#endif /* _DEBUG */ + +//----------------------------------------------------------------------------- +// Macro to assist in asserting constant invariants during compilation + +#define UID_PREFIX generated_id_ +#define UID_CAT1(a,c) a ## c +#define UID_CAT2(a,c) UID_CAT1(a,c) +#define UNIQUE_ID UID_CAT2(UID_PREFIX,__LINE__) + + +#ifdef _DEBUG +#define COMPILE_TIME_ASSERT( pred ) switch(0){case 0:case pred:;} +#define ASSERT_INVARIANT( pred ) static void UNIQUE_ID() { COMPILE_TIME_ASSERT( pred ) } +#else +#define COMPILE_TIME_ASSERT( pred ) +#define ASSERT_INVARIANT( pred ) +#endif + + +//----------------------------------------------------------------------------- +// Templates to assist in validating pointers: + +// Have to use these stubs so we don't have to include windows.h here. +void _AssertValidReadPtr(void* ptr, int count = 1); +void _AssertValidWritePtr(void* ptr, int count = 1); +void _AssertValidReadWritePtr(void* ptr, int count = 1); + + void AssertValidStringPtr(const char* ptr, int maxchar = 0xFFFFFF); +template inline void AssertValidReadPtr(T* ptr, int count = 1) { _AssertValidReadPtr((void*)ptr, count); } +template inline void AssertValidWritePtr(T* ptr, int count = 1) { _AssertValidWritePtr((void*)ptr, count); } +template inline void AssertValidReadWritePtr(T* ptr, int count = 1) { _AssertValidReadWritePtr((void*)ptr, count); } + +#define AssertValidThis() AssertValidReadWritePtr(this,sizeof(*this)) + +//----------------------------------------------------------------------------- +// Macro to protect functions that are not reentrant + +#ifdef _DEBUG +class CReentryGuard +{ +public: + CReentryGuard(int *pSemaphore) + : m_pSemaphore(pSemaphore) + { + ++(*m_pSemaphore); + } + + ~CReentryGuard() + { + --(*m_pSemaphore); + } + +private: + int *m_pSemaphore; +}; + +#define ASSERT_NO_REENTRY() \ + static int fSemaphore##__LINE__; \ + Assert( !fSemaphore##__LINE__ ); \ + CReentryGuard ReentryGuard##__LINE__( &fSemaphore##__LINE__ ) +#else +#define ASSERT_NO_REENTRY() +#endif + +//----------------------------------------------------------------------------- +// +// Purpose: Inline string formatter +// + +class CDbgFmtMsg +{ +public: + CDbgFmtMsg(const char *pszFormat, ...) + { + va_list arg_ptr; + + va_start(arg_ptr, pszFormat); + _vsnprintf(m_szBuf, sizeof(m_szBuf) - 1, pszFormat, arg_ptr); + va_end(arg_ptr); + + m_szBuf[sizeof(m_szBuf) - 1] = 0; + } + + operator const char *() const + { + return m_szBuf; + } + +private: + char m_szBuf[256]; +}; + +//----------------------------------------------------------------------------- +// +// Purpose: Embed debug info in each file. +// +//#ifdef _WIN32 +//#ifdef _DEBUG +//#pragma comment(compiler) +//#pragma comment(exestr,"*** DEBUG file detected, Last Compile: " __DATE__ ", " __TIME__ " ***") +//#endif +//#endif + +#endif /* DBG_H */ \ No newline at end of file diff --git a/cssdk/public/tier0/platform.h b/cssdk/public/tier0/platform.h new file mode 100644 index 0000000..f9e4e6c --- /dev/null +++ b/cssdk/public/tier0/platform.h @@ -0,0 +1,630 @@ +//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. =========== +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +// $Header: $ +// $NoKeywords: $ +// +// Extremely low-level platform-specific stuff +//============================================================================= + + +#ifndef PLATFORM_H +#define PLATFORM_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "osconfig.h" + +// need this for _alloca +#include + +// need this for memset +#include + +#include "archtypes.h" + +typedef float float32; +typedef double float64; + +// for when we don't care about how many bits we use +typedef unsigned int uint; + +// This can be used to ensure the size of pointers to members when declaring +// a pointer type for a class that has only been forward declared +#ifdef _MSC_VER +#define SINGLE_INHERITANCE __single_inheritance +#define MULTIPLE_INHERITANCE __multiple_inheritance +#else +#define SINGLE_INHERITANCE +#define MULTIPLE_INHERITANCE +#endif + +/* +FIXME: Enable this when we no longer fear change =) + +// need these for the limits +#include +#include + +// Maximum and minimum representable values +#define INT8_MAX SCHAR_MAX +#define INT16_MAX SHRT_MAX +#define INT32_MAX LONG_MAX +#define INT64_MAX (((int64)~0) >> 1) + +#define INT8_MIN SCHAR_MIN +#define INT16_MIN SHRT_MIN +#define INT32_MIN LONG_MIN +#define INT64_MIN (((int64)1) << 63) + +#define UINT8_MAX ((uint8)~0) +#define UINT16_MAX ((uint16)~0) +#define UINT32_MAX ((uint32)~0) +#define UINT64_MAX ((uint64)~0) + +#define UINT8_MIN 0 +#define UINT16_MIN 0 +#define UINT32_MIN 0 +#define UINT64_MIN 0 + +#ifndef UINT_MIN +#define UINT_MIN UINT32_MIN +#endif + +#define FLOAT32_MAX FLT_MAX +#define FLOAT64_MAX DBL_MAX + +#define FLOAT32_MIN FLT_MIN +#define FLOAT64_MIN DBL_MIN +*/ + +// portability / compiler settings +#if defined(_WIN32) && !defined(WINDED) + +#if defined(_M_IX86) +#define __i386__ 1 +#endif + +#elif __linux__ +typedef void * HINSTANCE; +#define _MAX_PATH PATH_MAX +#endif // defined(_WIN32) && !defined(WINDED) + + +// Defines MAX_PATH +#ifndef MAX_PATH +#define MAX_PATH 260 +#endif + +// Used to step into the debugger +#define DebuggerBreak() __asm { int 3 } + +// C functions for external declarations that call the appropriate C++ methods +#ifndef EXPORT +#ifdef _WIN32 +#define EXPORT _declspec( dllexport ) +#else +#define EXPORT /* */ +#endif +#endif + +#if defined __i386__ && !defined __linux__ +#define id386 1 +#else +#define id386 0 +#endif // __i386__ + +#ifdef _WIN32 +// Used for dll exporting and importing +#define DLL_EXPORT extern "C" __declspec( dllexport ) +#define DLL_IMPORT extern "C" __declspec( dllimport ) + +// Can't use extern "C" when DLL exporting a class +#define DLL_CLASS_EXPORT __declspec( dllexport ) +#define DLL_CLASS_IMPORT __declspec( dllimport ) + +// Can't use extern "C" when DLL exporting a global +#define DLL_GLOBAL_EXPORT extern __declspec( dllexport ) +#define DLL_GLOBAL_IMPORT extern __declspec( dllimport ) +#elif defined __linux__ + +// Used for dll exporting and importing +#define DLL_EXPORT extern "C" +#define DLL_IMPORT extern "C" + +// Can't use extern "C" when DLL exporting a class +#define DLL_CLASS_EXPORT +#define DLL_CLASS_IMPORT + +// Can't use extern "C" when DLL exporting a global +#define DLL_GLOBAL_EXPORT extern +#define DLL_GLOBAL_IMPORT extern + +#else +#error "Unsupported Platform." +#endif + +// Used for standard calling conventions +#ifdef _WIN32 +#define FASTCALL __fastcall +#define FORCEINLINE __forceinline +#else +#define FASTCALL +#define FORCEINLINE inline +#endif + +// Force a function call site -not- to inlined. (useful for profiling) +#define DONT_INLINE(a) (((int)(a)+1)?(a):(a)) + +// Pass hints to the compiler to prevent it from generating unnessecary / stupid code +// in certain situations. Several compilers other than MSVC also have an equivilent +// construct. +// +// Essentially the 'Hint' is that the condition specified is assumed to be true at +// that point in the compilation. If '0' is passed, then the compiler assumes that +// any subsequent code in the same 'basic block' is unreachable, and thus usually +// removed. +#ifdef _MSC_VER +#define HINT(THE_HINT) __assume((THE_HINT)) +#else +#define HINT(THE_HINT) 0 +#endif + +// Marks the codepath from here until the next branch entry point as unreachable, +// and asserts if any attempt is made to execute it. +#define UNREACHABLE() { Assert(0); HINT(0); } + +// In cases where no default is present or appropriate, this causes MSVC to generate +// as little code as possible, and throw an assertion in debug. +#define NO_DEFAULT default: UNREACHABLE(); + +#ifdef _WIN32 +// Alloca defined for this platform +#define stackalloc( _size ) _alloca( _size ) +#define stackfree( _p ) 0 +#elif __linux__ +// Alloca defined for this platform +#define stackalloc( _size ) alloca( _size ) +#define stackfree( _p ) 0 +#endif + +#ifdef _WIN32 +// Remove warnings from warning level 4. +#pragma warning(disable : 4514) // warning C4514: 'acosl' : unreferenced inline function has been removed +#pragma warning(disable : 4100) // warning C4100: 'hwnd' : unreferenced formal parameter +#pragma warning(disable : 4127) // warning C4127: conditional expression is constant +#pragma warning(disable : 4512) // warning C4512: 'InFileRIFF' : assignment operator could not be generated +#pragma warning(disable : 4611) // warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable +#pragma warning(disable : 4706) // warning C4706: assignment within conditional expression +#pragma warning(disable : 4710) // warning C4710: function 'x' not inlined +#pragma warning(disable : 4702) // warning C4702: unreachable code +#pragma warning(disable : 4505) // unreferenced local function has been removed +#pragma warning(disable : 4239) // nonstandard extension used : 'argument' ( conversion from class Vector to class Vector& ) +#pragma warning(disable : 4097) // typedef-name 'BaseClass' used as synonym for class-name 'CFlexCycler::CBaseFlex' +#pragma warning(disable : 4324) // Padding was added at the end of a structure +#pragma warning(disable : 4244) // type conversion warning. +#pragma warning(disable : 4305) // truncation from 'const double ' to 'float ' +#pragma warning(disable : 4786) // Disable warnings about long symbol names + +#if _MSC_VER >= 1300 +#pragma warning(disable : 4511) // Disable warnings about private copy constructors +#endif +#endif +//----------------------------------------------------------------------------- +// Purpose: Standard functions for handling endian-ness +//----------------------------------------------------------------------------- + +//------------------------------------- +// Basic swaps +//------------------------------------- + +template +inline T WordSwapC(T w) +{ + uint16 temp; + + temp = ((*((uint16 *)&w) & 0xff00) >> 8); + temp |= ((*((uint16 *)&w) & 0x00ff) << 8); + + return *((T*)&temp); +} + +template +inline T DWordSwapC(T dw) +{ + uint32 temp; + + temp = *((uint32 *)&dw) >> 24; + temp |= ((*((uint32 *)&dw) & 0x00FF0000) >> 8); + temp |= ((*((uint32 *)&dw) & 0x0000FF00) << 8); + temp |= ((*((uint32 *)&dw) & 0x000000FF) << 24); + + return *((T*)&temp); +} + +//------------------------------------- +// Fast swaps +//------------------------------------- + +#ifdef _MSC_VER + +#define WordSwap WordSwapAsm +#define DWordSwap DWordSwapAsm + +#pragma warning(push) +#pragma warning (disable:4035) // no return value + +template +inline T WordSwapAsm(T w) +{ + __asm + { + mov ax, w + xchg al, ah + } +} + +template +inline T DWordSwapAsm(T dw) +{ + __asm + { + mov eax, dw + bswap eax + } +} + +#pragma warning(pop) + +// The assembly implementation is not compatible with floats +template <> +inline float DWordSwapAsm(float f) +{ + return DWordSwapC(f); +} + +#else + +#define WordSwap WordSwapC +#define DWordSwap DWordSwapC + +#endif + +//------------------------------------- +// The typically used methods. +//------------------------------------- + +#if defined(__i386__) +#define VALVE_LITTLE_ENDIAN 1 +#endif + +#ifdef _SGI_SOURCE +#define VALVE_BIG_ENDIAN 1 +#endif + +#if defined(VALVE_LITTLE_ENDIAN) + +#define Valve_BigShort( val ) WordSwap( val ) +#define Valve_BigWord( val ) WordSwap( val ) +#define Valve_BigLong( val ) DWordSwap( val ) +#define Valve_BigDWord( val ) DWordSwap( val ) +#define Valve_BigFloat( val ) DWordSwap( val ) +#define Valve_LittleShort( val ) ( val ) +#define Valve_LittleWord( val ) ( val ) +#define Valve_LittleLong( val ) ( val ) +#define Valve_LittleDWord( val ) ( val ) +#define Valve_LittleFloat( val ) ( val ) + +#elif defined(BIG_ENDIAN) + +#define Valve_BigShort( val ) ( val ) +#define Valve_BigWord( val ) ( val ) +#define Valve_BigLong( val ) ( val ) +#define Valve_BigDWord( val ) ( val ) +#define Valve_BigFloat( val ) ( val ) +#define Valve_LittleShort( val ) WordSwap( val ) +#define Valve_LittleWord( val ) WordSwap( val ) +#define Valve_LittleLong( val ) DWordSwap( val ) +#define Valve_LittleDWord( val ) DWordSwap( val ) +#define Valve_LittleFloat( val ) DWordSwap( val ) + +#else + +// @Note (toml 05-02-02): this technique expects the compiler to +// optimize the expression and eliminate the other path. On any new +// platform/compiler this should be tested. +inline short BigShort(short val) { int test = 1; return (*(char *)&test == 1) ? WordSwap(val) : val; } +inline uint16 BigWord(uint16 val) { int test = 1; return (*(char *)&test == 1) ? WordSwap(val) : val; } +inline long BigLong(long val) { int test = 1; return (*(char *)&test == 1) ? DWordSwap(val) : val; } +inline uint32 BigDWord(uint32 val) { int test = 1; return (*(char *)&test == 1) ? DWordSwap(val) : val; } +inline float BigFloat(float val) { int test = 1; return (*(char *)&test == 1) ? DWordSwap(val) : val; } +inline short LittleShort(short val) { int test = 1; return (*(char *)&test == 1) ? val : WordSwap(val); } +inline uint16 LittleWord(uint16 val) { int test = 1; return (*(char *)&test == 1) ? val : WordSwap(val); } +inline long LittleLong(long val) { int test = 1; return (*(char *)&test == 1) ? val : DWordSwap(val); } +inline uint32 LittleDWord(uint32 val) { int test = 1; return (*(char *)&test == 1) ? val : DWordSwap(val); } +inline float LittleFloat(float val) { int test = 1; return (*(char *)&test == 1) ? val : DWordSwap(val); } + +#endif + + + +#ifdef TIER0_DLL_EXPORT +#define PLATFORM_INTERFACE DLL_EXPORT +#define PLATFORM_OVERLOAD DLL_GLOBAL_EXPORT +#else +#define PLATFORM_INTERFACE DLL_IMPORT +#define PLATFORM_OVERLOAD DLL_GLOBAL_IMPORT +#endif + +/* +PLATFORM_INTERFACE double Plat_FloatTime(); // Returns time in seconds since the module was loaded. +PLATFORM_INTERFACE unsigned long Plat_MSTime(); // Time in milliseconds. + +// b/w compatibility +#define Sys_FloatTime Plat_FloatTime +*/ + +// Processor Information: +struct CPUInformation +{ + int m_Size; // Size of this structure, for forward compatability. + + bool m_bRDTSC : 1, // Is RDTSC supported? + m_bCMOV : 1, // Is CMOV supported? + m_bFCMOV : 1, // Is FCMOV supported? + m_bSSE : 1, // Is SSE supported? + m_bSSE2 : 1, // Is SSE2 Supported? + m_b3DNow : 1, // Is 3DNow! Supported? + m_bMMX : 1, // Is MMX supported? + m_bHT : 1; // Is HyperThreading supported? + + unsigned char m_nLogicalProcessors, // Number op logical processors. + m_nPhysicalProcessors; // Number of physical processors + + int64 m_Speed; // In cycles per second. + + char* m_szProcessorID; // Processor vendor Identification. +}; + +PLATFORM_INTERFACE const CPUInformation& GetCPUInformation(); + + +//----------------------------------------------------------------------------- +// Thread related functions +//----------------------------------------------------------------------------- +// Registers the current thread with Tier0's thread management system. +// This should be called on every thread created in the game. +PLATFORM_INTERFACE unsigned long Plat_RegisterThread(const char *pName = "Source Thread"); + +// Registers the current thread as the primary thread. +PLATFORM_INTERFACE unsigned long Plat_RegisterPrimaryThread(); + +// VC-specific. Sets the thread's name so it has a friendly name in the debugger. +// This should generally only be handled by Plat_RegisterThread and Plat_RegisterPrimaryThread +PLATFORM_INTERFACE void Plat_SetThreadName(unsigned long dwThreadID, const char *pName); + +// These would be private if it were possible to export private variables from a .DLL. +// They need to be variables because they are checked by inline functions at performance +// critical places. +PLATFORM_INTERFACE unsigned long Plat_PrimaryThreadID; + +// Returns the ID of the currently executing thread. +PLATFORM_INTERFACE unsigned long Plat_GetCurrentThreadID(); + +// Returns the ID of the primary thread. +inline unsigned long Plat_GetPrimaryThreadID() +{ + return Plat_PrimaryThreadID; +} + +// Returns true if the current thread is the primary thread. +inline bool Plat_IsPrimaryThread() +{ + //return true; + return (Plat_GetPrimaryThreadID() == Plat_GetCurrentThreadID()); +} + +//----------------------------------------------------------------------------- +// Security related functions +//----------------------------------------------------------------------------- +// Ensure that the hardware key's drivers have been installed. +PLATFORM_INTERFACE bool Plat_VerifyHardwareKeyDriver(); + +// Ok, so this isn't a very secure way to verify the hardware key for now. It +// is primarially depending on the fact that all the binaries have been wrapped +// with the secure wrapper provided by the hardware keys vendor. +PLATFORM_INTERFACE bool Plat_VerifyHardwareKey(); + +// The same as above, but notifies user with a message box when the key isn't in +// and gives him an opportunity to correct the situation. +PLATFORM_INTERFACE bool Plat_VerifyHardwareKeyPrompt(); + +// Can be called in real time, doesn't perform the verify every frame. Mainly just +// here to allow the game to drop out quickly when the key is removed, rather than +// allowing the wrapper to pop up it's own blocking dialog, which the engine doesn't +// like much. +PLATFORM_INTERFACE bool Plat_FastVerifyHardwareKey(); + + + +//----------------------------------------------------------------------------- +// Include additional dependant header components. +//----------------------------------------------------------------------------- +//#include "tier0/fasttimer.h" + + +//----------------------------------------------------------------------------- +// Just logs file and line to simple.log +//----------------------------------------------------------------------------- +void* Plat_SimpleLog(const char* file, int line); + +//#define Plat_dynamic_cast Plat_SimpleLog(__FILE__,__LINE__),dynamic_cast + +//----------------------------------------------------------------------------- +// Methods to invoke the constructor, copy constructor, and destructor +//----------------------------------------------------------------------------- + +template +inline void Construct(T* pMemory) +{ + new(pMemory)T; +} + +template +inline void CopyConstruct(T* pMemory, T const& src) +{ + new(pMemory)T(src); +} + +template +inline void Destruct(T* pMemory) +{ + pMemory->~T(); + +#ifdef _DEBUG + memset(pMemory, 0xDD, sizeof(T)); +#endif +} + + +// +// GET_OUTER() +// +// A platform-independent way for a contained class to get a pointer to its +// owner. If you know a class is exclusively used in the context of some +// "outer" class, this is a much more space efficient way to get at the outer +// class than having the inner class store a pointer to it. +// +// class COuter +// { +// class CInner // Note: this does not need to be a nested class to work +// { +// void PrintAddressOfOuter() +// { +// printf( "Outer is at 0x%x\n", GET_OUTER( COuter, m_Inner ) ); +// } +// }; +// +// CInner m_Inner; +// friend class CInner; +// }; + +#define GET_OUTER( OuterType, OuterMember ) \ + ( ( OuterType * ) ( (char *)this - offsetof( OuterType, OuterMember ) ) ) + + +/* TEMPLATE_FUNCTION_TABLE() + +(Note added to platform.h so platforms that correctly support templated +functions can handle portions as templated functions rather than wrapped +functions) + +Helps automate the process of creating an array of function +templates that are all specialized by a single integer. +This sort of thing is often useful in optimization work. + +For example, using TEMPLATE_FUNCTION_TABLE, this: + +TEMPLATE_FUNCTION_TABLE(int, Function, ( int blah, int blah ), 10) +{ +return argument * argument; +} + +is equivilent to the following: + +(NOTE: the function has to be wrapped in a class due to code +generation bugs involved with directly specializing a function +based on a constant.) + +template +class FunctionWrapper +{ +public: +int Function( int blah, int blah ) +{ +return argument*argument; +} +} + +typedef int (*FunctionType)( int blah, int blah ); + +class FunctionName +{ +public: +enum { count = 10 }; +FunctionType functions[10]; +}; + +FunctionType FunctionName::functions[] = +{ +FunctionWrapper<0>::Function, +FunctionWrapper<1>::Function, +FunctionWrapper<2>::Function, +FunctionWrapper<3>::Function, +FunctionWrapper<4>::Function, +FunctionWrapper<5>::Function, +FunctionWrapper<6>::Function, +FunctionWrapper<7>::Function, +FunctionWrapper<8>::Function, +FunctionWrapper<9>::Function +}; +*/ + +bool vtune(bool resume); + + +#define TEMPLATE_FUNCTION_TABLE(RETURN_TYPE, NAME, ARGS, COUNT) \ + \ +typedef RETURN_TYPE (FASTCALL *__Type_##NAME) ARGS; \ + \ +template \ +struct __Function_##NAME \ +{ \ + static RETURN_TYPE FASTCALL Run ARGS; \ +}; \ + \ +template \ +struct __MetaLooper_##NAME : __MetaLooper_##NAME \ +{ \ + __Type_##NAME func; \ + inline __MetaLooper_##NAME() { func = __Function_##NAME::Run; } \ +}; \ + \ +template<> \ +struct __MetaLooper_##NAME<0> \ +{ \ + __Type_##NAME func; \ + inline __MetaLooper_##NAME() { func = __Function_##NAME<0>::Run; } \ +}; \ + \ +class NAME \ +{ \ +private: \ + static const __MetaLooper_##NAME m; \ +public: \ + enum { count = COUNT }; \ + static const __Type_##NAME* functions; \ +}; \ +const __MetaLooper_##NAME NAME::m; \ +const __Type_##NAME* NAME::functions = (__Type_##NAME*)&m; \ +template \ +RETURN_TYPE FASTCALL __Function_##NAME::Run ARGS + + +#define LOOP_INTERCHANGE(BOOLEAN, CODE)\ + if( (BOOLEAN) )\ + {\ + CODE;\ + } else\ + {\ + CODE;\ + } + + +#endif /* PLATFORM_H */ \ No newline at end of file diff --git a/cssdk/public/utlmemory.h b/cssdk/public/utlmemory.h new file mode 100644 index 0000000..4f75f81 --- /dev/null +++ b/cssdk/public/utlmemory.h @@ -0,0 +1,357 @@ +/* +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#ifndef UTLMEMORY_H +#define UTLMEMORY_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "osconfig.h" +#include "tier0/dbg.h" +#include + +#pragma warning (disable:4100) +#pragma warning (disable:4514) + +/*template +inline void Construct(T *pMemory) +{ + ::new(pMemory) T; +} + +template +inline void CopyConstruct(T *pMemory,T const& src) +{ + ::new(pMemory) T(src); +} + +template +inline void Destruct(T *pMemory) +{ + pMemory->~T(); + +#ifdef _DEBUG + memset(pMemory,0xDD,sizeof(T)); +#endif +}*/ +//----------------------------------------------------------------------------- +// The CUtlMemory class: +// A growable memory class which doubles in size by default. +//----------------------------------------------------------------------------- +template< class T > +class CUtlMemory +{ +public: + // constructor, destructor + CUtlMemory(int nGrowSize = 0, int nInitSize = 0); + CUtlMemory(T* pMemory, int numElements); + ~CUtlMemory(); + + // element access + T& operator[](int i); + T const& operator[](int i) const; + T& Element(int i); + T const& Element(int i) const; + + // Can we use this index? + bool IsIdxValid(int i) const; + + // Gets the base address (can change when adding elements!) + T* Base(); + T const* Base() const; + + // Attaches the buffer to external memory.... + void SetExternalBuffer(T* pMemory, int numElements); + + // Size + int NumAllocated() const; + int Count() const; + + // Grows the memory, so that at least allocated + num elements are allocated + void Grow(int num = 1); + + // Makes sure we've got at least this much memory + void EnsureCapacity(int num); + + // Memory deallocation + void Purge(); + + // is the memory externally allocated? + bool IsExternallyAllocated() const; + + // Set the size by which the memory grows + void SetGrowSize(int size); + +private: + enum + { + EXTERNAL_BUFFER_MARKER = -1, + }; + + T* m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + + +//----------------------------------------------------------------------------- +// constructor, destructor +//----------------------------------------------------------------------------- +template< class T > +CUtlMemory::CUtlMemory(int nGrowSize, int nInitAllocationCount) : m_pMemory(0), +m_nAllocationCount(nInitAllocationCount), m_nGrowSize(nGrowSize) +{ + Assert((nGrowSize >= 0) && (nGrowSize != EXTERNAL_BUFFER_MARKER)); + if (m_nAllocationCount) + { + m_pMemory = (T*)malloc(m_nAllocationCount * sizeof(T)); + } +} + +template< class T > +CUtlMemory::CUtlMemory(T* pMemory, int numElements) : m_pMemory(pMemory), +m_nAllocationCount(numElements) +{ + // Special marker indicating externally supplied memory + m_nGrowSize = EXTERNAL_BUFFER_MARKER; +} + +template< class T > +CUtlMemory::~CUtlMemory() +{ + Purge(); +} + + +//----------------------------------------------------------------------------- +// Attaches the buffer to external memory.... +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::SetExternalBuffer(T* pMemory, int numElements) +{ + // Blow away any existing allocated memory + Purge(); + + m_pMemory = pMemory; + m_nAllocationCount = numElements; + + // Indicate that we don't own the memory + m_nGrowSize = EXTERNAL_BUFFER_MARKER; +} + + +//----------------------------------------------------------------------------- +// element access +//----------------------------------------------------------------------------- +template< class T > +inline T& CUtlMemory::operator[](int i) +{ + Assert(IsIdxValid(i)); + return m_pMemory[i]; +} + +template< class T > +inline T const& CUtlMemory::operator[](int i) const +{ + Assert(IsIdxValid(i)); + return m_pMemory[i]; +} + +template< class T > +inline T& CUtlMemory::Element(int i) +{ + Assert(IsIdxValid(i)); + return m_pMemory[i]; +} + +template< class T > +inline T const& CUtlMemory::Element(int i) const +{ + Assert(IsIdxValid(i)); + return m_pMemory[i]; +} + + +//----------------------------------------------------------------------------- +// is the memory externally allocated? +//----------------------------------------------------------------------------- +template< class T > +bool CUtlMemory::IsExternallyAllocated() const +{ + return m_nGrowSize == EXTERNAL_BUFFER_MARKER; +} + + +template< class T > +void CUtlMemory::SetGrowSize(int nSize) +{ + Assert((nSize >= 0) && (nSize != EXTERNAL_BUFFER_MARKER)); + m_nGrowSize = nSize; +} + + +//----------------------------------------------------------------------------- +// Gets the base address (can change when adding elements!) +//----------------------------------------------------------------------------- +template< class T > +inline T* CUtlMemory::Base() +{ + return m_pMemory; +} + +template< class T > +inline T const* CUtlMemory::Base() const +{ + return m_pMemory; +} + + +//----------------------------------------------------------------------------- +// Size +//----------------------------------------------------------------------------- +template< class T > +inline int CUtlMemory::NumAllocated() const +{ + return m_nAllocationCount; +} + +template< class T > +inline int CUtlMemory::Count() const +{ + return m_nAllocationCount; +} + + +//----------------------------------------------------------------------------- +// Is element index valid? +//----------------------------------------------------------------------------- +template< class T > +inline bool CUtlMemory::IsIdxValid(int i) const +{ + return (i >= 0) && (i < m_nAllocationCount); +} + + +//----------------------------------------------------------------------------- +// Grows the memory +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::Grow(int num) +{ + Assert(num > 0); + + if (IsExternallyAllocated()) + { + // Can't grow a buffer whose memory was externally allocated + Assert(0); + return; + } + + // Make sure we have at least numallocated + num allocations. + // Use the grow rules specified for this memory (in m_nGrowSize) + int nAllocationRequested = m_nAllocationCount + num; + while (m_nAllocationCount < nAllocationRequested) + { + if (m_nAllocationCount != 0) + { + if (m_nGrowSize) + { + m_nAllocationCount += m_nGrowSize; + } + else + { + m_nAllocationCount += m_nAllocationCount; + } + } + else + { + // Compute an allocation which is at least as big as a cache line... + m_nAllocationCount = (31 + sizeof(T)) / sizeof(T); + Assert(m_nAllocationCount != 0); + } + } + + if (m_pMemory) + { + m_pMemory = (T*)realloc(m_pMemory, m_nAllocationCount * sizeof(T)); + } + else + { + m_pMemory = (T*)malloc(m_nAllocationCount * sizeof(T)); + } +} + + +//----------------------------------------------------------------------------- +// Makes sure we've got at least this much memory +//----------------------------------------------------------------------------- +template< class T > +inline void CUtlMemory::EnsureCapacity(int num) +{ + if (m_nAllocationCount >= num) + return; + + if (IsExternallyAllocated()) + { + // Can't grow a buffer whose memory was externally allocated + Assert(0); + return; + } + + m_nAllocationCount = num; + if (m_pMemory) + { + m_pMemory = (T*)realloc(m_pMemory, m_nAllocationCount * sizeof(T)); + } + else + { + m_pMemory = (T*)malloc(m_nAllocationCount * sizeof(T)); + } +} + + +//----------------------------------------------------------------------------- +// Memory deallocation +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::Purge() +{ + if (!IsExternallyAllocated()) + { + if (m_pMemory) + { + free((void*)m_pMemory); + m_pMemory = 0; + } + m_nAllocationCount = 0; + } +} + +#endif // UTLMEMORY_H diff --git a/cssdk/public/utlvector.h b/cssdk/public/utlvector.h new file mode 100644 index 0000000..263e72f --- /dev/null +++ b/cssdk/public/utlvector.h @@ -0,0 +1,565 @@ +#ifndef UTLVECTOR_H +#define UTLVECTOR_H +#ifdef _WIN32 +#pragma once +#endif + +#include "utlmemory.h" + +template +class CUtlVector +{ +public: + typedef T ElemType_t; + + // constructor, destructor + CUtlVector(int growSize = 0, int initSize = 0); + CUtlVector(T* pMemory, int numElements); + ~CUtlVector(); + + // Copy the array. + CUtlVector& operator=(const CUtlVector &other); + + // element access + T& operator[](int i); + T const& operator[](int i) const; + T& Element(int i); + T const& Element(int i) const; + + // Gets the base address (can change when adding elements!) + T* Base(); + T const* Base() const; + + // Returns the number of elements in the vector + // SIZE IS DEPRECATED! + int Count() const; + int Size() const; // don't use me! + + // Is element index valid? + bool IsValidIndex(int i) const; + static int InvalidIndex(void); + + // Adds an element, uses default constructor + int AddToHead(); + int AddToTail(); + int InsertBefore(int elem); + int InsertAfter(int elem); + + // Adds an element, uses copy constructor + int AddToHead(T const& src); + int AddToTail(T const& src); + int InsertBefore(int elem, T const& src); + int InsertAfter(int elem, T const& src); + + // Adds multiple elements, uses default constructor + int AddMultipleToHead(int num); + int AddMultipleToTail(int num, const T *pToCopy=NULL); + int InsertMultipleBefore(int elem, int num, const T *pToCopy=NULL); // If pToCopy is set, then it's an array of length 'num' and + int InsertMultipleAfter(int elem, int num); + + // Calls RemoveAll() then AddMultipleToTail. + void SetSize(int size); + void SetCount(int count); + + // Calls SetSize and copies each element. + void CopyArray(T const *pArray, int size); + + // Add the specified array to the tail. + int AddVectorToTail(CUtlVector const &src); + + // Finds an element (element needs operator== defined) + int Find(T const& src) const; + + bool HasElement(T const& src); + + // Makes sure we have enough memory allocated to store a requested # of elements + void EnsureCapacity(int num); + + // Makes sure we have at least this many elements + void EnsureCount(int num); + + // Element removal + void FastRemove(int elem); // doesn't preserve order + void Remove(int elem); // preserves order, shifts elements + void FindAndRemove(T const& src); // removes first occurrence of src, preserves order, shifts elements + void RemoveMultiple(int elem, int num); // preserves order, shifts elements + void RemoveAll(); // doesn't deallocate memory + + // Memory deallocation + void Purge(); + + // Purges the list and calls delete on each element in it. + void PurgeAndDeleteElements(); + + // Set the size by which it grows when it needs to allocate more memory. + void SetGrowSize(int size); + +protected: + // Can't copy this unless we explicitly do it! + CUtlVector(CUtlVector const& vec) { assert(0); } + + // Grows the vector + void GrowVector(int num = 1); + + // Shifts elements.... + void ShiftElementsRight(int elem, int num = 1); + void ShiftElementsLeft(int elem, int num = 1); + + // For easier access to the elements through the debugger + void ResetDbgInfo(); + + CUtlMemory m_Memory; + int m_Size; + + // For easier access to the elements through the debugger + // it's in release builds so this can be used in libraries correctly + T *m_pElements; +}; + +//----------------------------------------------------------------------------- +// For easier access to the elements through the debugger +//----------------------------------------------------------------------------- + +template< class T > +inline void CUtlVector::ResetDbgInfo() +{ + m_pElements = m_Memory.Base(); +} + +//----------------------------------------------------------------------------- +// constructor, destructor +//----------------------------------------------------------------------------- + +template< class T > +inline CUtlVector::CUtlVector(int growSize, int initSize) : + m_Memory(growSize, initSize), m_Size(0) +{ + ResetDbgInfo(); +} + +template< class T > +inline CUtlVector::CUtlVector(T* pMemory, int numElements) : + m_Memory(pMemory, numElements), m_Size(0) +{ + ResetDbgInfo(); +} + +template< class T > +inline CUtlVector::~CUtlVector() +{ + Purge(); +} + +template +inline CUtlVector& CUtlVector::operator=(const CUtlVector &other) +{ + CopyArray(other.Base(), other.Count()); + return *this; +} + +//----------------------------------------------------------------------------- +// element access +//----------------------------------------------------------------------------- + +template< class T > +inline T& CUtlVector::operator[](int i) +{ + assert(IsValidIndex(i)); + return m_Memory[i]; +} + +template< class T > +inline T const& CUtlVector::operator[](int i) const +{ + assert(IsValidIndex(i)); + return m_Memory[i]; +} + +template< class T > +inline T& CUtlVector::Element(int i) +{ + assert(IsValidIndex(i)); + return m_Memory[i]; +} + +template< class T > +inline T const& CUtlVector::Element(int i) const +{ + assert(IsValidIndex(i)); + return m_Memory[i]; +} + +//----------------------------------------------------------------------------- +// Gets the base address (can change when adding elements!) +//----------------------------------------------------------------------------- + +template< class T > +inline T* CUtlVector::Base() +{ + return m_Memory.Base(); +} + +template< class T > +inline T const* CUtlVector::Base() const +{ + return m_Memory.Base(); +} + +//----------------------------------------------------------------------------- +// Count +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::Size() const +{ + return m_Size; +} + +template< class T > +inline int CUtlVector::Count() const +{ + return m_Size; +} + +//----------------------------------------------------------------------------- +// Is element index valid? +//----------------------------------------------------------------------------- + +template< class T > +inline bool CUtlVector::IsValidIndex(int i) const +{ + return (i >= 0) && (i < m_Size); +} + +//----------------------------------------------------------------------------- +// Returns in invalid index +//----------------------------------------------------------------------------- +template< class T > +inline int CUtlVector::InvalidIndex(void) +{ + return -1; +} + +//----------------------------------------------------------------------------- +// Grows the vector +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::GrowVector(int num) +{ + if (m_Size + num - 1 >= m_Memory.NumAllocated()) + { + m_Memory.Grow(m_Size + num - m_Memory.NumAllocated()); + } + + m_Size += num; + ResetDbgInfo(); +} + +//----------------------------------------------------------------------------- +// Makes sure we have enough memory allocated to store a requested # of elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::EnsureCapacity(int num) +{ + m_Memory.EnsureCapacity(num); + ResetDbgInfo(); +} + +//----------------------------------------------------------------------------- +// Makes sure we have at least this many elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::EnsureCount(int num) +{ + if (Count() < num) + AddMultipleToTail(num - Count()); +} + +//----------------------------------------------------------------------------- +// Shifts elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::ShiftElementsRight(int elem, int num) +{ + assert(IsValidIndex(elem) || (m_Size == 0) || (num == 0)); + int numToMove = m_Size - elem - num; + if ((numToMove > 0) && (num > 0)) + memmove(&Element(elem+num), &Element(elem), numToMove * sizeof(T)); +} + +template< class T > +void CUtlVector::ShiftElementsLeft(int elem, int num) +{ + assert(IsValidIndex(elem) || (m_Size == 0) || (num == 0)); + int numToMove = m_Size - elem - num; + if ((numToMove > 0) && (num > 0)) + { + memmove(&Element(elem), &Element(elem+num), numToMove * sizeof(T)); + +#ifdef _DEBUG + memset(&Element(m_Size-num), 0xDD, num * sizeof(T)); +#endif + } +} + +//----------------------------------------------------------------------------- +// Adds an element, uses default constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddToHead() +{ + return InsertBefore(0); +} + +template< class T > +inline int CUtlVector::AddToTail() +{ + return InsertBefore(m_Size); +} + +template< class T > +inline int CUtlVector::InsertAfter(int elem) +{ + return InsertBefore(elem + 1); +} + +template< class T > +int CUtlVector::InsertBefore(int elem) +{ + // Can insert at the end + assert((elem == Count()) || IsValidIndex(elem)); + + GrowVector(); + ShiftElementsRight(elem); + Construct(&Element(elem)); + return elem; +} + +//----------------------------------------------------------------------------- +// Adds an element, uses copy constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddToHead(T const& src) +{ + return InsertBefore(0, src); +} + +template< class T > +inline int CUtlVector::AddToTail(T const& src) +{ + return InsertBefore(m_Size, src); +} + +template< class T > +inline int CUtlVector::InsertAfter(int elem, T const& src) +{ + return InsertBefore(elem + 1, src); +} + +template< class T > +int CUtlVector::InsertBefore(int elem, T const& src) +{ + // Can insert at the end + assert((elem == Count()) || IsValidIndex(elem)); + + GrowVector(); + ShiftElementsRight(elem); + CopyConstruct(&Element(elem), src); + return elem; +} + + +//----------------------------------------------------------------------------- +// Adds multiple elements, uses default constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddMultipleToHead(int num) +{ + return InsertMultipleBefore(0, num); +} + +template< class T > +inline int CUtlVector::AddMultipleToTail(int num, const T *pToCopy) +{ + return InsertMultipleBefore(m_Size, num, pToCopy); +} + +template< class T > +int CUtlVector::InsertMultipleAfter(int elem, int num) +{ + return InsertMultipleBefore(elem + 1, num); +} + + +template< class T > +void CUtlVector::SetCount(int count) +{ + RemoveAll(); + AddMultipleToTail(count); +} + +template< class T > +inline void CUtlVector::SetSize(int size) +{ + SetCount(size); +} + +template< class T > +void CUtlVector::CopyArray(T const *pArray, int size) +{ + SetSize(size); + for(int i=0; i < size; i++) + (*this)[i] = pArray[i]; +} + +template< class T > +int CUtlVector::AddVectorToTail(CUtlVector const &src) +{ + int base = Count(); + + // Make space. + AddMultipleToTail(src.Count()); + + // Copy the elements. + for (int i=0; i < src.Count(); i++) + (*this)[base + i] = src[i]; + + return base; +} + +template< class T > +inline int CUtlVector::InsertMultipleBefore(int elem, int num, const T *pToInsert) +{ + if(num == 0) + return elem; + + // Can insert at the end + assert((elem == Count()) || IsValidIndex(elem)); + + GrowVector(num); + ShiftElementsRight(elem, num); + + // Invoke default constructors + for (int i = 0; i < num; ++i) + Construct(&Element(elem+i)); + + // Copy stuff in? + if (pToInsert) + { + for (int i=0; i < num; i++) + { + Element(elem+i) = pToInsert[i]; + } + } + + return elem; +} + +//----------------------------------------------------------------------------- +// Finds an element (element needs operator== defined) +//----------------------------------------------------------------------------- +template< class T > +int CUtlVector::Find(T const& src) const +{ + for (int i = 0; i < Count(); ++i) + { + if (Element(i) == src) + return i; + } + return -1; +} + +template< class T > +bool CUtlVector::HasElement(T const& src) +{ + return (Find(src) >= 0); +} + +//----------------------------------------------------------------------------- +// Element removal +//----------------------------------------------------------------------------- + +template< class T > +void CUtlVector::FastRemove(int elem) +{ + assert(IsValidIndex(elem)); + + Destruct(&Element(elem)); + if (m_Size > 0) + { + Q_memcpy(&Element(elem), &Element(m_Size-1), sizeof(T)); + --m_Size; + } +} + +template< class T > +void CUtlVector::Remove(int elem) +{ + Destruct(&Element(elem)); + ShiftElementsLeft(elem); + --m_Size; +} + +template< class T > +void CUtlVector::FindAndRemove(T const& src) +{ + int elem = Find(src); + if (elem != -1) + { + Remove(elem); + } +} + +template< class T > +void CUtlVector::RemoveMultiple(int elem, int num) +{ + assert(IsValidIndex(elem)); + assert(elem + num <= Count()); + + for (int i = elem + num; --i >= elem;) + Destruct(&Element(i)); + + ShiftElementsLeft(elem, num); + m_Size -= num; +} + +template< class T > +void CUtlVector::RemoveAll() +{ + for (int i = m_Size; --i >= 0;) + Destruct(&Element(i)); + + m_Size = 0; +} + +//----------------------------------------------------------------------------- +// Memory deallocation +//----------------------------------------------------------------------------- + +template< class T > +void CUtlVector::Purge() +{ + RemoveAll(); + m_Memory.Purge(); + ResetDbgInfo(); +} + +template +inline void CUtlVector::PurgeAndDeleteElements() +{ + for (int i = 0; i < m_Size; i++) + delete Element(i); + + Purge(); +} + +template< class T > +void CUtlVector::SetGrowSize(int size) +{ + m_Memory.SetGrowSize(size); +} + +#endif // CCVECTOR_H diff --git a/include/engine_rehlds.h b/include/engine_rehlds.h new file mode 100644 index 0000000..3684fa6 --- /dev/null +++ b/include/engine_rehlds.h @@ -0,0 +1,15 @@ +#pragma once + +enum rehlds_ret +{ + RETURN_LOAD, + RETURN_MINOR_MISMATCH, + RETURN_MAJOR_MISMATCH, + RETURN_NOT_FOUND, + +}; + +extern IRehldsApi *g_RehldsApi; +extern IRehldsServerStatic *g_RehldsSvs; +extern IRehldsServerData *g_RehldsServerData; +extern rehlds_ret RehldsApi_Init(); diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..d813ea8 --- /dev/null +++ b/include/main.h @@ -0,0 +1,12 @@ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include "precompiled.h" + +extern DLL_FUNCTIONS *g_pFunctionTable; + +extern int localize_string(char *buf); +extern bool OnMetaAttach(); +extern void ClientCommand(edict_t *pEdict); + +#endif // _MAIN_H_ diff --git a/include/precompiled.h b/include/precompiled.h new file mode 100644 index 0000000..b9ba923 --- /dev/null +++ b/include/precompiled.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#include +#include + +#include "rehlds_api.h" +#include "engine_rehlds.h" + +#include "main.h" + +#undef DLLEXPORT + +#ifdef _WIN32 + #define DLLEXPORT __declspec(dllexport) + #define NOINLINE __declspec(noinline) +#else + #define DLLEXPORT __attribute__((visibility("default"))) + #define NOINLINE __attribute__((noinline)) + #define WINAPI +#endif // _WIN32 + +extern void UTIL_LogPrintf(const char *fmt, ...); diff --git a/metamod/dllapi.h b/metamod/dllapi.h new file mode 100644 index 0000000..1563be0 --- /dev/null +++ b/metamod/dllapi.h @@ -0,0 +1,189 @@ +// dllapi.h - prototypes and typedefs for Half-Life DLL API routines + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef DLLAPI_H +#define DLLAPI_H + +#include "sdk_util.h" // BOOL +#include "osdep.h" // DLLEXPORT, etc + +// Typedefs for these are provided in SDK engine/eiface.h, but I didn't +// like the names (APIFUNCTION, APIFUNCTION2, NEW_DLL_FUNCTIONS_FN). +typedef int (*GETENTITYAPI_FN) (DLL_FUNCTIONS *pFunctionTable, int interfaceVersion); +typedef int (*GETENTITYAPI2_FN) (DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); +typedef int (*GETNEWDLLFUNCTIONS_FN) (NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); + +// From SDK dlls/cbase.h: +C_DLLEXPORT int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ); +C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ); + +// No example in SDK.. +// From Adminmod dll.cpp: +C_DLLEXPORT int GetNewDLLFunctions( NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion ); + + +// From SDK dlls/game.h: +extern void mm_GameDLLInit( void ); + +// From SDK dlls/cbase.h: +extern int mm_DispatchSpawn( edict_t *pent ); +extern void mm_DispatchThink( edict_t *pent ); +extern void mm_DispatchUse( edict_t *pentUsed, edict_t *pentOther ); +extern void mm_DispatchTouch( edict_t *pentTouched, edict_t *pentOther ); +extern void mm_DispatchBlocked( edict_t *pentBlocked, edict_t *pentOther ); +extern void mm_DispatchKeyValue( edict_t *pentKeyvalue, KeyValueData *pkvd ); +extern void mm_DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData ); +extern int mm_DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); +extern void mm_DispatchObjectCollisionBox( edict_t *pent ); +extern void mm_SaveWriteFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); +extern void mm_SaveReadFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); +extern void mm_SaveGlobalState( SAVERESTOREDATA *pSaveData ); +extern void mm_RestoreGlobalState( SAVERESTOREDATA *pSaveData ); +extern void mm_ResetGlobalState( void ); + +// From SDK dlls/client.h: +extern BOOL mm_ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); +extern void mm_ClientDisconnect( edict_t *pEntity ); +extern void mm_ClientKill( edict_t *pEntity ); +extern void mm_ClientPutInServer( edict_t *pEntity ); +extern void mm_ClientCommand( edict_t *pEntity ); +extern void mm_ClientUserInfoChanged( edict_t *pEntity, char *infobuffer ); +extern void mm_ServerActivate( edict_t *pEdictList, int edictCount, int clientMax ); +extern void mm_ServerDeactivate( void ); +extern void mm_PlayerPreThink( edict_t *pEntity ); +extern void mm_PlayerPostThink( edict_t *pEntity ); +extern void mm_StartFrame( void ); +extern void mm_ParmsNewLevel( void ); +extern void mm_ParmsChangeLevel( void ); +extern const char *mm_GetGameDescription( void ); +extern void mm_PlayerCustomization( edict_t *pEntity, customization_t *pCust ); +extern void mm_SpectatorConnect ( edict_t *pEntity ); +extern void mm_SpectatorDisconnect ( edict_t *pEntity ); +extern void mm_SpectatorThink ( edict_t *pEntity ); +extern void mm_Sys_Error( const char *error_string ); + +// From SDK pm_shared/pm_shared.h: +extern void mm_PM_Move ( struct playermove_s *ppmove, int server ); +extern void mm_PM_Init ( struct playermove_s *ppmove ); +extern char mm_PM_FindTextureType ( char *name ); + +// From SDK dlls/client.h: +extern void mm_SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ); +extern void mm_UpdateClientData ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); +extern int mm_AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); +extern void mm_CreateBaseline( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); +extern void mm_RegisterEncoders( void ); +extern int mm_GetWeaponData( struct edict_s *player, struct weapon_data_s *info ); +extern void mm_CmdStart( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); +extern void mm_CmdEnd ( const edict_t *player ); +extern int mm_ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); +extern int mm_GetHullBounds( int hullnumber, float *mins, float *maxs ); +extern void mm_CreateInstancedBaselines ( void ); +extern int mm_InconsistentFile( const edict_t *player, const char *filename, char *disconnect_message ); +extern int mm_AllowLagCompensation( void ); + +// No example from SDK... +extern void mm_OnFreeEntPrivateData(edict_t pEnt); +extern void mm_GameShutdown(void); +extern int mm_ShouldCollide(edict_t *pentTouched, edict_t *pentOther); +//Added 2005-08-11 (no SDK update) +extern void mm_CvarValue(const edict_t *pEnt, const char *value); //! Obsolete! Use mm_CvarValue2 instead +//Added 2005-11-22 (no SDK update) +extern void mm_CvarValue2(const edict_t *pEnt, int requestID, const char *cvarName, const char *value); + + +// Typedefs for the above functions: + +typedef void (*FN_GAMEINIT) ( void ); +typedef int (*FN_DISPATCHSPAWN) ( edict_t *pent ); +typedef void (*FN_DISPATCHTHINK) ( edict_t *pent ); +typedef void (*FN_DISPATCHUSE) ( edict_t *pentUsed, edict_t *pentOther ); +typedef void (*FN_DISPATCHTOUCH) ( edict_t *pentTouched, edict_t *pentOther ); +typedef void (*FN_DISPATCHBLOCKED) ( edict_t *pentBlocked, edict_t *pentOther ); +typedef void (*FN_DISPATCHKEYVALUE) ( edict_t *pentKeyvalue, KeyValueData *pkvd ); +typedef void (*FN_DISPATCHSAVE) ( edict_t *pent, SAVERESTOREDATA *pSaveData ); +typedef int (*FN_DISPATCHRESTORE) ( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); +typedef void (*FN_DISPATCHOBJECTCOLLISIONBOX) ( edict_t *pent ); +typedef void (*FN_SAVEWRITEFIELDS) ( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); +typedef void (*FN_SAVEREADFIELDS) ( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); +typedef void (*FN_SAVEGLOBALSTATE) ( SAVERESTOREDATA *pSaveData ); +typedef void (*FN_RESTOREGLOBALSTATE) ( SAVERESTOREDATA *pSaveData ); +typedef void (*FN_RESETGLOBALSTATE) ( void ); + +typedef BOOL (*FN_CLIENTCONNECT) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); +typedef void (*FN_CLIENTDISCONNECT) ( edict_t *pEntity ); +typedef void (*FN_CLIENTKILL) ( edict_t *pEntity ); +typedef void (*FN_CLIENTPUTINSERVER) ( edict_t *pEntity ); +typedef void (*FN_CLIENTCOMMAND) ( edict_t *pEntity ); +typedef void (*FN_CLIENTUSERINFOCHANGED) ( edict_t *pEntity, char *infobuffer ); +typedef void (*FN_SERVERACTIVATE) ( edict_t *pEdictList, int edictCount, int clientMax ); +typedef void (*FN_SERVERDEACTIVATE) ( void ); +typedef void (*FN_PLAYERPRETHINK) ( edict_t *pEntity ); +typedef void (*FN_PLAYERPOSTTHINK) ( edict_t *pEntity ); +typedef void (*FN_STARTFRAME) ( void ); +typedef void (*FN_PARMSNEWLEVEL) ( void ); +typedef void (*FN_PARMSCHANGELEVEL) ( void ); +typedef const char *(*FN_GETGAMEDESCRIPTION) ( void ); +typedef void (*FN_PLAYERCUSTOMIZATION) ( edict_t *pEntity, customization_t *pCust ); +typedef void (*FN_SPECTATORCONNECT) ( edict_t *pEntity ); +typedef void (*FN_SPECTATORDISCONNECT) ( edict_t *pEntity ); +typedef void (*FN_SPECTATORTHINK) ( edict_t *pEntity ); +typedef void (*FN_SYS_ERROR) ( const char *error_string ); + +typedef void (*FN_PM_MOVE) ( struct playermove_s *ppmove, int server ); +typedef void (*FN_PM_INIT) ( struct playermove_s *ppmove ); +typedef char (*FN_PM_FINDTEXTURETYPE) ( char *name ); + +typedef void (*FN_SETUPVISIBILITY) ( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ); +typedef void (*FN_UPDATECLIENTDATA) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); +typedef int (*FN_ADDTOFULLPACK) ( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); +typedef void (*FN_CREATEBASELINE) ( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); +typedef void (*FN_REGISTERENCODERS) ( void ); +typedef int (*FN_GETWEAPONDATA) ( struct edict_s *player, struct weapon_data_s *info ); +typedef void (*FN_CMDSTART) ( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); +typedef void (*FN_CMDEND) ( const edict_t *player ); +typedef int (*FN_CONNECTIONLESSPACKET) ( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); +typedef int (*FN_GETHULLBOUNDS) ( int hullnumber, float *mins, float *maxs ); +typedef void (*FN_CREATEINSTANCEDBASELINES) ( void ); +typedef int (*FN_INCONSISTENTFILE) ( const edict_t *player, const char *filename, char *disconnect_message ); +typedef int (*FN_ALLOWLAGCOMPENSATION) ( void ); + +typedef void (*FN_ONFREEENTPRIVATEDATA) (edict_t *pEnt); +typedef void (*FN_GAMESHUTDOWN) (void); +typedef int (*FN_SHOULDCOLLIDE) (edict_t *pentTouched, edict_t *pentOther); +//Added 2005-08-11 (no SDK update) +typedef void (*FN_CVARVALUE)(const edict_t *pEnt, const char *value); //! Obsolete! Use FN_CVARVALUE2 instead +//Added 2005-11-22 (no SDK update) +typedef void (*FN_CVARVALUE2)(const edict_t *pEnt, int requestID, const char *cvarName, const char *value); + +#endif /* DLLAPI_H */ diff --git a/metamod/engine_api.h b/metamod/engine_api.h new file mode 100644 index 0000000..3e46d28 --- /dev/null +++ b/metamod/engine_api.h @@ -0,0 +1,461 @@ +// engine_api.h - prototypes and typedefs for Half-Life engine functions + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef ENGINE_API_H +#define ENGINE_API_H + +#include + +// Plugin's GetEngineFunctions, called by metamod. +typedef int (*GET_ENGINE_FUNCTIONS_FN) (enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); + +// According to SDK engine/eiface.h: +//! enginefuncs_t +//! ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138 +#define ENGINE_INTERFACE_VERSION 138 + +// Protect against other projects which use this include file but use the +// normal enginefuncs_t type for their meta_engfuncs. +#ifdef METAMOD_CORE +# include "meta_eiface.h" // meta_enginefuncs_t +extern meta_enginefuncs_t meta_engfuncs; +#else +extern enginefuncs_t meta_engfuncs; +#endif + +// From SDK engine/eiface.h: +extern int mm_PrecacheModel(char *s); +extern int mm_PrecacheSound(char *s); +extern void mm_SetModel(edict_t *e, const char *m); +extern int mm_ModelIndex(const char *m); +extern int mm_ModelFrames(int modelIndex); + +extern void mm_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); +extern void mm_ChangeLevel(char *s1, char *s2); +extern void mm_GetSpawnParms(edict_t *ent); +extern void mm_SaveSpawnParms(edict_t *ent); + +extern float mm_VecToYaw(const float *rgflVector); +extern void mm_VecToAngles(const float *rgflVectorIn, float *rgflVectorOut); +extern void mm_MoveToOrigin(edict_t *ent, const float *pflGoal, float dist, int iMoveType); +extern void mm_ChangeYaw(edict_t *ent); +extern void mm_ChangePitch(edict_t *ent); + +extern edict_t *mm_FindEntityByString(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); +extern int mm_GetEntityIllum(edict_t *pEnt); +extern edict_t *mm_FindEntityInSphere(edict_t *pEdictStartSearchAfter, const float *org, float rad); +extern edict_t *mm_FindClientInPVS(edict_t *pEdict); +extern edict_t *mm_EntitiesInPVS(edict_t *pplayer); + +extern void mm_MakeVectors(const float *rgflVector); +extern void mm_AngleVectors(const float *rgflVector, float *forward, float *right, float *up); + +extern edict_t *mm_CreateEntity(void); +extern void mm_RemoveEntity(edict_t *e); +extern edict_t *mm_CreateNamedEntity(int className); + +extern void mm_MakeStatic(edict_t *ent); +extern int mm_EntIsOnFloor(edict_t *e); +extern int mm_DropToFloor(edict_t *e); + +extern int mm_WalkMove(edict_t *ent, float yaw, float dist, int iMode); +extern void mm_SetOrigin(edict_t *e, const float *rgflOrigin); + +extern void mm_EmitSound(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); +extern void mm_EmitAmbientSound(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); + +extern void mm_TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +extern void mm_TraceToss(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); +extern int mm_TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +extern void mm_TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); +extern void mm_TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); +extern const char *mm_TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2 ); +extern void mm_TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); +extern void mm_GetAimVector(edict_t *ent, float speed, float *rgflReturn); + +extern void mm_ServerCommand(char *str); +extern void mm_ServerExecute(void); +extern void ClientCommand(edict_t *pEdict, char *szFmt, ...); + +extern void mm_ParticleEffect(const float *org, const float *dir, float color, float count); +extern void mm_LightStyle(int style, char *val); +extern int mm_DecalIndex(const char *name); +extern int mm_PointContents(const float *rgflVector); + +extern void mm_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +extern void mm_MessageEnd(void); + +extern void mm_WriteByte(int iValue); +extern void mm_WriteChar(int iValue); +extern void mm_WriteShort(int iValue); +extern void mm_WriteLong(int iValue); +extern void mm_WriteAngle(float flValue); +extern void mm_WriteCoord(float flValue); +extern void mm_WriteString(const char *sz); +extern void mm_WriteEntity(int iValue); + +extern void mm_CVarRegister(cvar_t *pCvar); +extern float mm_CVarGetFloat(const char *szVarName); +extern const char* mm_CVarGetString(const char *szVarName); +extern void mm_CVarSetFloat(const char *szVarName, float flValue); +extern void mm_CVarSetString(const char *szVarName, const char *szValue); + +extern void mm_AlertMessage(ALERT_TYPE atype, char *szFmt, ...); +#ifdef HLSDK_3_2_OLD_EIFACE +extern void mm_EngineFprintf(FILE *pfile, char *szFmt, ...); +#else +extern void mm_EngineFprintf(void *pfile, char *szFmt, ...); +#endif + +#ifdef HLSDK_3_2_OLD_EIFACE +extern void *mm_PvAllocEntPrivateData(edict_t *pEdict, long cb); +#else +extern void *mm_PvAllocEntPrivateData(edict_t *pEdict, int32 cb); +#endif +extern void *mm_PvEntPrivateData(edict_t *pEdict); +extern void mm_FreeEntPrivateData(edict_t *pEdict); + +extern const char *mm_SzFromIndex(int iString); +extern int mm_AllocString(const char *szValue); + +extern struct entvars_s *mm_GetVarsOfEnt(edict_t *pEdict); +extern edict_t *mm_PEntityOfEntOffset(int iEntOffset); +extern int mm_EntOffsetOfPEntity(const edict_t *pEdict); +extern int mm_IndexOfEdict(const edict_t *pEdict); +extern edict_t *mm_PEntityOfEntIndex(int iEntIndex); +extern edict_t *mm_FindEntityByVars(struct entvars_s *pvars); +extern void *mm_GetModelPtr(edict_t *pEdict); + +extern int mm_RegUserMsg(const char *pszName, int iSize); + +extern void mm_AnimationAutomove(const edict_t *pEdict, float flTime); +extern void mm_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); + +#ifdef HLSDK_3_2_OLD_EIFACE +extern unsigned long mm_FunctionFromName( const char *pName ); +extern const char *mm_NameForFunction( unsigned long function ); +#else +extern uint32 mm_FunctionFromName( const char *pName ); +extern const char *mm_NameForFunction( uint32 function ); +#endif + +extern void mm_ClientPrintf( edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg ); //! JOHN: engine callbacks so game DLL can print messages to individual clients +extern void mm_ServerPrint( const char *szMsg ); + +extern const char *mm_Cmd_Args( void ); //! these 3 added +extern const char *mm_Cmd_Argv( int argc ); //! so game DLL can easily +extern int mm_Cmd_Argc( void ); //! access client 'cmd' strings + +extern void mm_GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); + +extern void mm_CRC32_Init(CRC32_t *pulCRC); +extern void mm_CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); +extern void mm_CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +extern CRC32_t mm_CRC32_Final(CRC32_t pulCRC); + +#ifdef HLSDK_3_2_OLD_EIFACE +extern long mm_RandomLong(long lLow, long lHigh); +#else +extern int32 mm_RandomLong(int32 lLow, int32 lHigh); +#endif +extern float mm_RandomFloat(float flLow, float flHigh); + +extern void mm_SetView(const edict_t *pClient, const edict_t *pViewent ); +extern float mm_Time( void ); +extern void mm_CrosshairAngle(const edict_t *pClient, float pitch, float yaw); + +extern byte * mm_LoadFileForMe(char *filename, int *pLength); +extern void mm_FreeFile(void *buffer); + +extern void mm_EndSection(const char *pszSectionName); //! trigger_endsection +extern int mm_CompareFileTime(char *filename1, char *filename2, int *iCompare); +extern void mm_GetGameDir(char *szGetGameDir); +extern void mm_Cvar_RegisterVariable(cvar_t *variable); +extern void mm_FadeClientVolume(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); +extern void mm_SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed); +extern edict_t * mm_CreateFakeClient(const char *netname); //! returns NULL if fake client can't be created +extern void mm_RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); +extern int mm_NumberOfEntities(void); + +extern char *mm_GetInfoKeyBuffer(edict_t *e); //! passing in NULL gets the serverinfo +extern char *mm_InfoKeyValue(char *infobuffer, char *key); +extern void mm_SetKeyValue(char *infobuffer, char *key, char *value); +extern void mm_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); + +extern int mm_IsMapValid(char *filename); +extern void mm_StaticDecal( const float *origin, int decalIndex, int entityIndex, int modelIndex ); +extern int mm_PrecacheGeneric(char *s); +extern int mm_GetPlayerUserId(edict_t *e ); //! returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients +extern void mm_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +extern int mm_IsDedicatedServer(void);//! is this a dedicated server? +extern cvar_t *mm_CVarGetPointer(const char *szVarName); +extern unsigned int mm_GetPlayerWONId(edict_t *e); //! returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients + +//! YWB 8/1/99 TFF Physics additions +extern void mm_Info_RemoveKey( char *s, const char *key ); +extern const char *mm_GetPhysicsKeyValue( const edict_t *pClient, const char *key ); +extern void mm_SetPhysicsKeyValue( const edict_t *pClient, const char *key, const char *value ); +extern const char *mm_GetPhysicsInfoString( const edict_t *pClient ); +extern unsigned short mm_PrecacheEvent( int type, const char *psz ); +extern void mm_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + +extern unsigned char *mm_SetFatPVS( float *org ); +extern unsigned char *mm_SetFatPAS( float *org ); + +extern int mm_CheckVisibility( const edict_t *entity, unsigned char *pset ); + +extern void mm_DeltaSetField( struct delta_s *pFields, const char *fieldname ); +extern void mm_DeltaUnsetField( struct delta_s *pFields, const char *fieldname ); +extern void mm_DeltaAddEncoder( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); +extern int mm_GetCurrentPlayer( void ); +extern int mm_CanSkipPlayer( const edict_t *player ); +extern int mm_DeltaFindField( struct delta_s *pFields, const char *fieldname ); +extern void mm_DeltaSetFieldByIndex( struct delta_s *pFields, int fieldNumber ); +extern void mm_DeltaUnsetFieldByIndex( struct delta_s *pFields, int fieldNumber ); + +extern void mm_SetGroupMask( int mask, int op ); + +extern int CreateInstancedBaseline( int classname, struct entity_state_s *baseline ); +extern void mm_Cvar_DirectSet( struct cvar_s *var, char *value ); + +//! Forces the client and server to be running with the same version of the specified file +//!( e.g., a player model ). +//! Calling this has no effect in single player +extern void mm_ForceUnmodified( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); + +extern void mm_GetPlayerStats( const edict_t *pClient, int *ping, int *packet_loss ); + +extern void mm_AddServerCommand( char *cmd_name, void (*function) (void) ); +// Added in SDK 2.2: +extern qboolean mm_Voice_GetClientListening(int iReceiver, int iSender); +extern qboolean mm_Voice_SetClientListening(int iReceiver, int iSender, qboolean bListen); +// Added for HL 1109 (no SDK update): +extern const char *mm_pfnGetPlayerAuthId(edict_t *e); +// Added 2003-11-10 (no SDK update): +extern sequenceEntry_s * mm_SequenceGet(const char* fileName, const char* entryName); +extern sentenceEntry_s * mm_SequencePickSentence(const char* groupName, int pickMethod, int *picked); +extern int mm_GetFileSize(char *filename); +extern unsigned int mm_GetApproxWavePlayLen(const char *filepath); +extern int mm_IsCareerMatch(void); +extern int mm_GetLocalizedStringLength(const char *label); +extern void mm_RegisterTutorMessageShown(int mid); +extern int mm_GetTimesTutorMessageShown(int mid); +extern void mm_ProcessTutorMessageDecayBuffer(int *buffer, int bufferLength); +extern void mm_ConstructTutorMessageDecayBuffer(int *buffer, int bufferLength); +extern void mm_ResetTutorMessageDecayData(void); +//Added 2005-08-11 (no SDK update) +extern void mm_QueryClientCvarValue(const edict_t *pEdict, const char *cvarName); //! Obsolete! Use mm_QueryClientCvarValue2 instead +//Added 2005-11-22 (no SDK update) +extern void mm_QueryClientCvarValue2(const edict_t *pEdict, const char *cvarName, int requestID); + + +// Typedefs for the above functions: + +typedef int (*FN_PRECACHEMODEL) (char* s); +typedef int (*FN_PRECACHESOUND) (char* s); +typedef void (*FN_SETMODEL) (edict_t *e, const char *m); +typedef int (*FN_MODELINDEX) (const char *m); +typedef int (*FN_MODELFRAMES) (int modelIndex); +typedef void (*FN_SETSIZE) (edict_t *e, const float *rgflMin, const float *rgflMax); +typedef void (*FN_CHANGELEVEL) (char *s1, char *s2); +typedef void (*FN_GETSPAWNPARMS) (edict_t *ent); +typedef void (*FN_SAVESPAWNPARMS) (edict_t *ent); +typedef float (*FN_VECTOYAW) (const float *rgflVector); +typedef void (*FN_VECTOANGLES) (const float *rgflVectorIn, float *rgflVectorOut); +typedef void (*FN_MOVETOORIGIN) (edict_t *ent, const float *pflGoal, float dist, int iMoveType); +typedef void (*FN_CHANGEYAW) (edict_t *ent); +typedef void (*FN_CHANGEPITCH) (edict_t *ent); +typedef edict_t * (*FN_FINDENTITYBYSTRING) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); +typedef int (*FN_GETENTITYILLUM) (edict_t *pEnt); +typedef edict_t * (*FN_FINDENTITYINSPHERE) (edict_t *pEdictStartSearchAfter, const float *org, float rad); +typedef edict_t * (*FN_FINDCLIENTINPVS) (edict_t *pEdict); +typedef edict_t * (*FN_ENTITIESINPVS) (edict_t *pplayer); +typedef void (*FN_MAKEVECTORS) (const float *rgflVector); +typedef void (*FN_ANGLEVECTORS) (const float *rgflVector, float *forward, float *right, float *up); +typedef edict_t * (*FN_CREATEENTITY) (void); +typedef void (*FN_REMOVEENTITY) (edict_t *e); +typedef edict_t * (*FN_CREATENAMEDENTITY) (int className); +typedef void (*FN_MAKESTATIC) (edict_t *ent); +typedef int (*FN_ENTISONFLOOR) (edict_t *e); +typedef int (*FN_DROPTOFLOOR) (edict_t *e); +typedef int (*FN_WALKMOVE) (edict_t *ent, float yaw, float dist, int iMode); +typedef void (*FN_SETORIGIN) (edict_t *e, const float *rgflOrigin); +typedef void (*FN_EMITSOUND) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); +typedef void (*FN_EMITAMBIENTSOUND) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); +typedef void (*FN_TRACELINE) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +typedef void (*FN_TRACETOSS) (edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); +typedef int (*FN_TRACEMONSTERHULL) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +typedef void (*FN_TRACEHULL) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); +typedef void (*FN_TRACEMODEL) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); +typedef const char * (*FN_TRACETEXTURE) (edict_t *pTextureEntity, const float *v1, const float *v2 ); +typedef void (*FN_TRACESPHERE) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); +typedef void (*FN_GETAIMVECTOR) (edict_t *ent, float speed, float *rgflReturn); +typedef void (*FN_SERVERCOMMAND) (char *str); +typedef void (*FN_SERVEREXECUTE) (void); +typedef void (*FN_CLIENTCOMMAND_ENG) (edict_t *pEdict, char *szFmt, ...); +typedef void (*FN_PARTICLEEFFECT) (const float *org, const float *dir, float color, float count); +typedef void (*FN_LIGHTSTYLE) (int style, char *val); +typedef int (*FN_DECALINDEX) (const char *name); +typedef int (*FN_POINTCONTENTS) (const float *rgflVector); +typedef void (*FN_MESSAGEBEGIN) (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +typedef void (*FN_MESSAGEEND) (void); +typedef void (*FN_WRITEBYTE) (int iValue); +typedef void (*FN_WRITECHAR) (int iValue); +typedef void (*FN_WRITESHORT) (int iValue); +typedef void (*FN_WRITELONG) (int iValue); +typedef void (*FN_WRITEANGLE) (float flValue); +typedef void (*FN_WRITECOORD) (float flValue); +typedef void (*FN_WRITESTRING) (const char *sz); +typedef void (*FN_WRITEENTITY) (int iValue); +typedef void (*FN_CVARREGISTER) (cvar_t *pCvar); +typedef float (*FN_CVARGETFLOAT) (const char *szVarName); +typedef const char * (*FN_CVARGETSTRING) (const char *szVarName); +typedef void (*FN_CVARSETFLOAT) (const char *szVarName, float flValue); +typedef void (*FN_CVARSETSTRING) (const char *szVarName, const char *szValue); +typedef void (*FN_ALERTMESSAGE) (ALERT_TYPE atype, char *szFmt, ...); +#ifdef HLSDK_3_2_OLD_EIFACE +typedef void (*FN_ENGINEFPRINTF) (FILE *pfile, char *szFmt, ...); +typedef void * (*FN_PVALLOCENTPRIVATEDATA) (edict_t *pEdict, long cb); +#else +typedef void (*FN_ENGINEFPRINTF) (void *pfile, char *szFmt, ...); +typedef void * (*FN_PVALLOCENTPRIVATEDATA) (edict_t *pEdict, int32 cb); +#endif +typedef void * (*FN_PVENTPRIVATEDATA) (edict_t *pEdict); +typedef void (*FN_FREEENTPRIVATEDATA) (edict_t *pEdict); +typedef const char * (*FN_SZFROMINDEX) (int iString); +typedef int (*FN_ALLOCSTRING) (const char *szValue); +typedef struct entvars_s * (*FN_GETVARSOFENT) (edict_t *pEdict); +typedef edict_t * (*FN_PENTITYOFENTOFFSET) (int iEntOffset); +typedef int (*FN_ENTOFFSETOFPENTITY) (const edict_t *pEdict); +typedef int (*FN_INDEXOFEDICT) (const edict_t *pEdict); +typedef edict_t * (*FN_PENTITYOFENTINDEX) (int iEntIndex); +typedef edict_t * (*FN_FINDENTITYBYVARS) (struct entvars_s *pvars); +typedef void * (*FN_GETMODELPTR) (edict_t *pEdict); +typedef int (*FN_REGUSERMSG) (const char *pszName, int iSize); +typedef void (*FN_ANIMATIONAUTOMOVE) (const edict_t *pEdict, float flTime); +typedef void (*FN_GETBONEPOSITION) (const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); +#ifdef HLSDK_3_2_OLD_EIFACE +typedef unsigned long (*FN_FUNCTIONFROMNAME) ( const char *pName ); +typedef const char * (*FN_NAMEFORFUNCTION) ( unsigned long function ); +#else +typedef uint32 (*FN_FUNCTIONFROMNAME) ( const char *pName ); +typedef const char * (*FN_NAMEFORFUNCTION) ( uint32 function ); +#endif +typedef void (*FN_CLIENTPRINTF) ( edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg ); +typedef void (*FN_SERVERPRINT) ( const char *szMsg ); +typedef const char * (*FN_CMD_ARGS) ( void ); +typedef const char * (*FN_CMD_ARGV) ( int argc ); +typedef int (*FN_CMD_ARGC) ( void ); +typedef void (*FN_GETATTACHMENT) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); +typedef void (*FN_CRC32_INIT) (CRC32_t *pulCRC); +typedef void (*FN_CRC32_PROCESSBUFFER) (CRC32_t *pulCRC, void *p, int len); +typedef void (*FN_CRC32_PROCESSBYTE) (CRC32_t *pulCRC, unsigned char ch); +typedef CRC32_t (*FN_CRC32_FINAL) (CRC32_t pulCRC); +#ifdef HLSDK_3_2_OLD_EIFACE +typedef long (*FN_RANDOMLONG) (long lLow, long lHigh); +#else +typedef int32 (*FN_RANDOMLONG) (int32 lLow, int32 lHigh); +#endif +typedef float (*FN_RANDOMFLOAT) (float flLow, float flHigh); +typedef void (*FN_SETVIEW) (const edict_t *pClient, const edict_t *pViewent ); +typedef float (*FN_TIME) ( void ); +typedef void (*FN_CROSSHAIRANGLE) (const edict_t *pClient, float pitch, float yaw); +typedef byte * (*FN_LOADFILEFORME) (char *filename, int *pLength); +typedef void (*FN_FREEFILE) (void *buffer); +typedef void (*FN_ENDSECTION) (const char *pszSectionName); +typedef int (*FN_COMPAREFILETIME) (char *filename1, char *filename2, int *iCompare); +typedef void (*FN_GETGAMEDIR) (char *szGetGameDir); +typedef void (*FN_CVAR_REGISTERVARIABLE) (cvar_t *variable); +typedef void (*FN_FADECLIENTVOLUME) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); +typedef void (*FN_SETCLIENTMAXSPEED) (const edict_t *pEdict, float fNewMaxspeed); +typedef edict_t * (*FN_CREATEFAKECLIENT) (const char *netname); +typedef void (*FN_RUNPLAYERMOVE) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); +typedef int (*FN_NUMBEROFENTITIES) (void); +typedef char * (*FN_GETINFOKEYBUFFER) (edict_t *e); +typedef char * (*FN_INFOKEYVALUE) (char *infobuffer, char *key); +typedef void (*FN_SETKEYVALUE) (char *infobuffer, char *key, char *value); +typedef void (*FN_SETCLIENTKEYVALUE) (int clientIndex, char *infobuffer, char *key, char *value); +typedef int (*FN_ISMAPVALID) (char *filename); +typedef void (*FN_STATICDECAL) ( const float *origin, int decalIndex, int entityIndex, int modelIndex ); +typedef int (*FN_PRECACHEGENERIC) (char *s); +typedef int (*FN_GETPLAYERUSERID) (edict_t *e ); +typedef void (*FN_BUILDSOUNDMSG) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +typedef int (*FN_ISDEDICATEDSERVER) (void); +typedef cvar_t * (*FN_CVARGETPOINTER) (const char *szVarName); +typedef unsigned int (*FN_GETPLAYERWONID) (edict_t *e); +typedef void (*FN_INFO_REMOVEKEY) ( char *s, const char *key ); +typedef const char * (*FN_GETPHYSICSKEYVALUE) ( const edict_t *pClient, const char *key ); +typedef void (*FN_SETPHYSICSKEYVALUE) ( const edict_t *pClient, const char *key, const char *value ); +typedef const char * (*FN_GETPHYSICSINFOSTRING) ( const edict_t *pClient ); +typedef unsigned short (*FN_PRECACHEEVENT) ( int type, const char *psz ); +typedef void (*FN_PLAYBACKEVENT) ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); +typedef unsigned char * (*FN_SETFATPVS) ( float *org ); +typedef unsigned char * (*FN_SETFATPAS) ( float *org ); +typedef int (*FN_CHECKVISIBILITY) ( const edict_t *entity, unsigned char *pset ); +typedef void (*FN_DELTASETFIELD) ( struct delta_s *pFields, const char *fieldname ); +typedef void (*FN_DELTAUNSETFIELD) ( struct delta_s *pFields, const char *fieldname ); +typedef void (*FN_DELTAADDENCODER) ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); +typedef int (*FN_GETCURRENTPLAYER) ( void ); +typedef int (*FN_CANSKIPPLAYER) ( const edict_t *player ); +typedef int (*FN_DELTAFINDFIELD) ( struct delta_s *pFields, const char *fieldname ); +typedef void (*FN_DELTASETFIELDBYINDEX) ( struct delta_s *pFields, int fieldNumber ); +typedef void (*FN_DELTAUNSETFIELDBYINDEX) ( struct delta_s *pFields, int fieldNumber ); +typedef void (*FN_SETGROUPMASK) ( int mask, int op ); +typedef int (*FN_CREATEINSTANCEDBASELINE) ( int classname, struct entity_state_s *baseline ); +typedef void (*FN_CVAR_DIRECTSET) ( struct cvar_s *var, char *value ); +typedef void (*FN_FORCEUNMODIFIED) ( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); +typedef void (*FN_GETPLAYERSTATS) ( const edict_t *pClient, int *ping, int *packet_loss ); +typedef void (*FN_ADDSERVERCOMMAND) ( char *cmd_name, void (*function) (void) ); +// Added in SDK 2.2: +typedef qboolean (*FN_VOICE_GETCLIENTLISTENING) (int iReceiver, int iSender); +typedef qboolean (*FN_VOICE_SETCLIENTLISTENING) (int iReceiver, int iSender, qboolean bListen); +// Added for HL 1109 (no SDK update): +typedef const char * (*FN_GETPLAYERAUTHID) (edict_t *e); +// Added 2003-11-10 (no SDK update): +typedef sequenceEntry_s * (*FN_SEQUENCEGET) (const char* fileName, const char* entryName); +typedef sentenceEntry_s * (*FN_SEQUENCEPICKSENTENCE) (const char* groupName, int pickMethod, int *picked); +typedef int (*FN_GETFILESIZE) (char *filename); +typedef unsigned int (*FN_GETAPPROXWAVEPLAYLEN) (const char *filepath); +typedef int (*FN_ISCAREERMATCH) (void); +typedef int (*FN_GETLOCALIZEDSTRINGLENGTH) (const char *label); +typedef void (*FN_REGISTERTUTORMESSAGESHOWN) (int mid); +typedef int (*FN_GETTIMESTUTORMESSAGESHOWN) (int mid); +typedef void (*FN_PROCESSTUTORMESSAGEDECAYBUFFER) (int *buffer, int bufferLength); +typedef void (*FN_CONSTRUCTTUTORMESSAGEDECAYBUFFER) (int *buffer, int bufferLength); +typedef void (*FN_RESETTUTORMESSAGEDECAYDATA) (void); +//Added 2005-08-11 (no SDK update) +typedef void (*FN_QUERYCLIENTCVARVALUE)(const edict_t *pEdict, const char *cvarName); //! Obsolete! Use FN_QUERYCLIENTCVARVALUE2 instead +//Added 2005-11-22 (no SDK update) +typedef void (*FN_QUERYCLIENTCVARVALUE2)(const edict_t *pEdict, const char *cvarName, int requestID); + +#endif /* ENGINE_API_H */ \ No newline at end of file diff --git a/metamod/enginecallbacks.h b/metamod/enginecallbacks.h new file mode 100644 index 0000000..7045fbb --- /dev/null +++ b/metamod/enginecallbacks.h @@ -0,0 +1,74 @@ +// enginecallbacks.h - wrapper for + +/* + * Copyright (c) 2001-2006 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef MM_ENGINECALLBACKS_H +#define MM_ENGINECALLBACKS_H + +// This file is a wrapper around the SDK's enginecallback.h file. We need +// this because we use a different type for the global object g_engfuncs, +// which is still compatible with the enginefuncs_t that the SDK +// uses. +// This is only done for files that belong to Metamod, not other projects +// like plugins that use this file, or others that include it, too. +// Since we don't have a clean seperation of include files right now we +// "hack" our way around that by using a flag METAMOD_CORE which is set +// when compiling Metamod proper. + +#ifdef METAMOD_CORE +# include "meta_eiface.h" // HL_enginefuncs_t + +// Use a #define to bend the enginefuncs_t type to our HL_enginefuncs_t +// type instead as we now use that for the global object g_engfuncs. +# define enginefuncs_t HL_enginefuncs_t +#endif /* METAMOD_CORE */ + +#include // ALERT, etc + +#ifdef METAMOD_CORE +# undef enginefuncs_t +#endif /* METAMOD_CORE */ + +// Also, create some additional macros for engine callback functions, which +// weren't in SDK dlls/enginecallbacks.h but probably should have been. + +#define GET_INFOKEYBUFFER (*g_engfuncs.pfnGetInfoKeyBuffer) +#define INFOKEY_VALUE (*g_engfuncs.pfnInfoKeyValue) +#define SET_CLIENT_KEYVALUE (*g_engfuncs.pfnSetClientKeyValue) +#define REG_SVR_COMMAND (*g_engfuncs.pfnAddServerCommand) +#define SERVER_PRINT (*g_engfuncs.pfnServerPrint) +#define SET_SERVER_KEYVALUE (*g_engfuncs.pfnSetKeyValue) +#define QUERY_CLIENT_CVAR_VALUE (*g_engfuncs.pfnQueryClientCvarValue) +#define QUERY_CLIENT_CVAR_VALUE2 (*g_engfuncs.pfnQueryClientCvarValue2) + + +#endif /* MM_ENGINECALLBACKS_H */ diff --git a/metamod/h_export.h b/metamod/h_export.h new file mode 100644 index 0000000..878acd1 --- /dev/null +++ b/metamod/h_export.h @@ -0,0 +1,46 @@ +// h_export.h - prototypes for h_export.cpp + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef H_EXPORT_H +#define H_EXPORT_H + +#include "osdep.h" // DLLEXPORT, WINAPI, etc + +// Our GiveFnptrsToDll, called by engine. +typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN) (enginefuncs_t + *pengfuncsFromEngine, globalvars_t *pGlobals); + +C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine, + globalvars_t *pGlobals); + +#endif /* H_EXPORT_H */ diff --git a/metamod/log_meta.h b/metamod/log_meta.h new file mode 100644 index 0000000..ec47c6d --- /dev/null +++ b/metamod/log_meta.h @@ -0,0 +1,99 @@ +// log_meta.h - functions & macros for logging + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef LOG_META_H +#define LOG_META_H + +#include "enginecallbacks.h" // ALERT, etc +#include "sdk_util.h" // UTIL_VarArgs, etc + +// Debug logging. +// +// This is done as a macro, rather than a function. This way, you can add +// DEBUG statements all over, without worrying about performance +// implications. If the debugging level is set low, all those statements +// will only generate a simple float/int compare each; if we were to use a +// function instead of a macro, it would end up wasting a lot of cpu cycles +// calling/returning from the function every time. With a fair number of +// DEBUG statements, or if they're placed in frequently excuted code, the +// overhead of the wasted function calls could significantly impact server +// performance. +// +// For this reason, we also compare directly to the float value of the +// cvar, rather than calling CVAR_GET_FLOAT() and thus generating a string +// compare for each DEBUG statement. +// +// Called as: +// META_DEBUG(3, ("return code: %d", ret)); +// +// Note the double parens, and the missing parens around "args" in the +// macro itself. Note also the "do..while(0)" loop wrapping the +// statements, so they become a single statement when expanded, necessary +// for times when it might be called as a single-statement result of an +// else (or other flow control). +// +// As suggested by Jussi Kivilinna: Use "if(meta_debug.value < level); else +// DO(something);" style because "meta_debug.value < level" is in most common +// case "false". Check disasm, contitional jumps are predicted not to be +// taken by CPU. +// +// Yes, it's all a bit of a hack. + +#define META_DEBUG(level, args) \ + do { if(meta_debug.value < level) break; else ALERT(at_logged, "[META] (debug:%d) %s\n", level, UTIL_VarArgs args ); } while(0) + +// max buffer size for printed messages +#define MAX_LOGMSG_LEN 1024 + +// max buffer size for client messages +#define MAX_CLIENTMSG_LEN 128 + +extern cvar_t meta_debug; + +// META_DEV provides debug logging via the cvar "developer" (when set to 1) +// and uses a function call rather than a macro as it's really intended to +// be used only during startup, before meta_debug has been set from reading +// server.cfg. +// NOTE: META_DEV has now been mostly obsoleted in the code. + +void META_CONS(char *fmt, ...); +void META_DEV(char *fmt, ...); +void META_INFO(char *fmt, ...); +void META_WARNING(char *fmt, ...); +void META_ERROR(char *fmt, ...); +void META_LOG(char *fmt, ...); +void META_CLIENT(edict_t *pEntity, char *fmt, ...); + +void flush_ALERT_buffer(void); + +#endif /* LOG_META_H */ diff --git a/metamod/meta_api.h b/metamod/meta_api.h new file mode 100644 index 0000000..3bbccfa --- /dev/null +++ b/metamod/meta_api.h @@ -0,0 +1,232 @@ +// meta_api.h - description of metamod's DLL interface + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef META_API_H +#define META_API_H + +#include "dllapi.h" // GETENTITYAPI_FN, etc +#include "engine_api.h" // GET_ENGINE_FUNCTIONS_FN, etc +#include "plinfo.h" // plugin_info_t, etc +#include "mutil.h" // mutil_funcs_t, etc +#include "osdep.h" // DLLEXPORT, etc + +// Version consists of "major:minor", two separate integer numbers. +// Version 1 original +// Version 2 added plugin_info_t **pinfo +// Version 3 init split into query and attach, added detach +// Version 4 added (PLUG_LOADTIME now) to attach +// Version 5 changed mm ifvers int* to string, moved pl ifvers to info +// Version 5:1 added link support for entity "adminmod_timer" (adminmod) +// Version 5:2 added gamedll_funcs to meta_attach() [v1.0-rc2] +// Version 5:3 added mutil_funcs to meta_query() [v1.05] +// Version 5:4 added centersay utility functions [v1.06] +// Version 5:5 added Meta_Init to plugin API [v1.08] +// Version 5:6 added CallGameEntity utility function [v1.09] +// Version 5:7 added GetUserMsgID, GetUserMsgName util funcs [v1.11] +// Version 5:8 added GetPluginPath [v1.11] +// Version 5:9 added GetGameInfo [v1.14] +// Version 5:10 added GINFO_REALDLL_FULLPATH for GetGameInfo [v1.17] +// Version 5:11 added plugin loading and unloading API [v1.18] +// Version 5:12 added util code for checking player query status [v1.18] +// Version 5:13 added cvarquery2 support and api for calling hook tables [v1.19] +#define META_INTERFACE_VERSION "5:13" + +#ifdef UNFINISHED +// Version 5:99 added event hook utility functions [v.???] +#define META_INTERFACE_VERSION "5:99" +#endif /* UNFINISHED */ + +// Flags returned by a plugin's api function. +// NOTE: order is crucial, as greater/less comparisons are made. +typedef enum { + MRES_UNSET = 0, + MRES_IGNORED, // plugin didn't take any action + MRES_HANDLED, // plugin did something, but real function should still be called + MRES_OVERRIDE, // call real function, but use my return value + MRES_SUPERCEDE, // skip real function; use my return value +} META_RES; + +// Variables provided to plugins. +typedef struct meta_globals_s { + META_RES mres; // writable; plugin's return flag + META_RES prev_mres; // readable; return flag of the previous plugin called + META_RES status; // readable; "highest" return flag so far + void *orig_ret; // readable; return value from "real" function + void *override_ret; // readable; return value from overriding/superceding plugin +} meta_globals_t; + +extern meta_globals_t *gpMetaGlobals; +#define SET_META_RESULT(result) gpMetaGlobals->mres=result +#define RETURN_META(result) \ + do { gpMetaGlobals->mres=result; return; } while(0) + +#define RETURN_META_VALUE(result, value) \ + do { gpMetaGlobals->mres=result; return(value); } while(0) + +#define META_RESULT_STATUS gpMetaGlobals->status +#define META_RESULT_PREVIOUS gpMetaGlobals->prev_mres +#define META_RESULT_ORIG_RET(type) *(type *)gpMetaGlobals->orig_ret +#define META_RESULT_OVERRIDE_RET(type) *(type *)gpMetaGlobals->override_ret + +// Table of getapi functions, retrieved from each plugin. +typedef struct { + GETENTITYAPI_FN pfnGetEntityAPI; + GETENTITYAPI_FN pfnGetEntityAPI_Post; + GETENTITYAPI2_FN pfnGetEntityAPI2; + GETENTITYAPI2_FN pfnGetEntityAPI2_Post; + GETNEWDLLFUNCTIONS_FN pfnGetNewDLLFunctions; + GETNEWDLLFUNCTIONS_FN pfnGetNewDLLFunctions_Post; + GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions; + GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions_Post; +} META_FUNCTIONS; + +// Pair of function tables provided by game DLL. +typedef struct { + DLL_FUNCTIONS *dllapi_table; + NEW_DLL_FUNCTIONS *newapi_table; +} gamedll_funcs_t; + +// Declared in plugin; referenced in macros. +extern gamedll_funcs_t *gpGamedllFuncs; +extern mutil_funcs_t *gpMetaUtilFuncs; + +// Tell the dll that we'll be loading it as a metamod plugin, in case it +// needs to do something special prior to the standard query/attach +// procedure. In particular, this will allow for DLL's that can be used as +// both standalone DLL's and metamod plugins. (optional; not required in +// plugin) +C_DLLEXPORT void Meta_Init(void); +typedef void (*META_INIT_FN) (void); + +// Get info about plugin, compare meta_interface versions, provide meta +// utility callback functions. +C_DLLEXPORT int Meta_Query(char *interfaceVersion, + plugin_info_t **plinfo, + mutil_funcs_t *pMetaUtilFuncs); +typedef int (*META_QUERY_FN) (char *interfaceVersion, + plugin_info_t **plinfo, + mutil_funcs_t *pMetaUtilFuncs); + +// Attach the plugin to the API; get the table of getapi functions; give +// meta_globals and gamedll_funcs. +C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, + META_FUNCTIONS *pFunctionTable, + meta_globals_t *pMGlobals, + gamedll_funcs_t *pGamedllFuncs); +typedef int (*META_ATTACH_FN) (PLUG_LOADTIME now, + META_FUNCTIONS *pFunctionTable, + meta_globals_t *pMGlobals, + gamedll_funcs_t *pGamedllFuncs); + +// Detach the plugin; tell why and when. +C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); +typedef int (*META_DETACH_FN) (PLUG_LOADTIME now, PL_UNLOAD_REASON reason); + +// Standard HL SDK interface function prototypes. +C_DLLEXPORT int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, + int interfaceVersion ); +C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, + int *interfaceVersion ); + +// Additional SDK-like interface function prototypes. +C_DLLEXPORT int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion ); +C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); +C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); + +// Convenience macros for accessing GameDLL functions. Note: these talk +// _directly_ to the gamedll, and are not multiplexed through Metamod to +// the other plugins. +// DLL API functions: +#define MDLL_FUNC gpGamedllFuncs->dllapi_table + +#define MDLL_GameDLLInit MDLL_FUNC->pfnGameInit +#define MDLL_Spawn MDLL_FUNC->pfnSpawn +#define MDLL_Think MDLL_FUNC->pfnThink +#define MDLL_Use MDLL_FUNC->pfnUse +#define MDLL_Touch MDLL_FUNC->pfnTouch +#define MDLL_Blocked MDLL_FUNC->pfnBlocked +#define MDLL_KeyValue MDLL_FUNC->pfnKeyValue +#define MDLL_Save MDLL_FUNC->pfnSave +#define MDLL_Restore MDLL_FUNC->pfnRestore +#define MDLL_ObjectCollsionBox MDLL_FUNC->pfnAbsBox +#define MDLL_SaveWriteFields MDLL_FUNC->pfnSaveWriteFields +#define MDLL_SaveReadFields MDLL_FUNC->pfnSaveReadFields +#define MDLL_SaveGlobalState MDLL_FUNC->pfnSaveGlobalState +#define MDLL_RestoreGlobalState MDLL_FUNC->pfnRestoreGlobalState +#define MDLL_ResetGlobalState MDLL_FUNC->pfnResetGlobalState +#define MDLL_ClientConnect MDLL_FUNC->pfnClientConnect +#define MDLL_ClientDisconnect MDLL_FUNC->pfnClientDisconnect +#define MDLL_ClientKill MDLL_FUNC->pfnClientKill +#define MDLL_ClientPutInServer MDLL_FUNC->pfnClientPutInServer +#define MDLL_ClientCommand MDLL_FUNC->pfnClientCommand +#define MDLL_ClientUserInfoChanged MDLL_FUNC->pfnClientUserInfoChanged +#define MDLL_ServerActivate MDLL_FUNC->pfnServerActivate +#define MDLL_ServerDeactivate MDLL_FUNC->pfnServerDeactivate +#define MDLL_PlayerPreThink MDLL_FUNC->pfnPlayerPreThink +#define MDLL_PlayerPostThink MDLL_FUNC->pfnPlayerPostThink +#define MDLL_StartFrame MDLL_FUNC->pfnStartFrame +#define MDLL_ParmsNewLevel MDLL_FUNC->pfnParmsNewLevel +#define MDLL_ParmsChangeLevel MDLL_FUNC->pfnParmsChangeLevel +#define MDLL_GetGameDescription MDLL_FUNC->pfnGetGameDescription +#define MDLL_PlayerCustomization MDLL_FUNC->pfnPlayerCustomization +#define MDLL_SpectatorConnect MDLL_FUNC->pfnSpectatorConnect +#define MDLL_SpectatorDisconnect MDLL_FUNC->pfnSpectatorDisconnect +#define MDLL_SpectatorThink MDLL_FUNC->pfnSpectatorThink +#define MDLL_Sys_Error MDLL_FUNC->pfnSys_Error +#define MDLL_PM_Move MDLL_FUNC->pfnPM_Move +#define MDLL_PM_Init MDLL_FUNC->pfnPM_Init +#define MDLL_PM_FindTextureType MDLL_FUNC->pfnPM_FindTextureType +#define MDLL_SetupVisibility MDLL_FUNC->pfnSetupVisibility +#define MDLL_UpdateClientData MDLL_FUNC->pfnUpdateClientData +#define MDLL_AddToFullPack MDLL_FUNC->pfnAddToFullPack +#define MDLL_CreateBaseline MDLL_FUNC->pfnCreateBaseline +#define MDLL_RegisterEncoders MDLL_FUNC->pfnRegisterEncoders +#define MDLL_GetWeaponData MDLL_FUNC->pfnGetWeaponData +#define MDLL_CmdStart MDLL_FUNC->pfnCmdStart +#define MDLL_CmdEnd MDLL_FUNC->pfnCmdEnd +#define MDLL_ConnectionlessPacket MDLL_FUNC->pfnConnectionlessPacket +#define MDLL_GetHullBounds MDLL_FUNC->pfnGetHullBounds +#define MDLL_CreateInstancedBaselines MDLL_FUNC->pfnCreateInstancedBaselines +#define MDLL_InconsistentFile MDLL_FUNC->pfnInconsistentFile +#define MDLL_AllowLagCompensation MDLL_FUNC->pfnAllowLagCompensation + +// NEW API functions: +#define MNEW_FUNC gpGamedllFuncs->newapi_table + +#define MNEW_OnFreeEntPrivateData MNEW_FUNC->pfnOnFreeEntPrivateData +#define MNEW_GameShutdown MNEW_FUNC->pfnGameShutdown +#define MNEW_ShouldCollide MNEW_FUNC->pfnShouldCollide +#define MNEW_CvarValue MNEW_FUNC->pfnCvarValue +#define MNEW_CvarValue2 MNEW_FUNC->pfnCvarValue2 + +#endif /* META_API_H */ diff --git a/metamod/mhook.h b/metamod/mhook.h new file mode 100644 index 0000000..b56b0a6 --- /dev/null +++ b/metamod/mhook.h @@ -0,0 +1,157 @@ +#ifdef UNFINISHED + +// mhook.h - class and types to describe hooks and hooklists + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef MHOOK_H +#define MHOOK_H + +#include "plinfo.h" // plid_t, etc +#include "types_meta.h" // mBOOL +#include "osdep.h" // MUTEX_T, etc + +#define MAX_HOOKS 100 + +// Particular game events that we detect, though whatever means we can best +// find. +typedef enum { + EV_NONE = 0, // no event here... + // non-log detected + EV_PLAYER_CONNECT, // ie ClientConnect + EV_PLAYER_ENTER, // ie ClientPutInServer + EV_PLAYER_LEAVE, // ie ClientDisconnect (opposite PutInServer) + EV_PLAYER_SPAWN, // deadflag change to DEAD_NO + EV_PLAYER_DEATH, // deadflag change to DEAD_DEAD + EV_PLAYER_CHANGE_NAME, // netname change in ClientUserInfoChanged + // log detected + EV_PLAYER_JOIN_TEAM, // ie "Joe<15><785><>" joined team "CT" + EV_PLAYER_SUICIDE, // ie "Joe<15><785>" committed suicide ... + EV_PLAYER_CHANGE_ROLE, // TFC: ie "Joe<15><785>" changed role to "Pyro" + EV_TEAM_KILL, // ie "Joe<15><785>" killed "Bob<16><342>" ... + EV_WEAPON_KILL, // ie "Joe<15><785>" killed "Sam<17><197>" with "sg552" + EV_TEAM_SCORE, // ie Team "CT" scored "7" with "2" players +} game_event_t; + +// Info corresponding to a player, in particular the info found in the logline. +typedef struct { + char *name; + int userid; + int wonid; + char *team; +} event_player_t; + +// Info for an event, mostly corresponding to info from a logline. +typedef struct { + game_event_t evtype; // specific event, if identified. + char *buf; // copy of the logmsg, with embedded NULLs + event_player_t *player; + char *action; // "triggered" string, or a generic action string + event_player_t *target; + char *with; +} event_args_t; + +// Types for callback functions to be called for requested event/logline. +typedef void (*event_func_t) (game_event_t event, event_args_t *args, + const char *logline); +typedef void (*logmatch_func_t) (const char *pattern, event_args_t *args, + const char *logline); + +// The 4 types of hook requests we accept. +typedef enum { + H_NONE = 0, + H_EVENT, // Specific event, from a short list. + H_TRIGGER, // A given "triggered" string. + H_STRING, // Any substring of logline. + H_REGEX, // A regular expression matching of logline. +} hook_t; + + +// Class for individual hook function, as registered by a plugin. +class MHook { + friend class MHookList; + friend class MFuncQueue; + private: + // data: + int index; + hook_t type; // EVENT, TRIGGER, etc + plid_t plid; + int pl_index; // index of matching plugin + void *pfnHandle; + game_event_t event; // if type is H_EVENT + const char *match; // if type is TRIGGER, STRING, or REGEX + // Copy/Assignment constructors, to satisfy -Weffc++. + // Note however, we declare them private and don't define them, since + // we don't ever want to copy or assign instances of the class. + // (thanks to O'Reilly "C++: The Core Language", page 113) + MHook(const MHook &src); + void operator=(const MHook &src); + // constructors: + MHook(void); + MHook(int idx, plid_t pid, game_event_t evt, event_func_t pfn); + MHook(int idx, plid_t pid, hook_t tp, const char *cp, logmatch_func_t pfn); + // functions: + mBOOL call(event_args_t *args, const char *logline); + mBOOL enqueue(MFuncQueue *mfq, event_args_t *args, const char *logline); + public: + // no public interfaces; everything done from friend MHookList. +}; + + +// Class for list of registered hook functions. +class MHookList { + private: + // data: + MHook *hlist[MAX_HOOKS]; + int size; // set to MAX_HOOKS in constructor + int endlist; + MUTEX_T mx_hlist; + int MXlock(void) { return(MUTEX_LOCK(&mx_hlist)); }; + int MXunlock(void) { return(MUTEX_UNLOCK(&mx_hlist)); }; + public: + // constructor: + MHookList(void); + // functions: + int add(plid_t plid, game_event_t event, event_func_t pfnHandle); + int add(plid_t plid, hook_t type, const char *match, + logmatch_func_t pfnHandle); + mBOOL remove(plid_t plid, int hindex); + int remove_all(plid_t plid); + mBOOL call(event_args_t *args, const char *logline); + mBOOL enqueue(MFuncQueue *mfq, hook_t htype, event_args_t *evargs, + const char *logline); + char *str_htype(hook_t htype); +}; + +#endif /* MHOOK_H */ + +#endif /* UNFINISHED */ diff --git a/metamod/mreg.h b/metamod/mreg.h new file mode 100644 index 0000000..00fe0c9 --- /dev/null +++ b/metamod/mreg.h @@ -0,0 +1,183 @@ +// mreg.h - description of registered items (classes MRegCmd, MRegCmdList) + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef MREG_H +#define MREG_H + +#include "types_meta.h" // mBOOL + +// Number of entries to add to reglists when they need to grow. Typically +// more cvars than commands, so we grow them at different increments. +#define REG_CMD_GROWSIZE 32 +#define REG_CVAR_GROWSIZE 64 + +// Width required to printf a Reg*List index number, for show() functions. +// This used to correspond to the number of digits in MAX_REG, which was a +// fixed, compile-time limit. However, now that the reg lists are grown +// dynamically, this has less strong correspondance to list sizes. So for +// the moment, it reflects what one might normally expect to be the max +// width needed to print an index number; 4 allows 9999 (which is a damn +// lot, if you ask me). +#define WIDTH_MAX_REG 4 + +// Max number of registered user msgs we can manage. +#define MAX_REG_MSGS 256 + +// Flags to indicate if given cvar or func is part of a loaded plugin. +typedef enum { + RG_INVALID, + RG_VALID, +} REG_STATUS; + +// Pointer to function registered by AddServerCommand. +typedef void (*REG_CMD_FN) (void); + + +// An individual registered function/command. +class MRegCmd { + friend class MRegCmdList; + private: + // data: + int index; // 1-based + public: + char *name; // space is malloc'd + REG_CMD_FN pfnCmd; // pointer to the function + int plugid; // index id of corresponding plugin + REG_STATUS status; // whether corresponding plugin is loaded + // functions: + void init(int idx); // init values, as not using constructors + mBOOL call(void); // try to call the function +}; + + +// A list of registered commands. +class MRegCmdList { + private: + // data: + MRegCmd *mlist; // malloc'd array of registered commands + int size; // current size of list + int endlist; // index of last used entry + // Private; to satisfy -Weffc++ "has pointer data members but does + // not override" copy/assignment constructor. + void operator=(const MRegCmdList &src); + MRegCmdList(const MRegCmdList &src); + + public: + // constructor: + MRegCmdList(void); + + // functions: + MRegCmd *find(const char *findname); // find by MRegCmd->name + MRegCmd *add(const char *addname); + void disable(int plugin_id); // change status to Invalid + void show(void); // list all funcs to console + void show(int plugin_id); // list given plugin's funcs to console +}; + + + +// An individual registered cvar. +class MRegCvar { + friend class MRegCvarList; + private: + // data: + int index; // 1-based + public: + cvar_t *data; // actual cvar structure, malloc'd + int plugid; // index id of corresponding plugin + REG_STATUS status; // whether corresponding plugin is loaded + // functions: + void init(int idx); // init values, as not using constructors + mBOOL set(cvar_t *src); +}; + + +// A list of registered cvars. +class MRegCvarList { + private: + // data: + MRegCvar *vlist; // malloc'd array of registered cvars + int size; // size of list, ie MAX_REG_CVARS + int endlist; // index of last used entry + // Private; to satisfy -Weffc++ "has pointer data members but does + // not override" copy/assignment constructor. + void operator=(const MRegCvarList &src); + MRegCvarList(const MRegCvarList &src); + + public: + // constructor: + MRegCvarList(void); + + // functions: + MRegCvar *add(const char *addname); + MRegCvar *find(const char *findname); // find by MRegCvar->data.name + void disable(int plugin_id); // change status to Invalid + void show(void); // list all cvars to console + void show(int plugin_id); // list given plugin's cvars to console +}; + + + +// An individual registered user msg, from gamedll. +class MRegMsg { + friend class MRegMsgList; + private: + // data: + int index; // 1-based + public: + const char *name; // name, assumed constant string in gamedll + int msgid; // msgid, assigned by engine + int size; // size, if given by gamedll +}; + + +// A list of registered user msgs. +class MRegMsgList { + private: + // data: + MRegMsg mlist[MAX_REG_MSGS]; // array of registered msgs + int size; // size of list, ie MAX_REG_MSGS + int endlist; // index of last used entry + + public: + // constructor: + MRegMsgList(void); + + // functions: + MRegMsg *add(const char *addname, int addmsgid, int addsize); + MRegMsg *find(const char *findname); + MRegMsg *find(int findmsgid); + void show(void); // list all msgs to console +}; + +#endif /* MREG_H */ diff --git a/metamod/mutil.h b/metamod/mutil.h new file mode 100644 index 0000000..eb7edc4 --- /dev/null +++ b/metamod/mutil.h @@ -0,0 +1,157 @@ +// mutil.h - prototypes for utility functions to provide to plugins + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef MUTIL_H +#define MUTIL_H + +#include "plinfo.h" // plugin_info_t, etc +#include "mhook.h" // game_event_t, etc +#include "sdk_util.h" // hudtextparms_t, etc + +// max buffer size for printed messages +#define MAX_LOGMSG_LEN 1024 + +// For GetGameInfo: +typedef enum { + GINFO_NAME = 0, + GINFO_DESC, + GINFO_GAMEDIR, + GINFO_DLL_FULLPATH, + GINFO_DLL_FILENAME, + GINFO_REALDLL_FULLPATH, +} ginfo_t; + +// Meta Utility Function table type. +typedef struct meta_util_funcs_s { + void (*pfnLogConsole) (plid_t plid, const char *fmt, ...); + void (*pfnLogMessage) (plid_t plid, const char *fmt, ...); + void (*pfnLogError) (plid_t plid, const char *fmt, ...); + void (*pfnLogDeveloper) (plid_t plid, const char *fmt, ...); + void (*pfnCenterSay) (plid_t plid, const char *fmt, ...); + void (*pfnCenterSayParms) (plid_t plid, hudtextparms_t tparms, + const char *fmt, ...); + void (*pfnCenterSayVarargs) (plid_t plid, hudtextparms_t tparms, + const char *fmt, va_list ap); + qboolean (*pfnCallGameEntity) (plid_t plid, const char *entStr, + entvars_t *pev); + int (*pfnGetUserMsgID) (plid_t plid, const char *msgname, int *size); + const char *(*pfnGetUserMsgName) (plid_t plid, int msgid, int *size); + const char *(*pfnGetPluginPath) (plid_t plid); + const char *(*pfnGetGameInfo) (plid_t plid, ginfo_t tag); + int (*pfnLoadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, void **plugin_handle); + int (*pfnUnloadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, PL_UNLOAD_REASON reason); + int (*pfnUnloadPluginByHandle) (plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason); + const char *(*pfnIsQueryingClientCvar) (plid_t plid, const edict_t *pEdict); + int (*pfnMakeRequestId) (plid_t plid); + void (*pfnGetHookTables) (plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll); +#ifdef UNFINISHED + int (*pfnHookGameEvent) (plid_t plid, game_event_t event, + event_func_t pfnHandle); + int (*pfnHookLogTrigger) (plid_t plid, const char *trigger, + logmatch_func_t pfnHandle); + int (*pfnHookLogString) (plid_t plid, const char *string, + logmatch_func_t pfnHandle); + int (*pfnHookLogRegex) (plid_t plid, const char *pattern, + logmatch_func_t pfnHandle); + qboolean (*pfnRemoveHookID) (plid_t plid, int hookid); + int (*pfnRemoveHookAll) (plid_t plid); +#endif /* UNFINISHED */ +} mutil_funcs_t; +extern mutil_funcs_t MetaUtilFunctions; + +// Meta Utility Functions +void mutil_LogConsole(plid_t plid, const char *fmt, ...); +void mutil_LogMessage(plid_t plid, const char *fmt, ...); +void mutil_LogError(plid_t plid, const char *fmt, ...); +void mutil_LogDeveloper(plid_t plid, const char *fmt, ...); + +void mutil_CenterSay(plid_t plid, const char *fmt, ...); +void mutil_CenterSayParms(plid_t plid, hudtextparms_t tparms, + const char *fmt, ...); +void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms, + const char *fmt, va_list ap); + +qboolean mutil_CallGameEntity(plid_t plid, const char *entStr, entvars_t *pev); + +int mutil_GetUserMsgID(plid_t plid, const char *name, int *size); +const char *mutil_GetUserMsgName(plid_t plid, int msgid, int *size); +const char *mutil_GetPluginPath(plid_t plid); +const char *mutil_GetGameInfo(plid_t plid, ginfo_t tag); +const char *mutil_IsQueryingClientCvar(plid_t plid, const edict_t *pEdict); +int mutil_MakeRequestId(plid_t plid); +void mutil_GetHookTables(plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll); + +#ifdef UNFINISHED +int mutil_HookGameEvent(plid_t plid, game_event_t event, + event_func_t pfnHandle); +int mutil_HookLogTrigger(plid_t plid, const char *trigger, + logmatch_func_t pfnHandle); +int mutil_HookLogString(plid_t plid, const char *string, + logmatch_func_t pfnHandle); +int mutil_HookLogRegex(plid_t plid, const char *pattern, + logmatch_func_t pfnHandle); + +qboolean mutil_RemoveHookID(plid_t plid, int hookid); +int mutil_RemoveHookAll(plid_t plid); +#endif /* UNFINISHED */ + +// Convenience macros for MetaUtil functions +#define LOG_CONSOLE (*gpMetaUtilFuncs->pfnLogConsole) +#define LOG_MESSAGE (*gpMetaUtilFuncs->pfnLogMessage) +#define LOG_ERROR (*gpMetaUtilFuncs->pfnLogError) +#define LOG_DEVELOPER (*gpMetaUtilFuncs->pfnLogDeveloper) +#define CENTER_SAY (*gpMetaUtilFuncs->pfnCenterSay) +#define CENTER_SAY_PARMS (*gpMetaUtilFuncs->pfnCenterSayParms) +#define CENTER_SAY_VARARGS (*gpMetaUtilFuncs->pfnCenterSayVarargs) +#define CALL_GAME_ENTITY (*gpMetaUtilFuncs->pfnCallGameEntity) +#define GET_USER_MSG_ID (*gpMetaUtilFuncs->pfnGetUserMsgID) +#define GET_USER_MSG_NAME (*gpMetaUtilFuncs->pfnGetUserMsgName) +#define GET_PLUGIN_PATH (*gpMetaUtilFuncs->pfnGetPluginPath) +#define GET_GAME_INFO (*gpMetaUtilFuncs->pfnGetGameInfo) +#define LOAD_PLUGIN (*gpMetaUtilFuncs->pfnLoadPlugin) +#define UNLOAD_PLUGIN (*gpMetaUtilFuncs->pfnUnloadPlugin) +#define UNLOAD_PLUGIN_BY_HANDLE (*gpMetaUtilFuncs->pfnUnloadPluginByHandle) +#define IS_QUERYING_CLIENT_CVAR (*gpMetaUtilFuncs->pfnIsQueryingClientCvar) +#define MAKE_REQUESTID (*gpMetaUtilFuncs->pfnMakeRequestId) +#define GET_HOOK_TABLES (*gpMetaUtilFuncs->pfnGetHookTables) + +#ifdef UNFINISHED +#define HOOK_GAME_EVENT (*gpMetaUtilFuncs->pfnHookGameEvent) +#define HOOK_LOG_TRIGGER (*gpMetaUtilFuncs->pfnHookLogTrigger) +#define HOOK_LOG_STRING (*gpMetaUtilFuncs->pfnHookLogString) +#define HOOK_LOG_REGEX (*gpMetaUtilFuncs->pfnHookLogRegex) +#define REMOVE_HOOK_ID (*gpMetaUtilFuncs->pfnRemoveHookID) +#define REMOVE_HOOK_ALL (*gpMetaUtilFuncs->pfnRemoveHookAll) +#endif /* UNFINISHED */ + +#endif /* MUTIL_H */ diff --git a/metamod/osdep.h b/metamod/osdep.h new file mode 100644 index 0000000..e11a8b7 --- /dev/null +++ b/metamod/osdep.h @@ -0,0 +1,519 @@ +// osdep.h - operating system dependencies + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef OSDEP_H +#define OSDEP_H + +#include // strerror() +#include // isupper, tolower +#include // errno + +// Various differences between WIN32 and Linux. + +#include "types_meta.h" // mBOOL +#include "mreg.h" // REG_CMD_FN, etc +#include "log_meta.h" // LOG_ERROR, etc + +extern mBOOL dlclose_handle_invalid; + +// String describing platform/DLL-type, for matching lines in plugins.ini. +#ifdef __linux__ + #define PLATFORM "linux" +# ifdef __amd64__ + #define PLATFORM_SPC "lin64" +# else + #define PLATFORM_SPC "lin32" +# endif +#elif defined(_WIN32) + #define PLATFORM "mswin" + #define PLATFORM_SPC "win32" +#else /* unknown */ + #error "OS unrecognized" +#endif /* unknown */ + + +// Macro for function-exporting from DLL.. +// from SDK dlls/cbase.h: +//! C functions for external declarations that call the appropriate C++ methods + +// Windows uses "__declspec(dllexport)" to mark functions in the DLL that +// should be visible/callable externally. +// +// It also apparently requires WINAPI for GiveFnptrsToDll(). +// +// See doc/notes_windows_coding for more information.. + +// Attributes to specify an "exported" function, visible from outside the +// DLL. +#undef DLLEXPORT +#ifdef _WIN32 + #define DLLEXPORT __declspec(dllexport) + // WINAPI should be provided in the windows compiler headers. + // It's usually defined to something like "__stdcall". +#elif defined(__linux__) + #define DLLEXPORT /* */ + #define WINAPI /* */ +#endif /* linux */ + +#ifdef __GNUC__ +# define DECLSPEC(kw) +# define ATTRIBUTE(kw) __attribute__((kw)) +# define MM_CDECL +#elif defined(_MSC_VER) +# define DECLSPEC(kw) __declspec(kw) +# define ATTRIBUTE(kw) +# define MM_CDECL __cdecl +#endif /* _MSC_VER */ + + +// Simplified macro for declaring/defining exported DLL functions. They +// need to be 'extern "C"' so that the C++ compiler enforces parameter +// type-matching, rather than considering routines with mis-matched +// arguments/types to be overloaded functions... +// +// AFAIK, this is os-independent, but it's included here in osdep.h where +// DLLEXPORT is defined, for convenience. +#define C_DLLEXPORT extern "C" DLLEXPORT + + +#ifdef _MSC_VER + // Disable MSVC warning: + // 4390 : empty controlled statement found; is this what was intended? + // generated by the RETURN macros. + #pragma warning(disable: 4390) +#endif /* _MSC_VER */ + + +// Functions & types for DLL open/close/etc operations. +#ifdef __linux__ + #include + typedef void* DLHANDLE; + typedef void* DLFUNC; + inline DLHANDLE DLOPEN(const char *filename) { + return(dlopen(filename, RTLD_NOW)); + } + inline DLFUNC DLSYM(DLHANDLE handle, const char *string) { + return(dlsym(handle, string)); + } + inline int DLCLOSE(DLHANDLE handle) { + if (!handle) { + dlclose_handle_invalid = mTRUE; + return(1); + } + dlclose_handle_invalid = mFALSE; + return(dlclose(handle)); + } + inline char* DLERROR(void) { + if (dlclose_handle_invalid) + return("Invalid handle."); + return(dlerror()); + } +#elif defined(_WIN32) + typedef HINSTANCE DLHANDLE; + typedef FARPROC DLFUNC; + inline DLHANDLE DLOPEN(const char *filename) { + return(LoadLibrary(filename)); + } + inline DLFUNC DLSYM(DLHANDLE handle, const char *string) { + return(GetProcAddress(handle, string)); + } + inline int DLCLOSE(DLHANDLE handle) { + if (!handle) { + dlclose_handle_invalid = mTRUE; + return(1); + } + dlclose_handle_invalid = mFALSE; + // NOTE: Windows FreeLibrary returns success=nonzero, fail=zero, + // which is the opposite of the unix convention, thus the '!'. + return(!FreeLibrary(handle)); + } + // Windows doesn't provide a function corresponding to dlerror(), so + // we make our own. + char *str_GetLastError(void); + inline char* DLERROR(void) { + if (dlclose_handle_invalid) + return("Invalid handle."); + return(str_GetLastError()); + } +#endif /* _WIN32 */ +const char *DLFNAME(void *memptr); +mBOOL IS_VALID_PTR(void *memptr); + + +// Attempt to call the given function pointer, without segfaulting. +mBOOL os_safe_call(REG_CMD_FN pfn); + + +// Windows doesn't have an strtok_r() routine, so we write our own. +#ifdef _WIN32 + #define strtok_r(s, delim, ptrptr) my_strtok_r(s, delim, ptrptr) + char *my_strtok_r(char *s, const char *delim, char **ptrptr); +#endif /* _WIN32 */ + + +// Set filename and pathname maximum lengths. Note some windows compilers +// provide a which is incomplete and/or causes problems; see +// doc/windows_notes.txt for more information. +// +// Note that both OS's include room for null-termination: +// linux: "# chars in a path name including nul" +// win32: "note that the sizes include space for 0-terminator" +#ifdef __linux__ + #include +#elif defined(_WIN32) + #include + #define NAME_MAX _MAX_FNAME + #define PATH_MAX _MAX_PATH +#endif /* _WIN32 */ + + +// Various other windows routine differences. +#ifdef __linux__ + #include // sleep + #ifndef O_BINARY + #define O_BINARY 0 + #endif +#elif defined(_WIN32) + #define snprintf _snprintf + #define vsnprintf _vsnprintf + #define sleep(x) Sleep(x*1000) + #define strcasecmp _stricmp + #define strncasecmp _strnicmp + #include + #define open _open + #define read _read + #define write _write + #define close _close +#endif /* _WIN32 */ + +#ifdef __GNUC__ + #include // getcwd +#elif defined(_MSC_VER) + #include // getcwd +#endif /* _MSC_VER */ + +#include +#ifndef S_ISREG + // Linux gcc defines this; earlier mingw didn't, later mingw does; + // MSVC doesn't seem to. + #define S_ISREG(m) ((m) & S_IFREG) +#endif /* not S_ISREG */ +#ifdef _WIN32 + // The following two are defined in mingw but not in MSVC + #ifndef S_IRUSR + #define S_IRUSR _S_IREAD + #endif + #ifndef S_IWUSR + #define S_IWUSR _S_IWRITE + #endif + + // The following two are defined neither in mingw nor in MSVC + #ifndef S_IRGRP + #define S_IRGRP S_IRUSR + #endif + #ifndef S_IWGRP + #define S_IWGRP S_IWUSR + #endif +#endif /* _WIN32 */ + + +// Our handler for new(). +// +// Thanks to notes from: +// http://dragon.klte.hu/~kollarl/C++/node45.html +// +// At one point it appeared MSVC++ was no longer different from gcc, according +// to: +// http://msdn.microsoft.com/library/en-us/vclang98/stdlib/info/NEW.asp +// +// However, this page is apparently no longer available from MSDN. The +// only thing now is: +// http://msdn.microsoft.com/library/en-us/vccore98/HTML/_crt_malloc.asp +// +// According to Fritz Elfert : +// set_new_handler() is just a stub which (according to comments in the +// MSVCRT debugging sources) should never be used. It is just an ugly +// hack to make STL compile. It does _not_ set the new handler but +// always calls _set_new_handler(0) instead. _set_new_handler is the +// "real" function and uses the "old" semantic; handler-type is: +// int newhandler(size_t) +// +#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1300)) + void MM_CDECL meta_new_handler(void); +#elif defined(_MSC_VER) + int meta_new_handler(size_t size); +#endif /* _MSC_VER */ + + +// To keep the rest of the sources clean and keep not only OS but also +// compiler dependant differences in this file, we define a local function +// to set the new handler. +void mm_set_new_handler( void ); + + + +// Thread handling... +#ifdef __linux__ + #include + typedef pthread_t THREAD_T; + // returns 0==success, non-zero==failure + inline int THREAD_CREATE(THREAD_T *tid, void (*func)(void)) { + int ret; + ret=pthread_create(tid, NULL, (void *(*)(void*)) func, NULL); + if(ret != 0) { + META_ERROR("Failure starting thread: %s", strerror(ret)); + return(ret); + } + ret=pthread_detach(*tid); + if(ret != 0) + META_ERROR("Failure detaching thread: %s", strerror(ret)); + return(ret); + } +#elif defined(_WIN32) + // See: + // http://msdn.microsoft.com/library/en-us/dllproc/prothred_4084.asp + typedef DWORD THREAD_T; + // returns 0==success, non-zero==failure + inline int THREAD_CREATE(THREAD_T *tid, void (*func)(void)) { + HANDLE ret; + // win32 returns NULL==failure, non-NULL==success + ret=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, NULL, 0, tid); + if(ret==NULL) + META_ERROR("Failure starting thread: %s", str_GetLastError()); + return(ret==NULL); + } +#endif /* _WIN32 */ +#define THREAD_OK 0 + + +// Mutex handling... +#ifdef __linux__ + typedef pthread_mutex_t MUTEX_T; + inline int MUTEX_INIT(MUTEX_T *mutex) { + int ret; + ret=pthread_mutex_init(mutex, NULL); + if(ret!=THREAD_OK) + META_ERROR("mutex_init failed: %s", strerror(ret)); + return(ret); + } + inline int MUTEX_LOCK(MUTEX_T *mutex) { + int ret; + ret=pthread_mutex_lock(mutex); + if(ret!=THREAD_OK) + META_ERROR("mutex_lock failed: %s", strerror(ret)); + return(ret); + } + inline int MUTEX_UNLOCK(MUTEX_T *mutex) { + int ret; + ret=pthread_mutex_unlock(mutex); + if(ret!=THREAD_OK) + META_ERROR("mutex_unlock failed: %s", strerror(ret)); + return(ret); + } +#elif defined(_WIN32) + // Win32 has "mutexes" as well, but CS's are simpler. + // See: + // http://msdn.microsoft.com/library/en-us/dllproc/synchro_2a2b.asp + typedef CRITICAL_SECTION MUTEX_T; + // Note win32 routines don't return any error (return void). + inline int MUTEX_INIT(MUTEX_T *mutex) { + InitializeCriticalSection(mutex); + return(THREAD_OK); + } + inline int MUTEX_LOCK(MUTEX_T *mutex) { + EnterCriticalSection(mutex); + return(THREAD_OK); + } + inline int MUTEX_UNLOCK(MUTEX_T *mutex) { + LeaveCriticalSection(mutex); + return(THREAD_OK); + } +#endif /* _WIN32 (mutex) */ + + +// Condition variables... +#ifdef __linux__ + typedef pthread_cond_t COND_T; + inline int COND_INIT(COND_T *cond) { + int ret; + ret=pthread_cond_init(cond, NULL); + if(ret!=THREAD_OK) + META_ERROR("cond_init failed: %s", strerror(ret)); + return(ret); + } + inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex) { + int ret; + ret=pthread_cond_wait(cond, mutex); + if(ret!=THREAD_OK) + META_ERROR("cond_wait failed: %s", strerror(ret)); + return(ret); + } + inline int COND_SIGNAL(COND_T *cond) { + int ret; + ret=pthread_cond_signal(cond); + if(ret!=THREAD_OK) + META_ERROR("cond_signal failed: %s", strerror(ret)); + return(ret); + } +#elif defined(_WIN32) + // Since win32 doesn't provide condition-variables, we have to model + // them with mutex/critical-sections and win32 events. This uses the + // second (SetEvent) solution from: + // + // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + // + // but without the waiters_count overhead, since we don't need + // broadcast functionality anyway. Or actually, I guess it's more like + // the first (PulseEvent) solution, but with SetEven rather than + // PulseEvent. :) + // + // See also: + // http://msdn.microsoft.com/library/en-us/dllproc/synchro_8ann.asp + typedef HANDLE COND_T; + inline int COND_INIT(COND_T *cond) { + *cond = CreateEvent(NULL, // security attributes (none) + FALSE, // manual-reset type (false==auto-reset) + FALSE, // initial state (unsignaled) + NULL); // object name (unnamed) + // returns NULL on error + if(*cond==NULL) { + META_ERROR("cond_init failed: %s", str_GetLastError()); + return(-1); + } + else + return(0); + } + inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex) { + DWORD ret; + LeaveCriticalSection(mutex); + ret=WaitForSingleObject(*cond, INFINITE); + EnterCriticalSection(mutex); + // returns WAIT_OBJECT_0 if object was signaled; other return + // values indicate errors. + if(ret == WAIT_OBJECT_0) + return(0); + else { + META_ERROR("cond_wait failed: %s", str_GetLastError()); + return(-1); + } + } + inline int COND_SIGNAL(COND_T *cond) { + BOOL ret; + ret=SetEvent(*cond); + // returns zero on failure + if(ret==0) { + META_ERROR("cond_signal failed: %s", str_GetLastError()); + return(-1); + } + else + return(0); + } +#endif /* _WIN32 (condition variable) */ + +// Normalize/standardize a pathname. +// - For win32, this involves: +// - Turning backslashes (\) into slashes (/), so that config files and +// Metamod internal code can be simpler and just use slashes (/). +// - Turning upper/mixed case into lowercase, since windows is +// non-case-sensitive. +// - For linux, this requires no work, as paths uses slashes (/) natively, +// and pathnames are case-sensitive. +#ifdef __linux__ +#define normalize_pathname(a) +#elif defined(_WIN32) +inline void normalize_pathname(char *path) { + char *cp; + + META_DEBUG(8, ("normalize: %s", path)); + for(cp=path; *cp; cp++) { + if(isupper(*cp)) *cp=tolower(*cp); + if(*cp=='\\') *cp='/'; + } + META_DEBUG(8, ("normalized: %s", path)); +} +#endif /* _WIN32 */ + +// Indicate if pathname appears to be an absolute-path. Under linux this +// is a leading slash (/). Under win32, this can be: +// - a drive-letter path (ie "D:blah" or "C:\blah") +// - a toplevel path (ie "\blah") +// - a UNC network address (ie "\\srv1\blah"). +// Also, handle both native and normalized pathnames. +inline int is_absolute_path(const char *path) { + if(path[0]=='/') return(TRUE); +#ifdef _WIN32 + if(path[1]==':') return(TRUE); + if(path[0]=='\\') return(TRUE); +#endif /* _WIN32 */ + return(FALSE); +} + +#ifdef _WIN32 +// Buffer pointed to by resolved_name is assumed to be able to store a +// string of PATH_MAX length. +inline char *realpath(const char *file_name, char *resolved_name) { + int ret; + ret=GetFullPathName(file_name, PATH_MAX, resolved_name, NULL); + if(ret > PATH_MAX) { + errno=ENAMETOOLONG; + return(NULL); + } + else if(ret > 0) { + HANDLE handle; + WIN32_FIND_DATA find_data; + handle=FindFirstFile(resolved_name, &find_data); + if(INVALID_HANDLE_VALUE == handle) { + errno=ENOENT; + return NULL; + } + FindClose(handle); + normalize_pathname(resolved_name); + return(resolved_name); + } + else + return(NULL); +} +#endif /* _WIN32 */ + +// Generic "error string" from a recent OS call. For linux, this is based +// on errno. For win32, it's based on GetLastError. +inline const char *str_os_error(void) { +#ifdef __linux__ + return(strerror(errno)); +#elif defined(_WIN32) + return(str_GetLastError()); +#endif /* _WIN32 */ +} + + +#endif /* OSDEP_H */ diff --git a/metamod/plinfo.h b/metamod/plinfo.h new file mode 100644 index 0000000..9e5b744 --- /dev/null +++ b/metamod/plinfo.h @@ -0,0 +1,79 @@ +// plinfo.h - typedefs for plugin info structure + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef PLINFO_H +#define PLINFO_H + +// Flags for plugin to indicate when it can be be loaded/unloaded. +// NOTE: order is crucial, as greater/less comparisons are made. +typedef enum { + PT_NEVER = 0, + PT_STARTUP, // should only be loaded/unloaded at initial hlds execution + PT_CHANGELEVEL, // can be loaded/unloaded between maps + PT_ANYTIME, // can be loaded/unloaded at any time + PT_ANYPAUSE, // can be loaded/unloaded at any time, and can be "paused" during a map +} PLUG_LOADTIME; + +// Flags to indicate why the plugin is being unloaded. +typedef enum { + PNL_NULL = 0, + PNL_INI_DELETED, // was deleted from plugins.ini + PNL_FILE_NEWER, // file on disk is newer than last load + PNL_COMMAND, // requested by server/console command + PNL_CMD_FORCED, // forced by server/console command + PNL_DELAYED, // delayed from previous request; can't tell origin +//only used for 'real_reason' on MPlugin::unload() + PNL_PLUGIN, // requested by plugin function call + PNL_PLG_FORCED, // forced by plugin function call + PNL_RELOAD, // forced unload by reload() +} PL_UNLOAD_REASON; + +// Information plugin provides about itself. +typedef struct { + char *ifvers; // meta_interface version + char *name; // full name of plugin + char *version; // version + char *date; // date + char *author; // author name/email + char *url; // URL + char *logtag; // log message prefix (unused right now) + PLUG_LOADTIME loadable; // when loadable + PLUG_LOADTIME unloadable; // when unloadable +} plugin_info_t; +extern plugin_info_t Plugin_info; + +// Plugin identifier, passed to all Meta Utility Functions. +typedef plugin_info_t* plid_t; +#define PLID &Plugin_info + +#endif /* PLINFO_H */ diff --git a/metamod/sdk_util.h b/metamod/sdk_util.h new file mode 100644 index 0000000..a87922c --- /dev/null +++ b/metamod/sdk_util.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +// Wrap util.h from SDK with ifndef/endif, to avoid problems from multiple +// inclusions. Dunno why Valve didn't do that in util.h themselves.. + +#ifndef SDK_UTIL_H +#define SDK_UTIL_H + +// We're not including the DBG_EntOfVars and DBG_AssertFunction routines +// mentioned in the SDK util.h, so we're going to unset DEBUG here so that +// we don't get "unresolved symbol" errors. +#ifdef DEBUG +#undef DEBUG +#endif // DEBUG + +// Inlcude local enginecallbacks wrapper *first* so that the g_engfuncs +// type is correct and the header protection is already +// defined. +#include "enginecallbacks.h" +#include + +// Also, create some nice inlines for engine callback combos. + +// Get a setinfo value from a player entity. +inline char *ENTITY_KEYVALUE(edict_t *entity, char *key) { + char *ifbuf=GET_INFOKEYBUFFER(entity); + return(INFOKEY_VALUE(ifbuf, key)); +} + +// Set a setinfo value for a player entity. +inline void ENTITY_SET_KEYVALUE(edict_t *entity, char *key, char *value) { + char *ifbuf=GET_INFOKEYBUFFER(entity); + SET_CLIENT_KEYVALUE(ENTINDEX(entity), ifbuf, key, value); +} + +// Get a "serverinfo" value. +inline char *SERVERINFO(char *key) { + edict_t *server=INDEXENT(0); + return(ENTITY_KEYVALUE(server, key)); +} + +// Set a "serverinfo" value. +inline void SET_SERVERINFO(char *key, char *value) { + edict_t *server=INDEXENT(0); + char *ifbuf=GET_INFOKEYBUFFER(server); + SET_SERVER_KEYVALUE(ifbuf, key, value); +} + +// Get a "localinfo" value. +inline char *LOCALINFO(char *key) { + edict_t *server=NULL; + return(ENTITY_KEYVALUE(server, key)); +} + +// Set a "localinfo" value. +inline void SET_LOCALINFO(char *key, char *value) { + edict_t *server=NULL; + char *ifbuf=GET_INFOKEYBUFFER(server); + SET_SERVER_KEYVALUE(ifbuf, key, value); +} + +short FixedSigned16(float value, float scale); +unsigned short FixedUnsigned16(float value, float scale); + +// Our slightly modified version, using an edict_t pointer instead of a +// CBaseEntity pointer. +void META_UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage); + +#endif // SDK_UTIL_H diff --git a/metamod/types_meta.h b/metamod/types_meta.h new file mode 100644 index 0000000..6f5bb5d --- /dev/null +++ b/metamod/types_meta.h @@ -0,0 +1,79 @@ +// types_meta.h - common internal type, etc definitions + +/* + * Copyright (c) 2001-2003 Will Day + * + * This file is part of Metamod. + * + * Metamod 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. + * + * Metamod 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 Metamod; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, the author gives permission to + * link the code of this program with the Half-Life Game Engine ("HL + * Engine") and Modified Game Libraries ("MODs") developed by Valve, + * L.L.C ("Valve"). You must obey the GNU General Public License in all + * respects for all of the code used other than the HL Engine and MODs + * from Valve. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + * + */ + +#ifndef TYPES_META_H +#define TYPES_META_H + +// Our own boolean type, for stricter type matching. +typedef enum mBOOL { + mFALSE = 0, + mTRUE, +} mBOOL; + +// Like C's errno, for our various functions; describes causes of failure +// or mFALSE returns. +typedef enum { + ME_NOERROR = 0, + ME_FORMAT, // invalid format + ME_COMMENT, // ignored comment + ME_BLANK, // ignored blank (empty) line + ME_ALREADY, // request had already been done + ME_DELAYED, // request is delayed + ME_NOTALLOWED, // request not allowed + ME_SKIPPED, // request is being skipped for whatever reason + ME_BADREQ, // invalid request for this + ME_ARGUMENT, // invalid arguments + ME_NULLRESULT, // resulting data was empty or null + ME_MAXREACHED, // reached max/limit + ME_NOTUNIQ, // not unique (ambigious match) + ME_NOTFOUND, // in find operation, match not found + ME_NOFILE, // file empty or missing + ME_NOMEM, // malloc failed + ME_BADMEMPTR, // invalid memory address + ME_OSNOTSUP, // OS doesn't support this operation + ME_DLOPEN, // failed to open shared lib/dll + ME_DLMISSING, // symbol missing in lib/dll + ME_DLERROR, // some other error encountered calling functions from dll + ME_IFVERSION, // incompatible interface version + ME_UNLOAD_UNLOADER, // tried to unload unloader + ME_UNLOAD_SELF, // tried to unload self +} META_ERRNO; +extern META_ERRNO meta_errno; + +#define RETURN_ERRNO(retval, errval) \ + do { meta_errno=errval; return(retval); } while(0) + +#define RETURN_LOGERR_ERRNO(errargs, retval, errval) \ + do { META_ERROR errargs ; meta_errno=errval; return(retval); } while(0) + +#endif /* TYPES_META_H */ diff --git a/msvc/relocalizebugfix.def b/msvc/relocalizebugfix.def new file mode 100644 index 0000000..eec0a33 --- /dev/null +++ b/msvc/relocalizebugfix.def @@ -0,0 +1,5 @@ +LIBRARY relocalizebugfix_mm +EXPORTS + GiveFnptrsToDll @1 +SECTIONS + .data READ WRITE diff --git a/msvc/relocalizebugfix.sln b/msvc/relocalizebugfix.sln new file mode 100644 index 0000000..cec926a --- /dev/null +++ b/msvc/relocalizebugfix.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relocalizebugfix", "relocalizebugfix.vcxproj", "{9A72E8DC-7667-46C1-899D-1E8B939564D2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Debug|Win32.Build.0 = Debug|Win32 + {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Release|Win32.ActiveCfg = Release|Win32 + {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/msvc/relocalizebugfix.vcxproj b/msvc/relocalizebugfix.vcxproj new file mode 100644 index 0000000..5ef6b61 --- /dev/null +++ b/msvc/relocalizebugfix.vcxproj @@ -0,0 +1,162 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + Create + Create + + + + + {9A72E8DC-7667-46C1-899D-1E8B939564D2} + Win32Proj + relocalizebugfix + + + + DynamicLibrary + true + v120_xp + MultiByte + + + DynamicLibrary + false + v120_xp + true + MultiByte + + + + + + + + + + + + + true + relocalizebugfix_mm + true + + + false + relocalizebugfix_mm + true + + + + Use + Level3 + Disabled + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + ..\include\;..\metamod\;..\cssdk\common\;..\cssdk\dlls\;..\cssdk\engine\;..\cssdk\pm_shared\;..\cssdk\game_shared\;..\cssdk\public\ + precompiled.h + MultiThreadedDebug + + + Windows + true + psapi.lib;%(AdditionalDependencies) + relocalizebugfix.def + + + + + + + + + + + + + + + subversion.always.run + subversion.always.run + + + + + Level3 + Use + MaxSpeed + true + true + _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + ..\include\;..\metamod\;..\cssdk\common\;..\cssdk\dlls\;..\cssdk\engine\;..\cssdk\pm_shared\;..\cssdk\game_shared\;..\cssdk\public\ + precompiled.h + MultiThreaded + AnySuitable + Speed + true + true + Sync + false + NotSet + + + ProgramDatabase + + + Windows + true + true + true + psapi.lib;%(AdditionalDependencies) + relocalizebugfix.def + $(OutDir)$(TargetName).pdb + $(OutDir)$(TargetName).lib + $(OutDir)$(TargetName)$(TargetExt) + $(IntDir)$(TargetName)$(TargetExt).intermediate.manifest + false + + + + + + + + + + + + + + + + + subversion.always.run + + + subversion.always.run + + + + + + \ No newline at end of file diff --git a/msvc/relocalizebugfix.vcxproj.filters b/msvc/relocalizebugfix.vcxproj.filters new file mode 100644 index 0000000..9bf99ab --- /dev/null +++ b/msvc/relocalizebugfix.vcxproj.filters @@ -0,0 +1,54 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + \ No newline at end of file diff --git a/msvc/relocalizebugfix.vcxproj.user b/msvc/relocalizebugfix.vcxproj.user new file mode 100644 index 0000000..ef5ff2a --- /dev/null +++ b/msvc/relocalizebugfix.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/dllapi.cpp b/src/dllapi.cpp new file mode 100644 index 0000000..1ac1abf --- /dev/null +++ b/src/dllapi.cpp @@ -0,0 +1,175 @@ +#include "precompiled.h" + +static DLL_FUNCTIONS gFunctionTable = +{ + NULL, // pfnGameInit + NULL, // pfnSpawn + NULL, // pfnThink + NULL, // pfnUse + NULL, // pfnTouch + NULL, // pfnBlocked + NULL, // pfnKeyValue + NULL, // pfnSave + NULL, // pfnRestore + NULL, // pfnSetAbsBox + + NULL, // pfnSaveWriteFields + NULL, // pfnSaveReadFields + + NULL, // pfnSaveGlobalState + NULL, // pfnRestoreGlobalState + NULL, // pfnResetGlobalState + + NULL, // pfnClientConnect + NULL, // pfnClientDisconnect + NULL, // pfnClientKill + NULL, // pfnClientPutInServer + &ClientCommand, // pfnClientCommand + NULL, // pfnClientUserInfoChanged + NULL, // pfnServerActivate + NULL, // pfnServerDeactivate + + NULL, // pfnPlayerPreThink + NULL, // pfnPlayerPostThink + + NULL, // pfnStartFrame + NULL, // pfnParmsNewLevel + NULL, // pfnParmsChangeLevel + + NULL, // pfnGetGameDescription + NULL, // pfnPlayerCustomization + + NULL, // pfnSpectatorConnect + NULL, // pfnSpectatorDisconnect + NULL, // pfnSpectatorThink + + NULL, // pfnSys_Error + + NULL, // pfnPM_Move + NULL, // pfnPM_Init + NULL, // pfnPM_FindTextureType + + NULL, // pfnSetupVisibility + NULL, // pfnUpdateClientData + NULL, // pfnAddToFullPack + NULL, // pfnCreateBaseline + NULL, // pfnRegisterEncoders + NULL, // pfnGetWeaponData + NULL, // pfnCmdStart + NULL, // pfnCmdEnd + NULL, // pfnConnectionlessPacket + NULL, // pfnGetHullBounds + NULL, // pfnCreateInstancedBaselines + NULL, // pfnInconsistentFile + NULL, // pfnAllowLagCompensation +}; + +static DLL_FUNCTIONS gFunctionTable_Post = +{ + NULL, // pfnGameInit + NULL, // pfnSpawn + NULL, // pfnThink + NULL, // pfnUse + NULL, // pfnTouch + NULL, // pfnBlocked + NULL, // pfnKeyValue + NULL, // pfnSave + NULL, // pfnRestore + NULL, // pfnSetAbsBox + + NULL, // pfnSaveWriteFields + NULL, // pfnSaveReadFields + + NULL, // pfnSaveGlobalState + NULL, // pfnRestoreGlobalState + NULL, // pfnResetGlobalState + + NULL, // pfnClientConnect + NULL, // pfnClientDisconnect + NULL, // pfnClientKill + NULL, // pfnClientPutInServer + NULL, // pfnClientCommand + NULL, // pfnClientUserInfoChanged + NULL, // pfnServerActivate + NULL, // pfnServerDeactivate + + NULL, // pfnPlayerPreThink + NULL, // pfnPlayerPostThink + + NULL, // pfnStartFrame + NULL, // pfnParmsNewLevel + NULL, // pfnParmsChangeLevel + + NULL, // pfnGetGameDescription + NULL, // pfnPlayerCustomization + + NULL, // pfnSpectatorConnect + NULL, // pfnSpectatorDisconnect + NULL, // pfnSpectatorThink + + NULL, // pfnSys_Error + + NULL, // pfnPM_Move + NULL, // pfnPM_Init + NULL, // pfnPM_FindTextureType + + NULL, // pfnSetupVisibility + NULL, // pfnUpdateClientData + NULL, // pfnAddToFullPack + NULL, // pfnCreateBaseline + NULL, // pfnRegisterEncoders + NULL, // pfnGetWeaponData + NULL, // pfnCmdStart + NULL, // pfnCmdEnd + NULL, // pfnConnectionlessPacket + NULL, // pfnGetHullBounds + NULL, // pfnCreateInstancedBaselines + NULL, // pfnInconsistentFile + NULL, // pfnAllowLagCompensation +}; + +C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion) +{ + if (!pFunctionTable) { + + ALERT(at_logged, "GetEntityAPI2 called with null pFunctionTable"); + return FALSE; + + } else if (*interfaceVersion != INTERFACE_VERSION) { + + ALERT(at_logged, "GetEntityAPI2 version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION); + + //! Tell metamod what version we had, so it can figure out who is out of date. + *interfaceVersion = INTERFACE_VERSION; + + return FALSE; + } + + memcpy(pFunctionTable, &gFunctionTable, sizeof(DLL_FUNCTIONS)); + g_pFunctionTable = pFunctionTable; + + return TRUE; +} + +C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion) +{ + if (!pFunctionTable) { + + ALERT(at_logged, "GetEntityAPI2_Post called with null pFunctionTable"); + return FALSE; + + } else if (*interfaceVersion != INTERFACE_VERSION) { + + ALERT(at_logged, "GetEntityAPI2_Post version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION); + + //! Tell metamod what version we had, so it can figure out who is out of date. + *interfaceVersion = INTERFACE_VERSION; + + return FALSE; + } + + memcpy(pFunctionTable, &gFunctionTable_Post, sizeof(DLL_FUNCTIONS)); + g_pFunctionTable = pFunctionTable; + + return TRUE; +} diff --git a/src/engine_rehlds.cpp b/src/engine_rehlds.cpp new file mode 100644 index 0000000..85f1f06 --- /dev/null +++ b/src/engine_rehlds.cpp @@ -0,0 +1,52 @@ +#include "precompiled.h" + +IRehldsApi *g_RehldsApi; +const RehldsFuncs_t *g_RehldsFuncs; +IRehldsHookchains *g_RehldsHookchains; +IRehldsServerStatic *g_RehldsSvs; +IRehldsServerData *g_RehldsServerData; + +rehlds_ret RehldsApi_Init() +{ +#ifdef WIN32 + CSysModule *engineModule = Sys_LoadModule("swds.dll"); +#else + CSysModule *engineModule = Sys_LoadModule("engine_i486.so"); +#endif // WIN32 + + if (!engineModule) + return RETURN_NOT_FOUND; + + CreateInterfaceFn ifaceFactory = Sys_GetFactory(engineModule); + + if (!ifaceFactory) + return RETURN_NOT_FOUND; + + int retCode = 0; + g_RehldsApi = (IRehldsApi *)ifaceFactory(VREHLDS_HLDS_API_VERSION, &retCode); + + if (!g_RehldsApi) { + UTIL_LogPrintf(__FUNCTION__ " : REHLDS can't find Interface API\n"); + return RETURN_NOT_FOUND; + } + + int majorVersion = g_RehldsApi->GetMajorVersion(); + int minorVersion = g_RehldsApi->GetMinorVersion(); + + if (majorVersion != REHLDS_API_VERSION_MAJOR) { + UTIL_LogPrintf(__FUNCTION__ " : REHLDS Api major version mismatch; expected %d, real %d\n", REHLDS_API_VERSION_MAJOR, majorVersion); + return RETURN_MAJOR_MISMATCH; + } + + if (minorVersion < REHLDS_API_VERSION_MINOR) { + UTIL_LogPrintf(__FUNCTION__ " : REHLDS Api minor version mismatch; expected at least %d, real %d\n", REHLDS_API_VERSION_MINOR, minorVersion); + return RETURN_MINOR_MISMATCH; + } + + g_RehldsFuncs = g_RehldsApi->GetFuncs(); + g_RehldsHookchains = g_RehldsApi->GetHookchains(); + g_RehldsSvs = g_RehldsApi->GetServerStatic(); + g_RehldsServerData = g_RehldsApi->GetServerData(); + + return RETURN_LOAD; +} diff --git a/src/h_export.cpp b/src/h_export.cpp new file mode 100644 index 0000000..9147228 --- /dev/null +++ b/src/h_export.cpp @@ -0,0 +1,16 @@ +#include "precompiled.h" + +// From SDK dlls/h_export.cpp: + +//! Holds engine functionality callbacks +enginefuncs_t g_engfuncs; +globalvars_t *gpGlobals; + +// Receive engine function table from engine. +// This appears to be the _first_ DLL routine called by the engine, so we +// do some setup operations here. +C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals) +{ + memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t)); + gpGlobals = pGlobals; +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..5ca7388 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,63 @@ +#include "precompiled.h" + +size_t localize_string(const char *OldMsg, char *NewMsg, size_t MaxLen) +{ + size_t remainChars = MaxLen - 1; + size_t n = 0; + + for (const char *s = OldMsg; *s != '\0' && remainChars; s++) + { + if (*s == '#' || *s == '%') { + + if (remainChars < 3) { + break; + } + + // http://unicode-table.com/blocks/halfwidth-and-fullwidth-forms/ + NewMsg[n++] = char(0xEF); + NewMsg[n++] = 0xBC | (((*s - 0x20) & 0x40) >> 6); + NewMsg[n++] = 0x80 + ((*s - 0x20) & 0x3F); + + remainChars -= 3; + } + else + { + NewMsg[n++] = *s; + remainChars--; + } + } + + NewMsg[n] = '\0'; + + return n; +} + +void ClientCommand(edict_t *pEdict) +{ + const char *szArgv = CMD_ARGV(0); + + if (!strcmp(szArgv, "say") || !strcmp(szArgv, "say_team")) { + + auto Buf = CMD_ARGS(); + + if (Buf && *Buf) { + + char safeMsg[190]; + + auto len = localize_string(Buf, safeMsg, sizeof(safeMsg)); + + memcpy(const_cast(Buf), safeMsg, len + 1); + } + } + + RETURN_META(MRES_IGNORED); +} + +bool OnMetaAttach() +{ + if (RehldsApi_Init() != RETURN_LOAD) { + return false; + } + return true; +} + diff --git a/src/meta_api.cpp b/src/meta_api.cpp new file mode 100644 index 0000000..e7695ae --- /dev/null +++ b/src/meta_api.cpp @@ -0,0 +1,53 @@ +#include "precompiled.h" + +plugin_info_t Plugin_info = +{ + META_INTERFACE_VERSION, + "ReLocalizeBug Fix", + "2.8", + __DATE__, + "s1lent / Adidasman", + "http://www.dedicated-server.ru/", + "ReLocalizeBug Fix", + PT_STARTUP, + PT_NEVER, +}; + +meta_globals_t *gpMetaGlobals; +gamedll_funcs_t *gpGamedllFuncs; +mutil_funcs_t *gpMetaUtilFuncs; +DLL_FUNCTIONS gpFunctionTable; +DLL_FUNCTIONS gpFunctionTable_Post; +DLL_FUNCTIONS *g_pFunctionTable; +META_FUNCTIONS gMetaFunctionTable; + +C_DLLEXPORT int Meta_Query(char *, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +{ + *pPlugInfo = &(Plugin_info); + + gpMetaUtilFuncs = pMetaUtilFuncs; + + return TRUE; +} + +C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) +{ + gpMetaGlobals = pMGlobals; + gpGamedllFuncs = pGamedllFuncs; + + if (!OnMetaAttach()) { + return FALSE; + } + + gMetaFunctionTable.pfnGetEntityAPI2 = GetEntityAPI2; + gMetaFunctionTable.pfnGetEntityAPI2_Post = GetEntityAPI2_Post; + + memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS)); + + return TRUE; +} + +C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) +{ + return TRUE; +} diff --git a/src/precompiled.cpp b/src/precompiled.cpp new file mode 100644 index 0000000..5f656a4 --- /dev/null +++ b/src/precompiled.cpp @@ -0,0 +1 @@ +#include "precompiled.h" diff --git a/src/sdk_util.cpp b/src/sdk_util.cpp new file mode 100644 index 0000000..37c6b8e --- /dev/null +++ b/src/sdk_util.cpp @@ -0,0 +1,14 @@ +#include "precompiled.h" + +void UTIL_LogPrintf(const char *fmt, ...) +{ + va_list argptr; + static char string[1024]; + + va_start(argptr, fmt); + vsnprintf(string, sizeof(string), fmt, argptr); + va_end(argptr); + + // Print to log + ALERT(at_logged, "%s", string); +}

n9bqX3nEljR$Q2fQf2iU2RFUbvUS|ASS$LtS0U@N9+xxpZg$EAnFa>w*wGp# z>5YqeZLRC=PT5K(tkM}#Oq3R87Wz{Z0(AQQ2VkO|+`{A}T!7GgK+C-3l#g(5Dy(90 z4dv0~!s)U3_WX$lraE(4+QXf}!u(t;b4|yTgQtoKxq2?^V?!-kqrWge4;xp+bm#G) z-wk$r}6CMpgTX^Q4-ju?dAoie1Lf< z%&r#jT5C#VB`WZ;+HS5mWwUtn9mk}yK`xVs*plV0CCUX@d&h3-JPFN?){^DcZnEt( zo5AiSoV13$v9KX(grgM6CChD2l=JbT1YX##P&qrw)8({m?{dmja6guhdmXVjhjOVA zpdc`Bo#&nMXvWwE56wbQ$>>lDYQKBfE{FM?Y7Xz`VSj_u`K!9L9;fUwxSFAYOLVZ6 zfN9lsES-Lt`#m@w)4x1omqqKvMI((;mBree9)Fl$$K16?w z-Fq8)Hvs0k9@^sV9cqlWtQ)mxd#C1Y#P*i4o^DrTI%CdOJ@4hbWh@R>3s7ShTUkcS zzyk7aj1^{OtWX#Zg0P$$&JI8LKq;tW0EJU9eswr#9vrTZaQ$mH_5}8UY`KZSPO~(O zi}xe!tDw=?ur2~%8iUN6F-Q|Hn)!``_2%B)z(eDk1JBW+^hevq4SH#0(^3wJ1w8jbqeL1}gSgy-C3^im0FhMxmu>tb^a^RI0efM2 zzXSQFB_H@FF9<6P0D!wg|!AIW#}67{K(r3+{jF)Lql)a ztKitT&g3=m`1SN0Mp!CxH1*uH-oPB3n`+NZ;Kl1;alF%`kP^6V$2f?_(tlb}<9NT< zqeraatuTltIwb$IWy!bl2J~+BGthO~yV+VVhoQ5w$Ip;!l&Dka-vGHIua&40enILi z{EpO#DFu4mn`tHfqdR5puZ0W*aIJChg^3BnOX-y2WuZ3#kqq=B@*3~szsdPDH`*Rx zZdA+QXTBii`dp;fn(Ly1he-zOH{J<8)83wc2i_Uqu)*`TgU=hho}zQz#%}}u5_~Z3 zbC~33(s%5<2XsQBB=dC}N50qduD+f57$2PIb%>W%e{h0c+NL+h2L#BURtxmZ$cyR6 zkV}5e&0m;1is3D$OItMFjX~*c@hzmEI@58SD?)jVU&}EeM#MyGH+m=+`Yo9d10T0( zy9J*WkEmrlb#Kg0CTF8ars$;#93(ELMxWKg9ZPfS_(hp-nG3%h<1 zchp$4s3P&$ZeW+e*^E-X5#g1}9F2Xln7=>P!3-UkRt2+q9P+4BE}totiupo5$78Lq z-B)F!Zf}8C89}DE?PE#~r=7AGiwD(05aNO{)Jfy5#@Ht?inWH(YBZqBKjV}y)8-m% z*{cLpUe72n(U?YxN8vJ8{jbO-3w28*Wb5MFj=+xUVn9r@2zOlrhlgLXpkaV2Ior(C-o961*=>`$!uXR&ee3jSLK{v4o#f}qc__JSu|w|bH~xFrgOWRm9r6{}ts-|Q zoW;)R6kI6$20g*QM7~b+q16H0>o)!{>}d;Z0R0}BB&U&$kq^~E%YG=u~ka{tItUK(au1n3+>cChS5G|1l-{H;-4!#7}Qb$-M13_2;fz+ zliu`N8a?Adwcbm2h%G>74n612YC2=x{_K4QUV|HYzV;%+PqO&~ua*kV#l1vyVly*ZEGi_S4TlCh~{E zT0N|m4<=h21GEGh@|Cv!`yUcGNp6wb8NU_yOZQ~%TQOtPVg(%YU1&zUi+0HDA5H4M2-4-fyaPByQfrC9=M({n3 zSYGf+jxMw5c1mx~x2I=JMLKVh@o}C;XX-l3^hsU1pe}bGtn+%bKTNdGc6p$n%WQ{F zUXJ#2-=*=nwC{e$^0c33eCf1bWcpm%wQOmOG(+@ZKtr9M3 zm&xpk_GWQ+(nDE+LDTaV)c9Ot!zqBZWVFw6SikYck83;{jpw}`ZJp9v*o8~=XgaRp z?}69C*m`EJb9~CoH@pNsk)BqCiF>K+g4cz=YGdta>qKX!GoV4M?o*z@-^b#7;HNy1 z%a?y!RnnTJq}>7nl}Zvf2Zf2 zTqos7P*^udJyc07gAI`5amZ14VUmsPCqVddPqP`vg`as$%Vq|CYwW}TGX_Gd*dXCt zB%D^ZmU#%Ai@>R~q@2j;=YLt*^q@O2Hp4j4$4TCYo-%nDrAVHRQ~$rON*--UX+hN* zKdoQ0f2i4N z(0nWHi=y;3R{Eh}7-zm808YufA$Om^K8r?qf zx9D`?TFaU6eVTL-o3F9$ul~C5H#;`y9v>H3YJ61g5wB&kbb1r@KjKL;Nq}Ta-&gT3 zjU7t|ivj(nI6oVwb25$hJ_h*|!Y0obHDR;zk@2J0CF~#a#?%8FDE0mC1JD9Omf7}V zi<~s2y%XP7lF{YAIm0|bTixUKT;Z2gn^YOZENm*a)01Ay%8LEY%i#BD?5IeaJQy$3eTaqp^p19JYCg)VoXPQAv{HOvFyyawA;>FqvkobkM)I;Pzh;}hRE*PbQctlRV#KPUXN zhbP1odLm!9>HmC6^40t(>`LtMnf+3yCWgz)h9QVhVrH@>Eeo4jJr}8Ekq`y=TEFqf zk09Pww8x?#y4G*}0`jhkEVL-N%sao^$O7qF6x3hJ_*c`c3OOX}vF%pqT#s#u&RfwB zYZ=atIU+=z>v#-)AJaK0`%6b8&Y`@YxZU$MtNvvEDC>-e?-cJ>&`!6;c`%a}*$HT( zUW4?rZetZN*HAy^lhFpG?iT5Gg2hEP;d`yX%GV9P*RQkbQ*hOz0`_IF$wa?So9Q_>0QJD+qk#=!G$G<4HTA87 zd`@9(sEWaUMJ|;7ohP`(a+4-ZgC1Rdoph|C1%|}Q;Hj91-syNo3r%53_FaJ3M z!&qQg^RNnD+TphFZy${7N~y~5z6mn=35f}@%Fyf14|pdta422FevqF=ih&u0Eiuee zQXs?FX3}6_1>798ZSB5QDb&?w9;;*v9kR% z(J!?c%@VEFlOOLv|5`7$6e;hM$kQ^mMND~Z@_kAkwm9^f4fV}GsqamfAb%~7vyvLaVhj$Q8^q(S|4XH_W46-IU=5YzJd4mD<7viEcy6ofbXnikdim$~N;-zJ1kUzN@F(_3 zI`^tRtyRu;vDVqv2Em5@Jb$;9T-k`b>7@RwytZ-m|`zXih*gd|WnL8DOWp2}`A3$=w`J>;a)2}Cl-+?nl)`7a zx$EY`gYjYa_*Al-2xMqpt7gDBn|IL*GTv0p!2kos(DPK40?c@Sq#)_33)*6GyktoAVfT=ZFM`vxG za9$a^`Rcf+UM`7B=!kie7W3bSj@S&QNJkUeA9z@&iEXY59W{!$Bu6gvNaN?8>+6Wy z2OA#Cj?WNq%iy0ZW2QnR%ec4+@%dve%+hBV_7Ore0kXci9BWA~INX!*GFmsIHZQmf zk)BM-HX=FGmd4BL_=A5aFKl=*q0GM67$-6x{Ey`mjDcjl3C+)0o1cQ83F!8PLT-88 zypBJJ`H5Q+OPk3O3R&Dtm;B~GV+FEit@gs%oXBmAf7&S7)-*pJ*7uC96|0#-$*<;c zf;6q~*-0ATeSKS7RsYr^TDnf#>Dm0?or+o(Ph{e4*=6}*O9!4h^R=WeWihjo*g7n& z9HRo<95{!S#DKBC5~Xl=9P2r5Z(KOmmQrEdmtL@Wfo^bJbr!GK%S9iWAXCL~e_7qUj$d0WFz6y4|v~8r~VI`;A6fU0$2e3p2w(!Sc*xi3M)o{0~c! z`$l#SoF)wNpWLA3_urp4g(vm_*KA&jw0|}#hj^1Ht<5km>CX7s(5Zg9yeUTMOU$hfX-S%#Rau}?xTopj;XQ1d7BrUd(4pwQ1=S+HtYsb$Rc8?vxw@kh`7Fa`py3^A^aDT z1Wb2OXsno%{)DRcvQuw0Q>`^>xPVi}Sg|q~Me!e4-Mp&nRi`dIik!;@QKTODY7%nR zIdjTY^FLw&e^350dsUqqFll1?y*-tBu2HQwq}NN6Ojgsn*)B)=zq?f0f4USkwysqb;W*?XNB^-*v991wpTpOY3_{ujFFZ*no@V-K&UaaTP zkH^jTjnEWOt?8EH=O|B2YOuXT2AD019TS)3E{@qfu!{>>41HD6J7d#}_m_e!?y<|N zhX@aB%d<7JA7_-y*TA^Bt;N+^QjWRiOP?5!k?|=4{)yVytcX;y|LlH6ZR;t!?4B~7My=pn9&5vvp{Y~*;d6F5#4fd5K0;%cxSxf>#>7r2 zmQ0`UFk2kdS{~&PL}IX z!=Q{))^Go&B5i~gXfX$x*^Qri?)N|b50WSI)mZ<2I6k-apJaas=CWnGndHWE)Md<> z)7&miUAKDrdKg)gx(915Y3J8yE#MUP7A&`yi_UXChWr8FF@n`^wOFs`K575+mu0OP ztk4{)%!wYk(WKKfy-B|hbE1I9;yfo~-dC-M+UZyXRnz6B+&RpXq8zd2;Cl?~qe$1& z`v(3#%$ah!Oz$II=C#kN`DI$I8HY}E`qNfAjwYD&XH|Od=qxQyAYIl@G#-V9(`n5_ z-h-4074)0k|h{T4q5 z+bv=K>PBy7d}bWWdVL%Nf*xr7>`CNdC+fp>x>{p~XqU7#NQ-b{McrYshl$~I@<@Dkd`z@lYdp`lhz0;E+iw0bQ?JWopX7eZ`scU$&<4S zD5LF))|yUxYD%5cMX$6r%IlAd)2+6ZzRgPil$HJ({uX#FGg#@gM?$CD@Kmp)Y7j`jM{S#XboC&%qC%ktVq2ds zb3x~+mZ-}-r_vW@+x>^JZv!k$>%2>*9-p2_m2bu83*Q2a5i)#;V84z~R3 zJu5$;*A%fa)9=ocfb_BEHr0*h<9!RV&_119S*znk8vjrHV4T-$b*5TV*hA6xI%7)q z%?)IO`s^g`j4I+4rxNabqRx`z9`0-7fdY5b9F$08vYP;TxXitn`}!*ETG@m$391pkQ z($m@prKhzIN>6Jal%8xKbcXp?kgjby-K2%jPrcvsv`vdi$LY$ZjY;dZN@dT-b;qLn zCuPsZoJsbCU)wUycPLYqI;ii`wyd*g-~4}pep}I@0=C^le``1XDtN(J&{lA`j6FDX z<>AN(vdo(25%__hM+~ymq$y4jU-1|WTfx{iZ}RCJALUbg6fd>M{l-=F4ajfL_K&ub zal-S66OcEaOy7<@dX!GQ5xu%!Ya)I?I)iKaUX?TgwZkabsI1vOh1ddRD4(MX-Je~2 zi<6F~O0pH6U&g*il%Zab>(XUP*aL`k>E{&Dx}K*wZ^Fbv+9&+d*QDK#cX8gjJ2TnC zjv4J!ZUlGaFR%|`LN4L#;d-m-KHY+#_pni$d6Hv{B_Pm&`0Zog7Cg=#L-;E#qaon< z1?Yfc2x|)>mnXmFeSK+pO4jn&j`F_U>)_(TU6PFQu-l6fepY5b1L>vj7$Tp{-%XgdCP?1wQj zvglj)i8#G&rGF6}vWB0u(uY48r(@F--<=EcysPNbbiXmQry62thsTFA=o9>KXozQS zGXzKefi`jWW#^UA?H1_vm!Mnd3P--6kK$ci8DvBChMy`y|gY9aC;-o116X^}_o(&zO#u+0+L(y+1WQNoELK z(zdq!5!=DG@{XaFoQL!Zlt(akAx5KpK)vqq9Yer~B$IaveS^uH>l~%L536!f)3Twx zQ4tr4XNxwL`+a{V?GGa;J_v;31?^uWl>24!TmbPM!sCo>ZZeQf43d&HjDB zP`LC>4XWSXq2n8(6SfBz!#F{M#FnZqRTc3r>AJ4Cs#r%P>#rGq#r?YB^=ZkQ6qbnB z^&9{5GB!f#NgL6!$v&lYJwdwmTH0TceVm0JB{`P;S@=q%>+X)*D)D^MmvJTS$-|8i zh~c~ewIS;BKL7Jl2ln&N4;piw?EKMSe!e@;`{{9+IY6>nzVCWc=?c~`(K|%baZVM)Ae3VNae)M*6yqTS5F8 zq{D9LD()73n!9s)w(Oe6yUWRr%KWy{L2tS>cA~WthrC*QcPQCW{&|(JZqjb~55T5c zI1dcjY5p&%`Uc0l%`RkzV$)jozhcX^g)`3clQ?-MQqnNrc3^N95YEx)n3v}CNSTVx z1evkjQw;a(u(4PLao%H+XQ_^CbKS<{!27cBhnYY!z!Qiov2QZwJB97I?2BBs-05_( z6Q95ySdH^}PS20c)c6_{=v?Z0Me3q3&BUHf7(3`*Vw$?lIWB_+0GhNvrL${PhD^0( ziA(1{cVnDynX<8`&2TIzuT2u|QR0D6(xITZ8R1x{D;YtT4mJ?liBmE<##+QuGJG5o%JI(!ov(BO_8q5ClO`*n-~$W^47yN25U zxoNmGmqK+BeFbID^VnxSG1==P-H}64HZqUW$4Bg&De8#V2 z@(8CC)b;(kjgwK5?FublGkIh-Zn<%Tb9|~lJ;_mv?x${5d2{W#ogjNoXP>o-%nvhY+c8{({MyGdMLJ|3c-FMA~yZ48EUBlp)z_e5XyG&`5b2-=C^H z)Wodm^ndTvBV#Hm_XV~w#C+3ZCrA)f2h6}b^RuEyO!3W4O!s^6c_!~xjZ5W8Ik7eJ zGvB~jSSt(V#2-J&bsf&u2Hj@+XcM9qkUSbpV`j5I-|F`}J3aJaGNvejuWzF7o;uzd zKQ4KO7HT)hv(bVUDM$AvB9Ds+jUwN76csHq^OI;lebN)j{e3zeH$fo7q<>AN)A>D0 z*Lte!bdas{NTwe`ymcN3Z}i9+iJU3zIZj(ZL@{stWfQ!eqxjQdo#ZL9eiUVpKQ5%k z>1&|_N*7XN-IUd=Jz>%jL)~h`dxj z&en;%x=L?U8OqIdF_YAt)o8qa_Hl1FW#SH<(x4^$gr$=($RL81{Z-;Ff zYiCflRfzBgfsDNo+Iy`s|K#xp*r9yB_g0V1TV)&!RqzXxe=vr>gMY{Q@1)=Nb8(~R zXOZ^Ly_V@hjO>-{SjLNTeu-@L3mK6c<~r~+4e=^I`Rp2r^(PPtVaQ-)uu;pvZ;#R7 zQp;wuPA{G4b-^gL<2{hE!lTh3UF?zKz2CrEl$c6f?>Vbpk-gA!-lXFO0IpZkFU08_ zh-msR#_1f3XnGWWqKD8MIu-s2P^9{Ap7-jWX|8X03H}=-y*|#W{!8s$|RhR)A z2A1yNF?e^Eq6)Sr;Q99PZhtB483(pdDdCN-Y$JolxD@uR3tOf;9I^AV4I=dXfuZ4? z0~_Vbg(@yX&a^?q64>(&Y%Rp=T-c z+*8GSzd;SJui)|^LxiDsoejIU7L;q)1y{(lrpT2E#Rhhh4ZFJ0Ug5oIPp@Dkp( z*sy!>f=MYTRv@!^i(akUZ8q$#S|!AVpZPG;I-y#lhP%swt7ogwLa7Qk-qRZUi|r0v zqh1dEY9j}@gbfVYaC<7nJf2oMJQ}1W`Wps0Nu9y1dn{{6@@=4qu+!^koL(%=r+jJhL z#kz=zbox4-?!$V4S*Nep=~*-rEB);z9nH*2|1Oh`=3=G4L#O+U#^8Ual|E&`Z_?=j zI$JCKT{^ws_MhKv(#bkv`oBk~hh*h(`nyef_o$8kd#&^xLoxgoonAxBvgo;8r;q6V zO?2>HE8XU6t4?p~xkrJ&!%8Q3+Rs9|yi=z?IAqe^XVP|;;4he?Ztep%0l=zQ$|DD*f#!ZnR1 zo9m_Wn1@pN{#3Wu<8!V=(?@l^*rX#%cLiM6AT&`P*K6|j>;g%Qlk&JulecrX_i&7)?g=Lhmw^F+C2LhTp_#b>`|#zVYhY1S++ zJS6Sf$7HS%FCH_%kiI`dH{cQCQaV}7CcKa5g5J^C$YyK272=CrmFAnK?Y#8PEmfpgX}w36zxy zwb#;p$-iN_<4%5lpoS$*JoB0n=`z|THd)52nd9<`fLyWN?B+Uox=pNm0u8pQ=VLtu zU%)sZi>ou|utV=*M(gFMuO*!8eo*+C#-pEeeb_0UvIMmcW)B}`o1hqm;NAm=NBtZQ z_@fV;YtQ(Li;PNNjDzb4biH|aYldY2v7%;o1ViZ#{2t!0gim1o)1^gpNe}STK8`4v zo}Hg>pOA574gGRdlRHsqedr)y@nj?lhaj4K@!E|?kcOvuy2n{+lJ+ptwDF)Cu4k6u z5(?6JH{y>x=8?!eJM+}0;eU}v_)ih8Va(FgQyMDmQKTsmFed~@@VISxiY660xXF!p z{y5-7651rlXUp6R%|(4nBtmcHO=ywoJCbOg_*-zg8Xr9a9}QYkn-N$t`$9IYW4NU* z)`B@FFiYK)C7UO(Hcz}KnwF{O8O-Y-Kc%U}?|@#!S|wm!r}@RS(-;NttwdAdzER7G z<}%KEt)N6#W+5Qmh3Flo2RoIq|Nn_rNNuSe7F+Tr9<6mrA6SCjd|UKwcTr}I`O&}{ zAM6WCl{{XQMBLjN!<}ph<>h9ic)a|$4S!Fyfp_hFyr_tcFBs~p;gTNHoVH>2VF(`K z%p;~}@%nIEkF0b|{ge%RZ@Eyx*(kiqMhnRkfY#uK?sGPLn5jo4I#h{)O=~cPi?&P& zjsIB}zEZ1}8Z`{^u)_t*NHM(LA9&G*uV->TULwrm$%9tw7{9s~m+)qE9hdDg_m;|) zph%kmAe)(a3*L;OUbf-)7E6&|4Ol{*_84#V&&1=nS8UjO@Pv0Qhhs6ojg71N9XCzK zt2S(y!NEDaf>a6sOo8D1^tc+#XPX*&CtV~>iHXLl^)?>EY>@q``JE`ZgCE3-Pfr%f`cC*=r+g%6gIUkoA?7?NU znvMgS*R3|}J%tDl-4!u!bYPDhHPG-Gjr%Seen&m1HL$CK&W+^j23F(VZo}>@M&(9S z$W{p!=UL=T3(=j?@IwxK0aq6Uc|Pw%r)}iK4Z~|%cH8hf@_txB6?F7e&H_2O_t~&J zgJPqQD_7{$3elZH`+W{P9!js^iZFWSoN%YWXB_xq6!>Tz1;7_V{J&H-c^iITSgI7V zgC=Iuv^f z+^H!MU+ZGvzySp2fw>OQYxW=+AGPSf*6Q^_1?L6<8{4y)7kR{n-5Hep5-wFBylnrm z4QV<~+VDG~sF9C~d?lZ@2&-*9YQydff@;26tdWelEylRDEKb?*JIbY82`32A&eb%M z@gI-ba63USp!gga`LFn%K_lbGZTKBgr5a+o7G#w8h+EuGKHZ-5u=#qmRu3bBE%AXg$0lfP&&=oTjG`*eL}M-uw8DPqfAQ1CC!KNN>kSxOj@ljL zPQm|_17C=+>#Sbn_Jp>V;y2E^@Qt8RD;3D6lkHpZn%AdYco-?3!h;_pn^syhayjS1 zRszg0mZ3w~vw_uq;29S-sAu8W*=N9}H8f*ph{H}5puQEpk;*;%({JXI!)8{?w zl=1WRD37;Isf_aPRvAs#1-s170`?LXf-K$2LAr|JjlQ09;Pa)h9-&bHo^)lwYk6LD z;A@y!tv9GykeO+4&GYj%EMlw(kAJgni`iq7d~)gl-_!tuGdy2*%H%>kV#SB>QDn?5 z630O=+hy)41VOohmuC-bLm3W(R3%0iuh{VW@Jw={RLT<*#q0osx9+4N%bTHj6%U_l zc9~oOldw^g^~=<1idov*J#%0Wjjg7~5A5OB*J2z8wLCTyt+uqUk;~=^crlVOP?$7# zG%mB}W2)XQb{V{dUde~3nl(xyLC{R02a4m;ZmbAsd1flA{E$<=j`y&NQCP?2XDl8L zEmiD7^{1io${JVX;A&(Vxmp$T@N~kum{nWk5A2~ayC!E3Jr%Ps-!XI1tt4SHZF9!Wjw-+Yrq^-N`)!ZWju}NRU1zZgO73ui;c+Zfu?EPN=Vj6 zJ56TV;~jd(?!X@0^lg~a`rA;l?9b2PedoGgD=1s&OdZ&x`AeaOYzytQTvxp9c5vaT zb3bTAd8|wkO*SseIQJ}-m9bO0ch>YXeks#vRHD%5`>R}h%Loj#Wwg8=v2j6OVOWhC zrHZt)@ow+L^^LT%U-5X_!IRBY(UUc5Il9ERm|d8Fl;`1fxSweSM4(QhPiqH%adph zX6)n?^X4?qui53IOsP_>R|<7eLw9y=8tTOO8%Iry#d{0d7S@$5yMitF^+p4wrF*d2 ziyFQq9acu$`&|y6dd3G0q1<;>%r3>FhcQd=X3XK^U^+Bx!4!I2aXcqJ_OYx zYFVwtodU6+$z`HEu9XYK91I#vk>ZT0(;I4RHh)AfjhE6fy%u_jcKn=!%g^Mqg`iTT8IC?eS$Sq~pA+jRmz zi7f~a{q#V~DWbO)l0|XE0!1^r?0Queix9dP#JfO2U5b{tuyg+r!nRFd`=Q2LFWt|r>8^qV+c&!@-mH*>n4H>dS7!E+0z z$MfTM9k+7cI1S8bTZ*A`EvM6jcbxVXPUDGfL*rXHO;0b!w7iYe%{(>MmV}md4*W>3 zGtS}xt?M@aHh8|~lRO4^oMH}}xA_?z)U|Ho?;vj|PkChKl11syBE84+>hoCWmvq|O z@q0+eYGA#^Z)ONxl(vS_FzlK`Q>P6QBx_2)fzs&}5Ih;8)VT=z!1$Qery8r7&&xNxLnioi^-dnLACH}yHW#2&b(it6s z5ntfIkieKOx^rB7fRk_g1E!1CK&9_T zr&lc~g=}T*M#67<4a%XiB-@?>CBJ+F;BWmUvbO`RLu6Diw_!YuCHoq3hw%y_=uL-v zfL_y38z30aleLUAoWWved_hBFt?KYYyuSkH@?@RyHPG=po*_Yj$NOlWUE|~viDn)6 zSyX71WwJ;P)Ta_HA;ufT9|a|}4ZBOH4(Bs8H^e_P8K1V%9K!Av+K&L!TetC<`*C0Y zCbD^~2x`FAJhsr`k|vzh(QlJ%1zpd21_JMrxU~pAq2q0MM+9^n*kQmknS*$%5W65+ zTE^d_VD?!s_vZq147o$ttwZ#2ze{}GqhMP_3m6Eo!-UlKkk+q(3)10ePX*EW@`L1G zaBs@+ZVPa4E`xaj4Rh+9Bol%eI*>hNfo1kVA8KyR;MrvX#QAH%h19dt$tM{Q9UDyk zjx1)}v$%ZDR@Od%Wc67yvYX$v<^LlFCG;q^^(1uU!01(`kA4(3A~1^(r~@-9lUDM= zC1wQhhn^(*AnK$!K+?ez?-!l!#!(5`E|Wn=$Zt?)vxkOuWJqsfSP$tkuSl7ekEsi+ zPtRkQx>Gir4Gu?`8-y4h(spt82b2v@Pn<}DhYcOpu>Z572|FKL#IbEGg$v{05yNnEoo(qX_+?AyEPTA33D#j@MY$Od$$jPAGS-LwmICyoV0 z{OI#JbY}O0XGlc+C^|n0JG$V-q){1-a|m|BIC1A+e7%*(i1>Pv`J%UOluI&_l+h(X z7IjawBe^50zZ%0CUt{6Y{?**DUWuADjY@{#wI6uVDQquDVYLHn3-$ zzC8sm`uJh+4%K;=4PG4!q{8EI=9F~XAh6e&Y>04Dyu~u0exs4eN7Y7vwY&^4Ea@^d zf7D4zEU`PKA{N}V?pvA$c2^4QKKN~+W5U4gOoh|*_6%Gcr=%7DZ#2gJ7o)gW&CB6l zmyu?+d2pl^W=ERHqcJDt-D~F!2P47op&;KHGWq*c^LLp1kEG_)8(M<@zSR6(CjXlAG*VKE0L7T6s8ojQ={=QD{^HRE9>{ zyZ#-oj1wm&nz`JMW^MH*m{6@8n52I{W)4qlj@-o~}-(>$*4{MRdBZhtjDU zov!QPbcVlmF8PJfmvt06~HG`zp^YFo7X$C#T~4rj9L<{pROQ3A`zR zHzn|<1m2Xun-X|a0&hy-O$odyfj1z5&6w-F1#lbwiXw0MOzuB2hDqD`=}!L$k6C6r z6VsT(J#q~Dp1U*sBe+PtH8wMGWF!a+t;75FQo<43={-hsc}L3iW)L2k9kgbq$By)N z(iJwqno;^tI`6+;!cZ9Be%_-N)A2ts{eliRtdv9Xmff zbmWkKgiwSy)lh4G7=J4Ih|uC!>3%NH+d8yi^fr8F|DgSUOZNM`5IoT*!dM-{81H1} zulYCq^WVr@fUiw^y zE^%eAclwr9(dF^g)8z*Zk89B`N5SLPwX4G8;-GuHzha66-K44yW3C3%YV3c$7vFas zIUL}N{_=KXjfg(il>h1ZtHS3*w~vzuE66DEdGu#I?^F0DKf49rfBCm}Z^josAM!5J zLJ>YE!6(`5hMQM~PugaN{WjCs5V>;960gkXBDKZ7rP?)J7)CyCEK z@Olv67yo*TYO(*QeF{2O+7r04e17Qwt#t^Wx8wWsXa4nBeBtwb-WH|PyOd5(-MA_` zrDs)Ej7d_=uDa)83l8h@z4*TKBQGF@KHI%3N^_gRBbGV6EBRI7krYXr=2w)@--W^c zGm*;)IcS`B<9QYiiq#IU+PrU1f_PJtQiobm~+U5?hKz!bT@BWtc ze?%I3#FZ&4t56-srpL8I{O%QTO!_1~&%R}q_>`Vy#Z-EIK6e;CN5Lny<$0s` zt_q*H%J4X@a$GsnCA;17lIQ(9d{g^;Kfd4d^>>cr3!k0d78MU&f!*TCPjBdLtHLLp zhg~@)K{xUFoS%3%P^Dg4$ z?vH*NU-<0tUM7X(a|P}52k{-1SBKAjdoVb$VqQq}`Pq~5J}2?{A@K6it1o^LU-<0x z9#a;)83Szcx0$!E3ZFCmPUqq2y}MV8Q&QKOU-P`5!Z-1W?Ev2W|1^UqPUv%w_mc8M zFM-cCQZDUZ6+XNDN!r-HVr+WE=ZCRTgC@L)&+o(c9j%WX#TP#NywUHHzpmlVvoZWR zdf%$>d7O?MtQ?nOx3~P6=V2QP^SK@05B}M(ni9I#8&dHQ%_mU%yjWQkKFJGVN9oFO zO8Wff)3_5+@rmsz-p$+pf>^?5zeoF2=`#gBNAZ2}yH6x7I$(5VxeBuS6SH zMW5}l?)=IPvO)Lt^C7^WJFzPI9H-MXE2vJk+h4>6L9oI4#C4wD+FOt0 z@P*F-Z&X?7W_&}X-b<@97e6s}lpc{@IZla2S`|$LN`=ZZbQskr5{?JD6!MFFn z{q5h<7fu&>`_x$bEF94xq?AIs&0RkKh<)hMKJHoVt#JQBgij(6coN^lE6vUS+K)Yp zl^6O1-t)>I(E{i=QqI;^i`V`_Z-tq?z6}@n4SV8Rx7AEzRd|({erDwsl&;Tb(eQZz zK8fbUMmMdB?`1v_H>_A^O1ArBhygLwWZV4+zHdGI=de`zl)P6|tIVhv@XEVZjn65Z z;#yHYzwhhu914~ryfc6H@Ey#iS2pWr7r`gZ{bj;c<8yYU$D$wn2G)JS1NkEIzqPqr z{;lv?@m^E<90i|bx4rLPH9qGSW>-v|9`2Du8eECk{v+9ki{^d00 zI7y%9YpcfRV0w1ty3*_Wq0o$7O7KI6!ROg%Rs8J?CQy#8oHk{y=$_Ad9+uBopBa3A zrgaG-#fCeei~o+MBZ98H%|j@niDHMatjsV&p%?E+v{MqXeISYM8CX=&drJ4=JEZF z^FRDB_`bdRkuCVbXT+m+NuMeBA?iQRMysMv z@JX9&W>#*{4cdvlI!S1iEpyoD!%{2$+zQQ`W)uH4D{DY=#%22 zmp;BKe70Mim5p<+AJ0GN^_2E#A35oBYIIfjRCBtm30xsH(>c~zxrr3;KrD4JU;iKR z2kEwk-_LLQ`rqOUpNG7y@I~~Yn0FN4SKF(?Gxp}rj&&E0uV`Dn8|yE6J&pR-$KUea z58?}-AN1(1H2PeEZYf6EI=m{rcYGF)ZXxPjQ9geQ`);-o571`=-*2B9`d9eE=ZNu1 zWW&Vg>5*08a}p<#=2mc<2HS0B0ee-!1MwN*`~JiKkKRW-%Dn9zScTM%B7tlT@keB)4RpN7|Ken)PLvQBu zi+_$-06dUBDR%ggb#wRO3!j#ERkhC{)yH_9RpJwy=U0+ZV&ktqgZK#F#3zkAf8p0Z zPeV3*M$P{D!-~&SldHogI+>MZ^L5ro+h&g8D*O=bU)V6UI(+sgSC&uG=O6wmbck=# zC&DD}(ZBe@f58_%V@9yr1`@k#4~o1XuTe~B-A z#=Vzrl)q>ljr6(o;Z@;ta-}yS6Q7?r8@Eqd(~iD-_lJbL3Ga*=qg?}^6ziUySsgwn z@uK+Z?HB8K84?6OkE=Lg!@*UF6XdRIym&FY!ZFeFkHu$}=sdvt{(s)iJie)7?c-BG zh=|z8BFa_}q#$Augjx`r?u9O~4Nx$erb*gH(xfKo0-{C)L_`Ex1%!$q6;P_6vPxCN z>P6)$A}S&(YE|@t;uRI;{XLm8IcIWh-+w~qLz$d>^UTaM&+KQ;oITS%2`b2n**--gWcUv(Pgw#Fu7sUb#tNcu+3sl(J$>#7 zYufxgtu)lP&={BMXyRQhqGx4<)ePEmLl?%nLkF@at@XVT_vt8ja87ol4gW-Y07=gV zZ_DVZ7&KyiOY`=;Gqm@H?*EpOo`IHGFS7Y;rI9;vfRE+rkU$zEkUhy}{nFjaSbhpS zqSQ~iA3<}oITKo>&Bd__Had{Ih3x4H*;Di_te~azbVpWE*ofNP1uv@OqC#B1dwSGY z@ZieWImM>*JS^F?dQyw%T7|M}^|zQ!-FVMBcMb5+?6TuG-=OrW7j&(Y^el_?8vQxg zliFIUqebvnty+-)56;8rymWFjZy|f0n%rXcY{5EO{y+BI-g5Tzl}GsbkAjyNyArk{ zd(s-od)Ga`7#`eRp?$j1D6Ld(7qpn3SP+X?i~IlG)A#<5Jxg0s&lYQkeE*|oVvFhN zj%Y(fjptn`x39pba$5rbKc2}BcyN9;N11Qa^RUzom6}_s9g2J(+Wh#h;(u(~t;K9w zUgVANvk{4Ch*GdN9TQ_LbOvoH{;LemwdtxG=5W-_#4H;hyyr&WMSeeu)mLUVPRBA&Wdv8{Nyj>j;}^guJ5Ev3 z&%J6^sEiTl{x5y3Upk)sr2OW>=@|KQ;Of&En}>9hjxHtr+?yI&k0%95$2#cPi!ui8 z0_jNel!%Y@7T|{9!$>pfSQbpZ_-`6Jqv%tw*s%sW=3H>@$WP?+WTB{=1iLQ}oF|nI#FGEe|iVZLvm6w}nVo3=7zE>-Y7C2X{YPuGq5>lS{gnR6e5x)-Fj` z{v!B@jqFH`3DA@FACR6E@MpAtq$@o7#11KXu7ho_z&Ew=rXZpJB40O^b74tO9JmxQ zC6QKAqw5-V?_wpc+kN%(40v!4gx2$D{fD0EU~?{{J#FRX7CHylY>D&(>7?iV7~Ijq z7TL23zWcr@b#yYmDSfDA^sI`oqNL|sG$+;Sen;!Zb(nD zx43+zVru9d`TjFhKZAOC+)P)~BK8dG*>dgBf{>o^u%{JzmdqZz4RSqSBN!KZ#@HvC09=Y0r|KC#Xn`KOF% z#vJ%~_K_ATw`D~aV0@c|XIzDz4?>rUtEvZa?H03xlo4=qV9!GM-JWU@ds;0KJw1!B zCv<#)u{Ky2A$!h&F1LSrRJk3rgcacV6ms*F`De|#7Sc1aud`reu7YhSkMK#)hv5Iz z{l#zK!7XJy(4PdIqG#;WEu<$#xDjlIf_mm-VY9!|-p++mJsa8{;L0sy9Z+7$6?UNA zU)W2Wb|KfnLgRR+yVB~7l`KnbRJ!u?Idl?H~X_@+I^Eo4WlfHR-KJh<#9@*Pcdb%U3 zC^e_E@G#&P@Tvb?2!C0(5ATNux0*#O?2q|Nl!QK z8hP=7^n480KR#Ky1RmTPHX8boqqC&!@O6nTa`uqj<-#N9agl3qNzdU67`q8R>A490 z3*BFeg$Gx|j<)5W8lbP0zA?0jo}^@%FMaD?(sLPfd9&fJce!@!m>Kgma`7m?_!(=+x{%|9P`;uZ=9iWdk(b`!@6L(eVqJ-!`_Dn_jG7qO&#={jBmRA)?#`VN3i>3 zr04bVYW-Y+>ykEi(2xLb0~@T&TsmBa`$qU?&e;~zGm^)c1odp~XKVm;p!&HIzN1&% zBkxA_Mdtb zy(525Ft{H)_%=H0&=C<+GN{6{^!7`xBbIPAZevJCS~nuq%Aw=h3#%hu)Zz0-vNIta z9ZtL_2tJk7)$p^fKcj3z-Nfuvh~XNrhCp>P_Kyo$Rzqt-w#vvIE5u00e&`+P%r?>y zw?5g;zxN5B#0j_R%fYLM#ua11Bw}T@`9AYmW)Bu>*b{j{ zYb6bTww$h2SkElMUEY@4oA6w){UPhp-c;&d3Ue;xScpz9R&85l!wbG5W?4S&o4y}C z2=;wZIbI8WCJp#+1L=p;6PUj<|8yMl6)QfL{?&4}y#S^S*4xp?@H{STNBTYmopi-d zCUPz7SPI5N&(<}_wA?l_?cy0vMTVqSwHnQChqc-Z`EsX7iPhjS zXV{RQ<#?9o?-tP0h8Oxq@|_;dj}^Bwu{wq+dvJbJi22R6q%d6M=Wwb$ODjqu_{1x> zXF2SNTNFWiZVqZ7{@W2c7b8O{w{u|62`!*!i34v(usI^R#1bsKHCRA;TPeGkzG~dg z(BA7<=tnBnK-XC4fKPqQbMV*i`K&)YxLvHDGB%|1^zXno z8JjO;9}_IQp@mSV!{LY@8M%Q!>AEV7F?ybdbln2K@34(O!Gqh)jwtQXDcp~_4d2AQ z*>buTm)rc_2yT8PUFTt4>0&Cs(6tWN#qlY$!~(a6bx_JG^)WP7>UKf+nsk={H1 z6I6!n4V`63_uZ%**EY0VImVfdrFhY1#40W6IyaFqTEr(^>E7GHF~dHC2UpLID&@El zKg2MYCAOelEBwv~)>z)ZK5Ss@7<3_Bw?Us)5B}JPG{qe_M(>X&XU4h&Sv0!sMffFm z7rG1=mq)(NQsUP<&F7`0?~Aw|Im!JH*XT7?r;G(@zdiLm2cK=Za*X*L+T)1cwqd02 z>oIu$5PZ`2CHS5G?tK$HxYya{%lW5z+_$mfV|BX=Xv=*#P;PExD%M!7g z%ggg4F^r9XE~M|v@W(A~Hw+%!zR~H|W}F&*AS(ipks`2Xo=_cJqP z1Y8^j6|^Q1^Y(?Tv#L$$G4Kkv-EEEFyZuO&cDTub>KH7)G+$r#!U($U0rw``t=Nz5 zo74UP-Nh|dU(J&%AgbRxW2pKcSxL43=gh>9a7q3dN;laJlXg>rw7uI3A!teGnHaRKog0xM_$e8LZZ7!^~l}B=T%t+rsG5oz! zr0*-Zj;eosF<0qdq4OKWd92I-)pBi=ztkJiMPkym0|xo=@JZLb@W-F5{*CK;fE|TR z$;G11(io~>OUvn6ino?WaJzHRuB)Ky!_b3tt%v{D{3}Y}!M(#eQzpO}ufRK#;TL?` za=I3KBiZxtu~X_K=m|YY*H_^$y7t2x;laJj=>8SCLbOkGU*~w;h1AvSw`m58X43V);*<|5h-DfT-c8 zFx$evs@w0U1d9Qqag1OeWOeT;SOAQEFWA~^7r!Og0cA+!Nsic% zL32MAtR9Re1A=XtQU0M|3<>Y9VF^DjnI>2am`DqSd3mcdX9SA_6E-3id-BKu!D^b3 zs{(HmYUJ82>w6xTjM#B7kxm*4 zoOrL(=Yn;_I3Cps>5Qf$J=x07QDdXXO&MSPv{F9JmGXOrtA>g9 z3{yIrItML^3he)Lwp5>MSW04@tLy}%lWQPQxgW3YxxC?+F~Ks;Y`IY z&eF2~0HX$lvx$cHD_^MKjIn?B#rxkvEQO89+>y&!Zf-7&a6^bezHHNNoEh`(2OA$^ zIcYcPPY>XXvBO}ZJtG|!y_S3(XF5H-Fwq#28<+Xusv$~#;(IXOevaD zHSgkClNNHh+?--Cs2I#on&(}SbHnePnWjDjMum>@dJoGTueOoNro~{qFD90q`_TEd zbjeWWO>ctXpCXr?thSNa`6mI!gjn9BkC*I7=5on~LDw+WBgByAwhKpcmYt)a=|_A9tU)Pnhe9Kxeu|~H7ZQq~1C6rCj z0XzP{X2R$3>GUbFpIbP~HQtzj_t%9OV>@1GTgh3zB@+zEQRMR3{aKbLIkTkQ4+ixW zmYXy;3P zUvqsCXI{@IU}Hnf>nUFN^~;<&-ElW#uPiaFabM2t4*H&46yjb0wm6thW8r1Y<+%2Z zI+R#qR#(4U)IL0pm3ek;uFB!emXHia89`}@W2F_H78_zX8&WzOOw{*Lti-9-_bTTi zFkz!!%;tKq=EGVpmzCPo{;DXn8FLf0_Y?C>;(lTjOU*GGkk<%=(z2E1nG!O0QFjO( z(v9-Hxx8|5Z!U`AP9PNMqsVQ8FZTXNF;m`Lu&-P3Ft;I&vJqcb@G$W z(Yse1;w&#)-m8#TF7_%!F~8$-7*DUrZGrDtn|~*lOUk?&OtgbrQ0F#zj<4Y?)sh2N z5R%Kc^gHJzQ$s(U{%J7LMpBpqr_Ml0AjViz=fI;)&X?DWvn*oGIEwkqdr$x$gFNMD z3^P};Et{2o6YsOl{O9w5DZUCYVRs*{RlDP)S+LviBMOts_mWHhq~r$E`5Ckk<49sV zhx|(B3^Mr{)$s=Lj4H(!m!;O}#mI|c_x|^FE@#Rt2J40kijUZ=yAPb;EGzY1Fi(hC zGN)X;{0L_{{f}Thz$YrRAJiQsn1dGqc3=t{8_{F3!Umh+>B&$d^59I(*ILkVmlc7q}oD7P7ot z@f?!v=I9`seZU%?}xEL=UXom>@-+kjoj;h+gl6PX@WY(qcG1d%c&F00G5ag5ufG6 zbMpkdAM9bp4kWi>$9LNW>wt!}qekxYOI~X$*i~R%H0+8u3@Ze?9;~Z|9lmzMPn>0@ zG_{6^b}-Wcxfn(6RXpu0))%9g(=`hW&3RCVk<961AN=(f4>M-yYhZtdn7O)3-+Rw; zhIV4I_8zDyI0oU&lqauK8?wYYHQ6r(qjxe2<=I|lO5Q)>#%eC7(^rFa3Nf5NJ)jE} zABHk$d>Bl$gM0Dah|{%SaE3Al_Ao9e%zBn=5NpL~voZ&m)iHEEext5W7$zoxVd$pF zrRJ&QWP>Ritbd55Sk$p_PP!LtKa}C|>Gbzqd*1^56zR;f#NVNoiF(u(&o5_}aAwG< z2D>{HronXoQ{9Gf#@H`lXeyL2jk$NOwzcC-r%$xtox>=RJU*=BEX&`?S?>7HiZEUZ zr6q+;J~cI#GvoN*ZP*(h3KOfz?VncK$nmE8?OOc`*xh?(P%$MPGM@&UAClAQ?>s%= zZO$zD!!Z(gEfk+I@7u4OF3xoN{}wZb<|mZS#Gj(k;!v2mIVmNKeH>ys{gZc|Mh)St zXQ|qT)Z@F}hi*{nbXwZqU=UTp%+0E(SW8_V!pzQW>Nz|r^Ru1&-T>vquH{UpztyYOht()&OO{SYsU*1^QxRAIpSkXNskQMh{l*z%UxIZDv81e# zgC6WC*dJg?A!an5%3T|3BS-tR@u3|K#b?RO2J?sH45s(m-=>sZ=mvIGh*>gqcXw3m z&e*45u_1=DyK^qT7njf>kIByiXBouvz?3h85SeJ_sk|+?xc2}q$5>PE+>Byg&uYl& z@I%U%8?cU|_M4bDf>9-=@ovyK6d)YMmsr6Vk{XmV!oRiPfe+yY*;X)$oWdm5_mikG zf_(x;4ZC34_3Ptcw`f?=7)KW&*Siwq6b(DCPorT%Fuq){1Pyz5$IQNhJp^{0hIRV+ z%5MaF39O&Oa^ZI@jeCnTU&SY2CWXZ^bLI9yH!Ee(<{eUncabUVTIR3lV;M!&5oxiR zd!j};kfEgCwU`&2({De>nYC<20MF>-g4jUh{mrM2F67KycJKXaehy?+&Yv!7c#|{6 zPJ^W>a{2I|*z{luXLiTP8DdR5x-b!8j;d`llrwYL0kFw17R8syTroGzK0ltbIP*0# zF%H88XHNGG`wNF~R^r_c76>t)=g&7UR_dnDpEe8om_p2LOM2wS`?y?ku6%Ce#L&5o zQEYt97RU)3&Bj_r#>VmZhTHEud~z#c&St3-WB;1cUa*O?mG`MbhuJJ|T*K~hFA4S% z*kg)*vr*qI?w8MUmXne(hfY1<`r&7+U8gy)D8-k{egdlv$z^6wt2}>(vwXwSxs3e~ zVmXF3dGDiC@^m)!z5x83?ZPNW51;b0inY?T1-N$wMg^G|h7X~4Z=)T|mCr6s%@b#r zBF|DUny>cLGck9Xe#@)^h(ia21-68I)J-&rAxCo=`TUYHpE$pS2*d8Q`;#&lr<~?xe6VA*&<6~mZY%EO1n0lz; zj8Zo%Z8cy!gJBXIcEiAemqv3rXBizrM3sZ?J0&xZ>xIKkrCqwgyb$ctAd4LN_M%LQx@d`b(kq~{MR`GPZ` z!Ll@L$o(+^Tn6R(p;Wmw?ENRqR2{)GnEY%>ZXSJ4j?yVVV`I`VOUl8O+UKc^8kUnL z?+MrG#h!4Cle6V>b3Gn$ZZ5^Q;|X>CFpH(;A0NNP!qei9IS59l?Nfe6vynrBi43OG zFutk1ag=9Gy+4Im=^Ax?f*Pa`#u*=i2i+%GnmSJ%I;0$~QP)QAL#{VmKYSRM!@9+j zYC0*;g^OZtd-_`R+Pj(4dbRh^&Si_7Ws1J|kJ zrD~Rvtd5sbO-((si8ZABi`T1RZeUrdhQAgK=V78R0{a{nl-I#VfB+n&v#Iw*(fu)b z4|R5)*h5XWmCwV;37v-%#Y(&vZBU;r?ZSK>-Qdo@ium3EgXx2LHXi=WFX#R)*qya% zUpx_C8m|~WP_Q~MJ1!`%iTx+K2Q{@p9Xdawu747Hed%tqU_HT3;6li`N*|<4$T?k6 z8`V4;gt_Rg%Mvl-CKfaFQ84P;NNx}_m)&-^broj`<}PSJXi&mgnRDiMnTig+is@k2 zgqXRqOLo_OTy8>YQ}5h}V#d5>n^n8tjr>*Z?kU>>MvXqjcOAw(7Y+XMHXbJafA*ix zKcThJYr)Pba-*>}T61hlA4SeK;5k)?o0-2f+uinK&YaWcg9Tdi_{K21>yjsz^yLiq zNMF#NH=Jt`=M7U?x_p~zzd6ikx;rx5EeEObT6iZH)pO@0<#q&~>mZsh}Lo98Vx_*|4>*aUv-UAO|hMz@{nI_I6 zz*@7V{j2|cP667wJo$Wz6oWXQ0`s_J`3#mklQ@Hg=6Le6e3>TkEFbO(=RSD^&yy(S z-$%tBm*~O?__FhXt#1hSG+31) zM{M(|52?98m_AR>&oI_f*fq@Qd86;&7jb6uwLPYuSumJ6?30e=9pKFF=n2+akprvD zW0xm###mG5SVXaMZ;#`cJ1TPhna$ht*-kbtXLbDswnAm*mks<-EV9wUFVuMzb*T4t zaF2!;wBJE6YM`l2E~hUQM{?0$ig{d2;UxmVk77U6bZwF$EU@^#L?%Z z4g%{QWPE?)@^hBkIYT=OM)3%_J=Vi6!3vvU(f9w%EE&2c z8Q)u{%9V$*jlzs>S}xGJX%<|YP{YIz6-QzAz+Y1=Mqyf0qW@gSuQiZKw??BT#Bc~EHOcXEKn%3fS{C4 zyUYX%>Q~w%d#I2qjhfE(!8U?~DNHJ?Dx+_?BmMmNs9^yG1?8$`CQy(~Z<0+51e#?0 zzO^PkDa<*|$jxhpEog=}l)#OnTy%b=q$>+#n_n1OvV3*a*7NUi~YO~?h$v1y7OY)0;o#Cm;#%b;t;&L290 zPfdk+v>A518FoTq`v>DP=t#dt{52Kd$tGEzCz$dvj%`javtb<@NaflE5$`nUo(mNQ{w4|h}tkl(6!wjq} zMr96nHx28=Y_y~jbQC7t=MiBVmG8-Gg}7rhY&Q0e2~2YIz91pD9Qz(sHX?Y=j><9w z3g!##R~L-NyTY|%r7TXvFn05)4C5#blhc`RjMp$~YlLgXQd34tEJ+}wWs)&bV(A(k z@(f0>c>Fpsh9$nn(lm^pV|NfrB*r8rUW(t;^>`y#UnpM++G37Ga&d7%HaD-T4wsCW z3yjK_V3*x;d6r<+V3%pw&+k2Xw_tO^!rXppMX(*AFjs+f)5x9lnr{_y+rTc?uq^jL zuVD3Hoi(iExXz`59Rj0*C(`*`w-4=tHG*~0u!Bq9-7MHSu&XrenLAEDAXqn4kSjFo zmC}m`3Kj>Z&9knno;C=U62?kqwEs}B0x%lui*zm>5Hnb?>M*%>hnAEGHV;hF;q9~^ z1ginl=1aw<>uG8ewBNR{Fkkw2yEg=D0Mptp>C!Gs1UmxO6&E6%b7KZs1Um)RQ^USX z*`6j?v`*Hq?0QdwU~ypDboT!G_Tc!G$^@Osr`7Ll$1w+lTtOK7eCzmM1apCD?Or;p zXRTlXFl{<*ff2!FCW@~HtOI*IpOfKj4_4zqhDJ}Ouo zm^REE3pa<#SxT7Pw{7oUE96XIv^XNdd}Zh|r(kw4ZCW;b`-?-cYOrXH-2FY@Nfc}j znAWzpM3=uH*eWn>eB*{rh!t!zm{z}`m!F<47`@9x+lCZhR*6|Ow-KG!s;##}K6vgr z!A^o{bqJh(eSu&!Nu_zJ(EYv`-MfNy0MOb!_J`+(3)T-zTh1E0wa*bO1x#DV3V;80 zrC_G8Fz2u7S16bZOl!ZJo_9PeSO83`pKtx?5L+I`M)vt&laQllVzg!cPouf7V7tMz z`7*lgi?;}NFidXm^e?LgI~vAj-f6m4utqSg-Osh^_myDhz_jgP-)HX{Ay|(~WVuiG z=F*TYSpVobdu@H+xaj6kSxN!Z+F^p*Hc`mg!L;RN$kr~Q_If&))=*0+*wwfY<*eJbb3X`n3QSw(M_x6bOdZsn zjHgX!-xF(mf<=RA(t;_lG@z^VA{U_!(pRC<*X4*tKZ8xe+Jhfg6(w}8~w$U z>qJ^~FoM<&-Ev>2>aPP8t!SNf#7aztpJlHO{u1_ojOk2)| zK6%#}5nmygw#*+}zjK#h)nTltuKEkX7KDX)+m~Io3RVlIwZq$8WGK zk51{_2c~Va2Dxgec?;&t(XjYp-ujK2h9Elw)(f9SnP`34*P(Jo?}gObw#{GbR|~mV zFm1kc*SnSrmI$Uz=a|QzAyWtAGlsF`;rDG2tPl*%RwymjiF02R%mt=R=a(NI4du(c zurL!Q(XK%r->NXV%VMAXQ?T7&+A^3h`O8pz2f(ztub)Uy8t^cWgZ02?k!SQhIkLmK zW>`05N>g&fn_)&UREc1G2tMQ}J~J5ph1f%VeYx}lVy115u+ZWxtS6(rS8A!O^P1r#C#L1Equ~p8?z+m zPZ}F4p9{b)3Nb@Yr~X5gJ}xhNxx}(l-Jhi>ZKO_LBQcBdNc~ z(yy2@>m=r=j;|?ro6Fh!+a;Eqs+({BnKRR*dN5Uoe9JrACn@8XR6~O#hy4<_e{>g@ z%g#Lrrsk(ke`d$eZ*Z1lIV3U0-uSz{o3qq{BNEf;e?2&2f+ClEG%UW_WBtsWjn6*; zrlu470@~K@<;-F@876mXz%!q4X0n_KWBxx^-^*EY>NzRQl=o)075zBFx(%3` zpO(}k({xIC$z`z;%S(EET&G|YL}hTW#4Ks8+Q$tOVa7@Er6%v{)Zqwc*_rWRqK_jT zo#%1tHA};KdK1c0h9cKHG+xpL^{5_GxhLN!P=l9z|qr~#)FiWrB^&dO=U38PKL1~#y`FmtPLUq4yC2&quGlE>ju_Y!}e@mM?VdQ zIT-9p4Rb#|akF3qeNls_ayE9W@;+}|S1 zZeeU#*Uywb2m6-6wCSAl-R0j3xfC$19a^m%zgw^ZFww_Re!g?fq?v-1g5h6ChsoEa zhw8(00BzZQx%+KYRfG1M2PVc~6y^ty9W)BI8BALrI>dL_&Y8{C02Zu&Sic?_w$^+Q zEZFvd)k}SUzVQ&4sGId+>)yw~gnspSy3q6b_h=m`ohg~8z(o5=d)CKn8WJkIXTgGY zKzy^AWhlvzqxMXP${^yKjr|R}oqvVKik&5<(@(ziCZ(LEuo#J1GXD5%pEADI=?6;; zW3mDK*|JvHV-gQ0+TA4Vk35!juAHaE?iekxa_^zB5C5AppE*%tR@dfdKc}pK4nyKn zB<8UA7EGk#16J&hIr!tSsi4J%4}7na5`WYljPJ zmy&RXz?}8dU7R`HW{J6nd}BNKyCPR^2NP{_60=!%Ui9f)&dfd+So=_zN;Pw)OhkRwgO!lDXm_n8tqo z4(kg2T+Zu13MT4p5-YBnzw3%%{X|`HosgKlsLQP9yj;#~KM8gbE_fLq`Fl}wn*{WsG?-{fzN@)lERncIoe#Hr?ZFH@< zoX^}1Ox4eCfBw-KQ7*!+!iCv#Tjhy$ZQxDIaX-ouX$=gd|m;XQ;SL( z_bO#6!R(Tl&-}pmVtvMc>b~N;XDeaar%TLSRn%tnR?doCGbLuXua6m|)M>M0 zp2XbtfuE01#=;KsVu^X3`rhVqJWRWJ6`1HBl9<2ht>+g#!&$X=v&1k*`E1FToO%7b z!Girmust)|kAKnS4$iFQ2f)<)EOIT`aNv2)%)aAbqAyNjPTT%D1C?}E+RjMv4ZC5C ze*b4&&f#u@k+v%5sNVITfgdViR&@hY?O^tOKchnpXEtAq#8~kqcb>S0Gq*KXVpYyV zwzhSg;dy(Bm9q64uD+f#uRC61=Bf`*v@7Av>`atcxufK@aq$YP%#c{su#@eR9^(vs zhs2=Y!htlzMfo&W6-W%vAiTY$ku!(4P+~U!y(3tJT}oL0qg!EaTdl*cjiaOQN! zf~jq?+dXj7v}ZYURL4oo?zv*lDP>%4_QgwK`iHFk?Y}*^oZpcJ7K;nsE>-!=*Ic=a zGy4?3BxfzJJ~Qi25#Jmz)ed%#$vSa4XV@1Dww=Pnym1kpPdM3qAPwn|pV;S!5fC-B ziE+fR5B*qjDLk-(v^p?Th*>hn4*oWdGo4;{6+hd6%jH@&T1%&KhUYuL(n4~k%)MQI z?JneMB{}RhzwY2p&Txhbelg!9J%yv&UE@(u)GjUGh8~T z_qUwo=Fq_V&JfF=(6Oo)dN$H8wV)gyR3N1NX}3mzz}S( zoGrpwKlYbr{ub;A7|f(F6MJLf`E#7PTxYiqcRVNLTwp^~#;*D8t=*g@XRHF#g_ur%{ehPk za%MEF0~2+VGON|=*SyPFj;RhzwNZX<`K$q(IPUw3OUgr>xvhy9 zafvX~FotN{wz?H(PIrdH63jnX-%)JqvKl4kE_&?8KX7M(Y-BSRfFZhIex~6$hD*Bg z=P6q;hqqLc^OmLeW&T&? ztd*GG({`?Ne(n;gs>m06kxpX1Au(SsROB4q zXo;CC%Pw1JRl=<7Cb8m#rQ2`3gEOluMq*C)^?@&6=ge)3m6*9`)Pg>4&PI6SB<8l) z516Ioi^mf$GmqoU$1Av;qdHMycF+DXdslL1_GL)S;V(bg@G@uBext-ZRfW&&%jC>w zFOZnoerRNx(widjcXPQtK1Brv|BakP0p&E%OzIrPk)!* z@ba@I)9XP@oLR{E7`o?3}Hs$=|Lf5zp^Rdo_G`_6lw`GPZtb-Tnop35(3+@r)d ztX^UX=2vcfXf0>)BN`-Tb^o{1@pm}$dk#v>>0bG0=lPr!Igf;~N2A;LIkP*Dhq1BW z-f_1QrngaI4&U6PWfp}wPD#vX?os`d5~j_3R${Dp!xP)*aJeDXba0>A2l#ARo@k|< zRoZkCD=T~c^MReXT!J}TVrJVn8RJ%QR$fjgkf>oMn4h`t?H!!CtT7UE7cKIeD>$>6 zVfLyV@vi zx!su&#>&?2drt||Ym}J7yXdlxH*)5-7l2VmNn_eHoTEhFlf$~3(+noYt?2)%Q_|l~|?ik6XR}=B(1@mso;%?GrE0;w*kdKw?(+@xnbyf9v!fJvDB=`-dO)19%i|>L1H;3 zd#}nFoVl%sBTiPQPnwU5*mp_~{bU>8)Ls8#wd0=Sa-yzO?lo7iT*CVu>ZYKGCm7?(=$3BeATk zvqvhG_9ZuGv&4*+DNh<4TrOwAc8Qfa7Ck#{sR(nQ#ImxUopzs+FS$7fCFY;H{iZ-) zF6Xu$l^C97?K52|6FKRP63a>7oPFo}Tn_h@C1&-#v;BKztbr3+QS;TZgn9moOMc*T z7E1>(EcqyH!JUrz_xz!hYusy<J*f;;f>qR$@M9;XT6+aE51a zB<6B?#;^Q9N#~e)iP;m*KD;%LGr#YE#Bjc9W64R*T%IFfs{I`7@Zp^^l`s=dNpk+F zGhWdtbsBqrB$nWq`bKR6mqULuLR(&3u4O+4uI0=-rnAKC36%}0_i$$O$4IQi-FSF* zEN8g4Br&i1vC6VOBEEQu`F)M&qc#Y+6p1l*3YB` zSZ9e%zj!pSSmEB|h73Ftsc>?3Zp7dl_~515%hycdy^w)3}^Y ze?(%I;!T&vyvmuo^4utp1r2 zW9*Z!4g>^SATgc(ht1D?&e=roDlk<)oJTaOP^l|^?`BEPSNi*ULnkh$({GoU)0TV5 zqrH^)y!#|(Pq5$MInJ5Ie^6o`+w7w`^Eitcb5vsXg#Y|Fd;n)&Ph%L%KK7l`Mmo#R zfT_0C=`-g~SH{T|WgTEiRX=x0^xI3;@-VSZ38uCaPREvh6Si{Z^T$dIXVYvNs^oRC zYq-R4rmy3Z<6O>aPn1}Rf73;8mWlYXz|?elE%R6Io5Yz;ZwFJ;iFJ+ofHKd~>8UiT z>9kolmYh`PRi)N|#QdHmS^7mvT3quaW>4snN2e~)_{HH}4yLBXx{rjhFZ5sR;LKt@0j9=hv#!nh zs*tlW?2IHg(OdD0ZyjfTI~``F=8M%ETX)ZT&g`Q*NDN256s6DN%wp{Zrj759w5=~F z@g>BD$qkPm&|3*JVYtLB&cAxh`;)U0mMF1`vU5Lg_i*MLoh31hV{P+tI4iakgt3gd zN8jblVzW!ko^T@T+?|}^*?5U%`cD+>RhZ8|U1C1p;S}39Tn=lv67$CB#xz{Xnbo^k zVwTL)@7)v4na@!pF?+()m>Id8ImGVe>=JI@cRh2T%!n4j2%lGGglk_H+^V`oz%r{#1e0RkT zcrF+-WVI~0ORlaCY~pg3{0OBg&`ko7IKMTZE?ZJ1*N$68pz^Ir_YeW^jf<kl zchAc{u(vM+mDlweHpLMj5%b~tW%so2m$IjPrX0e@;nSbm)|++DO!KxfDm8#H>lD+Vq$t(z07($*!Z> z-Kko^?tV{$#C(<=>-}GF=CU4=SkhG2^3&-e%;OT%>Bp6ixt+5V$4M|vy-gZ9a)Giw zfjLQ-+~Utyhsv(*X06?A{!0&iJ%fkoW}PL**sm{LZsx4a5hF39<=q!2C~b01{$Pn= zukux2wGukSOU&vUQQ&=?v#I@3B!=^gqqZn>r*fB3VqWJfw>^3fm%|#I#8MpdD-SC3 za7T5i#B}<*=Jsgha#p`Tj3ve-IXO#l1SDonGXLwXP&+?QVmkd3--vx(rp)CMbCw_b z=`RBhQ>R}iG0fw>DN^iUnNSzTSoc{zImV7l%$Lyf>`_HOga4$&>`u0L!Ye|Dvl1(+So3=BPn=o2ZD1|64e>j! zn`~6y2Nz)?{?kSON2Q`Viw=}gI`P)VJ?;!=B-#v7-|6``^#Z zQ|3nwSEIxd5>|LdWpKHoiZc?^=~Mkxe$M=UI^bF@OJ2)UTPD5DSwcbwi8+fL5B~d* zNJ}?~`4a9e`t%beOfS7(Mh(+H)wQir8P_=y;v~kHbJb@{xSZEHT4E00S8YdDi}*4m z#@Lz9*h;}nVQl!{mndsiZhxV~JVmYImShPzm&A1X_jiq2%$dz!9mX6v53b@Y#W7Q2 z)}#|pA1UBWr(Ym3oqm1UJW-a|Dv3cN+NQMgrqo)A87(~;*Ypr!Zj+c!UvmB;#eSHN zNo>UMD?<7D&wN zy{=*wdIg@ART5+DUm4lUII|?zhOss2z2 z?101=Tlw9I30y8ScjEoZ~n=>y}GIVJWFqBmE| zr%peAx?zhVXX-35yVLZEvxYN_fh30a0WAsqDcE3%* z`7aW?-}l|30S|IHug54cv}cEgD*Xz^OA_nKR<=8#><_{HDKIt9QuOcM*-M#Q;JtDZ z!@0dHfB1{X*NV*vV>d1QTj|4DfbKl1VPbAtc!|>A;@P|~_VdZ>x`=$)F0uQ48^5{d zO`%@{m}&>ctatcV2)RRGU2(zZsa@H!AtN~25AI@N&w_})K$HUlDhj;4*I~x|}8<+cM2-XI(A+3!X zrd_j1uxK!CUXMR^(j!<*7(4mRsGkLk3kx%E!-i3UjSgc^ZFr?vu#7O4{-l0~V5TsZ z{QcBa!EhMAq=WqtdV>aUcU@uZvY)b*@r%h202_?oCB_&NpJmA=k|Brt#Y5}BQt+AB zMpkJF0?sneg3XH}mY5h!paNUrZ9_AWs*6budt-Lsxw_e}IPM_a3V#d0C}EuCr#?5M zbU0@?Pe77mY+}EKS8`^`TnE-ZB!{`$Zzmq-%#c?Hc1eikj^7h=sZv*T`rQ)Cu}oSk z_G{?$4Pcjs`R&198aW%sswI}4 zdVcCJKF)Od>0qkeE#t z5ARmo(d)dBtC85))OR;nk8zfhvQA=_%sCI=5Ns!@4An|3HE-`1rBk$2Uj}agTeOnlRWsIrjjVw#_=(IA3Y6jfNv( ztm`-XdUCmR%Ly>GU7BRM>AA<(aHi9r1k={((p68b#ox|yIowYLqlzQs7G9kF5@!Zu92f;6*aHvltLH2;*$CE4!w$p`rAz3Z zZ77%I@GjD%$CWjKNyY_|9GA-{X|W_ve!TGs zMK1FUSoaXq>0kMT-m*(!V!EEe-z&@I=sB!g>8D`16NZDu;4^2brkf`1n#oxzGl2~V zv8>G49gi*K4CmW`Y2!OIc92r8vvZe&QNt(Vd%2+G1umCmsRdKZr%vDho{uUxyJ`4l zu(lz&9815cX(^oP^xLE`EynHxe%m3~J}@<3GIIANDqv>EYDB*TDrF?(=d68%NwP2KJh2>tG{GDibE&ITza}woc`_uFWm|%S{9+Bi2 zd-8=o2NafZ228EDn78IvEaD9F@Nrr@ zIxviBhcZvu;_OGh;tcz8^3{1qHom;>mSv&7suYYGJ_?gqZtre;g`6Ku)CXdp7H@J3 zHWRE9E`;1ej>Sq^@O&efNGHivw13Gi= zF`_pR^?@4IEB60)F=yjb3&2GEBUZC}tkU*mu|kOznED=@?&ETpZ-#|gwPeIkoRwCT zg9+USvy$R(UOL@c$kAc{)TvQA=QGpzLFeyK>Vv=HC>YED7Kd%qHrM!Pe~%S%Cp7Uz z;mf)6TZi)Oq$WOMzb;YdW9PuAa!_7VyZHFrcQfEI`aF0%_C&%L?Dw1V-W1FZHcZ3D zU$ehTu;pM08n%At#dH}A^AOm@3L~YDEfddS;{FPls1L+O4{$sHFDQ2o>;`!`>PyW#NR zQG%Jlgzm(?XN%VgRtnY?7nBxawsYTZ5G(*j-w8H$z&kezHU~_UdHPL_Wz}rKmV=3U zODw+s8&d_V10#D=n54^?=V)gO*O{dRX*y-FZ zE;nT8St-79t19Oyp?6`cI(U3)d`>sriC5!uRj6{z77O;z@%ij2V8Q$h>NivqpUqn! z$5;MUyGQ5qbb1}7V3*>8YzzG~dFD1(OYwO<89TrHip!bH7EAF}In{Jp&9zc|ewP}b z%d=gI&!dU2+T0+;=X0p>VO>KL-)<2Ze5&tfHSz7ndl=O+;Z4#_R?CDemu!g!6ZyHD zAa_`ltc}ym(r4BGJy%(*0VgLYTKbB>|nyS^~{(oL|d_ZV>y^e zOFhz}mL;rZX~Lwssp^NbEH!e(R2?wq3X@aqfc1DVVRw=fj`H&en9x0(oeYaln@-(r zstzQlwO>E5roxPGhGl_?Ivt)CQ#0|Eg9$s3oL2WhGx0436E+HuuO=)^)wZ}d2lmhT ziTglc!9E9LhF94HgPPa5Y@ftT=_7ITB0D)X3%4YS;=09BlIuS~1G&^sELA+k&=74HNsn zG;9|$<*8v}oPn8cEW)5M*kY8k?$P?*JWNAgoW$}>DoZdIfN|Xu69=#|XQA`WU|GYN z9hPbh+l%)ks%gnHESH!mUuD?Ou8FUn<)qZzI#=mCvMk3XW=!2b^7hRpm}-46Bp(Td8JAeka>uFVrQC5g#1a#)#XB%Jr=0tZr^RaSR;cPX5a$n$y6KC# zoH>i)H7t>pIMsAQHw~MOHC>e@8>%IiV^QP7TusB4GHsp>yJ5SAB{Pp#&Chb@5e-Xa zZtLWS-n|6kD4*zWHH-?1Hok5cd5AKIp&=Wf&vwCsoZp!UCTu$h@3~atW2{iaGVyyY z3uqXI_Dt2?ZKIQaMVQwhKa1Y)u#d+#wY*-#`m>l~Z90#GeUBd|#<0ZpB%nCb??92# zSN+5LmX0^g0%yRKxkWuPE1(VYtjq*Lz9bvYHOboP8AeEIm`P)WU@L^*Mq+Y&I++PE z#D_B742y1tb(Yw&hee>R*syoHNo-EAOcSSc_K=vI&KQ}AAcN`b*9?noh7E3#HTI5^ z*sGfQUiBGpwK)MzaF73~IxyIZ-IFjq3y@yW1ru+r3m~LM&)^S2L`d!D@C}ieAUrJzU`^>a z7OV*yF|#ChU6lwGX$iQ%H2D(HFg6XW8@@;k=2^a`4`=MLrsE5&1JmTE6y{DaYK(Z8 zA~vqyAz3a2DbK!_?Dx8jz z-P<{{x)x|y9OnHGH(VTSms?}6T@4tI&shHqOU))3a;@2<$+cjy_)PI_h5zoa$LDgU z(;ozDRM<9_XUH0L85OPIeVpwuRIq(PTDIW5x$9^C_MBkH!9+S2V{ZCY%&udcnM)eM z5^+KC4L~dW`;C?N2)WqSs$4q0ROPI$!Ggub)sJ9ho}N$hGc8&(zco%`#m>KHe;Dj{ z@HI=se_X$~`W%W#am32;Ux3nsv>0)H*MQnJgj-{;%BhQRKMsGy@a}}1f$MwKb7n1z z#-K&$hx3#DsvRoqodrWWlbEaGgWsNfh|AfgbOW;^PqDTJR_vTL@5HZ4n6Bxln87fE za!xmWPp&m{_yb^MXfEfrj)=4T#o3Tjde@ss%Z;%6?DTeM;kbpM@29!kPw~A91j_*HjSH+b2g7XD`qyEcb!4RyOE91Je;QmnY|ZjA=YVxnYe8;|zOoz^+vo<;(4LyJ*QdsKZIHff{Bw-z7M2CjIDL zFnu)a>mJp#q!*MM4K_%_3=_Y!3Kjr^X;~m9x*o+ixe2 zG3N594ClLrKvI zvmeof+4KL{I}-r8sw(eS5)vS+vhTDIWN)&u7)1#rKxB&~ph!bg-Cdn7(%scmRi`_k z7!+~A6#;R_6=y~w;=Ut}yW_&RG9QY|I6C5rjE?%j_y4{3PSxp`SMR;5B97z7gPZDl z|GS>^Kj)r%-%_$2JLVK7*Zm)dJxSM~o7l>8?-yq6earxTGQOX=acNNZV#Mg|W$6@$gJHQqQ!yb_Jb%pcJ_t+_}TyUWy0yU?u zJyRIJXHGwFwnF-(&Rh1Ef0-9zuP&T%uEBE(W5q8#KAih$Z>4?*q={+GEX>CDGz0WW zo%ahf9j%>#Ri=LC%JDuAn?*1x}z* zu4ltSVH#dg=Tqe)o8|h-yr)sJ-TJUBPIajq`cxkGSnPUGBN>Pwh! zo5s2Ol_xwmw{h+=&Ar>rre?iUA!>uq&lFBMo^x~5hwU|E?4p&!+*#Yr+J4sj;J=$^ z{bANwvscePfA*T$x6gjx?2pXeV@_qx#yQ`abK*8PZ1bCKR?dCf+(+j2&->WC{kGk> z?LFHbx83#I{bIY*w|~d>^X8At|IGYDci6DQmv%UE$LH_((j9-gT6ECTgHAkX*+H*4=vN2LJ@}G? zKXmZkJ=LDC^&I>7mp%SJAHV95+YXt1=+L2`KJ<_U&s}iuf~Ow#=EEL2tp5pLdBQP= zzw+>h4u94WA3S2WBd<8}TSuO7)a#D=^HG-^edp0TA2V{ySC2XB*kg|EJ@&?9e{<{w zy`|pI^?sxGzTRcWtvv26$K8J19ml=zxDOon;p0Ab+`bFz3!l62#S4G3@Rti$EPCsr zIg58#yz}DA7k_H;kxO2_hD?lkK?6)~Spwy?o`wIQ~@1nvb!MBU`cTx9@T`Xjc%J-}6_DYxPw!Jll3k!q# zyhLaFg8a|aUzduxYm~njoV!#xF44J5f>x+yNZ&3E@{yPN`F^Qpboz6#<^fXpAAil( z7-k3mHAi-dTHRaiJS(V``Y#K5L45=ItEhCbHr*}@{u|T3L;6-yj~LyMaMFOr+^0H* z^)D^(SyHTC)N@xms)il(eaAqW^kI%#xmf4s>)-9w{-w&dozC{DmdjOcFP*=%aGlD9 z$CLDNRrL2~-QWN1{$488Sf0z>-*1TizDJ)s%ihjWxf1BO8YXI>9|y%Z&v!T(g6xOFHw4f(tS$%%c1uvy;kYFN_)!b ztW~;6>03&>Yo)qY=|-h*Deb;Pq40F2mn+?^G)F<=X-d~AeO7531(_?9Uas^NrJZ-y zea=d+Q2M6QK3Z#BqI84Oca?V1+;N7|bxOgLP+C(gSGq>&ZlyW$J5N#Cr1WW}S&ETQ zR=Qg0!%BZtI$o1+Rq4G-zf$T|95$}BS?SkGy^6iYl{PE=T4~|lT0bhiP3h-KM=OxO zTq1zKgLcPjmd(h&#h zUQ4C7DE(0BXe~a*m2Ox1wbF4~a7-xOsq{OgB|Ta*E8U^=OQqh&>)CFlJC%N|L|k%( z()*SEOKI_;y5Cpn{YnohEm@%PE4^3gL8Zlq>ATVgmHta<*%S0EhSDdL9#MMA;f2Br zmA;^~`w`-h()CK;Qrh!K{bs4sE0n&jwB1pK!b+u=DSbt0=cC0*rB^9^L20{Vbg!|} zOO@_X+U;23N-t6R7p0wh^*b|4*DHNRX_w=~AEld=zNxh5Ld|zduT%Q2(!Ptdrd7IG z=^mxs7Z(Z_DBY;^HKqAWbUjw-g-Tyi+IDH7pqsx7S1Wx&=@F%qkC$yJeO&2br6-+G zC~Q>vq|%?1PCilhzAIf-5U2FH%}M&r9;Fv3eNpLQrKdcxP)?Q@p&uJj6} zyOely-jQeP-N8z)SNf*X_UGvN38jkCdzBtkI{sX>sq|WiQCZ+Ev?Xy~Z zQ@Td!BTBzhI{fMKi%K^seM0HCN=KY8`6|6Y>0L_SRQjXRfon8Qr7M;0RQkEnD*Zrd+l$0&r434(m42!OS9X3@$dSeR+*W+x4LUE>=e7F0UFjbE z%{`-Ww=pQ$|PAH7%fH*&Z^pC44RF~S4%z&(ZVfiW{)MW-;SxMXCvX|PpmTmj6TR<#sr-Tx`bE#^h^Nuf(TnwY zrxLt}KiCW0!Cufgc8hMYO>7c-#18LO8E=Q!7W{;la2{Ji|8UIg2>xJ8a2)Pp3vd_C z!ejVKf8jVh#c$w0uswVMy2XxqrDyC6-DBGi=@Y*JkMRZQ9-Bk|*c|o@C*eIl0Xg7f z%ol9mFL@~+Hjiz=OKf+w>cy8~W(=R(ihDKPr7q z>EY<_V=hyipk(dALu+%B&gW_O4&`grcA75lRXOyD43QstMSfnl$Pe8jKl8JHP5q)< z^y+nrKC!7h`rM%y+Alig2?ZM~<21j}-{O2+kDhzT75RBPd8O(xTS2Z~PVfvqdwan4 zTG<5lK;N+i{0}yQeP9pR2=?)D;n;>Bli7)l4I42TBD1(0lVoUI@^%47ks&?+jv8OR zFMzlB1Mds++75P-##Qfk*!4BviO%N4Dl4(S2UInl3$;KcoIImm!ByP{IkKh!XfOBvNdw_f9bKsW6Wu9BcDdUiF&G^F{jZgJ_!LPy@ z&o}ZRYb)>bdw$&_Ip&R#TKOr)9G@3F?>y(cpF$VN9i1U}WR2dCwU3jKx5Y|He#-OC z>jnKIEA(LciQ70fg#6;Z32tG}X}U3;n9dlF=?(0Yk}Yx7kMxN?<_*o%8+wS($Ml!^ zn6^zX^xx0PL3|}HA@f$YZ}LaJ*bwsddO+5u3*^06eM8PkbF`0L^VmMT^Lj82#&v+b znmyPYjLw)B(FgYW4E4+NE{{HZ9D7xQ%v<>;`h#y`eMEndulW!9;`@;$cVv$2z0A=8 zGDr6KE#!{Oy^r<0@09ai&TrHB{al>H^(2{QaoKdreV9qUC5y)Cme#2QWb1!e~%F7%+TkPxQ9`{S|{};+j9;?Ir`)ZAq_{p#3yuRQs+%^A%J;Zfn z`ok8Go#_jX;&06Nz*X}-=nDHV-l9XZ19Zn)+1m^AIW}W!XPa-$H=!?YALftZ_7Low z$!?N-KmHT{kFB5=o1?w|!Iz^We5&cme75)3@ip)sr7h)#ylBU-nM^*$X_Nof6o_V?=&%EJ=2r+i(OK!VmZgA3WFbHJ7(8F z1AE3t;2)TGh2C;0}ObFsBNege+n7qEBymBravej>>)$9;0# zA7jgDKG?sjmsnIL%Z@uM_%5H4S8D}3a=lnYaD?r zHForX4wy%?;t_O!Jkg7v*N``Jo5>t`TkK-<7IHV4cPnq?L|p874#!{Ffy~>HH*uz4 zng4RIoS{qWPOoOzFA)=IX1-t5M&vws`sHGD=N#%FY#0`0BaYgUUVCVTXOUgEwc?q|^H-7B_STf%?tC&(MqTo~y9**;o!U^}%>@PmA^s0X5dh_Qt=fiViE&O;p{xI(xgTGAkgEp^t+iPb&@wR4j_B$m{ z`iFkdJ#pU`b&fSMa*ppoCdnGz6Q{@JZ1RuKHD2Dx8F`zm&6jMgeaGKwY_?9rr@(Dw zh~2?E_6PFrMZ#H&r!E8ajb*=p`$zG#R9g zKZ$#J?ASOI=T^J2T>f_?%dK(mS6+K#jo|nC$0S$w3;ljS@r>so>&aIspUro1KWFx4 zegxiOoALEKcFOvPwIln6t#}7_ZH|M##N_5z%ogKwj`>4;q4~j9J`g{V*GGj4qm|{<|}v-=SR}Mi`SQ3|FM{0Zh7nNC1MX*KHB=96dM@l z+ldk2Q`|Pv;;~MBcq_ir*H(OmtH(;-=0}hX_L{c8j|`Cw`i}b(=I>T}fpEyUN!;qW zf{aYI##?-zao6(}zQ9}K3-Kedf!Q$f^VeN$Jp<>A+sNO?wsBtDwHCO|dIle9`{4LV z^C!ewt;Xx)l?xIB+C24W z%avzzcpd|;+VdEB_du|%d$y8{(KCL;)@JN6wX!|@2==#GpO41c#Ga9f%bI7Se9WHSMjxV*_#SZ=zgr zeb|1xpPz|WEtWveK9)DGB*hW!aKt#UwfR2%H^6t}xsCa+&2{(!zl<;DU%YQ=^?XAT zFK&&=)a)UCk5bwird2$TJ(wTCKbk#Y3rW7jWcvm63Hc&h)?$pcll4np|6*&GtaS@= z-`X61Af^w$7o4VpcI-8;9{v_M?yobn;+bDJ?zuj+kGTK${vJOFx46zgyl3~~CC&H9 z%6PO{f5Tmy1K=?CJmbI3_s8diR&y4d#+Ln>oLC^f7Q?T%^L()P_ukjT4|vX6+~0GU zcVFg7k}ERB28ffGXPHaQW|1kr!{kc8{kl9!wkB84N0TkwL$>B8^2+yK^)J3gW4|~_ z&e+qVu|_v;<&n4NGyP(mKJJXm(Q}ixm$DN45!zR={k+; z=&)VBcfxhAw>-XNYx)t->vnzK`y}hQ-)pC@=;E(&4I$4u(sRXP!&Wxy?X{JywtFq$ zUdht-qVmcVyRx-IEBnMY@mJVTnxFH&JjqtgpXZ%-;&V=``NsRnPUW36|F*-!Iip+N zCyZ>9{26|Uc^G*o$tlf8;gh|b&1bQmHThcn!?jV989q2|eqle!WQU$@&x5(e=4#Jb zd+&>J*W$%)VxV^Uew1YXX!Cuo>a;a8dkJ~@j?9vDX*&5^se@ z77zS#E6CpD{`c%>kZqDr@Nv1HPh0tdea6D;c;5c8No*g#!d#Ts{^2GuOYbRR>}S4! z^$yoh;IR1v);s18@NeEHm@kO?0Q_B6T);b|j9cy6w9Q{hv8Bb8j1eEzN}hflxm>a( z_6zPckvy>v{3kL^TKf=hr^SSSjd(E0W|QQ}{PAe5d$3dHoirbrF5byWp(#NZm z^2Rhte8`Fu;YZpyunoqtS)Z-0`Ct$53ma(_FZwkJc4jdSb2I$$$^IjWcEwf-e-21fo z(0B=llb#_(-pCSu;``(GnY8kGaFIUS9CEk*hUah`-*2%C9EBJ7K)4ZK=R6vFv~btt zi7exDNZx%~bb)`NKF@VqFSAy@Q1Z>A7usZOeqMR5%AzCQy@RaLk=csb33HD3Ro=HS z&#ng9W`MCOOvb#-kHTikjrRnMK+0U5Vy-k=-;_{Bqr*Pl+9^Y&J`c{NG)JMl+w9$PSOr>%8YtDl|R7exK`yn=5BTeErkkCJbm z`a9jDWt{l1UX1}+Vn6t5yQcu%vzLJ^u_I!UPUF3_n29*jV(YB+4EoHorm;QoxQ^i! zI`;ZD`6Ks(E1?fVHuTHnZ}wtq7yO0s!t4uwhA*QHyZ^-7T-?@pt_Yur%`pe?&O&s- zT!TLBIzKuw8$>7Q%=nEDZspgoSATCHbC92Z&^Pms>6`fneS4qj^@1$nEO86ZnlSgE z54ha!nv?m4ImY4z`}BG_Q@TJ8$l7#dGDlY?Z)DB9gWQ=%O=qSn(~s8$`b5^mDaaZb z$Ms_}MnA+vJ_bM!rjxi|YmS! z@$!bZ@Pj!K*~jILtS`~{Ehfn$-&WiS`%^$Vn z6Y=xLF`FaI&i!10tZaVpwr}$k^1@c}uSs@_9Eqif9eL&{X|6&S_+IqY?mE`bPw?67 z3O!S=^%LFNc#&m%UfpXVc}+*m>E{WXBUk@GZuk-U{b=~PJU$LC zCHb{>;~H;Ua5POGtz^LXpCY-pJAQmToHrkjzi;J>h%fy7h;EPp`aurpC~2-V&bMPz zUM9vvcn25r%#~R&igC~E)Z62zBA!H!TPv1iua@UtTj@VO z|1kG-Gw+~ld@lM%x8_69H~L7@bEo?CvcEBsy~!ONAbWJ)O75Rj8Dx)tME-f!)^OMR z=6GysoW%zr`@g2#kvX#eYs&pUI*@z2GDqIXeY296H-3XXJ7kW$@#EOq{||EC^@`Bf zw8QshD$}m)|9|E?F$%t#>lk*g4(k|v8Gg*q*VtTquV_f}UU&AEze&S9ZSx1*X3h%M zONx(qri%HB-yX6!Ij&=i@p#V4ugB08a|*E@wnD6jjbI=6IP3!-w~z8z42Z2H#a8~e ziM-9(b6D)}*l!j2=i=BS;PucGg-e(<1zn>eVT1r9M=u+Ke&~3@ptEAGIX&+EnQbjGw}Wlyc=D=SaokryZd|d zaUaOg#SeteKeGk-v=l=fSr#BS_~5P$gJ7M)O=#1Z@^;_LJ`Tq6cc zTAva(ux2MdAg*DKX1|4afcRmZ5-|wzA#nn~vB+-~a^E-chy7+Ku?g`Pzwt;MLd?ec z(0&t?*pK*zeH(sH(c%hX2;wClJJ@f6TKs^|wCl6XJG{e;-+;91Uj8>fi8+aXh?`eS zrmgby3frt?c^}f>PtuR+#`I#bzs3D|bdjV7 z)(gbA$T>+Lri&yUbRvI~A+j^M+3%wML~`JFNa+*5U24Bm%04vxBaTI{{KlyL<}1Hv z3Qzd`&^VWTTYenYE}TM7#w+6xZ5U_fPvz&0=^q>OF}LX`4;SFU{DCG1xG&7xsqp}A z!3E@kouYs2!tBv>gI(Gh%@jNhGd;XUe~?~mClwrYMTYc4ZeG&?jK^z#|} z{a*K`oA~^M9?*f!Q}<}R+;hWqYjnZh2=Sx+PH`R{yiId?+|E4*e9X|wCnd?9al`p6 z+1pqxwlF?0R^~ItYj*i>P9G+JKM!DM*h-e2#pO*rgB;**To&Hv;qM*|ndg}Y7&l{y z=S9}=5T0`%)I<7gHGjZ=;w$vPKAyLgq&R~Z!^ao%rkgPzzRz@HafY9l@4YOHe@!oT z4I!?dJoeyi0e_aH6N@*9tIZzF7UFgQ$MV<$ob$dIS(`sb-o(Dh8@VD=a4fEOlPxwG*ExE|H=CZlPh@U1 ze@HBEu|0By&&+AqDDz`08#Q^G-q8W$ME;Bu`Lnh`_UHlqql-LpkIVU4(nC>eDdIKw z&AQ5B68eg)lWfq&+{*53+dr{Qmz@_U4D-xnFz3cenxHu{rb0$ey)0oHwo*PmCjZVwUen2h8X2#`tQnt=VZO zz8X8i-^OE?Ec>*5gt(1jpYRzQ#fNwsO^RLcbFJbRZ;yYC_;L2e$KpqPr0E`x!zs88 zubBsu=4?35S_Y28r6f+^FW`jdL$Blw|Kjn2=L3G#&ymc-o)@j=No)}wVu$cBzK`Me z#FFd~8)i;p?qKhP*bTql&RU`!UvBG1<}Zs=+VS(~pqsh%nbHNei;fMwbZO)CyXxOdo5#THRKEZ1B-E7!w+U8mFu}S_E zUy2{KxIW3B#(gQi4u6HO!+*kE)*5h^wTA7NdSB}OsP)IoJE?ET+c*SG1qm7dX?&1pPuh5SwS#sOsJvV+3wuLm7VENpWIqJoV=-?ly&!*dgAV+f z30pE-G#f-8_ejQmPof?E)0XKW>3RZkM~29KjpS~;@SHF`phxT!JzC7e{9fu%>U$(KeFH0f$UB0jNxxZ?r;e^ z$g%-=gAKr$zXkcf`7!y=xL%ON|M%+pD}IrCEwMp#$Gw*3Bl#_YxS!-6O!JleK7sd_ z_%ZIuG{1>W!5iijVjAp-xrDy7@};fjxX((T_zV0QHt78+zLa}ZvFCl{&(f|rX8BHg zj~_N{bCLN=d?oXupS$e03B0|wn!E6MN%I%Bo~J{?9$>|i=*&8*nQSKj$ZIV%;)Xu@jU*V7W+bQhPc%4Z?LC9jJ}$>^+`-kOb++& zRNL4TF@WuhcKaNDQhm18$L^S;xxWw_J65tzduEF9ux3D4=qEm|XR177L+*|JQOT11 z2=-^WpBetZPy7&jv8I2od-M)(kiW^>-d6+<(4WbleQDN4_BP57tbo&vfqfiydQQ+&>Ht?fELR8+7jXa?m|`M#rXK zXZQv7I9T7A%uUvBQ2u*Vr|m~0?<85rZ71yzstLYm( zBTxJW@-%(p_wXC|R`_Bz=Jk#)&BovuynBoGfw5h$fB0ZFXMVPo?$P&rm48q&!LRa8 zF>hP8Mo+UZIN|kByOVna%n{&JXD`KF8bq zki|nkzvEZ&_xOjnf5#Uj`3mf6u@e3v$=@gW2=fniEymBm?dV~>^sqH`;N|aS->uxe z?PvL7Vup6*8jowxji1Nkx=qsS&5~_eyZCt@qnS?QZKF^4ip-ef;cBaS9?lY9;UnON zx4A4m2i%R~D*U;(Iq&O}{5<|RN!Lj}EX|%wuX+8sjqmO@eR(@R96!=+EQ3D&7UP(_ z{Chz1#n1T|)BHR36^}9T@vZzj^F8q|ejc6?*JBGl?#RPEvkC0M;!X3}%&+kI(cmO{ zV;<)kdxM{fBk%|K0q=kC<-`d|{s4Pq4#1ZX8>ab&EPIQOYwxRPu2tx>kEzmZj(HJ1 z*x0`#by){YUQcaUy^Aui<;z`10}&4kdBU_-4;1nIC9(O=Ihs(qYR}ewe%*)PME3YWM$l#a z`Q0z69@{^G_t+M3c-k|(es2&C*#7@-RoC4bKQe|#?9HPG)~?9;5_Fwj=&;{#%FI(hc`#XC*ccxFzyUw>gA-~UqypWO2 z-)2W}2X0_5$Sm+vXNPh%KZTBM9qBpDdNMv==e4JJ{9y4f@fWcKT=6!AZq1jYE5Fy~ z$7#B-@!7afmMq~3WA(m}G4QTvctYQYm2b6VfsL@AfxPgQaLx8MZc-j(#aap7(KmdI z#lYT1%!dRvs+tx!Aj@(M!@g1e@@46Z=HoSEEDXBkTj)fP-;8 z+WHuKVxEFi@D-oliih5Ro7_JkS($u)q`#>rkVQ-mjL*h~T$5re)4%yu@*5w~Nhf~w z66uch8v6G#^6?{bCblwJ#OF2S;m4E|Pny1w5prCoGV#4wWE1CYoUiZ=9>?c2=Cd^0 zgU|5T_{e@Ma)!I+6X3q*dgEue-nhZ}j&O&uik(aDOvie21T-kiGE~Ui*Fg zYgN|fwLE-<5ARVK?BNn|mHF&D`p%gAe4fN%;z#BrerGPuW#mAdwppLd{mh{@_nD5{ z^(mg0KK_8C*qQkg?@PQN@!a&j1HZxV`uRAcU0eRMWEPh}*4`tsx3vQDZZ)5wA9Rv7 ze$TrkIhf4jcAF*>_<&5{nAzgi@S9I~e#k+_NL$FlkH`AXJhjHynt{mtetljat9o@JL7C&pt$AA>)dw)bYI zlUBO(KFY=(_fMZuJ;d!v<4zm1*$49k?dKUkJd4W!{a}xq^+}A0&x+e5dPir(Iq1yd z?pD`cjE8wSX#9)EkxBD_%>hYR+8pr<$+?vdlH~u`91;40_#A;PB1hZPvArDl!+eRo z@y--@WWEIM;5Xoo?dPzr*!|kj$KrQvPOxWCkBio_%ajM+!YSLsfy2yk%z>;?SO?*= zN0it0ZqQ$R@8)H~;V^cU^jr-4udGSmr+l`D12>4#c>k}D$?$)EzlK~XMBlsC5Xx`n8YO_Z^po*N@<`=lFT* z+Z!&?JrR08pyxR63$*tN@~%OA58Rkk{-pccdCwrcY?uGc3)sBHamWOn*uCcXP;`+b zBXoss&@plf<_XycF%3F3pJo0Ey>boBRdZrbnAgOnxRaFUNOD z-pDVnUHNMQ_zLue--5r`5&AU_o8N+`=mp>0ilgw8xYG2*K3@`7?Y>p(H@d(s(1F>( zy>LKsVcf`>y5T!IKqvH>{=x_U{z>>`vZG#nzSRu}to}T9LHnjh9}{@rKj(#Ee2gAV zb|$m9PED6ycUd}Pd`a;Dejb@1gSfvpf0X2l%n!j+bV^)eI>mqI@rA@7=66<0#`brT z9+5wCH=XzxEy>=@Cmkudn(UE5D;t6b=n45-EXH20#bb=m`ywxU#@kB%`1K?|V=|B1 zkogwR0sM;D5pp-Zw2F1m3AU9d2J_=Ezlr?Mlic9@^Yw`jeMo=%_yPWZSQyvi@nyf# z-wR$Oc`5nvzD(cQ-}tmX{aF87-{IS$7i&LX=@un)YU9S&!~aj}Jhp4&M<@7y^IzCL za=>rFKWx}^`8$<8{3W4nxAHak8D#2x%-Je)wbFZ)eyU`=-0yn*R)!LO=lS{!_B0}1 z!VlBkhlH75KzGJZ`0nRT^axLx1KwmBGzFFxZB^!qy13X|1aDaZt`)7T#H4pc4 z(65Ko4)$jHPV#jJzbxz{V@dLP#@D1d-g6NCp)=3FxUYkId1A1*-!q?=$KM%`;LROs z&wQErw!vk6L!}L+(aJ=r+PAJ;ADJBJtLp1uakPA8X<%~QaCy3~JU%!&IaKPKsFnsR zV-w}k(opY6Ay?7CT5V{3-^Ap=Xn9ce)JxUj;$W$FaAG1~`LWuDK{`|_)=FD+tbc5* zcVaMSPiob{zM;|4;zT)r>y#;tuPcw2`m3dp(V<#GVl?SVpT4lK2BQ@6grpn_(m8n|ah7)@i z6&tkB+0t+=z4(T5ZL&DpQ>#x7l`B1q7WXdflVXinQ)6S|Mpfeul-WTa#>Q$JYxUAt z#}!P}Mkb1b>lde2kUos@e8Whur1of3QlD8#wuz64LSvPoz6ND;T2)9Sd4;jcc;8@k zup9A(8tgAstCcF=p%o3%o(oku*n{friDKW*LR3`?RD5~A`VrD0@`5%%%^Fyt#G+ozcdgJN6FV;4WXIMgd z1>?1H$L-4-kC*CG>%$82jy#$Qiq*l9`o@V;hBr^?eQl%^PO_bP@~Lr?U7LLmXXs!a z?6mFifh7w&lH1_ekVOccwjE7Ci_#UJ?)#>P2-(s+Pm1O$#qv-F?bBPYjTEb0MG>{i zU_{#vyoPvRo2XQx5wyu2Vy^CZKT)lX)H~u%r8Za@A1<%UTiCq)ShWXQ?rr8K^$7q1n&BK$OKnR@5VOYeh|)oN*caATt< zd5LQwS7oeUaa*aYacn4dtA}CD*j;sDtXLoEhKq_F`*Ij?1|3vMtzL}GxHGGw6aDpS zv0Se~jBIr_%z3h2?#y{b6JKL>9a&TxO^;M6x#I=vZ?rCE+1croCzmY~$m{o5jQbsk zXb+(?HI*x4#qn~m3DK&8l&O-rW^Aw;?SizbAf0T3!=sgA7tUi^n>1QX}K=F`iMmdBzA zwKHcMG@q`(^bTxn1}NFoH@gXTayzB$z+iRbM24xS_nDX|2xrRUqxoWy88#b6nB6XG zC&$;1PvxHDXG}9!gj!EmTMBI%z|d&M8Y!jxWOY;%Y{$*ZY;&kErTx(7O?1EMg;<&%?9PV{w%`56%6z;QnND8j zMJ3DQ{R5NrdSyIgYb1sE>n6)cJ>7Mri>^Fgu9t(Wz}5cIaxGY?vY41M7&(FQ(F|FnkA--}J0_>v}<2|J|NPEA6Ef zFOPQ{%xLggb3jT5xG0^q=ao`iov&&GGo3%_27vY$Kzbc1eP9T+a_8%b+C)j=5N@EW zc_buZ$D`1dlK$G{M8+^OM9E%zxxTSOM}RGE$k1hq9-JJz9!Yltnb8wzw!5{SyzB7P zP`*gtt|IW+)g^mBgvs$PV_u^Dau6kE2N^bk=$^t(w|R!DW%-6+6zL|B&gjT6+Y`Px z+TXnD)PYyl?n;I$NHc?>4gI-CpHh#kv0Jt4Li9k}*WbhV(qjA0<*>d~9WRYK24r(D z+^7gv7+vX)V5nZ}>N1urX0$xe4R!PE@}-l%Hl-MUygu9;ZFF|PWL+RAPS&HjwJik< zN)7!=-H2ekG?g|LrH?*b7nHlX6gb%J{(7mai}!SQmjaR0+slpp=s{y2|a7>pJD$y21$2P!2JKYQ;yfzlr zkhc@je8m=uZouo$dgLoz3d57*y2@G^FXp_z!Pe}R+E6KqF*@vbmlrdpXZE}^4isye zcXMB2w6O>Kuw6eUR2*Gb(RG!PE;jV1$4Xq?cl43DvOMZ?nZI#EG3z33%9L9k%ZSm^ zWjDRPv~h5xlywO6cBKy_&ttL~HO!npvx&fc*Ah&)Q^-x% zr!DKdK%S@8chd2Tmt4K5Z~4T;iekOkcQ#j-`qq}lCi+Il*I%{t_!Cz?amnc`k6nDi zl10ZZJ#EDkk6pfa;i6-YU$T7R!bOW0o^;wtr#`2*J{DBi?8X_Z)}ER45V}1HKI75! zUPYmWVbOVr$M&?5R^$Qi=7Y+bW(GzlOZ1?gI%Cu16!nCP3fE%-LN;jRX@S4!7j7+(pm-?C#GfCYFh^F*DW+4lrtMERnv{jj=F zV$#@9c|#!8p`n4I9y(+l)W&c^_a80=!1OeC8#PHVW3ZxPH=dfRPnXH@6tuXlJ-Q zAZPCxm!Qm%zF-TujcUiW6t8JYZJ*0CFPOB^Wb<-I8--*x;a#+Cl!^K1To$T!?78hW zT55(RZ4`2`oDqIM?q5{aRK|nEFfIgBw_X%u4G%A;0U33 zctu`a8PJ8TYFSs6rcXMdTBH0fzntfd<$2^ZL}lx+C!6Vl(PGF+bPoUKAnt9-3%Z3Xs1Ql?3I=A_U9Si za@A0{7Lmpyw;YT}%O!gCr~^_+QQq)7sKLJ;tFu1%H&b<1gMTemsF~KXVvEt9fe-WM zn{ld@8T#lzQvSVHosHAKKB|qr^TwZ%29rAIxqsn_>uZX4A%Z;5VMxmK0Y16(b$MDE#d@V3kwY>b85*eQ94 zJ;K-0q-1K`v=-*c<=>_%QztC#guq;_<_5LkRU2(IIHCZlgJN2IaGAt6*IMz-d#Bpy zm~^0*U+7A3&NiCQA*QILaebs^9*aN2H*aKR3)f)L>j+zB9_h39Xtc~?%_{oRYXMtk z3!>ietr#hJf=U`bA|LM>?+*y;%~i;~j;v*GqJilndN!$L&XK<6jVdiOMb$O$XUxiJ z&z5H88w}q*keN*#X!Cl4v=JCtxG&#OOMrO?GVcHRPC}j;L;XtwS4?hYoyDKA8vl z+9(*wkULe|DHU#tl-g}A-0;sS27A6S>{n}X@d#m79v)NTLBFhgqKV!}!t;DtIj8Nh zy{wGxri!er_9$FtzBcO&o-oU-R3eIQM99h--guBHB2~zPeOa~TFikc}r?r2m8=UfN zlOjjnLY38W^k&MI*%X>ZZ;wpL(ztD^WuC~a!`A|4<%(Y4mzhmNq~**pX5<>_3;J)? z-`dKMX&$>^nVp+&y4aFA0PVY!rZaOjZ~e)XTy%#|%X}k!A#ocnv9(b240rhad&|lq z-P>d8E%S|O=diE5~jJU*G)#b)-P?xlHi*GeOj*66y70@~(|-m%b>9NBNMQtby1W$sdDR(5? za@M^iX}Nrd#rr`$#E_y}pL=4dZpRzr0!>N*;tk#H*VjKhQD?eN%gdUi&YmN8cea$U z)u_eQbb4*-T41MXwT<-YJ+``bv8CwUUaIsykmKS-Jv&k!8we$s)+HOD0`GcdNH5sU zA>OGBVOX8hb>1tKQel%c{lRsqlEjdwv#Pk5R_{=y)~BRP25GrQ`l|Io98rq?gFG1v zaQ5l?P-|tdzdSZEn%<`3ZVIF~s_QzUW@?_G(P}-YD^iU#O?djQzTl!DCu!8AmHqpT$57>O(lW}^>k8K5GzElBPE6M22GgrjTj{!LMg{EN4GyPz z)MjS+zrm69>225aZj|)-HK?yR5d54@Yg-O-g;Pw5rh;5@M8SKHv+~K5v&ihRK+9@$lo%kb$)LI*VA4aunHhE2dOF?p z1@&nZx{j3^8U*?D+a0{JF>4SLlhx9OGCxg~K^V=jvdui%m_HT%rBoQ`LRZwrNBPOI zhSSQm1F4&Of)@g|S4z8JTNF%KV+NAbNZH$CZIm(w%Q~$PJ2eOoGe)6vW{p*?MEje< z%O#TWx>W50xLl=1bu+EJN_uP1^J#-#2u#_AobY$&By>(}21yPf=Kyq)~|{j_S^1^V?MZ^j<4qGtU-YcT53(V-31vGhi?(KgmjjboFe85Oz? zOy=sr%mTG6v4op2;eLGjl_y1!C7!-->D7X&^pi*>7TIaH`Ue@QEH#&H`SoWmD;qhd za%a`%>(D^z)I8D`m1^X<^U6!-9DR^8b@bMLkTchyr25L(K-!qt zfDe|DDduBa>wV?g*ucQX^qs0kX4}|L5ooli$g@XM?9bTXj_MMJ(uN!4(w&dI?If#X zQ&~;=m^Q68O_du`H>G_=scTK2vAH%(i1#E00!cBYoIje#&RVSMLOSNBbznwE!>oE& zg4S#c)1{NSVLUii3tlVP(!p#0Ea(|+DQ{YHmbG3Usuu^+*K{(D;Efb%bBom{p@>we zt7FSLCcSHPn?ve13}*4B1Uo1 z3F%>mjV~yoP2*a9eTxFa6FjSrj||K$$-2WV3Ri<4uOHl?fGBA#v_-Zg-{_i~UbJwS z*T1xGGU(NmjB=f(ndG@}W}}u>zl)yM$Dm%zo7w)LE?8t`%9BSwl$UcDmNRnG_^Idrd4X0^(a_TrP>bR-fQTs04$YslZ0ov|a}48_eL2 z-V;9_#`(1?v^|@=_GmO7=2WOVcG8J0;{7mhv)b^DE~ynaGmlKJYqfrh*Q;M@3GUp@ zS@TIJ26uF%jj!2_a;a3(0JHT#k&Mfc(!FX+VMw#t;fcX|H91C$kN%_+!`qfq`WVzZ zvT>r4M*AQWj}~(Qx%GI1Y{9F4Gx7{iIRMqLgEK75{VHDrseJ^3j_g zc-*}&`s^K?j^9bwD(99iV~d>i;pSb#7XEFKDeOS+NbZKyg{0Rt1rOJzt54F@8j_Kx z=L@n0cPoaL*X|Q?Cf4*mt1IC}`ZUI=%Y?MSgGH&-WNg_t!YWtD-)3F8uER8bP$J}W z?lR#oIJ8-4#{DRHn=0~9W5ZGAEfv1ts*V0NU%lO4q3|7`?UV_A#&X6j@wo;S{)A!s z<)+wOY5KKXZP}|u!(o}N%N^OP&OXRdM50vuy}WW%Q$~8TWIQMijJblfW!9 zS8t^A=1nX4N)$WMcl%0f{9a`na#Bb|Lv3G*m3-S1Td0us%7iTJKoIupmu(0__x?sd ztK3E*y_Cg%9;=N~jo+kgql~?*IV_T3T)Jse_xkFWW`kQO(k7AM=1E=QW2y1*uOI&P ztU{r1)HeF3W!>Rk6oFBWTf}3TGj6AD=FWNlb+lg;glT!M{>1XPcU334w>de|j{+^< zfd2lUze+>6*VYA>8TtR`FQ?4dNZC4jFU@sQ=1R4h^?$?aGcEYnyDxLTs`7lT$~7tU zRZGFGV7k?JU~=7XdAeU$<|c*)3P;FUyiDm6N*sMk=gN&7q;&tBLZLFdQ214VB>(fU zaE=R=_iEgaj<@REd!oO?Gljwng#RFR?q8MfPMzObpFl_JZ+|>h=X-TxFQs{fN1|hX z^w*C1toOxNz>lr}`FX~~)ua>EW9$Dd-nRPK`aixay~Wc0vGxCB>woQW_bL95e!;Pg zsFy;It^XyxaLLfYN@#rj_|(id3glX{wp#!1@TEnwPGY*g<&( z3co$Que(i$XMSPU zt`q9Utf>BZ(fOSVvv#9{+vw}!93h+byx#<%8q^^3CV;|_doDip>W za@C!P$#XX%zuokm`U9>=y1Rob-yTuEX4_3{uLc&%o;s|a zu%ELF`$YBZ8|7V=*w3>{8!s&C{p>6BWJA>5nWq{&*gv7o19Yz0zuAQYqc#tU@}7{` zX052_Xmy>iQY}SI&NvgvsVAYm$H&?`Bx>)_DDQ5PDdR^LEZzYKu0pgE_K;BlT(RhdP;CIEwtz?a_R0 z;_r|HGsiWnaBP&XH_Eq{^5L5p7xj}SB3lc2vrSVG_Ipm@ged=sQGR4fA2`e&o)}@tG7W#^t9)gVAB%~!9y=Gw^hu32n%sV}&Uv1l zOdgH(DN$aNBYkS-n^ia^%C|hqm(0hB(c;FEo-o^Bbo3`0{68(K!{oX`-)G8cc41}I z-sw?Z>lb-_zs`*Et%~I{Jxv6XomDt1%6E1n-|Ss`q<8e|If0JPjZ(9nZ3^c_CyAJ94=|pUu9^DO^ZC>FgO%{$!r0 zLA_vKZ;aQ5wzMYjOZ7LYIp%E({j{OBF5^>eCChnA`_?iFC+Hbx)G~Dp zM0FVdXm?PlIkwq_A@V41DazZM=zsaKz`-#+>=bym#wk@RFBtfS?4At z$>uoc6fP&9+Fc*zH{QdAX1-a4u_)holrOn|dI@`Rs2X+8zC?Og45G5uzbm48%oeKp zZobiCkx=j36l&yEAL~&W8x!~`;s~iJ%Q=M&QU0k|e#T^N`1~8A{8vW#o0!^-uxCfu z4Rh!0wv*zDOS0Qz*;1U4wj;$-$9kzCAd1DtE#u0E+S+ti1bh-sb$M{RKLI0O!|es*cVb zu5&${J3pMdtq%INAjn&)FCVC#TA2>pJVxh_usWW>^VX-AOQS-E;{U;VQ_iO} zu@$;UJA%WqjCVy7KdU@CTA)qNpV>UWda}N1e2p%wloWp&es&W-P0!owUi%O`US(G| zF=?~9O7DL>O>f5`Tn);fq&#cM6IQxh?>gFmNNl{%Y+@@)MMIl??gL*POm(ZPrI19{ zuge^!SDS=j#1S|;6x7Wv(e^AP_9@VtDRe#I-5sI!@g2xw1I`g2;s0l%Y;vW zpCRq2!WE_3V6{9!Y!KA_RN?iYe9+(1f?o)Yf(PRO@}4Ho8vWRb$Wf`98k=K&_6*#q zG8!9oY?_g$DVI})T^nEclZw%Tg>0aLp%e8X&J{+s}nZj=YzhFW$L@8t};d*43 zmk56Y`0}BlwUyKLXvk{)N>-?cqOe=RPSZOq>LnI<`u(-0{@xCzRixh7RI0AjyXW;n z&{|aQu*$v*TsnG2Fhd2623#B!_U@qGu^|~|)%;dP=kJKluN1kF*QCz9KR6efk#sz& zcRA6?l9iiQo)1TDov9I=TG4J(t;wa22jzn?tkNBUMg9EckPXKAdzI?Ai+rnihklJA zjn_}tL!{Aoo+JF9!I#Tm_4kgrUU$rmcIY(?1b#UU@5v~?Q21z6_jb`I_47CN6Qh@7 z_+sJP256yxtruhXM9{ymwp)b{$8g{Oj|*QF!>K=Py-@gt@I7LcE4E_cc$F!r+6Z{p*ls_rIi$2NmQQ^CD zQisW(@z0Iq`zhf&g>VD+VKZTD9@71}xl)^KG z!hZ#SMADFQ_7%oqJoo(R5q?1kV=BSn@lC?%3x~n+f8`d`1*xgU#x$Ae4B)0KOBbBfBhfy`5NIz1!xoZ{`C&wrVnpla%(~P z_X__}RNip>$F2b?TNeI*V)#FuS}5!g_2y&3za7K>Bz#_E%^w$jPYl0U`kfoG@~*uL zh2KTEA0L0ClTQo(aSW$_Ha~q%_r$%Y>h*_Eb$n|6df|D;!?lv7h$$ z$gU$8mOf42e7|3~@h1u2S;lSrG5mX%HOF^S20kF%{DUuV{$p66rhwoue77R{55GMp zqx>})j{AhB-t2-xJPU?GLY?Ed2W_e^^x5P#M z{J)=8uH^`BOHEXE!MurugSpQ zBmCVe+Y{BHkDz|@KOYqS7M<%+GXMCB8}YwkYabH+<`{mjaI@B*2)`nRpBOllu(r1! zS|}Vxc6Y!J{U5aO4&lUC{_y_&Uxlv_sAd}D-+z?8?i%oJ=LKO;Jieq(ZMz0->@EDm zQQ2@r;rMM%Izae)V)zH1L!Dvn1BKrn!ygg8t@&T!?}*_SU#%07G`}WXQ*dyEHHPh* zfBlK@Ln7Qhy#36RahQGi^5o_F4#Ib~g3+fhzpwCvqVvAIwSS^;^UoeP`+Jh`H2z;G z{OPJ6{w9^bO}I=rIE>@o|K2U!_^D7WIKWLmUlaa%o$XOF{Lq{AC2H*<;i$Vu$?)+2 z4`-Y4Clm@*k&XGq_|5!c{5j|FP(L2`{JCGaC>R`8-uHjb5t6^^hku59e*U}g{e*ek z*Z(+8ZW=;xSpR+f`!5XFT2YqZ!|V4b;e$HcqZE#KrhP9Geqjv%!l#<{y;%6#7{2q@ zbt0}j`{!|!Pb=K?=kY(O{_m*nla$aQ#|J(g#%J{J8;f;EqCTnH z_Ya+e-z&Tl!{2soq42l>)jbiyFOT8B624O;|6d62i{WRzKqn%$ou|c(vIMo+_`LkC z5q?2b-f+rqr}Fgg+rlkAG93Qd{=j|0AFq5IhI{>Kb6ESS;X!>Il;`gt34aPFbr|l; zuNEGU?>zrE3OD{G>GwUtO-%_@@0?|0r+q-Lb;=i;5cV=l`>W zn}0L;`1Xf|oBy!#zW&QydBdsS;>Q;YPm8~96fPA7hn1)P`8vb*TZEha8BYE4B5k}@ zxLjOt7~U7OACBhp!p%P!PW@(oUlyJgpFJQvu7BUZ-wTJo99I8=fo6R7-@=ax;RZfB z#fh+gM~NI}mr=GLKAod4)OWP-{S1gc{rcr};mkGu@cdXK{IFTNzM=}vKfL}Q@JFG4 znm(~v-uln@to;`VH~H@oHRAC*gd4A|55E1o63To08^UdW$?Es<(=UXdr~Y$ze)2c{ z{k8B_F&uu_{@R1WSHy7mVYT(jF>V*bKNR4hw3cb};YDQE;pJoed5Z8&0oug9eVr{l z&JW-I-ISMsY?|GaBl0~WYVQZa_lV&a{v$RO_U3-!yT$Og3ZEZI>pz8W8^dS)6CDo6 zcj`*6MTLj)!|V4Y!jFk?(=#}&lU^=dAxdx<&iG9lHw!oWGTe{?I8)wb*5y+pInfCr!__`QgTTg{yZ+D)7Jf<$_x|VA!q13s-~K$E0}cjULDz6awIerXKL=kN8xzc2ZLd3*7eSAG{t@sneKR-o#VgD)@HvMNf;+g$>gYXT?P2Uao`!8P>j{ozx_dmNm z17F)Lt3PMVpN9&^KU25oFW*V$3V&vVS^HkU?-Y*R8KysH)PJ@LU!imK(en8Ho%ai; zU61?ze?s^T!a1xw?ejP3)52e>PY%O9|Gy-BG=v-Yo)u1nqy4h*%VYRNfQR}y@1kaW zY4v;lObSo4-{%RxSp4NklJ9lGFNop3|F0KL{N&4f|Mz?0KMdhU{XV|D?^(_LOW(fn z|IfmYSN;2_4jZ56*FJsW`q|@NKMOMOg~CsW`e*ff`8`GW6Jod@|FCe{_J@yO)(PLs zgZkUYFINi>)amk29+RX$&lNuAF#h!M-zMRj4rUxa{`;ly_X(wsCSNbV7hMv@2OjtG zdyR0)wZd-|j{WtVZR$^56YZ~7;Unuzf#q9@leR)=R-r{uH-$ke3 z->$-0KXDk&{9@Nn_R!x0F`W2oo2bY8=xI7~hI{#bUwAQw`}NQ85cm8w$3|Ah59etAO5xY))5fkp3%5MC8Q)$d{CP3_$HGni zvrFM#8fQX}J#&2934fU|+Oosze<$Iz@A22XoSfmA1BAm}kN+^hL&hu>esK&x`4yB8 zdvlZUgZQe$>Y)8O(f9WWKNwI)5`Iqx{#)UPgvA>i_Vw>R+`PVT^6~g`;itH^smjae zbm2>5_)#O|3VVBv@at#uy?J>1eV*_a$8c}I&lmo@81DJCqnz)~QPoNE*-yCnuO$39 z;Wj@c;VXsrG`k-B<@R*>p{|khl9JQM?zPpA0 zS@;477aiz#d;LxR9kmy8l0KP#?C|r~LgD1|xcA>Hgu@Sy`|?8><)?-3ZVgAD-alP0 zocNW)#^>=j2)|w!?VAtx?f*qMWA(W2|KX!s?w@)294*}XXYCW8*!6`|h3}yH{o(s} zj_|`G(8^Q)Je}kF(}f=x!>Qly&!`Ij+^o<>jb~SUr#ZiFtKen6%AcZSxF6s9gkPJ2 zpEMqp^)dX7w}$o8$7$hL>67D_@FVaK$eR9d5>9;2VYpvEzFYVcL%4za_2YxW&xvp^ zAM=l=D0q9LzC2lZdZK*DZ%6%2{-+5)A%_3qt4;ZxC46ZNKlN+P_5Inx7sv273lCe+ zy<=6$Rq|)NJ)G9z_4i}pyT$PNpCnf}ng@l?isAQ5f5z6|3x6c~*28HXCx4fJ8DXLD z-?ec6pZ1O4v=8TK;Su5bKfnwpeldPBd1;6AGQ(B`p4Jr-`SW<; z{}!D$-0!~~BAotl^aTIv8T5fBe-9NN(8=LG{(D&Xx~N>psIYx>g*;|&Y{qYfqd(h! znJ2t2R^G2aOTr%?;rm3NUcT1}zb-nDoH#tbneR-Rob{GEi82*PhHtl;4 z;pfHhH@~SVpFM@26T{iRHTxQQPIG?WgVQ>`cUhAk*9m|6tdJYN|7L%$6n;_+f8fou zAF}OL!cU0dm%Ni!LTj0Qb$I^<+_U;W8sMQez9O8qTH)UjE_b(u{HTi_{7U%d7>@kR zKm1PkZ86--??K`3h~Zv-?@%oMfN*5z^|!OW)Bc^p;kU>4etuIv?-LGxJw71ZJF|3H|p%XYg(H9r=`nkLuIozrIr^0#w`)en<>o=H&Au;WqBDM>Fl`Pr^@CdD^B8 z4%(lqPuhR7bQzEDeE-i8UROTfKX99Wo+12MG5kIzyr}=57QP=}bmeDfc|_YL6&?&F&|*Ea7DiLwRj?^*g1v?1L3XSiQ~A0_-?1ENpj zODli0@B?GGFTYCo1rhG`vyIM?&JliO4EOW*M&Y}~aPR-$B;4deeH=diJ>>;qd=etz zzu@!qC;3ko4*&e&`~N=ShkHez4gYnG?~y()uzP8EJ)48M4qH5I7#x`ZDc!`~&`r1b{j-443z*>9W zD+`6c=-UxW<{#dxn9bs^vtAXR_qgx>)xv8kt1dLk(|_|1*9tGk@a=<`G3@_~gb&5= zwZg6czZHHuUv-2fLjPg)|5^C55N_a}KPTSMd_KgNM^}75Mfgi%<%$31M71p!E)fQY zl_&nQ=T}Y>E(*`Uef;+o;m^WZ=&s>4i>%>0!q1A~ zzWpcMSSZ{|<2ro%bE5CZ3x8RFHgVdwZzl-9K8Dl2>1Ua6nMiP0{l5Lr3Ew2tVk6oZw`-Je0{O-i$b`8BY%qz`-QKK;mF^v|6eBj z{21=#|3Tq5h#x(3XSUCrMt{B}d@_bV?>2N2_V&xduZZDa6K?mHeM|Uo3}5&zIuv@t zGj9pwC$C?x{~rm*7Ci3t|106|qJHHu`Fa0($?L-M9{1&M7XFK=xB`oA7VM zaR20-aAc5TAKCiy0pYKW;eLIztAg{N$8f(snybq97tTQ& z9KQb_5WX}#J!5=~mGlwe%yk?#e(%43F5LJZ<_hDF*-`%g6mI-CocP7o7rzj`+JNZO z?+-sH+~P0G=C7ZeELr`7fPIv#e}4buKH=!yjm3)sOzH|NkNUL<6Ev-~XQp zH~CpM-~WSeZSuqV=jFdtcvAb+MgB423;3cVsr;*M)mx9%-@hn%+{XJ3;Wx$b#qS|+ znEM}uzdVLtE!@2I$AnME@cRNh^dGC=+Pr_q?921}BH<@doesnCpSFMdEa4}Fa0B=L z^J3v9Un}qZ=dHp&s`55oszU!u#CEyV!jW$a_oqGX^?#Xgn}59g%)VbGocPcm-oD=? z{D25dD*sX8ACvqTgW+|>oEE<=en-d;kNf^j3SSo0Z{tV4^ojbOC;aFb?(OqE!ma<- zKILtE9~b^lvGN}OhH$AXIIMkN|4)UV9mDgf9T(KQ9IOc{1_2#_LEfp)x!1a z*ucN|@-~0JQMlb7WH|Rv+Wht=;Y(uWZN$sC;C-31255~Yj|E>LV zg)7_(4#VMx`S{r__Oa^XiPdHdK`-)aBd!toy-f45>HyFcW1;S(|ZRJCu< z*S=r4)HS0#>uYQ6$oGf3Z=RWHzsrSxLEv^#BA?gK(}aI4hI9SN=D)LqeG_Xs~txf#2SpYhrEqdyVu z?+H%Cj}!i1fI6(a=l9{COqO4xe&JF_a3qy~x$sR0TZiGke>VufGKTy1cfMQYW{1*R z5LOf1-?wMve|G!l(0-Ah;nY7bYVVoC{}}zvoWgPO)%dc|f35y(Xy24K+?Ri)@X?@@ zX(aS-X5Tjo?~UP}pEn6-?&2{2<@xy+;e8?8z`cA5pWCv$m(Ov+v0sj)`k(3WZNh9b z;=?P1O9jE<`EC2FR|#Jk!+rao5xydZ`}pv4!cU3eK0Z9|^G!Ude-+_BofYcV#)o{+ z75Sep{EIRCwpYQIu(p>7|5ObBop77~t{2Ywc7f`$`tgtU?WJFoe--|s#u>ejLjpTC zYT>3Yh0j0W->f|SGx@z)_}heeocPVG;q)(u@guk$-haMAIKIZ?-hbXAygE130r@y+ ze=mI^fp-hPAco(tsTm*KF8t{+{666(pUuM0i{Z;Q@clyJo0@=Mq%)=?+Fz~jwEq<0>tpyW&t^{oRL_P9?~ma>5e~mN>cSVr@Y8|` zF=X2x|0CR=B5zn@IDT9z-*@;~^Zt9oi9am&j>55&}f9xc@9KsFU#~*JIK3k2^ zo9&`}jDMc~roJBtzf1nx<2+wvt=%vDlQG;sU-S#%cgAr4e9_x}5#ImZta0Y}?-PD5 zpbi_K_h0`md}RnXaPOa&J<#<3R-W-OR=z()_;9Q|_1pUBRN?v>99G`f|4!jkLd~C% z(eID%^2>04#pB-o4;21$m06%<_51kl2T^&C`||UC)qH-9wmE!!eW37z!_$p_J^p0j z_sCb7xzZJuIJ~^Cyr5oX&jp00>Z2spw;h%}&$j9vOfZv4oZ}jMl zjo-)rUlhKRFpvB3|3UccgmYMV`Y)FkeE+lX8v%6~j(#ov{EP4#Lb!o@{l4nA&Fj}z zp8ENlbd&I-V&y$QSN|@IpQ9|nhnN3l8Tdp7?(2Q*@5dzYm;@e^z+)14OahNd;4uk2 zCIRhrN52<-*7qchLH~oo>&o?!$$>3?GPrNBRvTL1H!(RdTIL7JqaWbYPmkv-uAhz^ zog6ClO;k(z{pAV$D#4J-cGL3U#6-UGW3>(X*~+w^LLM9`ELgj+r?*;MQz}*mM|w`~ zSx_oZ^l*92->DU1?RfG^p+*tF8?hmd4lV$1nOy zWqvy`ulQ@#!M>r<(c(n8H@C=5+hK$K)zXN5_okf&XBMR0b`;c*`SFVvnwZ-E)of2y z{cdMIvLUUJ{?hbBrK%rd&P`GM;L})TsBcW4{YW~eY0%nOu{<8M)TV?McE!q>r5gfo zu(GSpY*Af<^@|ppK09h)@xlflx-8%5;-V*>U|q^(iKrM=Pw01OhAV9;+Q<>nYNA?M zrynEg8J07x^^KJWtCd=1xZWc_UF)0D5A9T@YJD3{>|IopzYe``rC1&s4cqLXwCWtt z59oALe!Sj!>AHR}C~_hlbiOuH3Y}PBS{+m{Ssfj#jCbDs^7!~@=iQg=%ay@;SIS#A z6gid-M$a!e4^_j_5Ai!!m5EZdFFja@rW<}=uRPS|BoKxhns;h_gZj5$sbkUWw{yFp zefXQrowq)4dDCjz6kV-!#bimp_0*o+6<~>}ef$ViWNvwz4dkt#=Nc*vcRXG(RRLFf zJ&u?nzgX&A&11FcvCd1=?TJdI^9p1k#oEU4+#|P%AaHB_e9J2{D>*h55Dz!qnhMu`4^S=_j1iJCM@<`i9D6oAYlYo*wIW5o)$J!??*xZzxtX<(@9M!771y z=W9qs0E_c7aYoFCyXmUs@f_xxKKAK)bx|nEG}>p>QLE#CJFfs!?5|ggT}2bMx_-uY zY+$mBeuPtLe<}D)=8nT6NkhSCX`o48#I$S#;h5ER+4z&TE(+Dh*6_ zp@rh;x{4N;Bi%4TQW&4?qJq$z`3?Dwor1O*>*eBT`N~qYe^lJ=yryYUijA)>YLGnY z<*_bm&|<%;#ap$zK6FQ{@zPXU^C_WtP+Ndd3HqWGvfL30hwwZk@XpN6?#|B6 z?#|Bc>vjiQm7zV4#at0w)+~c#m|S9adCln|h3YI;Jnb2@ufmDNMHmoFj=EujS#Gf~ z(+vkW5By@R)Dr4-AGtj`7NCtb7fQJ~v+>qS6WSz)%SYSZm6n_LfR3R9me;o3H(x9q zS-^a7wv6@eidi)CeB^3q{F&uizPeiXM|-`3N_29hwP%nIYDBAMY0rdK^D}Gr$597c zob9fIRr9qw7d!04w66qB&${VbC%f_rVumA`uT-~U|=*1BQ zho6G+Q&;KN?;9%b+;X8FZA~MT7?6Cm6lUio`Ma%%6C?_fFHSB#n!=mp~Ilp zq3pR1AsX$IqX4tZl?sAtPFB0)bS&4|CEmU)^RuN+0bT7Gzz;m_wMHv#>dd5C%dL1% z#2C)Sg>qSM!*o^ylStHPwIQy4ByNY`$M$tCloxZQ0>_Q7O<1$@#d59-rx+*irt4zX zc)ZeKLDbIlU~x{n2JMT`h5-y``?T#FV7^;V@htBil0&Vt(wUGOj*#wRc&Bd0J)}_L zD3s1Q2gi4bKWQ(vHX_GNpF(-tr*ALzF5Rfr&aKv_{6Njk9fd=os~WhyyH$$6P|9Kr zSwk>nH~G6wnw4fR(-b~&fgP^m4CdNWfR!@PixmXhmTKAgV$Lk&*JioqD3o-Kj%ZXK zTLLC*u2ueRQ~)a6vHja5uP)_hr2#s$VLKkVVz#=x)M3%pj)5yg4;jJ3(T%IqE7Nl4 zu#OH!g8d>ZGp%Mkhmv>WE1s(qpcmY{-E>Z^9IGojnmX$OXxE_B)wyHYh6;4<+(vXV z6*8t_?TURgUn%8_o(ww|!COalB>~#rt5v)5@vdZSY_GP};|S_4)#i8V(YaMiw&yb2 zZIEcbLvUM%?8y(dM(eCsg!{YcK__ZQI(y>USK&k@KYzTEYdg7aV_tPF_O!1>8wT)1 zW)Va%*Tos3;@vp7mn(Hp=r(0Q6hyUCa9o?@vlJq_W&vPo-sO_^IJ9&^clw>fWZ^WSZcJO94xgDeNR$OCK5vf+@r@H4es?VSQ0*rB{4v|x*@ z^i~Pm3g)5+TYppD#tZxHMfX9eu){z1K%?*gX=xZgAi3f$R2!BR52bW(kJW0K-2!R91Vgo? z(fVKlLmKJYDQSm@p+;u9Q*yyLCP+wD)YaX2J|tR$$h?{UDsuIXqqVD!?-W@DchA$i zx>Pv9Knjwld273JndOzxhzh|p&lQfb`J9`Z$(3;O&2m{$OGr-_M`X*)wPMl4v`}tW zM!T`wk`)=Y<&utl5~>xI6N3ZH;VSFKLCCAfq?*SDH%_k$Ao^gDI7- z5ypgjvy+8s_G7MsZ3(WMD%M%6*R`PIdKFnZxAQ6zL9ONfn^mN#vuG>oK{Nr>=ge1; zlUu8xE> zSi@D98s3-LJfZ;BT5B^V<(8IUcWdwyb2PvzN)M?OX~3rn}?M!Y%Vk4+mQ59GS2w`=z0Mh`hJ)MlW=}(r8&JPI*?;+2rboRpf)_H6d23NM)`iSWOaZO4d>@6jKftt|muxz`M(( z)sF*o2Zn8MxKf&QTdlNoS`sB%gHrg%bk@efkEvf92R|NuZ5;eycyMSdD>6^!Is&0x zkw(Lo1lnT_vi76x*H%wIWPTN8rwi5=tR}6Ysw_d{ZJNx4 zg|{RzQ#z;~}{p zkgsyr1`=U~6fdR~O%v5xm^Rl}wJZiZlUMEMv!O%6cQpd0n5k8yLR*ptWp# zL`gSC&~;iJ>Eza{PGshCt4?&@4OE>-&0SHQ=%^-iB~&LmS_JV0J)H>M1x=kO=`O5J zG*mpgtEnTMxdo{sA=Nj(vW#h>-!W%<_t8pnZZAR1DOs(onz3WNY=?QhR#Xb;wRv&MHHpp6mPo}*SCkYtTN^V`pj(`65ddx=-ZYw+G@ygu9j2_ z)6B^X)9o9JE+TBnN#|$c3D-KHHk#^|IW8i|V7jn-|GsIg^J$4t*|T%DbpaRXN@#LT zLp8f7otS?c{?_ye+};W4%ySr%hdJy=CQ8 zH4tyv)wHh-b33QnW8cZsQh0u|AlPFTm)5jVd7pY|5AL{Fq%F2K2^Oa3vAKj@BeyHl z#Awpm2Z7ns+4-d!&0^YfM3y`nwbzNo8946f#Sbm3ZgRynh9}zRh}#vgsntOV7iU(m zt5wrCG`B1ideV$Yc_l^1in&&v!?h1>n!r@^c!z2lx)U`z65WQO>u*`!eas`uVI_qH z;~e;Q(XAvX)+_;`<}$kUVwuu`we3=FnbLJV+#A$-$I8kC(aYXT@z!W*L@2hLjm)iB z+yLKFv**gyY5ZZUu)T6sYO^#%x9PYG)1c|(M1KXR_};0 z2cKOy+CJ|pu9)${zFTFUo8fosww4^{D$ATUosy|ATjFcXI?-Xi(P>O)en;}PyJR-e zMR(K_TB{;mvl`fM#+L4Ne9)T8Uh=a2anRY_E~+ivY`_ln-4wN+m$Qa;82LT3x563d ziR`69z0j^8Cnp#?bavf@rj(7molxw&pyfaapJ6?1@ zuI=rKcSrXK%gdH@Z%=$XD`0P%Vy|=Tbln!$_i(l6cv<0GZ|7y*w_{uORyfyNqt$(m zdz^9WTF{P{70#Z0cEI`lvbVz7V;36T2uCmc9IsW_+fogKU55=zHjEVnW@T471QcyfZeoJC*H_SPYR7u?lAe$&d019&%2VM=#uFN zR#AIWcd1x!e2MkEY%BHBm*|SxguRu`ptEo-r(CS$2u4|)X&=zz(;*188%+}l_0St? zSy^E?UucJlQ?)SnwiC!E(=~qbXg)?30bj-WG+(aZ@{G>8>l?S*Otpn;wX|YNOW5^z zYeN~j?=qH^?crAQf3M6})2&3(c;hL2Dl1U$W4cW`H}bKn<=I7>$S7w8*^SuhSUDke z_U-v0p~q*dvkSER^J|6B6*z8A_yH^4)u|_TP;85Lb?U$lxjL1dJ^YW5t;c7bKfY#{ zPI_~vCe{zp`zRn&bvO$^$4}`LYH4LWHQ7p-l8AD(m6VgIR?2ckVY`%fCmCsR5@~g* z?dG_n#Awo9=UJR!3BvX@cRWigi$n&~&TZtlF3nWh?v!gvJ|#iX&`T%VN7j4S)wK=p zuj9K|K9+CK*iSGX9SL*WD2 z=)_bkm6*s*4YY1=3i_PZ$9UQwqk!))afjm4M;;o-N}t$JSY!kn?QEkP=IIe8r>)>z|uxJKtNF)-+^g{UIw~ zSi-QhivuWEe8sn$r+3fFEDd{DDmSM0khx)HnfK81Wqovw%mI-Z%L*2SMso_)m8%XG zQhY&Kn_0MFyEud65)|Xyb))yt*KAo?(e==?+=jVr7q^Gn((D)k!f>FY_CkP88MPf=$8j@aFZ!ux^z^#PY%O=z4Hyekkd9@>+*W$V$|y zR4c1>PdbHlyxL+|IrN~`MmrjrHxcp*YF#TY&h(^rR4t;MaB1>$JV)mj#?Czy1IA&G|1G}xLdZ26VGq4SfOl<^1*G+9bP_|Ca zmDjqh=r)2}RwBAPQFS;os5iGT?xI_?=Y@Oh=p|%bDTWyR{nlu7$nto$L-EDUC~o3* z6@ath7@aNby21AKaH-;W+1B4@XYRc$Y7_QWo%gwAN6Y5-rQDN9&cQ)DN9n$v9y43f z!NDHRr#fU{MTty1?}_@dbi36}Jg(@HI8P4&G!Y2bnxQ8=dJHc@s*DUh7v0yrw#H@-MncKQp z|5W$cxv5hZGB>8mjkwYZzmIY{v6zX96-zrOou~OH26oNUn`FCM1vFM!4;rRaJ!~3V zK`T!y1Xty*o6pWREps;&{CzUFwR7jOvf1KnmQJW-=`cZ)IfmDo$1%w~0{hY~r_o*S!T*4-*cj0hV^H2_3YoSDhz~cVvTZB&ttz#?iZEwri5icws zX%!Ar&-X|k$Ixc+7I`i*f(vppEydqWc&dZ9)--*WUMe9syXH*VNYKH$8OZL79$a;e;I z#lkH}FQ}s%%v!e|lhM0iI?>E8HI>IIV?$(!Yd${rTC~CTMO--q;RxHPzSg?ry4!b+p(wrb`H##nG9T!y8lSjgr&)d*|$l zX7}W`Z#)WosqVNM27C$8|CJpW8u@PBN7mWdR(Up#O%0T_`TY%JX9JN`W#>Xe6wR1gLXxEjqkvSlGW!j5%sGgvkX_(EfC(D_R%xztoo6j{haSvO; zva({a%kysZN1AW2hX-sOFO*bEy@#i1+p@Q^8FVw4t}X1Kn=;; z%7iw4%iam6 zhoe{z`>$o?L}Ra|=w5Hyad(pG;g~$oL*KgNsYu(GHEqf=N9{L7*X_?KU*ovkn zc36)ot(jZ7*j<%w8bWM=od#RxD+sj1qWV~_Sin-g!|@&vV(mxk$Byf6{bDd##2LTr z&J+9hRq{1@M?Amc6XzUDbDVG0Mx0<**)C4oEZU_ga`$sP7XauGiUc>!5*$Mv2v_jN zDXy)Y|7Tpa`D@w9lDbihdMg}WNQ_dCUR+-IlUd^vEo0&UToe$jRNVEEP zU*cs%ORLUoxpcI2d<`$!giC`;=-*`0P---qrLd^cXiED;R>Y>VG+UZ; z?^alGnrgwlmtw_<0%6=0J-bLyyltn4UVh?6QGIg%W4lqC-}8f;GDsO7yHWAyqKC@&KYmQ98=oq_&HuN( z)BIBEqOIQR*9@x%$mYz2SbPe)lB7{r2@redb$A{ll}A%6wN~ z17DTz4HwDxW8bG#M8QpHef2mAc`hO8whrmzI9L8k?+aRDs>-Z`n-?J^S2DK+(Or9OBU%Kdh<$u$0+qEu{yQcwPbQahiZ)V^7z z{-&(dsm}<{&p%wg-?v@9_k2mI|I+P8klSt*_!r)w)Nb&+>g)1M|Nq}X_nUt8T`$ie z)a&h#`F-~&^_p)7Y0T3DbMot!od(kS`zxc9JyI^zbRdGDuC*J~a9`JZ>cfBkaz z`yG(gucFYaFDfSt|5*ec{p`N8l)4_W{Ln6?j-fxk6ZLr|+VmLY zclIGCZ&E2dHn|UF8sN}KlPCN{bAUjpWLU^UxVKnpt}NcdBq2n zI*7byKZHKLU8!%QZHDhgKStZp=le> z9rFGb+NFv*4WZ9}7v(gcrETVye1GPsQlk~6b{t1reqE`Tf79VhDAVU3fqt#~;H++^ zi=lg8eWcL+8hO#@)Cc67{(oKfMf&{-^hGM#J^SeiWkP<>n3vz?|5rW&T?W5jyh0#D z_5C+jB~NbVR8GUl!~$Uo78CXg~UV>vq@@=-0!(1v`R1H62mvFChCL zAr0eEh66Xq@B065gv`r-?4ajA*8Qemqp0(@(O0g6Twj5@4qd0zQ_+vSs)C{reY{K{iTe#kzCVRJoV8D>2^H(S{eV&B&RbN2ce48H|{yhiv+5USwMe-7FfZT-2gq5f#!r%pq!=3pn$=c8!HtNu!rbH{^`BR~K_J(l-KrnMd}T?gH|sX(hiu<@!lj6!pI@N+)KgIZ z`p>I(VEjP6>GQI;VEjbA{Lf|3Ja+X9+dsRo~G1)q8vNEtJDK1 z({H~oJm~)e(D848@5j!?xczF#{c5ziZo_9TI=cE_e+HSG&kOVBmwX@E0sRB)#Yv^E zg)BafvcKi#AdPwY2k6zP*S}Mz8I1e>`Aghy^J^#c(|n!`n?j#Yj6&XhsQ)gEhqD-q z-U+*O2z5i7)t)ajpMw6<=K^g%ZGd;~eE(p5;ePn5!QWKBF z7;u$RsXxIS3(psqV2A!tsn>h*qLd@B3H6^JL;m!6!u_ygu#Jg(F@Hi`ntfjL5R3)L zi$0simHL#|Uw*LxZ5V?-yiBQgKz6SiLqEG4vUxo034YV(t2bc2H^e{r->=ZGJ_((n z&&dm5Z!SdH@4_4r`TQ^R>&KtOIC%@^Dnmr!KHmq=g(URwfP+1-QGVZy^z_*TdrY4t zl<_TpiL$*OJfX*hEdn?HXVK@*xWqgub>$JvGd5waqGkP%7r;K?_hc0E#Q5|Z$e2Dk zt*1YI1LSr}soT*PHa-D1ekaC-!%U(sK-tYF^H`-G_hfl0qJ8d0zo5@GkilKwli!CQ zs?<^F${kn0wm^>apBDIiAHuk$X-3~FF#5j_GP~zCd7kXYJog@lo6pPdM{7A4%wOz9 zpNk_;@VODcuY4B9{Fh=L33-i z`tcb`UH&xK=mE(4KFp&)yZaNEvu(zF=e0_0K>6SEBFw$cHo2oMp5cDeueV?Bp6^a6 zb$Y}-UpJ3=#lvB1k767u3VZ~5_Y$-TM6KQnn{pxQLZ8d7lyCq4pIYpI@i8<)n2FzEUs?`65{dnzrkPfz`e?RK|a_H@=(DrHQ$pY*#%1fUm$oE%Q zVa)^``VMrPKA+0S_uqe8z9-%#-}L`IkfZ-0wS3iMp=*7ZyMI71OBIv{&*pRGr2P8P zW$2ryqusu$)J>4z!=3{fqArgMLl52yJBR-AG06U}cVK??hv*+!=w!`sao@kzW%z68 z$Boa$nDXZs>oLyzpIG4{84U9Ps$kM`1hP z;_&++=LfdA=l>{S%$>%33OYOeI<(n01b6w(^8LtnpuJxY9s9IPQ`WjmkUMn$eE{+_ zpQ)EX_tNGm`2AVv-ZNpp%%`Gl%s)h63((eo^CGNW&hQV(d=4Od>UBOwe&EKNzq$kC@;LP68rZ0J zz~+7pJfF{`fqyTBJbwmzYd-fwzi;$(^tm@+jy{Aw`7lEPJN#PA)xWIN5y<$XIR~%l zvJm9T8R+8+U^8`DL(tEkJP~X5i&0;++Zg&5eI5y0*X(l@>PDX*!A8^Pa`fA+pTRTe z{|>TRe-+9N`4(R)_{W`4>IIXKD`a^Hwr@S^{g=q|0BqF%KzH8wIib7jh4TG#)M0l` ze*6F5{BHjVb{={5y-TV8cmjUkjXIrzT<=616yQ^Z%(tAxnDPdt9u2vj^Et@mZ7%%_ zpiA_*_Y~&oFH-7J-{wdD_x!7sdMWx?{pXoWkkg9=x)Wm_eWta2twIm(fnB=sgP4<| zZs(v3M^TTTLbqzqg0E83{qV8q`;6QZe{hR~*Z=zL(=qO&T=e-Xl;xz( zi=H2i{`9wZV-B{Co|Jk%Wb+!d-Ob-a`=d^8K)adGc?ad!6zaZ`&qts`=JUjiQtuvs z?k{5=Tr$w$_p>g7Y|lY|e@YPk-&*!Q^yko_`p>afU@dT<9vXc96V%~hb^JD0Vb`GZ zFJJFyFMBK2@#y=nNBj7nUmtQ$KY-2I^g4N7hOMX1|LXpH9`xiNp$`$Xd#lfN=R3@g zWAJ61>z>W8*Lr0#um`^%l)!@$cu)clO5i~WJSc$&CGemG9+bd?5_nJo4@%(w2NEbB zkLQkrae6vms^YrDa!LLCfqiPjd4pKLKN$`W^ZAmB#N*kK$%$|#mY7JZowtN01CXI1 zMd`4$(Pz@gcYvyCx~-~j+bQI=^%NWjYTb5X@Kik4`ssP|Hu2%~siy(99e7$}o{8U^ z@JAn_k#*;K^$fs>-!tj^6gHdG`t5z^5jGXgOr|EX@kA(sIudN1fsMx|5~=KXEIl5| zgvS)&`YbMVYdvng!A&GG*^$KLL_|HXQ*AmA#qFcAJ_~tQ@(abeY8EF9sLBWTxMv9J z7e9aCX4T(BR%~tJFckg6jAjUB}_hywV8mEzCA@6S(I0Jk76d z*~V}?!R!LAM6CMU98~jqf#%g*C!|6n%ca?BmIX8!fH04B+g=17>(EwI*B5JkgYD`X zLYRyvFg${jq`z0ECtZ0qe$!_w!N7Zq#?f!4dj>Xa)fUz}dVV?nPSf<1j&LsltQGEs zZE(+TgL`fZoa+PY)DUQ>oUf(tQ?9>k$20W@*BAQK>ox5gH0@UO9rBxzj`}>`r0L%5 z=(Y`k#>oDy8gBX?<@GlG=ki;x-cEEV+dDM9>C05E`m()C)4p5Nnz9jJ;z{{a3Er#e z-lypdPof*r_Cfl7pZX(BOAc<5&H1P=NR%n>5PqAwOPYT50iEW9I*ngPzud$FE@$;& zP5+T5^js!TQTYx1$29%NHNC^FQ|D;hCq0~$%hmhS8fWTa>P>YI*1unUR`dIu$4|-u zd1%}h8gT2BY5y;3oXLyQ4xv8uXXHlT*v3_Vs`>qyHCx$yNI@te!cphrvJXCza05& z)Vy2eMR_AcL;XOf{p-54e!Ax6+^GIWr~O-9di8Ib{@*pd(P<-(A<)yGOVh9Z zL#O#qoyOQ2k{jjWX#3R9G%alwiyb!e6xVlup>ZZ};zNH_29lTK*RTE$(Lz`LTc>e2 z*FS%yamH2-ftOGB8_nbYYPxHh>iH~QDUjvCds2QvyJd|0e|7x-7tcQb-)a8pY*%M0 z1KDXaF7YsCrr)|e`qW0EfgCnzTB9@Tbw8)v9Q}H=MbmGs<4y7hp?v&Cn5I8%OOAJ5jfolWJMFV!H~surz%(zfFqkMFtoO)@j~|2z*z zWhUIBmh}Z1XWE?7Qk|%NM0XM4A+L)q4<}nwf8p7uF4eS`)zPNGYY5z&T>I2RH0=&e zYjl`si68adVE^q`SLiekv-~%2!~PjQP6r;Yai%_mr+kg9AE9|%t?6#I^LKs+ZI&(- z#Gx~uqpwpM24Uwbis$rw2DXr^(L9^xInavzdMro#aaF2UNLxJAt z8_D-kpr>*$>hfKu%V+BWc{sXt>d~5Rm!>m(mqAB5XWB-_xb?iDPwlu{(;M4E z^gFbS%y_z2^WJA^ot%yQ_FJ6j1LbG(q;H5s-KhCIrjB+9So)*-&^OUOR@2^GM@#xZ zf3EI*YDm+DEUn=KT?H-GGpun&E=C6_KgVmmifUdXmY39r?6FxN?!a#<Knf|0F}ue8$!b(>C?(&BA$(D`qi9Hlh*M>D#%ohchTAZ{2>6nozeUqLq6Akzr)3l}y46UIzZE!-Gu z=JRAtyAN_iYzfPZ@+P_=`a`?&pMI{Fsng5T)hW&MshX$hvu13OzP(O8UDG{7)A@ag zXq=Apse3f-vovkKUe?t>cvEdwtR`EH}#^vaW7zwwokoO)4t5ontsuzOnF{zang>IFUjBM z^GeO6h`c3ht?S7!6L`ZYIO zo5vN7);A~c#WLC^Tg5^78N8f#u1aIH_~!!nrTlDR{-h=${Cd?ApDoO1bH{RpqM08+ z)I2|U3(7Wo^hz>)Nm0rtA84U00(6)JJH{GUJx%pYPQ4 z@6zxU0|d3*@J$z~Wo&xbqYff-zV9zMwC@lnmk$dqKyb%$K3-XG(9 z*Q<{c9qRT8O>bn%@~`U;pVG9SwzRH47+d>UjWhWgTN~_K>(%EquP{QLq`bye!#D`@KEVU(UtE*z+FqY zalCLoQ%+P0M+&qbLFp*3U4)Y|57p~-SQ->7Ulg}Z-rSQ6> zV?o@XAlp%;z7BYe^I0s^Jl+2$;3o_`v^YaT7PQFYFM)p| z;n`IeFO>39pT7e9l!a%?Rjsc-1pFBmK2A5;=PP5&#iB0X-vR$@i)RFvkMeoGg-b6a z`TQ907h8A+SAQ%+JEUws0q$iMrxi!b=bwRlCE=iVp~9jxvQGD}z`d4mvIm5nIlRL` z+X5O3-so`A6ZzTYny&LtfqN_AL>B|;{tLKw5)OSAyFkT!bbcOM$9nv8;NDBPc;U!G zEnPc_5t!;m_Ue9uM_{gs&c6H-@DDMsGH%Wa<8p2^ik9#H0QWJ%jpwV?+>!in-t}K9 z`=>ly6qTZUehv8N2!60qsO5+8%2a7Xf`8G%(dn_iH}qe!@bp5tBK08puUUA!i~xJ4 z|1IF(uyF2FoG-z@W8q;awv=ZW@b6o=HWs?wD32dnobG-aw+{CHM}!Mc3ZOPVsL14bQU-#L{ByV_b(n!=g4K>4BSr*4t>T?M>hLs9?nm94{*OETnIN}*K}j( z{7wVUUlA@^LgVB|*n=`JvN{vE-x4l)EL6k`(on-Bt}}tD;jKt6(>Bnkbxc!-mimyL z?kD_6B~Mn!XF%<@9qBg{K7IE{rMxJLrDaGucRJxX_n_?0N4jlA%ouSwaMuzJ`hq!CWxRTX%kxmccM&{PD&P$P*pv_9 z0xB}=(oRNE|>Dja<#x)_gaou0l%N{w82UUk~CR;U8Y9@e-q&eHd3w_GE=Ud zzz-2#YzdmMRGZgnseeQWC-#YPCf$v|jd8lgxooI%#K?f!Jnq4dXwHjtii+MCQ%XJVd0!8jI~r-M z&A9>iIfqA!=IlJ^Cg2tbmx4JiFS3Cl-MR(vqJv8p)$K40+!Eo?cc%*Z<3>&qz-t80 z;FVFj&ZB^xAXvD9@e2Fv6=$n%1@4K2i8*sDSYDjTSI~*c6ky(^)BXX{zLW5%SFAK&K9E1Dl|%aZ z9l*br@ESRlD=wRI&jNQp;ZSa*6O@+MJa8Y{pc*aDg zh08;7`WoS4)d=3NIt$|t{h)9Y!7m~0HwaJT81biJ9!S!i3UJ>EpkhOv&7sp!pY~ zF*1uDvo_;t!2OhQP@0+C>`@Q*OyGW|^B&37Xa>)6BKR*ocu2#a4fwAJ9$v`L9-S&w z3p0fx#vCL27XbfT!bixxgbIxm@dDq+lffR|9vh#hEe>pOj%v zjUE9PY)D^lt!e2jOJx62sg(hXw!KaITs!(#&1U z;LV`BlIh6K!1};;fgS77JAk{IaIk-~`N`5^d9E;Dfc4O6-wph=gtz^I7Bf{&`##`y z5e{M%eK%8NDIeMQJ%pbs7vPQ}3G<>ZP7}Ej-U_YjaX;wxJ317tIo$_9cT=D&7{eD_ zAN>gMLxfLj_X=_}_4p)k5g(T<%pOgnwaG=I%Rx3`O!FtR@2}@+{Eur~XbIO7o;ZjF zI%z{ZZ`RX1_7Y938pbdHQ<|fdGwaIhpl2DKK3>N3AHIS)>1|+e1b3o{%xFG*i0I64 zkij$sBNI>lF*QG45`N^9nAZGgtf{u3`wYr`2hr)#+b1IfX)HGB8qv-XEtVkFT4i~* z){0unO6!jWDQh*~NXrvk;`=%9EfU>r%lXPlY1=SV(H{@~7&J?*Xa*I>PvV?i-xon= zKD9nb4thS%F>kW{9)Q5Z)jU@2NU=PVE20QyYuN`_zu2E5FN#BG&LfZ$yYK=Ka3NpW zmoyLKEBi8@{|tY|cf1MyyszN-PV2iJPes$&$%%9{L%J(5l?;oGBBC-HF?+HM8w*WD z;s&-}F)T3^O{HRyDDUU?3oJdEjKT>EAb4Jb{aeJ^uz&Vz$a_4R31yM1?B1FuQ~hVSFq_?S%@{z{kO z2X(a6#`Uy6)U}SQP%@@%0pa@VaapWP^t}Bqf!|z@M_-{n zN4V1)aFUqte+~RLji1OLhhWT#MQl6a&uxwuCVG7MThLu-^Wo*MULXk{!e81PZ~2hE zVDGi>??7ulJ47pk!O^Um7R36}yscTW=nZdK-!?QrbzA=!`I6o=*V`lH+AA7P6312t z(|rCx^KtRf$xL=4itZ?VcAdg=IulA|CX=Rb_Yo|NZaf-|gEDU5SXE@Qp^3wp*f{rD zvIG4ZmJCg%qtKB-uOI&-@=nGlM>!Uo6GZdn-x(=47*8px}vM(9nCg{%bejgqOu#Ba~1A4*LqBRE>y+xky`GEq4_72_fo)e zb8f9eupMf-WTD_kws#A3upDWc;aT%(XrR(8!taAW@iZ*Y{paQYc4uX(U_FeuJ z`H@bTy(uc&zv1s&`1=X|+3@dyIr$%q@;4Gah0&|%AWBg04&ViSgLlZK7f zrQgi(RFuQ_k^ha*Cz3VUxBoz$l5vbfgv8(wN+%{{e5i*)WJqhqHt4px-~&zs;Tz>DDg*`+NMkHd(KJiRZV&#>)6fu}LHG5CjlP zCKJQAM#CA~4h|O%O@vX?4D~JPZw?oag`*ggt?V}|hf88qj)vng(_Y&=+*m9UiB5#6%{Qi1QddUX%%=x8cB8p?!-wbnzm+2K>sWIPm(GMeO~wmDoRmQKQTnE_ZMjBq6 zh34n!Uh9*>3;ni{4r^(+&no%32`oc}4*j^1E;g6X6$y^1KTIph4t=|kZgR0IwHIFK z>y0$y@Y)<1;0X@WYJjRY-SAoBa#hepi9G(8Q8AL zaj^=m@zP$`Y&2(v(kHR{TTGUZ=POd05cw#ne(O{NE@E(fY6|X}`ICl%s)2-@ZhaFR z5;Cse=NZl|<=C|#J}k;}gT@czjip$e(BhWY%_47;8_LQUQ3Tq9AiT($+b4h}+-5&t zsi$@?NV&GC(A*+)1?#LF7I>aG1iw|MNANs(lEw;fz_BY*_s`R~?Kp4p+f>A-Eoo2p z^Y*bi?HMkuU+zKE_s>-ET(x!(u0r-=a$V12Sh|?cFENnnxJ~CHn`W3Ji1e8LY`+W) zpD5SRenx_ne!DA&SAVpsF6TK-@n~6%KUcTA?Il4jT#obF&=?&#ziB?ExumTxXsA!T zd<1h4@?lV2F7)vlh53BN^tFo=+!|ayeAkdp7QdYKVkNR6kE2gw>UoJ`sMnGlPB2+o zuIA@Ek&ZmHl$Xo4s&rpjT-#0gX4CTwKP7w56e)N0Gx0 zPnP-0Jm*6GV#?>C4i|$x4dAYDIP_8}@56L?NfY65g?~!mS8BNJ6rN;^%pNY~CASoO zPb|MceXer((GCFH*GGs9(+kVBIXGIlQM5o9f3?E?b^*P$i5+<)+P6ycWZhKQLg6}J zW8jfObqU@g5xdCaQIcPZyj9hjIPpyRuMOZrve}^Z{yIg@I5MC*DUVFTbEm79CzUAM zbZUb~d%8w@XYu@z-0VqaCLUa!$1Ys;4R0ex(xY7W0go@*E>d3P)VK(X;Q{L&2<$U7llQHiaaoav1hNI5BvsWPcnfCGUm{j{mT3%D@!F=;WS5L)Op~> zt!B(QSil}ev6#k2fv(>=1=zuI1-^U$rCfakW9OWMttS{aO}Uadjx7U^N56+-X?eH} z9!}Enh5%8p%r<&>NgKp(BK$;+9GqqB;-931)P9=@9w}faWy$i|!nFC?@p9#;q1#F@ z3~I9r1d;lkMz9!dJs>Wyfbb&C^K^pio?>8U5G+(GmrgF0m#dD)nFNQyJ;5aszGo2( z#x7r3suZeu3Sg*|i`Xak(ruGGiu1%ux53$*2Wp7Pn(Ug81$23BCp-o~%<5*br4oj^ z5|ZV24&gHS3dYb}k;*O!8F#LvTP)Y|u*Bt3%xmNG2&bW3JYAOa1rEoojQNxi$@>Ba z7gOSu|3bn|Xt_Hqm*FD9(Owa3y>u2=uZulgU>4xX>k^NKq~e$LQV%yuro&5jnTO+E zZ4*mdUGCvSv$F__t0k785EL(E>iiIoMx+rS;ri|HXn4aqKq7fP)T0^37SZxjfQb2A z;nAe>G60o59e9|B$J7}@g=wx1?%K7B4%lO`!cHmb0o&{3d!?6#cFhoLk*^-Dm6z&d z@oRg^{xF3@(KUOd91;r8)xS9`bvm6_U+nk)AsJ)Gza z=V06Ang+bB5XQs{QxOEhT;j4b7gja1BMAJJqM3e`mANUl`4o0Z0E>+1=hKoKhS1R}5f zgx5AAhHXjI^9Z)#P^?U4xmx3$X5B)Z-whsp5|b-E8$qg|9^6<*r>CQqh}z;Y9*rJk zr2MWkah^AMbU||)$Gi&Lt#z`0tVbV#8_Q;@<$AM+k6EP1;}*g((DjKSk3L*Exl}6$ zdL@@JL^PAoR|qXX7thV)d8B9DFyZ2KBZr3Sa)b#!j@|m@MT;W2LMqrmj1BEl^pCCGEt7LJx8jydIa6D(@LEZN8+Xznkm^j#IF*@HA;p+P> z6#zTmSpV=O<7Ui3(|Qj2Tg*WZMsZckfr-SyiEKI+@eVUILD1au-t}hgIhDyq$CH`E zVtdvpJhOXP^a_5BOg1*ia}D@0@Ouyc?x)`=`MrUE?`QZ%`W-&ZzcP*6hd+4?6AnjC19=K=1%anJ=X0 zsf6{vUPRCERHY~5whk8)ED6zQo|n*bIy4durBWf?HkT4CECA|Dm(eq}T2hhdNNmFS zelI6@JV}CP{d|Z#A0z;!yON$$(QqOqKF^2KGaZrj^1q5;lLjdD7$O*L3Gn`nz(NEY zjwgn7U5Duz8AU_moL5+$6RFUs_1#7sO*E3#?rvT0sG)ZluEPkyDW5v}QG$m@IIl7O z9f$r)y<_xD?p?T?!A_S-%Kf{uh#x>wc+Nv@WBPCg%13fiJMiquUky>3!>QUX~bEEbQ$W3BgCI4=zu52X(nA2-9vlT1L!?<(}^J-Sc-FZwjp zJZc@7`hoiH-@CmWT4c-O8@89?M5qkd$8&J)pfhVM_>Ucq-DOf2_>3K#9Tz3*e}SLa z;f(h|=LO$zBaZUa{ss7i8}SIpHF^#orNbY@Ig{v}6sFETciMC1z3lB~jU5W}_JOys z7Kr$8e_-V@o*s+Seo8uvkOZ;-S}qRGn+a(C#Kfqyo2tVdjE1O9NS=sM@c1QTNW$>V z9^5FwfKIcm32sp1uy<_vnRL4~Zm0=v4{)>xVdT*Vd0@xEG7%5A4-t9Xz1i6KbPQuc zBoUrSgwp9mSmyMvu3`j z*i>}y;9i#RMh~`ougGtc2TMiA5f@_Q>e7$I4xzgU-z^^f1j0|KyzoQYya2;?5AF0w zUp&pjg|$t9@7dC)w2eALU zF0J8X0>@Np6cY^xj|qGVv0MoseyiqBUDt;n5V$nbFg32^8~5QOFv%Gy|G2=@W3ebY zrqE6Z>|iK0VeN22VB~=1`X%LAW|3MKZWGvnsGduuIGQ3eM)fNQ?DklaG+oMe zr@#;)nSqWl5(qrii#v8(8 zdd?HL0Ep(bueR|pw@pSW5SNolQTz$j`!t7_bXmHg6w@?4*E!wK zlPN?m&T#3{(eNZJo$x!;gJYG+vOCM?F@~8yB6V1gsEBiOF)$m^o>@#cSz3vto08W7 z{k6(EH5yGoQcSGdqK{#5z%rAF{N;MWBL%uRrsV>py7x0ImQEmcl%6-3=iTzWk)Kl| z;eqS-?bG$!Bz(eVEx4JVM^dpU0+J82foEP@7@imziG^dKxPxzHIBD7KusPC)PYcju zKpmaLh=>p%$Od=Iu&!?=T|b;gC0MgW(e1O$%m32qc`}69BPar*r!d=&$8NVegmoI@ zOo@$-Vx7itZp>KbaCS0f99^?Ts<7?GlpX@8Z$l@tjQS0 zeJ7fQs!l=#;ShQX%M5Wj!V4~h2;((Yx9b*-N8r_17UTIi7gF?YtHz<&f+8ZT6oFR{cCtPxSXd`IjN^Zle5W03dWS$l%o4tcbnrx zkFTv1edxcxV@NE61mX6EImTF@Ylas-n~o4-2syXFOz3uMT9wwu=c!;m-b zK4p2I33)e7B;sz0A|1K0g{))WF~Z732-qM;=-t*iCz;irKTW_9_J?j>2Ovb7?Aj$~aIl*`Q0&r}P-y1jl8?>zn;FbjiA{L(0UMvj!kYW@6OZeySt5 zvs-R7lnhXi4Av=K8EPVwjyc@sI@~b$hT)UOLRRy3b;xo%3tY>J>z3WO2ko!h!K`6Y7< z%!3F__)Ln{M_SIO1QrU1qc|*cFcy!5Ln-JdOjuCkm1 zOzZ~Z;^VjT*^4l3W{}PhPPYZ&s8d*(6Hd2@ZcCa|C+(gd;dQ%A(CG~nQ_@rGc_K0S z=r$r9h>hr+49>I@<}-*0$C5J<7lA<@GtkxZw62~@^B!1$2oAq+$XN+@UEyvWie($m zl`sjbWD&$Opl3lVpcLIbX6JHzdVsnhW?pVykG&Z>RX}6)Fu5#^ZyB; zbA5)Tv1Wn8H;NuCvexiPSPP++J8#XI$@5V+NtqlA;UpG!I}bqfiQ8>CNd#fqD8bBc z0=s46*MOZAIE)ORuCQ3?C$N(`9gZzZO)Le?gU$T%LXxv4HT-2_83a<9?zLq~XGX*I z{hncTcJv_T=hi0mDS>0Wjg4UH4(FX+^YjZYLWkGT$J234P{+q(a6#cr(cujI0_g*? zRF*nz7J3vj4M#X{T=Slsk?X~%3uf<>p~zG}P}zrV*^^}x_fPw9CWagBTOKRdxcz9a z4O{v2Oa(_xA^X?$zzHH@8bBRKVA=bl1K^EQ5=i{`sQ(}xpb8qZk%8#N58 z6kPEj^4O$dlN0WI63$Rb{#ZOvUCr6E9ij&$Rl-|cFaWCScD?tuPSMdKICL_TY3!Y& z4JUAzNoMJ$?tMND+L>IA2JdI;HZt!Ug z8W}K!=CjeKfxR(gKFubdCXg3-Z(-6WGS=_A*{9VWEoA8tirlyObY8w5A=hE6PdAw+ zR_s0tCz5u3d74i{MiW#tIATy`S)T6WSsl>Hr$Vtf9}bi9oZ-`uBZ3;$5ph}0^l7*l zG%nM8$PrT8o#oT9ywZo^j>K9)k1z3__Wdv;_@W3!X{35 zUg*;ymPZ`9g1gAakuXqO%1$mEkTu7}J`MU6IfThRB+_h1aY_s-r2GFRJ}sIP>r@;o zgg?a8LDOC8(}gM41l~K=Z@4-J3w66D z*%zRp_$~4W)SG+ZcYT0%B1Vx0*%sr+exH`t`gHP?hWxamJu$p%o#%H~$Q;5=4(u$# zfoL9aRllr-cc@4to!zszsN3M7Y8`X_)NL^n=X0eRPiFTc zsqPaGR~V`oAZf2sp;%^s0o)dkz2sc?`V-uH}-v3s>J%Mu4}^LkbfWNxV5~q!NkvC#PG(3IyR=pQL zp$_Abk4}OcbEmy*}*nJz0BJkqDn;^)}+-H4mla&IQEQ}}E z1q%&hDNG0Hu_?wfRVsidcNKPe_|h20uM6U71(=}yG}Fd?LAE`G5+ZIeuGia9c*+F=~2f96oBj+Hese?;iTvWLW<^rwn zSCPJJ4;{5wqu^nTrNIuGXuKE|*v? zIET@QU!EDq(HpqgiOTesM!HmCzL?i|oZD#N<1yi~;5lCf(p@qQkh&C7DQ0CS^m+v*RX@VXXD1VhMyAQr??vS_~=V&&iG-pka*t7+T*q zTN?IXj?=UUb)+2xTEH=%EtbYa*bLJ}SKLNhEe_Lp-lxe@WXDt#TR|MMrSmz>(!qbq zeq>sIaEKTTz05OCw=|X)t(%P7jmvU|rGYmO#>Eo_m*-52Hx&)mLmUl+ za2X27b8F3WEIqbIhq102P9+YKdr!;qT#M(09LwcA3o~u4#Y<~txK`msW4iMj=;%-m z92n$WgxG0qZR&o3rR9ydEF_-dL0w$8%x46VxWs&lyUf^kytRTB+o!&6J_cGi=UuD~x%bTnEw z#lt^Lc*4xGO%sjM}m?cuwkDz#>14BZ? zD{%=puwCo{iVHDuIfEoWJ%<>^A%40CWf|Ax7K?OwG)*b?>2bY15y|s6R-VuYFD@#H zfcUr!JlXxjNxK%RkJ0hz2KEu5$fQ0t$EO?I8sfj zF*xi^BRWQSntc$)B}8}4o`=xWOdoL<==sFU>~%0s*W0+{P2J6Y2h+goZ9Id<=9#?? zho>IIZZOWn>~l!|F3!~KYcL$Afeb&hm%(tp&X9(XEY`=tGoEHYL-M5~m_)`7`a{O= zWcD+d<`8T#R*`gNB+VD0R_sIDhaa$N;xHpZJM(cM(xbcWd{M_m#^kORFS?T3$HrD# zJS;&DS7hn24SUTJduj2Z>TIFFvcmbeI^1M!e!t@Q7&DLDPd3KHT1s#vc1dV!w`s&> z6AIJ@Wij*2bqY~pEN6;WH-RIfPkjz&oVQx%Z5n;`qtI`5^oSWiw>-dcQh|BqjUsQ& zz+HW403_=l*gl&nAI+C0aWxFf2Yb2n%%|q7)}Ap8%ZX#S%^cTVXn4QS^0h=p_Snaz z^tALqi^$=7>Ic}%B{(9Ca(Ib*BsZ(qP}t8UxW1Ol)RAGClS_Fn(-xtLE#iWiY8mHU zaS4aK2uY91I0usXvV40QQU6S%uj0jK&6?sT077rua7Y|fPb41r7iaVv;dX>OM@ z1L;z92P5D7PIWv><8aI4a2ab*+yubo$331@$Ivn&3G~H@%`WKw;&1k*5n|?D{3SsK zGT~~0l|H;t`vPcPhggof^{c>O?6Hv==B;pSS=#k2tsyB5O?1X_a^Qg8JEAow!ErT0 z%!lLrGQ+`Q+=p+_a1ITPrVNT@vPt8(LI$JT5a*tmAFMidwG2}F%odH)TTBMYJhy6G zd@^L=bl3Y5j=`KK z)~kTiOOG53>r}u}dAdoOp}JmJqXJGB;pvwvF;ePuwJmMt^`5az)g@Ri75u9!~s%SGoNFzVa$J`W~$sOU8T7JwPMxeGJZ^?inGg{JO z-AUO8@zh0g6@LGX$scP^qASA&@!f4>1$vR8D<9UKz{|~4xJs>7o-G%B{F&4@=qfyB zgM`ES+Dz#td^fAPFL#Lg2`MUf6WpF4E&~K2Qfz^qQn$oQyFb~E-#GFf&K#muZs1Hm z!4M%yXQ?COQ5#c)ej@Y{+Ong_Fumlr!LZg* zX6%%dA8GtEWu=&3+^UWHBXHOQ5oZ$_xtrGPhf|z1v81*ow|8)23E5P0EHo=amii4|S$sj*om zCtQN6+YCj0@by~m=z|oghVw0SqK2ZUQrRf17LGD_=LH&ROfVBu+3}^3j@Oz@ByEYi zEE@7-nn9P}jwUoCh*UvHur1S23z`JHSVTnada4P{7%mdwGrUBk%dOTmmTBaWrQ$xI z`Wk6q21A$w+5A+0BMmviXgbA2Ccn*%bQ$;v=yewp(KwS*8=JG8akQ~{4L0tkCB>}_ z7x1zvwoc73(zoW_zE3D+)@vbnbnO`-T<#-q9T+NYggdqjoEEekrAYF`eu{yoB)k!E zp?WU^cU&2q_N`D-vCBI=oSdm}INa@I(goIqryRUtjj7hzG&-&y8WhKtfxh2D^;!HR z7PE4S!^pnh;^1mxr?0J_+H7(D)&A1{+bk|Nt{sqE3-F~F-81xDazbpMCU$F81E9Wl ztM$_n2b#u@kaI{p)QIv1dvb`d4vU|ujwZqmCBAope2INJ?8+2PEtO|u5YAZ=e3OHxvFw`j%elD@=a+Mfhr^A%Gm?|^jji=KPAIt3n&Gq` z;&g`_!3ywbzQUzp-8!QI$4nV_ro&B?u|%li7DRr*rk3eh4i7A*KQ-xd+Z=qXTr3~K z%h_3<&UWw!t}4{8?UV9vcev<@rJ{Wg!#NHxGdPV z>3I&%Z+#wzx1@mUY#|o*QJt@KHwE3jX}LtB`rLKcpkBPr>KN(W&7!#ND8%Nu`GlPd zlFMNVI*jXcm-4f8m!X|kG@*g(gmlN7n^OAdWNhCaQ)h2JO1P15a*QS>oDOF{%p8<( zbfP+yFQUotLS5p!A&Af9Do5zf@`}8~P}&Z6R{1>OAHemC#YtST?)*=lx z@Qw`J98JRn=ZW(rK5croTA=b`fhhO%lYha?Co*J1+ta3$JRSEI-9!8ho->KjQJlDdZqeGutS6>WCdS$z2lFI(USac0V|!4J zJkY`lJ8iuBBYreLU8i;J5ZBR?`c(@6$qwFb=cmCf1DrLVz+rP#5w{?+vly?Y!|`v9 zKeu)6lm?~b5KTH^C32|WlWEL{x4`JVGuHpTnlxF&M@O+$g`16dzs>1%r?R?yu@1(` zphg}I`!$V)5A52|*k$%?ZbzGRD1n%O4n)*uueRfB1TNlug*u|Cr}$;$!df5B_pt9C zq+5G&e=l6X`sEoW9pCG1@oBsx9+%ScOK7Ce_N&lbZV4AhGgE2H%_^0jEg!)R$gT`D zuQPR?COr&~qZg#;rXjcz;E(sTu^Ec$XXXz|;jN_E8C>tX!2Nt3KUbIN?e?bJeGJ2D zCs$>f^+HpF@0R^Sem{FW$^(uyh%1{HY1>E2*WMR#>UTI$PX)z7S5Cgk97!24I-%_Y z1~zVCIP0a8PlQZ4an4J_=*|pD@B2UQAX#Y=DVljg$W##@M_y|MNa7~VL% zq~D!^wVuGRbkoJ+y(F_%o}qft)D@Q2Z+jm^vVXj--*CBH<5zRA%&~XG?+s#z9+M$o zyd2fhVE-0(j+f?q8tl~;s^r;bpsXp)dBeFnz2sM&HP=gvqB8!I?RVIipnkx+FvhNF zm<(ZDc8sG!=dFz~ehMtaD$8^jGX-`K6ORL>@^RVD;kLn8sd?m!2$q|J>z(fIXB@^z z!Np3)&;zUwALF6GCrd|(o6$ks^C)n$SjER&?_*N4Q{I(#q+B zNH%xdwHUpp(JaR7<{8%$w#nl3f{fwt4_i2`7=+ZwS&7UwU@Xs&^{8jI6rlb0-n z+u`H9MH%6SJe>cYwo@J)HN|B^8H%$A+;^wed3g$7yEr4>s?Xuw;!Jcz^*dZ(ai;64 zHaon(Kx4k!94@#(lUP5qK3hP0Vei%uy9JtsptX?SpW6LII6-k_BuuA|=(J%vnwY?f z)ZAIXv3-oEWi?+jX78%&r}#d`!J;9o8F4MT*kVIATRcr#aBM=?bDM=@l98cnIguU< zS%cr<;|V={m^`(t^FtOFOA|`(fU_Q*ayaG(UkRsC>r6R0tPBp!gJaQ&saW8hdVPjQ z0w1yK9ZSpgB+$qxE@7ohccfmb-_XVkmk=%}pxq%`2esMIgyIK7htohyS+-etID;A- zz|A0;jEk32JL>T`MTysgvJMOx939a&b&)dlol>U^7Qu0&6WobJ@5sNo&dMeogA*4w zvC#z-4)59-b5^|55S68^vA`UP_;_uO9Rcr-8sJ=e%PWgb34Li(J&2FffrHQiOt~>Y z;9@OYnj`fg8m9+%jWI<$r`f5`F9AX@T7vY2d=qAkb*JdQ7K0cn^acGadT-`Vv`;WT z8Xv}Gcyx;dMYzckM=cY+$0dk|V=00A#re(4c%dZjl3N)qw;k2_tQl(=3bBufi!r&r0%p6E69F85{!lC{C?-hn|~2aG|x3ASes1G((jx7?i_OxE`AcQA}e zfb9a%!LV1kJA3`$E{528AdlVq0x;}P0v4phI3}=xU4wgcSr8M8^6d|#MJy~}L4K!U zp1oK;Mza}u8$!;=koFr-@lK#gS*DLkRk`fv+l)KT_bxXZf-P2>tOLf)T-8ECU)MdJRWMi98He%3-h!G=;h=`cYMnpwL z%pzh$WFuzTEFvP_5N~K^T|{)ret+jY=lMVX_x-;;<1YKz`g~^k{h#yPuje_}#Vhp~ zqGQUqKK@7vL!b2R-N)Ycq|!#;&>PkGH`1Xe3haqS-_Q|#oU!)qrt{#9=^cE)8p06~ z-eijPQvkGfLas=p2R$n+%!ZM6iF8umh#A(vm39rp4r}1-YZBGQyk}bQ1n%5FxprNB zRqWm1101To=7q!E$&{_`2dnKL$~4!?Jj%y%c?g>|_AxNzzml5RF`d>c{$k8K56`g) z*~G_q<0od`JjBS^Hg~xN{7ikoFAP={Ty7W5{=8vJj$fF0WX@dQ3s}e2@vYAbE-r7d z08&}E1y{xB;d6^+eM9{9%nz06j#?eEnb*q+Eq!0t_}Njv@w~nyx=%u7+t0cS!7Ryn zSTNuSg2D-0fVNM_iHW(Ora}5$ZBWb&2Ed7lHH)r8^gL z`D4u?XB4SL1gF!wg!ma9GU5uKQRW`d2^q0l=9iM68u`>JaizVH{Au;$=&?0%K8?ev zwlrLviclew`trVcfp)i)Sig#fAhixZobQ{-`Dw;I{G?02ly4X-u_o;s*Fs31(|kye zlr)oyL}Ijof9v6pb=9RaN*cSQlty}@e4CpSeM>h~Whh#P-qi8-yh)!tXJ)MBPqq8u z{GNLTskX5xxP^RejaCM8N(h+B9Zl!TisrZ=4RIzMKmACe6H1uVyz*;Pr*r#7_HhAw-14TF5nf(WCDAy`hB0_D-=OuG-0ryp z9MR_SsvAV8KX1r9LSrx}h~WNSa^{q^g(4DdnpgbJh#ApH3kO%~E|JprYJ0ksjpOSB zY0+OCC{r9LSYW2E69sEc;Lm0t?eg9Zc3iNvu9z-SB)4{;2RWF2XRD`}T)7`*i|D8P zUd6b+U*n1v^ioGu?{e}t*Nk3Ss^+|sq#FCr=69NoI289=&Q6!1C0ycO$Nq9ZHnSWJ zaS+3c%}*TPm##lOD{i(}zO^HjG?%V_JS*Q?ido-TqlD7N!+mC`4!fn?^;61=oq)A_ z35^=5BSpJzC-@47g$V;w`f9|}`wJp$g=jmbM`7bzjd~iMsp%roYc<^oV~(3+%dhHz z81U1n9T*jdoqILzunz57!V7!pKc+hCxD^?@PUvLyZfR{*=N-p**p!xUP~AO_rF9m* z2IJ$@H{BzybB{5|>I}S4yJfTQ1ixoIx8F@X$|q_+a50zC-RX2Y>y!B0D$9;}q+Rk3 zYz>yHH<`@L;*O_G8*{3J5Dn-J*7sn{=js46vGv;^D0pCkz9}>O| zZ)@M&QC$0Y;yB$ok@iZ>H#XH>3t6^&MR9N7nxPRG{l`a_RC^7d_5BiOJf$?cY&4zs zA5a_R)1Ft@MOI2lm-U0yjyHx);O#GDMF_p5WXtT#q_kFR{f$7cOo+vn#u46U=#m7U z_c#tJ+VaA~n*$hwLvW-=**)`*CLJ6>Wew*^j@l%+d=y{KK;kM3^(CeF?9!9}fc}kyxpZ@Gbk(gf5TO0spceFRP43npY2|Sz2E9m@&kz ziTsf#=?M9rAdbxdKJXX{zrF<@`ae+z@p%T?S?K;$k`Kk+{~-G+w0mGli-kXf zWW4Jez750fVsC`c=BhG@5==OmgL)tEXDcaFFgp^BVKDqst|L(S37o6XwTHIwM})hs(|x68?Xg|m;%s`H}dkw3FLE3Ky;_T>HVy%+OvUCkvu5&_h=vUt%eS=Pv z(P3F)8kYvWH@!9`yAcAjl_~9>3i|FFbq5qgn+e_{Ecp<^ZZM6HWE`MjB*#lJ(<7jiPg(fz7Vu8kHBB z9_cQt@SF~r9_6iE@@B+Zby(SsS6MpOj};#_^!YyQ>qhJfuBT=q90IGW_kN@E&tF0kB8>xUT>5Z~u zXWpp3S@JlA+PjwK=#*d=PBwTL9QSz6X-@?Y=ObSK>cOULTpN3;fcZN3c>S)zF^&me z^*BMeYaFID4sx1fIE7v{W)k82tTmcH?7s%^Glz#+X3O4b;8RvBn|%_vfpXa&fm6L+ zWLihqh6T>@mGxmC7PvVKMs92z_8NKd{TX;(#3u)mRtF1H{lRuD@Y3VKo$DU-8}Cgo z#oCSiSfp9o-t8S@M%2SYm*KD>3!Fi1XN7au#S>QW+ z8wUp%Zt<=4de7@$ljy;3wzB}&P+g1GBXe}UPD-*6zE>O8=l!M3w^N8ow;NNS-rmjQ zffLo|cpx2)Q#Plw0t#w-68*7 z)#}L}MsPi|Xh~1&JEZ5_LGK&Au`AmAT(v7-_HkhP`*=O!<%G1@oKV04dF5Lpc<^dZ z$DDkt<|I8a6(VMS5A&{_ofe-*{aBxek0m~h-pKyOm-=$oqd0YNQjarJp5?HF{hU&| zTK74p!`rQVtgNriV&km2QaXS4H_Bt8>x7Zc-~WwtQY6F!si|Izp_yW`5IlG;|%83`$J<^BzvXSLdgLDNLlb@Zr}nQvx@?`;RUKoA zt~_uBV?WtFFr{wS!x~NZ=(o|983^ya<7ZYnq+Euwcja$;hP0xr-gJK!{=B+t*n&pA z*ms0qtnT8*!Q|n#;$&R2dx3c18D}>^*Uv8Eg7?8W)Y6(DK6u9AQ_RXCMtBKp_!%Qk zcmr4Z7$atQ16TSD!;YkZ>$LbDdsAPUe!pVp`tacoO!AAM&p*bvt0wsa^U01cMwdQ6 zm+50j)}?)ET5sCCh@>^r)c5>I)sIK-eeW2>yGC?Bjp_b*LDC7q46FWCHZXFfzxbc72hjX8E=r#v@`GChrtT}WV z3;6QMah$V)ukCX;c|}vE4d_0LLcj4lHI5|HyUqh0n0x73mNx{cz4hiyn?9dj?zi-a z$-4ATKQwUo3V1xnGQkF>%m=QvE5QDx#7*8pjaTJi_fo<|(;FPSmlBR#3+pgwapl4G zrNnhY-vqmt5?-!e1<1)hN3ekzmX3L-{Vre+Q>L3dxrzq~=0fW>Xov4&y#25$llsmY zg!`I#A;0}*mM660lW)e6%DxxZ*VZQ%U^)}X$@+WN;l7X|5|<}fkLf-?@3?7&Uz~?~ z5J-*FZO5TrWQ8?+hE^k97e;Vj8}ed5gR7yM1rZpde<01A&^nav|(lnIHl${_G2dtCvft{ZrdZ zKR>ax#jP{Fze%vBJ%Zr8@5DTh#JTi*KZf+RY?!;#^P7rKB=zxPk2Rp4G0|a-d@CE* z(tcr&Ssp>k^k!S;Z>L86?5|m#qzxE*Yks#cKl|vJgQIAlxVYQLJm`(j8~fvX^8WC9 zo?UWH9vaFW(!}^4c~_<{I@h5R*oeIY_z5=m@PQ2GHO9C&Y~l(`1@`D_akqT0&cx0f z*Td7@i@4t9?UK}q?b#l;%pFpAn=aO}9bFi8a7IXBd6*+sz}yo4r!HLXx>8%L#Xjqg z!Q^w(kG{?O!Cmn(MRzO$bKDjE_A!HH!(ujp#Z1>T`daDtdp0DWJ>1HC{eI8}^G#n2 z8Ed~Uw86AvLnuH@s=& z!7TA=U;W>fcM-RY^4MtoIrFl4kw5ZQF6;ZESC*$y&ud;bPiK1VBC4s$PEF^mzcXHL z49$KjkHvtk)ZoN7Y^9`2@!Iq*_&9sDS(~lC?m!WKfV`rlI-4UtFus9gjMUKU$44wT zk2}RspYd@b?uJWd(jLYS5Z*g+XqVy=;?snSV?i?d?1vlQKQR7g6#G2euiY(}Brqu) zgv!Sc5Nr=TEGp1+Dj%K|<>Rk>=G}J2;q!;`S1)+L;aHz43#AFv3lzLhWxZPI2rWoM zh{@*q0%ruHPU0@TJIeo}1e-15^5Jtv=}a|4Wqq-K%iD{s%W-|vCIBmI$*1mX1zYY= zI(pe@-@HyRbO6PXS2KM0hfMJktR0vQ6B4v9E&Bqgzx@oab-tqKT zY`G{pIY@Ja|C0iT5-N=S$(?KYLRrG}yzi+%7@O@I(`)^4?O-j-pA=|;8J^1on-d1&j&tKpwhhD?uVy2sYY^Lt}>P8qZ;jl zKjHOPV+n4t6_NG_hc4A$o$kw*=&EYG$k%)^*jQF)6FzZa&3|Nn+2`vrq*Eo2-w~@+ zx?c&)on-u3dvn-az^j8F?_-+E7cy{p9xbkWdU}aRVcH2kuHp~oISu0)l;7o0B_=4! z%k!JlJ^4gix;)R(=XgA(edc$6YBv#1rV$g1mlQTPf01_~R~9c* z8O7t^dVUs0CebTw+|4%0aUPE~&7;{QIUEt295<5_Tq*DU0k1y_&n*am+Hf)Rh-zJY zcYD}xFH+-^^=P)KEcN`uWn#&@`YYPsrINmnXF3fB5w^ec`-bD|cw+BpJF!{v87DY? z5jJ6aB$Vd&R3-Sr{@%5VNU77>Fc_T1!(#z$T<|b(D=NFFM|y>6 ze9q={955*!^7#x4TeOCV%i4N7r@<^0OT{|yES1mohx1;WMe%0lW~aAtxOrXfI2JdKH^Yv<#4T*YGFZd+%OQe({3f!h z^7?N}XWH~RjeJhl^>F!mh0CIOv_FH7`ziHPaYBjb)R~!Boti`D7O(yRxcB9wxi83d z5ayNk7bBI!re`|YhGsOuE+84@c(XNeD$)@#T!L8(c9Z%yR^p_CEH#&eyDQ-!sunnN z8+qSMzd|qRhw0a~ZN%E$V?S%sht8MD+P#a>(IZB3K7nzoTiNe%i;rNYT(O>Vx}S)OIMz*HEF?lzm*8I^Ps7ln&EcNNEke zhDyo_95)}k?B7aWk`gTYw6gRQI|tV{teou2%HdmjLx>+2>-NX!Pph{hZ{wZ(A*B@F z$FIm^yE{9vQ0h+aqKGh4oh!!h$EkDIERAf=?5F0ZmUk(hk%eYjUwRsAhNKhEyD8w) z1XZy$iGQDf&97X1!usqnwk$s|-)kOQ%VE=$CwsqGS3f~};_OvvgJ*3(y|3Sr`>In% zdytoVmK$W4EdA|R^1Yqm$gB)(?U#Hhl_9y17=+db_FBMUw<9+qiXFDslTW4jhMyOB zI1ZK3Vlk(m@iiI=GA$MWjrBY7`5=>e?kclQW)qrKcZ_X`Is$KmOp6!>4%@Z{+WZm2z+oL6-=uyJ zyC7i48>ubCDoC)z*mI_yV8Rx(_c~lf>^XB$NGMt(ni{bq`hIZpO_m`TE{5zJVld@bd{C zUIV|tDdl^h376s@K?T!3XyWF!-7Z)8;O{lcbH;$@gU{E*^)@*uk!+ZuiMI#7Un5P( zYBd%?U;mWGLY5&DXm?!h`Yy2JsUPZV`DZdMErkg)ZZVxf>{cWRh6z%r(&e?>OluTZ znJlfJQ&lrv>dpMt0-D*Wtg*f{NbFF*JKQ$KkE0lyTn^#NPOy)@HBhC-_wKqZbMj3t z$$rb0*&N+dr$ZBQe{&nIjI;-Fh=ZV3Zj8z-KK7^UJU%{Xf$z5ulGX95I(@ulTHAbY zosQ;qdX1{{KFs|$Z$M@1)NgpR8#i+jVO=Lt_kGaipVPW{YI)MxlOjJ$CG$aq_Q|vP zY~?s_`mQh*jReNN9}=FEJ?tjX`SU!|vv9k#6>M^$mF-1gw!*>x`)S(7o3Hji!E+1A zY(rMshEyBhn%lU2ZEydu*S%&T0BjDbY73ELw}Fst^=LXbeujEo;j4S0_HtfAe2>H( z1AlRyz(q*qLX;inM8NSO!wXB#D-S1)U(lkypVb`ny^Uf)v$K(e9=6=s@jhxx>Fv9c z&oeCVvTj~|m+Ku^jW=+KJJZw)tj;#lK!esgfzmgP`TDt{AMH9{(D`yI5}h5ANb^_I zN}aX!N!as!GI!niMPkk(+5kvLKv0A zHm$#XT=(+0E)k7r30*>e8(-ov%07Xj=3C zoN|wD?QL4AJ)frf+smx^TTLT<@h{_E?)N27+T8a05^&8Ze}BXp`UTq2EWN(82jTtm zA(9l)^Qx3ue5~=!BG?N2(+1pqglR7X*vE%=zS1W}E{D0_uv&3T;}*2_FVbGlC}nCq zRs%o_v%kNFy%MTcoBO+vh+DW@JKV)!yx;-aV`jtdx|FWgc!+imrZIg4ijnPGjOV|m zeGPjejww#y5C|0FD2Y9V@iF~mK0ha>FUsWFCerK1FP>m4tEk($EPzinK)_?SRQ-VCw>D$ZxxqKET$CvNsc#wnH6n0i~kFB=* z&8%_pF73+Wrmv5IG#u6n>`8)5+YU*?i4tk>aoS&(m(!@x=jg6sX~VrI^@`4q`{9=v zkMQW3yW+z#0M`1b&vfT+ib{+qJkego<`M5xI3sfNywq?gO`$!E6KyJG7Qdo4CElko zIPLY(#}q9PYS(w=^{{psE@yYn3B5EA4lDgUU}I+K5PaL_)qG(C7BC#q;PEZZ5plN+ zt^kQjcQ$=5&aTMB#P;C%1e;l!TMXaJRf3u08OqXr54r2F`Z~0N^D4A2UxPoMc?0e? zg*Q(&!1MLjfQL<6>Td%#HMi(SYRV^{q;mU`%A3ZED(da7^9zrq#GzF!_Frw}ru^_( z$~5jrdls87vE$Nsp)XaYq5egDq10`-X8`|f?{L4y!!vE<-#FwUw{=anFIeo>>0Z@L zx00ebd4kjy^rp(PI=#IkY;?^K(dG@^s1iRFbAQ znfG~i=P!nh-hb8FR=|l1oF?JcX3$RW4k>(n9Og4B==q7g{k>be`zP*i7 zyJF0IjXO)VgsI)Is?%!nGmkeSZ+ZD@_mrjoC=`Co*Rv`2nA{pY;F7U3wdlSt8aN;0 zcn?8`DefL_gzH#(DF9)dF9Udml!^U-t?K~Z9`Sv&*QnaMW-;dQ6X0>U%ci!WG=^~| z!w*JJ!QSJ>y)=WnJl{=RXRfwWGav9pKAztu^3gpJbm16n<3?^2lFzLM)W@!-S5~E9 ze01Ew8+W<~u+MOqF8pMFQ@${;60i z{B~IqYntEA567Pbzu#_iho6tx?j)B$Y8yT^2nv$8>}l-q^8rN~W*ENa@XaxcP!dZzVrKB!=0o6R(|Nli#u0J*Pi^0fX0usOv4rNfwyptp(9=dfvA(Ox(H zFAa7P<2C~E+IqqNrNP2)3es~!>ioeEX2O|p(CWeurojZ^2sapU_zb2uTAx3Wm-Z%VVdb!e}Ea3RW z^fFAC;&H^a*O+$Wd7shz6R~2)+|MV)i2}fk5_jC~>BQ-{u!!~oo*VUs@-sSMQ_Cw! zZ$>;7Pe+J8Hz)+v)Q@>hTK}FfpCl=xucMk@cAJErCKCV9U zJg~Tg$k_|h(JLN;RNr$OMwaI%r!Ta)g7opP#vQMRgavwHy_RpV*QpI`a8K3eg0TRq z&VQZ9nOrq@Ncv05myqLYo`N@WA7eBmwa?QKq{i&SdCb;U zjLRpUnph5IS=6T) zGnS%3ywZGTq;E!zJ@;IeLy38Ca!6EVX{tejSWpCOx7mG4ZisZJcH}XEeGulrNmg`9 zwxI)Q^w6pKZevQ5NSUJ*6o&EnxVPnFgWrjR&G|i8c8I>}O0rD!?h-$VIPS*w*70@E zdyjDN@vfmEcdZXcY?Fh{)YRVA!j+?GoOdepbZYmjg!g7PkQ(=U`|~bh?1Z!+;&tH9 zxyYN5HfCppTi7@{Hen&AhK#lNh9MVvBXdIvo|QLmF%(x*vUH)eVSK(`m*2Vampf(G zJ@!yDu<4(k$$FRt4hGr%9Rvd>PmXz>O(*yJ_N1~h?bz-@2hJhevvp^Qr7YkSgJg#)(Swig|jEV!M| z6?e;7+H5x5=BU*DC8i@-lEnh*WBNV0{cD#sr0z@F*9Y%Ghl!ztu2;-I_lCpGuY{~3 z;`}Vq7qpppP*%3DTN``)8zmU`7d$9Sp4VQ&CE=^iXYrJRkA2SP#S`UO@lVak=W?I0 zr*Jci#NgHQp!Ppw_85-Wp~>kb7eL;3^ot^Igp*EtEyE|SUd1aF{9f%r?ubag*1Hn> zE5qiGIw$xaMyQd_&AaRL^G9nY=s>FOIwJSfxJ2uDo0k}a;Hy1o^PFrzTwd(-UMZ#y z8<7FL&;3{AGl?*L$9iS0?(Z}lC1;wez)$y%oZsQ-Exj1SGEHY08qKkJt(16E!;@o!m5}RU8&b4EC$=7wq)5f6 z9r#`^(lF$T0nVBeuQuY=y_xZLf6a=(EJL*}43;D=YC&inekzaeg!w9llh_!7=ln15sSK3FAqiBH-vgwBzh0#Ca_VG0 z*QyUWQ;}{_K_U09$w41;8}`gfhrFpsH+#6hTPKRPJ<>=c+59!rN0FzhI8Rg-^01;T z;-mErkFIYY_}&7)(!ejlb(-GTOnUap|Md<034{5(8S59tdRWLMK5SstVbPkPFl9IV~LiBmmVMIS!Snnu2Us}&&4$rbe-I2kY zdf3lB71m&;1VDAZF|RpPOBOr$`p3)(6|Y42Tc7cJ-o(vZvT>G={W1?!?ZSMP_cd|T zs}r-qZ{Y3I$Y*9r7I!f3;RfE!4(k2ez)2iUbF7{0-3E^9V>x6FikDEf6){SF*L>l3 zH*szV?)y3Djkjn&H%hSRE`FP|AT+i$FFGzhTD0PAHJ)U*vpQuVAbc;4Vs8WuGe2#~ z@*U|fh_GuaaE#;f%DQV}8kjM9iusSb{jFMqNgrl$e{Y*0uh5|fEk3gPv9zADLU#mR zgr$qHUr}n$`VZ(JI7}6zOLSRc#=Iu`a2VPL?sR`XaCoP%7FjGSc$qAPlr$N&R>(RP1?f&XW^}{OJ+g$#p`P!(yoYojWf&^lFqQsn{ev3+RZxGP24}?w9kWBcsZY zcXFK{wH)FJ&3%7S^(oMbQePfReHpJV%(x00W)#M}^Y!?e8ZQ5DP{vLDmnW$g5PRWMOO(WU#};{a7j4a!r({NeNXxvCi||0uaV^(zFlMBrd&`o%j*~B z5@p+f(IVFE`|}*SY-RgJqdb<6ult)$_X2uJ=4dqG3OkYp+;pFn9v!4I{nJ5X;D5LQ z4;`Y|x9?E9bpV@zdunt3_V(6iOJ};fFu}&0V;d$zC%eNX1`Jlxs1I-oBh*vbn}#9UgMl^33L zzn!rM-{p1afi2w%e48BdFh{3jcOx0k(1KR1w;|52>dv~7p>5a|Lom(`Y(MX$Unve6 zf+#H4QXZYVqltHX-rHTPRPvI7pEWcbSc#_PS#HIRGl7<-@ftg8m+^YDIH`BAuf=}c zg_XEpxtII$txjAbUn#em)EetcmR4FH)Wmwe)L#(YoHCVO-?5*2jQ5TwTJTk?AI@Yd)VyKeVB?=(d4K4yVi zI@#Tj5A9fg0iW8y65rDDrnWHIML8>Q#^4IY9TNCD2KMOfFMJ`OP}SzgFZ4-fHQpE= z!<}A`xubl1F3SerdC8qQ^cY>I^UjIX*I!M2O|dB+lMGH5*yIErp=3lU-->xoRHxHyzA#Qris28RDqqj z*+S?HO{Q_pGL5RUqD#B;kul>zi_Z@{PKJJV$bWlzZzb+T~G?uVQ%HYp8N_+C6a%msPH!k<*Gk3VMD)YbT6X*pEiTc3HK)30pAC z6z%?{e9pKkidl7Ws^M>C5&>m8n+qJ`NPMX#bexj~9#uT?vO+$K&W0($Sh?ULus}(J z;ZvYa11k&{y!qb3r*DmeTvnuo@V|!t-WumWi}FdEHrDI?w!^vb1rUSiGK# zv@__Zl{=mbujo{;MC!|GJ>R+;*f$7;6Hg8rK`_*>uxm0U?JM;ln|HFA)jt)1wo2J)V(@qBS2qDx_+Js!Bj?LYzuIp`dlN_Xk zP&(`GGx?5dn(9JGxbPJ}0j?Gidum8J%P{jbkEHd}??Ww@=jn*<8Tb1g%X{p%rE~-K z$+^I$eR3(!eTFe;FWrZ`9p~dx(>Z8F$j1z1DmLo#=KSz-#8EMtDXZ%^?ep^Km(#le z{^84(O(?7R3w|h>e}Y&;&(gP-&F$TM*<@O0HQlN60I2{vto%S)T*qK{s@)Am*`WrkzbcEQT^A@(g-dAown4oDdC;oGhT>CBh_Vv_l`W@VD z1tr}8sopr}%(u&>xp|aRpEhaP1Ud`pUNiqLfkV~;@tV#zINJq0^y|uYT=6le6Xrp# zL25_PVD|o+#9~^HqvTp%>sUM;Bz3qP5hb}QdjhUFw4<1BovShCTV5Zz6^uDu@TGIm z0SvWMM$OBaxw(ng79_}$^K9>(pk;&hr->ud+QRp1e;W5@kJyB z<1zq){+(@vJ?ncnP!T7;&WqrOUDX`caj$heEaL!0%onFtT5;Z=;E`3;f&9vJuNV54 zBh_`@L3<6@XtlF(c&*ofovN!urR0t<#;rw`hu2 zhFsLXCzpvFpZMd*L_6IJ%e*nV*(V?RGXWE~x4{$Lp&e^DtcM984t)|Nl@M=3O?w5| z8){+iJ|XO;jRkM`L_W{l#8UXkF>#LuZgJ!2`8p48_>{+B96D(Fnz5Dh$zx6IX{`qJ z{OaOPA|_QO?u{lws5W& ziSnUSzojUQ~9xL0YFdjmz2f z83{OJB+Ch!_R#wh8FEJgpm7YEP z?f*a?C+%{Ke0&kS11VtBIFXdF#%)h>rkg4xueR#Q_ zq6|p~D)B91@4o13tWj8AXbmW>r|eJVeVa(R)%9fL0O=_O4%vn!xhZmMrzz_+=5R}L zrFuUPq>+9i+pSv*X;Pn%VfU984##kQTI>5E!|qSFgsP98Hpq|a{q+s>JyI$lqLlW! zxvf45!|^^IHP3rxajMV<^E-`Q7S>1!X9kD#M|b^b+HddI+CtxX`qBiR3a8LoHWr+e zX8f*i#d-bp{zo)p41|6=`hZ91o}ixtZtiL9+=;b*+t)-&kXJ+c_IiV6a=(DMK*aLE zoEUSv1z*E`0~$_Iemij%+1ix)F5!%|;v@ZOt=R-;JJ?#)IF2{r^Rvtmp?WT;yz;#K zKwisMNN#wPO3SnSu&VGpve?_*KfD!&0tlRP6peIe%G1al5>fwqi+TK@<`J%soP@xr za9^`<%(E-J@>+b^bUx1U7DB@2{I2;e^RMA-F`vuKCrmhb+laBwJi>%?BekZ?yPn5@Uz(Z7zO4f$ioj*v zr7pD$L6?jxiyGZ)YcO)PNsUW`G4FXG919^y!tbRMIh=y?ps1&Slxrt;Rg6?nX-I{}^DfUlyxs^q4(7c|dDyv?2{H`zZmPH)cl&#J<;x)yk954Kbn zBykJ-qS17|elulKf)UZ{iM>^S`#5~MF881jPe-fG)UllQ8;GYP{EQwRK3)THbcCNc z$bOtmZ?imUgrDEfc+=hN$Iso!?YRjh*7v7LRsuyD&eA3Wf>U0Om$e@x zql)|U+h{NQE^!?@0iNh=DYG-OvuH+3#Q}VLhnika7VUP}=xv=!-S;t9(x;Qzr8b z5_isbXdL^J7hJwpl-A_Ob6?&Ky=?MyROl3rJJnMeL;RF{q?84$g)Nm zcCIE;^^Qr@|EE&_(Q}YLb}6Aj*C+^AoUaXd!4E3o)7#R$)w+&#^j(?{J*Kc`H2YMd zJCqG;$NBpDNS+fmqsz8CS-hRv#kpSNl8)!23CEdU<2ni@4wo+7Nu1|3F6DbH<>M@` zakg-0CkTqxc%yu``bDy)%$+{M5yC5j(>X)&-oN_%5OW(HvdeI#pu3I0&Ud-tp2Bho zM=dxsSD4QfbFq}=d=Ks6Y_r70dT)R<&rv70L&Tal1`D@|Jn7{#mjy#DMrkrd)8<)3 zV^{KZzn41uBF*d8Y>z>2nErWfN>{Wu?ELd;olwv7e8;pHrAX<~*Xn>AsITCLG>AT} z7VGun^yyAD`OMxah4-=MyYR|cUyoY^`E3|9CT4# z`5I{eX<^&+`@x&VR$|MnI`H&xb$pP|Or*lOb#$|bF&4eBV{#ZBuNQ}?-qvh)S>L8JH_L2zI4t`wyt?FYk-* zaj*H6r1bXGXUW>!w4EYGWuQRO;S6;BMd*)&OVaaq%2PQbw<9FRydE zZ<0kLCRPVK8*mEVcVbb<8+TPo@lTR&ttln&eDEY2xY5byUVnZ=Hrn??YF`;9!L>rt zFb*QrzWTkLOjGsn3KmsfQw47B>4nAIrUra!9eDY^{gm2MCrRz70jj^IH>Npa{K#_N zoPFy+G;z8Vc4CcVBdD~Fo8Wp%`d+19rXQwmF1Pr^wm#f%R$H zAyazfYdX`{x#H@5(Sp#tzqf9a`>?n}HgTqVnsD&k z8~IEfmG&>Oo`OdI3ECR#cj5#sdt~f5y+O#{qMy~0K<$k4S+U?2r3=?U<$Q_0mQsWrR`YaRswi3hQs7o+ zp28R!RP4J3Zf*54O36rN%60u&?{A$j_qhhCEzhOB#vP1R+>!gK=)?<|#$Lkj9$}{+izqQeC|OwL(DE_UY7*6PW#9C{xcfCNLHVy4UpRY)?DTSZki#LIcyM98Xb?_ zqAUU~iCEDJTAFIgb$^yR65QDe_F^p|-tIVmXwfQXAa<#nz3z>}4SAM}^)mu>w1Yn7 z_5GbKph*|1EB)?n@8*FFMPSc6{1lYIG(45^J@Iq2<>+|p9q;H)qVHn2n$K7LeI7gw zda3rIa{CKdDp3KIBxkd%>vV=xjym4Iv2nQ7eG$if=`0U;caP9Ir~yS=18(WJ_X^u^ ze1%#ysjR);HEK+Fy@i86{`1j?t2_G}$6e2KbbJd!&PH|soO<-}Jcqj`^y=;(GKSql z3?6RQx~&b|CfcQhMUJ*Na2uOO3CCDBaFmG=bILbXHE`rpou2QmCXOe5cT-~}`E>BG z|7rBMEXKQ9Lh`(2dhhlZwt9OUKYbIYa~M5YM{Qg=664;_<^@KRtptm{iUu068xzm8*Yi30uP7`2Mk-tF2iv%ixPi@lS2JpA%kKMny%m$Hu>KD%6M=*L)$Jd4Z6~Rz z>wU1goF}U>+ID+1+U5WHPIOO)%73xzzw3PWR-@zpmj2xP!K!*=^{R2roWB1Z|Gk>h z?j84%G`_E8UVjOADg<53F~)av^xp%Ezce0^q_xh;;p5m{J0YAw*SeVoun9^n|Gehr zm`XJ_@38Xv`wnS1v$%>s`^&t%jf=P51lbv+{{J7e|K8gb@%%Iw?d90$dw$E;o)+40 zYHh*N`cF&y)?wv71NUk%O12M6zlz<;7ctiVr;TfG_mDp7`4_5T9OXPzZQWSKqeP^6OLenzxLM^qk5sqv z_kW@-PgFOh50qglW1-qSoP6HmC^g_K)%Lo4{|Kn^m3FP#zj}3Yce{i=Q*B;JAgfpD z-ec*ukB^kFXz$l6Z30J|x9Dq>r?I(CKlMG!9PmB*D>kMe_}ekb?c%DDH^^0?$R`OU ztbOJ)-9((%o%NdP)a&0zUbX9dB|cHxn(1CxcaxWO`$f)AvVYXZH<7QZZY*wN>k!|g z)s2<-J^?#cy(+A+txB}-i!+y6qk1;t!BxeA?# zquj#_CsDp|?~%^o7M2wT_BA2+PNn#Co>qHG_9_1rc>H~X#%pnYdY?y+jAcf)8{=}F&ZG~cfk^_|9(stoth_dvZoiIGfs z8u7Ysvf+5zA)2ag2Wz{C!xLjaR^6DNUYOn4xOPOly$#iU(PQm5`b-Kj45GW~lNw(7 z{JFk5cwHWa-*aNP?4NMgE>W)Tq0yq;F{nZw74z`rB~zMP$0F&{l5xzvXTz}6>i1Cp zIh80;34P@!s1!bWiB74u;VDz+;27=GIjFN$Yg}im;CCnZ>#C90>3%qcfbK3}_we6q zs?&B3%lpY`r6c{TQu_C&u{legs+yUSowmkZ-{^y)7s6oK0l)WBgD#UF2)=iyLicEly3Y=_Mv3X|x5_aWiu_Z# zf;|9?6X^vM_3a(F4<5T&sPvz?#Im=jU zyg3`}&8+dzomEv=>@T`>fODT)Fk~ti2u)Ba%qxS=gzcV_! zn1t|6pB73Dp-pOs%J%a84IT51MVYBO#M*cxWsku!+99vjrp2DMM?(mZan8sq7D1+21%C z>(T$s%o0=7gXUVj{El~Ia~D?ZyUI_Frr$EjJLq{cd|9v4)rj*okj&>>%BNi)`E_c` zYVR8SkG94n%qwcmOXgQWYf5)1l-EJ*DZ$PG>EG*Tft_amFXN0}RztBT1%Fkw?Ulpo z>)ovB%6qFDPS~XN`BlsdaS%0{cJ@AK-=00Krt0KXA<{5>EI9P_H+T9-CozEB6@ zjI;QZ(Fb?{H!^oI`C|{9_V_wVo{9Hp*cgw~jK}Qu;nA@-)%K;vNqbx_K^;syZQ46l zogV$_qP^p7?JXBn%li8Dn$z+u#ZRg6Bco5eL>7CyJ~zLK_NxCSJ*vGjN?#uSf7zE` zkG=9%+bjL_B|DS%^bDTA(mmo|%(?dbTWGh=ldG+H{a(a}YIg$f7ZRaN&99hlSo;n7 zGAUD?Z%uW!x3@cmbE@QdfQ#8b$T^H(fDr!j%G&b8%6xHmHDTl)QkN)h)9A8;H@-+e zjE+!UeX=%pWaE3w>TSiRzCWJ&{%qQBkJ!4w0%seB)828u&mIMSANDt!hqs`Bww~^x zC!sa@81M%~Yr{j-_Y-_SSRI&OCdm(V9$c~gRgJ#Q%JviCAw{=<25QWpIs-MNS?eQ( z?v%{t;<@(qa&dWKeR0P8q~m|59tg#f7t_Qoq;0TYQBtc*>-4wL7p+s#OM~~`d>G?R zCNi-E`7tjjA^T6KrZ9Ar!qd8=1+7mobwk;dg7g=8LJKsjKWK2xadRZ zASeu8^a&=O!I^4%v4=xv&E+?dXuR6Yyb|H>t2QSNdE*NICcf|QyBh?1WA(!EY7d41 z{QaQ8zm_({-vjpkpIMt*o-RAb<0(Pt-NUVX$VHCWsa@l?UQEA9tNHl4G!Bp5DWAn% zWhf)BzEl1Q<^Lf6@n+TUc(YFN`{COLe;xF7HO+VMHR-!4fDE}hgN7o59%(~QkzPftz=n}B_Bi^g811o)SKFc=|??32~ zl9mvK^k`nc#E#cMzS#@)+$DW%BNkzi&jt#bM=V`5>IN`?<((pcqpP?gFmAFD*ajPo^%n! z_k-dOT8Z@-JXG0Z%KZlSi_pmT57RNB5IY_}C!WmnByV{``4# z!Q0Mg&ez2${HYSfMr?ZDogc>Uv`RrwTpj;+Qk|8 z9{qb;zent>`kj2&=|-yergYtuuAK%UAoTO>%tIU4_{d|hk@89gtTAvt!|raZDSeMs zH;MV|>&5SxTlxDO_%kj1hw;RJ&|Hbvwn;tlcVF-yxFIG)6IuAWbR~)lQNn3yyBw!G zi^;#V4$zjKpX&I!X~M{>aqQi3eC9)0PYs9<8=v-dHotzjJ$bS%G59QObc`6S>OruT zq57|@e(oaiMOtW!y1f2^Qv07v?N?dPr{A%L&M~O^ZwI*U7tY5@^=d_taWz`ukQ`PgO6{?gy(qF=62) zs!!GE?@E0lY4y+uL6-Kmwzw3Zd}90Y$3nQ;2ekeS*@wxp0#)S>UaWi{Heuw}did|C zSLfM~a$rbZE?*uII-!S6cYXRzlIKsVsYk)M6>YyT<6 zK|HG82R!~3GS8>4o3XgUD`+`J^uGNK*j2QK&gvz3bN2!YfQ^~f<2O;i)_Bm3zSlRe z^wU=2^EeYuwgOH!{(++HCSP=SGd!PtS3%0u5Ndq5b?)b;S1+!H(8+(3R&D!(scr4@ zkRX)g3&!Xt>*N45mGy^GSy$4!aQYbaF`Q-XugLY0%WSj;gu@2VfouDgs64MuBk#S* z3zNLIMt&DW#+m9FVm?4`b8d;hO%bDixELR3b+g4IBwzO#RN4^F;gL0{09onvVQBY| zdBx?Uk)Yj2llZ6rkjrVsKa%<@TO9St-{l9>`CU!Gmc1hjsWT5ITIX&ffgIQ%hd-*w1KKU4oW-{QxT#pY6TKVBUi$;L3&!hID? z3glPnqvrM7i#~Ejl2v{iF3&uZBp(I9+N`%*H6YKMo1V(6o?ofG-;vrobj@?cEUm2| z{YID7jryeI(S)Y5zB858PRGs7!8z1i^L&k{RVs_*?IbB`HjfJhgJTGSqruFRi z;Gdw5abO{zR~`3Nerm-UzTdweE7$M?^24@sA_;y&&Y=8ftGyM}eO6^9Bj1@(4m1i5 zCkhm2x^RDzHax_7Dlj?ETgbC*#rZv?@*m0N)UYQi1PZV}qrN{ynQyPI%a5oc&DfaS z13~#t)pN+vwT4KT)2C-!+uQNorHHK z|3bCL1&BLedATmiTX7ix6pQ5kP#NH~uUYh?-%FYCx2AX0%5?0L_&BdK>xEXn+5E-* z?X9`}{pZoU+1}HuADzTo?~K>!*@xd!|1??F#jks?Jiad z_R`PKQHas0gZsPi$OrdWv2Bfbs(tY}lmfI@KEXI?e~FGd$AIZS(J>!y&@qKSK#t*9 zi|CDn6|-L-cAZO;Ct>bQ12Q1C?27fD_VOg z-4}nc7?1nto1he>d|8Uu+VZ9$nZl?==AdOAD z$Nw_lS_^OD;TF6ay~F>C(y=c8YD(XJhfFVAkh3tU=-ZqW-!>N`$ z-K6Q-=7~|jQr&+ul@sF?b^j=E)vGpWy#7|I_tPnTJ6$v9D>-@@U#YGiOL<>t+>z*z z=yh0}w#<~K!HD?X!qYH?OCPG7m}BI!h|BP zBOK^e4;_};srnvLeYjPEbLF+BF%a%8HLi1V#nGx;Yx$AtIv3H@@y%4$-=Xd&s_R#F zy{z2FCsam;x;*u@+*vende&QVMdy9w}CQe-TT~*T#Y%6&I-}vKT-4rdfezl zd~!(o*nL}G`0fcM0a=YNeO`L<6xD>=)N!cVMb)l~mV`{F05&-pO^meC%BI|q%Z7;(N9 zwGYSOg&QQT6T#3mu{a*ukMJc%KU=ij^vZ_3GuqD$+NqNXelG!WI$3YHgrzqBRBH35 z8uto!>h$(CRK0BtdYczm;8OUMMNrxk)^1bqlJcnSHLV}LQxvuqGr3L=KEBq0;L;0Q zyN)I%ma#$zuCnjrovIKAFZ4`fEW_{TZL2$~gsU9sgn8&+bj@$=UO_W0%TGU7j2k+P zn-(E>^VZef+IFPRdsjuGs?r6{|{5%H?pyMJXBZC+C*$SyjzqgdiFVy`0?z~nCTMEXuQ9= z`}I{7`hfXNbuNG(t=XR+Q=i1@8R;&Bt> z-xT9m+%NrO5x1saH2qk*^@h}^W9!r2$*x(e9vSa_gl_%2q8{iU51(@llg5K2v221U z(d~C*95@AbaE962y|Qy_-qZ_y{rMQ3?3jCe!RPlP8L@<%&-w3*x{;43wRJhYOs7Ip zgH_ytXS}C(PDAUopG2$ZUTfcv+%-=vUzUN2pRmPu%KsAWQhxCp2k%s(fxA1F#5&gz zkr;+;m{jI}Ol7Kl;sdJuA@2^??Q)NLcFUU2_oI~mU;4_|DT^ft$`Tidf4Gi`v%T)^9BIHQ|BmCA{Zy3W zmw|cw{x9m+T*#kKy{0!!#ZBM823})l0QRTqRJ*@Ww41ftr;nHT&;3wp9dZ|9?QvMD z;dcu_ZtDoE@eb=U)6V{wpXgqE%=_Mg$Yq{NWol0juJ!qO@$dI~3L$m8zqyaP|K9W5 zGiVaXZH=bp&Pj4TDqU@Ff1|PoVeV$SPru2jy>d^=_Zn!AQ5K^1_F4X|-_)bktCWVc z_olR=$8nBy6+AS(^XAaliTTw#uaqHuDRX(cy0W@)!%pF>$8m=8;?Hd*CWyA-{3cpV za6i6ir+7;TBvgH8;VlJis(a)AsV(1YsGEJ#u;o*E4^=nTdYjkx_ILKL$rpqAB>2PC z4S0G;Dht?KsvBG`H6K#x-df#|t=(R4M{x%Hd{Da|(KvaiPrDnWtMkQ0|DQ13K5YAz z*Vh_nr)>KI##jv5lYTRap4SbYNZURjx&2IgZJI~jg@bDn{Zc%SO=Dd146Y93=g*Zs z(>`xU=CZ#emEE`B*AJ5&O`MewIR=aUE~abz<^7JEqwd7&>O_*?`gYGitMkcpu55}p zu4Z<6vTRE4zIr_-cyJ4gbLLC?>a~Dht9`^&6KM55)joFdPEC}8`|wPsRXdK-w6}gk z8n^cOonPMRnOm!{ys?v^518lR%kEfKce#Tv70s(|)|qG0-P#XL?fUXm))4v0^i&ub zO-)+;+N)uoJ6i13b2hn6o{;tn_Mc&8oA=t?Rjrz@Is8i6fX?mam9+O%)`RRP4o$OJ z6C*{cWHH|l6*#9jWNpLI2P3c6!dIm+ANrPOXA(_wmZx1l(hCr!NY?H5ZNCk> z#^7|deSLO+FY|?eBlVrBdOKHd$VZa%8{S;>cVUEf%Gv<0-R3AyHA6Jc!xt}FFf4(! zCwQQGubluc}xkCH>o!kr7W3%P<84-^On2U}Hxd ztI3nAxLR50?Oj7V+w-2K4QJZY7VB%gnlin^S5nq}ZE1_L?ym|*PdpVpAW7Yi2m0{I zzRlM2F+D$vOk)SuN!aSHGDo^Uelz0~e-E0jA3jvgNm8c6I^Bzpb~7C=AF6G5W+>K+ z<_A9D(TjTR+F|N%F6}MRmWrhr2)%ek$BxpL-%_;YOnR5T8!}TdefplICD_(RJI@)K z&pkM&9hSbxp*8Yb(;9hygRX?`-~o@d#lBcmb|`SxtL>U|-uG9g4tESKe=u=g$gZm& z{s`qms{^*@x1|+r1ix8TC{Tg%wncA>U-@X!f8LX7dz1B21FX+O-adZC$&f>|zS~Ae z|7Ee##H6u!JdMToq_NQZhdJbm)pdaYGBI@3U*Q-Ba60K~KJPhl$i7q1a@+)${)F$e zdd;GjtE3HH`4hC`K4|$GQK!G3GBAGW9Q525gm@WmE5-~vx4ym?tRZ`w<*o~1V>pC< zk-oP_Q6x+Yv25|#w!ErPYWC6@hD~Gn+tOIJ)9YP-AWmY9NgazT%eexD9`B?JEcV%NFUAagMLU<5XJ^sm!;AOIDv@*4%N95_znIp? ziIxXzzP$eg8>_Aw(W-T#bLX_l{e7S4`;5u_{afkBUB@7wQ}^+`pWehue}A=yv$M_T z1=K##oPTZ6ezRx64?arEQ<#_QEEqF>DZOFcwV>>}@V->5PlSgJ?Tmch1 z*AznJde;B;v*qB0W~vhlU=^~cbByVIoIffd7!%9D3TAGFVzRH zv00yx>Acige^zbg_}BQ$UhSbid$mXU?A5L^u8KoESFY-H=ODm$>_p%oI_39T%E4_MrrC_J^Wz{m@sw(0U zN?(2*SaT>V)0MvjywsJ~yhuO(8Q}W6$v#9s{uRxO*45xSH{ZFnw~6xbo}}~kjw}Fq zKA$CLIiH%#az2Is9sH;Hd=LNXFXpet)nlyr6Flax%kOgjzMk)xqsXuM+bGJG-A;|G z%Z~ZGLR!t=CjV;wls4wC$M2k%Rz$fkw9Mb{B(3J}(#E#Eku-y8@_1t@#F-qsD(~a^QW0GAv_nltcIk+ShEZQ3Unw`{Ewbyj0 zVO1-f!m6B)FM{Ipon>n6F4~jm+tABcGb&-2*6^FD7a?TJ6UTp|# z^TVzCk@?a)+NL=DCiQcvPsbYI>Sm^~#wx$RPk=(78C-fLlCh&>Xy3w(S0~#g&3;JR zq0KiHTUKLoOotw<4z{Fg613S-(Z7dG=Mm?9k{;(pByWBOu>Oc99Xwy?1H6I`;>f8r zf+-hW>jPUEn#U7L(K;Nup2?`1r{M_4FcqL&&W%*gdxy1aasC;+2*bR9thkICJXCO*l!@S1c1M(PKfGmH!S$`L0U|n@<2g4vK zDr#Qd$Gv&FGM{Y?p4J)Z%xpe?w9-3_43_>JC5&^^$Usg=OI6T+_f?a(U{QndG}^-& zXT4d!!Rl8VM5`;J%+px>FH1`#J(e0EYkND*!JHG1`m%V>eNM3&P)g8zzdwy#t^YPs zJx?sme(ndEd*^Gp(KjP>4sCVimj&%l|K*Km0zN!#B2lnt)q#zPLD2L!Hkk(@i= z7>>3w)t3*ZzO?f<7&Fu2j1_GkmN(YNhpaybSZpA@dcn^ktr5ZXHbjxzo^Sy}A3-oz zl1VyoN{hb1F~^=Qjq=SW9J+1F)4=IG(E9kjR==+gI}eCIiUZ;0U?AP%^e<8;64;14modatq0Mh@ zJ;!8a>GS|U^0@s$_3eYAW!*>MS96X?)}rO&iWsH$%&+kn62XW*TG00!go_~_GqCLNhf3?VCE86pd$%JtbaeQl%Bh}s!-wICE7P!pU7CkDw=+OdizTb4_3;$8@_k*9? zID+D_vaQ^21O9;Lo49hcze8LLtuf0Z+}VU9oPotXjq-$h&~eG-nzDIa!abC5`@8TU z3;0_cZc0w!Usdf>o<|%vd$@7Ud=v)!35U<^ANiX~Y2WU!6@m%e5P2GDu|Kdez!6=B zov&dNdt3ezi}cfub6^@Pl|Scjq?br$I? zD0K_|EP1qFKCXXnSLhTuEgx@@Bnz>FSm*8kXmw;CfUINZCy#PpeF9wk$sY(T8~JxN zi$z>TLe(T$XB&o-^jzZ|F@q`BRg46snq1olJx8C}=A)l1>VjAE)bga$y3{j`Wt{*P z3&0NehQFj&l$6#;m)Xy9>B;N<;mEbIJLX@V;oqk*W9W`J0%YnOwgx zx4cYT5MnVTW^@B+eQVbpn}foiUs_pT3rmCgn_TMaUrK##rwm0Lz*N_yTpu7|Az2W26dCFFr4atW3sDSzADMMdAZB>cW-2UnlCel zTMzYSel_dkuNLbAeO27eC1+)NE7<1nxoJVzytKaw-F0xEIe@tn&akvz{#u&Tp>OZb z{IjkD2W_d}2^)om}>1j$l5|w-H=l%?L*bU;>q^(PQ2BXR(cCz`~pkf%1~N(@agWYX;sbF6V;6c zY(Gir?|bp(KUK^H_961))}%j62;k%7 zh?-QT6>abtVCAffpZSx(O8P+j%zH#1tjPD6bY|W>`u9nrzt8e7bV0pN(!A$&#JuZ` zR1L`F^h~s8UU`|+khETYik!OthTRF0Dj|d_Bu}|G7fuZ#DcN=9K9|aFf7_xX*Yt#x z4zoUJYUfYiv8?$^+ZYk_j^~b#4~%rQ&Cv(U?fRKimh`Q#{j&W5iI9Ds>aK=r*xA_Y zp_K0D#m|xlzqZ%$sYL7{#YuAAjei6@{-kHMvwg6~B_9gv^*6P@E1ivJEyLlpD|mxF zNp^LDjUfNOa(v;iM+I>|jT&qf28N$S?1|BTT+|6=0T1-TB*sZA3;8h40PC~vlh*Z- znTnEsTd2WAa||Hz*!>eq(t2s1Q?0pzUy(VE4PY+opQW<2cO^4bxk2yBrbKeqn$I;_ z{esey_FtxapKjbWO<88TZ_t!f>opZEEJ9{&E`OQa{r1v z@z=CZkpQAQiEo@vXB|nZTypwunKG*+vsGzH!$^nB)ZYYt|7z|yHb?(WQ6F@8L(Ca| zM*4s@ciK1FBN{KxM|6_?-QoMD%bwZY#$oHtpnd-x^`O_xRkeRrI>0)wMydaoiu&IziwKzi0#1FrK%Z-)Qa z7_;siVGFzY#H&B8{~-qvO(R-dZa0Xi63T$KPK6t-ahWF)`(dn-_r}QL>s@)^vlEJ{ zhF_$8bZ7LJi}oS^UwdY@!`nd-f(cBzM9d1)o-K&iJEfo(?R>nhL|Z=L`bE0-J23f| z@0h{8r+3Hl4k2Io2Kp6ix5r-&e+hzNt6N8+gtia*QMmC6-y}L!wt%KL!hZ&Se`V!# z+}he@1{#}RwK_BxqEl1bl1Qa&Tmsn~wx6>(g8lT2p6Tgnp8N=)Rb@cSueJMMsaJd8 z2O8&PO?#iCJ@^UDemr9CPxtvz!N*m2hOkFWzkV>jt{V8Xm~5S?4*Vc+1|ZpY&nhW< z{hqtOiO*|Mx+T(o`n6*G(0TK2B1K$MTo`*3DKbi}zv*N8vdL_m?r!KHx!1lq8SSQd z^)c$4m}9l8Cp(@Z`C_AQjMWA&)UAHFZ0N9mSIAb0h8yMKZ==N7W4EjiTi(E1@a3?d zP+RWr!+GX9kS7Sw+Ohz>^i5Q@yTQb1PZEp`WN={}gqy*&l+@0F9O5N1} zZ7uDk4#Cw4g^5e}rS9bV>@4?kK^hOmQ-k_@I+Y)Hr|1=E&Z8HXIoQ&g6P>_)^1|%N z-lohi1Q#tg%2?dn7>mT7Auk@smK4}Ciy>X}u8E-ypJ|*0#XB9k>;Ln2I(59_cRFeR zTi)qsig9Va)6*eYywfi+4o|htFH2%-d0`oO_p0;@lI=mPmKGEx`J3l8X~-yg3fKmI@#d9fJHA%6+@%EDg) zc_DsdO&wDzv_;lc)HnXsGp(lY`;(r8em{`(C&cH(XQu@c)%~FL`k?eC-0QoY@q)<@ z7P`|r$Q3f}BmT?G&5q^Oea2gR^mWBNJ)$>^6A3N>&+_I5(8hSE-h`-&MR-ut$x%a0 zRzEzA_kC%++iA)Rc*U zZ=0{;_c_)(f9PzLZyRp%qVTwnA0$1or4A1_ZY^K!OQG{+l=c1_NfUp(wfb8$q0CON zw4!Vb^#&N6FZNEd8PCt{__ltIj(>IP+idEK_A+Nn4|cchTYZmJ$1ts&esGz_p}D`( zUf1`T>IyDX@w~zvq_a)*>~AXigie=E%7OTy>VIpSVKMmbw$rq;g1%jDe;Y3K2;;B5H)S2cRxTQfP>c6yB}>fyr21)oY3d->V`Yyv6bX^uijw4 zrRcZGZOo_p<&L&Ti%tb$IKCw59~pxR-i$ zPf#xJ--D^+oqSi|ll=zYuwf4yJ{#UfTKs|>NQX4$NM%ZQ-(mCS;Xz}ox5AU8k3ZSR z&|Ti1cW(N)}-iVtE`!{-r?><4EcYMpR;Z#O@^*s6RSH7XCe4jh* zauo(m?Pg~7kocy1y`v+ErHgfWmNhgiRh$p9nRQyMrj-?U_95hiXlR(MNb@UM(FARb zKWNZ`N7vkfHSez8iNTN1n6=w&CLdwNStVUaWNAs(Iw(gC9Y;IxIKS0So!?VMJJDgB z>RjwD5l+<3;)0SGgtJz3uIo)UOWpCuy=HdWoLzDsjzeoZ_p$|sd9m%sQC2%`lbtuX zD86%Jo2%DWZ!3m!v>#^aljLV1o6`3M{^Lw&$fg93bw1DUhi`*NXMjFcPw^eHsmL$c z)YHKAH;Ajt4%yTKX(gLlQLTgV7Xjc5#{c2ruNIG=142q6tQ^^AmmLyMKC=V zwJ)~!kRULpk~J*>Zyg)fy5vqP;7hra#$EOi?*^{FWFHZJHD2+!hrX$=*-beN$Zr+t ztni-9FwxtiteZ}%Q}xNj^NWqt{svp8Y~4{I1C>uyy{9e$ z*T0e}Tx0J__IXKZSvSw5Jni=4Rc}S7uNxr^af75XzCM)^cADp`Bbx(pU|lw#m`T1i zuJrd=@m6M*cszS37CQv!N*~zzt$Fwm8!_BVLp@@%`uBK2g4M9;zaz^W7CoWV`6oTaw-HtO95EZRP~B zHn-nNEV@NPh~WB3BBG|c{s1Dc$LFbE>#==L68?beA8#1ilF64?AB>W;u6I*87n!T7 zg(oR`Vqtn>1>$yjb*8Hq1Cb5;goW)1a$EOP9Yg5e@WV2Au_yK?_LjM<_ocGh_aS2m z2Nj~+y`a>eIsZ}0-+m@{Z)_j-CV6ybH`@gumvNHH(D=QOemBpfS`KmpJn#7IGh1t5 zl=X8Hc>JLoscJeCvomK2hp=|E&pRESTJNk$ZlT2#hgu0Ex7z(;YWI+NUn43& zN6zQq|I94OCPz*qnD_Z)Rey&B);^ti-#{Jb=;Yag=b>*jLyXc~zB;p~3rmW{!T0#@ zY`kjt%Eq?wsIR7Rdw(%*$Pn6_(GnH&6(mgUc7LGvh=xLuLt}M2jnzx(+;%?db!iXU zS)y-vr_z1pA>e1ZVDL_p%BP>1g2^sS($D3qrk9q_BE37oJIj|@{ba{VYi|;E+je8-Rrwda{S$!o5$h9>-W+g_!t`j z(-|Xv#Wxn?Ld>kxM^RI$OSR|WOnGGty?u^yhTRF+|0%H2yVoZc%q2s2iP$A5cdyPM zv_g3_(Lwf3ec80srE&dm8rOHEefCY({(~hPhHmz7?A=4?fHMUfOX;5Q1~_^#XCyjx;>vxLcJ{}W`=dqM9~tf5=!+rebI}i_KN>^H zw={+!6FAE_;VpgBB@H#LJtA14Gp6w#70fOJ*YVWb?qfw;;GMt$ZY-_$>34fKU& z^XB&f$?fmrZ>K)B{|#w9i$_*fC)rk8^E*PjzN67DTz{_Ss73yp5{J^qypsucvapU! zOHOr~Cd_@9G_K#7+NCvPddjp4eYnpDkN=gw8}OmCb1U;6&QZ<-)h3RB{2Y?5{n=_m zY0SlD&@tad{SQ_fmTrTKb^`p(j3!tw*=c*$NKQ`y*j^ly@$UV zZ-Zd?3d&}wK{J%RakW9~<4+fDFdv^f+}u=Vc46XzyGEo9ec(nLGzJy-SZHcReZ0AE zEN<6+M^*pw%wi<7x47EyXButT-QH3(p4}@rhI^rR*rjqCh!!}l(0uAFu{Q9Q4nC1! zL}uQ?E&K_RX}cr-EcGxhTU`^QDXrfPA1~@38v!qmgklo;PwVS@Nn5qNhfH^Q4d-FC z1D%kx7LTHrNkt9X`=6j4zW3YfYPz}feF%S@a9!CUrnNQvNPW`!h3W7f4tB6n)4T`< zAJ^5!xE}*HPF#p1IDO_TJ;g*;TJ)uAIB|@X{wyPV7QLE`^VR+4%5kba@{MKJu5?`)*F?dSN0Uy|)T zghz*vI|iaF(N==pD}FlG`e;P5(zZ8ak19WQ{9;oE@m$KT-f-sbb2(A5^~ zKC3GzcOT2I0)D^Sm>AuyGfX^>KVOUodbdlwqZDjy8Vxh-u?kYT4Rd~2tmmYY1NCjb zuqGB7j+YBCCHVRL7ifppnAZN_dS0{#ELf{-IuEdKE=HG0E~q znV%m7AAj=mZB==M(r_Th+c&M(cBHkXotHc>e}w3WTmJaS1%|?%G25NW8mUXvO)$_ytOnk>5DNLwjWKuNGw<$0*fn+ zyz+V3#88gb(T}IGZOSRKUpMRHS%0&IuQ!AJUGm|_L5Hv(!1P;tRCK~m6#dX!r>|Xl zs@A#(?MPbp(&w)><7}9#`GWQTj(2p?BcEoFFz(Ug`>6ZKBab|(;ll2<1#{lL)fYuj z4egG;J752*-tBsoetw)a^%?roT39--gg=c1fX>@f#KZV|Mc+A}`rGVt*$<@|L-yDt zZi2dn7smLs@zMPKed;UUA>Ie{0S{!+?Puy|txeYvk>F)L!C<%Zm(o4?M5VDlRh_>3 zf3^M$wENd>tlRrJ|IFgT^z!18Ork|<6yNmpsn$C%r6Hp2i5QXD(?OBHA4gdlv(IVF zKFELQx#)Muet(+Z58pPp$$tL<-yz>sy8oU3B>Vjt{?*?gj=U1a@)xq-e@I%%et(vK zqi)rqygvslmrE<6T&+jRe*ZVC$K|>Ih~L9{EP3uf24Bi^-$-r0xzEo)ayhV~@f<_e z`}0zZDV66dWGBZhr z&Sa)@Yf_QZxtvLc&W*VxsaW&yR7FJOhp33CsGz8bsECNDct=IW`~A)j!7HivpQ69_ zXYIAW-~B!3dnPIHJiq6U=e#mGXRp2Y+V{2BUVH7e((!1Gqdz;*c3al?w@W6k>&ZBb zyr-O=i#Bs3wsMR^F&aJj`w7u>y$kL{)Blosi?{Q5<7q{IKIH8Z*7$ZRY<=Ob7=d^~ zSH&b$#8SW8TlSk{D{~jopxuaaLHXo>SBd`Hj4szH|HDc7;!!a5Khb+aOl1BZA<%)U z7|PAx-a>b~X@g|Gx~JA}*(>-6_%)Y4s_#phYr(#O-t>xA$MpKG^nc^&|JKvTcXdi1 z)6#FGt!IDlY5&2~zS#TVuL&dXnqLkN^o@Dfe)f03k>}0h4R>w*9Ex{NUj%1=m|vb; zUWzeF|1sd`dCf1QfFoM;fX&6Me%bJ=4DHh>W^q=EHsQvwdBibWLd*WK$@sMK3Tf!a zZm+v^b2wuzZ6s%0Y&;PP_kwlC>>rczu_**o1_3qGE)QYM)s8=982F!G(tnD_a zR_Pf>VV!XZX8<7NNKdETq4JjFdtwh)%MoyKCzW>c=_LfsYj zX~u(N*#f?3F4i}R-=7`ZTz6ea;nR8TCc(^JV7V_8ceBOGW?&IF#@I{$`=67(XT9pi zQm=S=xxR!UZZizsIlf17hUk;C@CEv>;MY3&gVK0io$qPs*SGoB1m<=Ex$&Xjy43uL9;O#)9vB?1t*>Ls6!j+ z=*N@#w)z^@>!|2bINt!v4u@NlP~)I~l(os!=-X&jCNbLC2DLU{!%iOk+o+ ztMrX$@SY?iNE5#Ozpc&Zcv8nw1TMZE0@mW!E+AL`DUN$vsg&5f5#L?|7C&aAFSgBS zf4OMwz0$K3O_5ylOPIXfWXAT_wB7sPtPoK;?Y7 z@a$5WzUkHJnFaJ-3qSCR{grN6TT-$`5X0g5_EUi$F# z>Z&#X!}mkf^DfKRY;vmF7{7>-o2C1wQLQnXmwKQ6grvXj&iaM}u0}td>i0h_Fovv} zR}4;&r=F8cqB4k_K_+%BWvb63U#9iZYJYzN2!3FBkleeBqg3lxoz3dh`H4xL!<#{# z3E5kjd^Ir8GJBW2zR_-!@bAOM!kGqY&?qdQ@VA|T9qbsL_rs0e526uWj8!*(9P=(8!Cs;0LEuYI zY(nvqbme>0XidxMPvB`eCxIWcXG~K1FZy8!xG8E(V-V4K6xDZB z@KKw7`PfVtERICM=btusdmq2Z;OJi_?R_wt=^Jg})N_K$oNcZhOWu_~h50g<&2aVB zx3YQ>wWJMJfGng^FVQff>-&=VK38kVz2%55u+WD^b{uAA3$RD@Q}>7!b6h9T+zmrc z1?|XM0visk?Wg&ip7*t_GrC#AlZky)aBlRv90JW1#s180=>c9ZKmA!F z)Hpsl9X~lZ8b+fXPQ9z=AX{$O?@`_yNSJ^MI5;#P+WS!a+4gpiG#1_7XK;Ynq4@V^N*T~&jQXnN8o+9u*9giufaNfa3JXe^Bq*wKVL$n+6zkEU+i>0@Da}eiXRIbSPY1wRlb9LifYaP%>9~bMruxK%P zpME;HHZKI>SiGlJpWKu!3{79ep1d3@CS^YzKd#Xnx!Tc9TJ7JK*rYqf{?Y|}YGHjr zJGGpl#`N05`=@0l(ZF{9auf6O*~$F0v&<+ul0)H~8ZSxR%NEnLGLqT)*yX4jeI=b6 z@%3642a|G5Z_(e$q*gf+kd;wQ6LLKSGvZ>`yMeAm6@&r~7VS&7QMS$o)prH#al_*S zeUoxuRtRBzyR43LyoVfb^?kbNPU5d4XRb>?Yp3dXyW@(wFX0Y`$BPmwJC7jPuIwbb zvj#LDzjgZdaMHK%xyOe_dMEBUa(C#J7^0*H%6Dc%{kW-?0g%?Cwn~uQ|0-AXd0Y=q z2s}TiFGpE$pkG4^OA8xRKJZe3hDnt|pl}91LY>RL<#Wt7hZVom+G-vM>@2>Mv-q7! zTiJv2I)ujNLF?C<%Kadb(;Vv^=ef!d_8_(u)^tc_WoYc4L!C6gI_^JukW}8i3J6$) z0?f2DO9>BQB%q0xJpuH?Op+Nt;LUyzK2`Ns4G-11x| zyoRHm)n|Ox$^EDL`-XbQ#|KX5t0V#C{ro&{V`n^tO~C?D0`tClf#c~w55is4_^{q9 z;U>EG*x*p^*|0j!@%B32$Uk(mUXelcMQKgs^^cKG{@9a zq$1QFOMSK~=TSqB8d>u=vF^uc_qhB|kM#y^3&`gn3Qa)=ywH1lJUP4{2D~4h>wHw8 zWt@S`#&h}I@v~^`F5U~sb?o4Buui3MsWZP$Bz*y0a|2zu0WY4joN$%&$|!0h*>8HD zmI*5as=n8DQ#Q8Q@aCbK=`e zE775ReK{SHmYK>K^>R9{(Z2gp_MK?aWJ+L;XUy^F&L-SH7H@YZJg&p~jh5%t$&;9; z3GZ3L22mYHnNdfv+ZJD0e`u2O>>g9E7UnPJCPYL-C41s7GuI1=bk*#HC^>g^npu+L zZn|t?3VeENzqYl2u6Kxt`6LUmVmzOV0_^Rj(&&78xA_hZ*>!#vPpLVl_aXO#JARH9 z_WAXa1Dh7nQ(^3e983=cdo2}nV{o`H*Xs_yN&PLpu0nrlZ;y|W3f`3a@5M#e(=$cN zWZhveF^_X;M$WtL#;?m+^_jFllRWg9NyB4bA-@iC5b7Rb=xm9bzN|C5`s0D5Kd|pH zJTN?h%r5NcI(qs2%$-NV{OBA{o2%C$`$(OAJd|L_rI+L!M?ke#F!a5b!bAM&MQlvVC37Cf`EyB^Y-@Pa zYmLJm%~J1HQ%bb=FU;Y@!~0n{;m?<#ij{HrlU=&MrLJATB-cYOeKy4dPq5U#a2Cq? zaC5GA9k;|AxeQO`aQK&ja~{QQG%?o-`L^O7)Ow!7_^g4$nihOD6O{{T z#e3@Q;!M(ym(-8Flc!9cMLN(X(u^3^KI>pB83ED=@F$ImcD4yUZNNYJgw9#Xz3-CCd9Ke_3shen*|R zMSkCQ$>65*wnRAUwJF_0{7L6+nQwjCAbD-9qkTpSnlbinFT1D)ikU- z!FOh84$UlZAoT9#!uW(V3TYsTXaG|*pNn>J3naffNd zPF`J7tH1PkEBeJQymAdTsk9|(bR8nSKX|w9eV{d=`+D_92i|UMv=5&{F08q4WV|tT zXTura%BZ}IFYz+A!+Yk`MDOV~m*j@GHOlZ#mG*G$NCRtYJ}1Q&^4?Rh0TYt@+468JuNC8_SB-evj?+VhltzuBWM z?x?z$6E~A~-Chj|j-{Y=aT1|y#Xp0x*X1m1a4tsX``;~@aTyTqJfp>lJ|i1Q@P@T3 z_~8PdtOJKoK0-KR#dBi}c^`eH=Z$();`gGDUHz7i z-P>qWoi=?{(k9)jjc{+~1|q|6aEd;zl23KM1buwDpFg??BV#Gq#1^cU%^&A3WKJjk zI2N}8uV>3F(mvgU+x!)*xZetI;RL%zbJ{$D9pkq(SNQLa?2@(_3Cy(gQxAk6jk6QvbXr!M`gjD`kzDI!bTo zuIeaC4re=h4s_`UJ%-c%=qLQNw8y-jueEZU!*}>wLWOr`g#8Vn!n+6`N#b`aOuXa_ zny+7*)EyZP+B5N_#V<;$=6#TR6|$D$V{V_M1!#4>iv0P~PV)ow{6Rj{XKOeY1O+3+ zzJ|Zf+C4lI&mdoK;S;N(o#IE4Pt?C5X{T)D74;7X%LHKMcG!nZj^y?lhPXREH934N zI60mSzJuH1z^1kOjg;?vgz1lbt?9jO*&3@+zi&$F$K7G_7TD6&1E^te zv<~})VB8DN1oBnzYqDcOLg{+hx{>U7Ult)jS3$DlZ%*nH?}NnY>JAEf1(A0~qMSgf zWA%88%N{>*Y~-}5JB;TisS?ooU48Yf-d7!Yd0wO=Bn?BBtYu1RkMaKhHpi*?P_@o- zKVZ>eibM~#12yir-*J40+*Zb^<&$Y=fm(|m!Xy7R?(TA zVyR_^^=hmwj%AQ(j*piOYgb0)CrfazR^?qH^TKfs^fg1nP& zeK<4P*-&}g)77$f73uaUe?0fRo8PxxD)RrR=V#3Fa&)$QkLQnP%UFl&>*Q@YTmBen zb+&vj-)fK2sto1*34Z5!sYS%Q#@uVQrTN38l`YLuXELYcyX{AaQ?W=p$1g6=o?Ba4 zwzuj!bN)DSrT&Ii>iyME0#DyxY3yWA^L@beaeJDj;;P23qfCBaXkb``GpCv!_VNB{ z%F!7Am#?$Hi!C*=#$YshFB`Rdy|0~JHv>^xTR%e{{FMT0Vx|)nz*+W2+>|QrqaeT^ zH{K>5!ZTH%{dcf`?#ULGw+s~ah_50Y`WKvYW>=QCLOR)d;?B{KMO_HNZi=uGwpHJE z1;064nTqzu6}|->3so}aRol9H-seB>eSS*|ZNmr`lG1gQ*n(_Ldywep`;$8HmS8ftK zdwAmK0&#C=Ktq*Z??=%b*@M&PP`k^0T_)_nE(~a@pZb zY1ZHDx<&0&+AhxFrYzcvh|Hddg*BqM1DW0m6%op#aX%RPW`t*M++Qu94SN2ulR`a} z?zYfJS4?*(;Iqm_EU~QH1CGkL!yzB4-Rt(!pf&H2khd~k?Yk@E0r;IqJR8n`F@qfY zt5b*HO6p*`mYfz){+b#bxPKIfPcjv8Iw#NVQC5C@ zbEUp$eJ>(dtDdF&psSoGtY2bl-b&Wea6KtRB!V(PN!|f2XyM=v(yNJ3PW8 zR&1J{3R(n^;})>h?X|vlRMl+_z6~9c*+E|4#JM9F{v~IRZQ_B$-*PJN0ecVDbZ}U^ zYR5rq2Qy`6#pah_hYV&|ZSDwm*kD80*$Hoabg%k*NxN(hg$c$z`^f2>o2F4Ij25-n zY-ktQ9%=Np>Y{B{DWPpXzo$`|n?hJ;?<)0Mq!TVx59Ee$KHGKx-k41K)HbEq<$oR}C5Mpm^-B&vvphZ@dfTqzYL zXx;uX_0+nJJkFn3z2#dM4+!Q-b(&X7!B$5N`w@RiJiJY1r9Tzp{(#HlHC|9QyRHr1 zTZ%c4O;^_L$ay&j(fEC9SkL`^)KlU6sH5KRVyW>swmvM)2H4D52*-s&O`wG1r(*A4>2; zQz59>TZvwhV+gF(_qh$VySS4Ji=+%AujcNDDMxd+!#eS6JiFsNi96uwwb^qQTM=I& zk+ofSsvn`Oc<%kEm%CM>QR}XP-sX=movG@V8W#+~O}`u^*$z{R__a{GK9|21*g zF=)A@%7MrrNgy3MK8C=JkjV&b6wux_-f|kx3y@~I5BWBoOm|xMT!=vP>HV?rFV3T6=d+rlIZv4Pq0ma*{&+i`S1>H zlg?7sCZi8WprQ+1#@0V@+y8fPs_HLrWp7>nRpztyxxZsxwU1?> zDT>3t@WmzSrL=$FmNpEN)_~&Rq-EN`(*8qR+Sr!?x8lJay585o#|&mZc2NrocrLf$ zv8EdBR~+|vW7-Rzi>~|=vpv^525fKSZ;L@t*K>hrr_%yTkMAw*LA=q?=_*=*ab81r zg4nR!Fh4s)cjRyK4)+-sKZEY|9$xP2aHj#!=7j5I@UM5b17jNKeBy_1Xa z*oIJbMAM~gZ+lxeEynh3gy%Z@f@2#Z8gQR~=CyQo z{>l1ReXRXPe#$X?*)J!8dQB_Fv1Bcwb3FZAE&tTL@YuxUXd*93A>P9IwjISgDK-viv?-7IKa2Dktr_$H?*ihvSv3 zQe&z6T26GFFc+2wme0yCrp=H4MLP6UZC1o|oK+AcMCOzuoTvRy(z16L4hiETFVGEU z>>uQB%hX5OFFsEC_>nHOSw=$c*w>*M$KL(-_4W;M3u3fY>`e$#>SLE5F0Jk2t|6|k z;vPAShw8D5d*oT((!@8bF>SC>dZGy*icUabUw2QY;nV8oC7IJP;o%N#3vCV41rQGL zb^8OX#OvLp^L)4r$=9pW-W<~QQ5a8gFWTA{{FeNlJ4gm%{kpQg#g%oAK&9#zXQ%^N zC?w@aRL_H%G*QME=Dd3%zC#i286y0!$rsxD@-BmWVrYx_J@KDAlkvh1qMe~pK~Gd~ zTVRab7J1wE)smkHQ-nqZ(_ZnSF^*kVxuWkKJ25FHfb8~#+%n$|~$0qx7xj_Q5GR13mF%I4Qfx~$3 z7#8mxWeS_bOCD-kzILbyV|yKCN)MsXq7CrtfnUQrjp;e5T7>!iQZVez+^s~K#rFc0 zu@AkNIjlIKExR-R|afhcGfVgslr6Q^{<`@Oa*i zsyJ%bVQ)QwS)`$XQztMs)VAMO$AL@j+~@7wj>h-0FS7sTG+t-QI_-H{(jKSr{l~(s zv{85hlp?!MVSnxJ(1(Ic9_Wr@Z9WSongM_e<1@2GkVe-nyaW_-lpHyEs zrurK}Z6b_Keh{yU>k0jNllNyzFX%qbJZT@y&NyYx+p6}5Ta;oi;9NR`tp-mT;5UPR zH|t!6+cnQ*M?gA^QKw$v19-WcVvMx*pON$pbp2Rh!urR1%}R?|uqZh_*d_rj_3 zSC{R}Xnb1bx`JsOd!>;Hfm5AjV{JEjc)`$FXjib~w*GMM%sN`Mv-w@6;QL5>5@#uK z%?YP;{7i5oWltAHatW9Br+D_(cr1YD@m<6ROT$IxxOX0CjU!`>GdnFNK3P~#3y$%J z$lKc*pX8UVmZ$-z_K1&t665sDWSrpPnSfWTlTx#HTu}~kYcl^<=_mD-Y-Bw*&Oa+> zb?W$pjL?Ms5Z}u_xjOB(F2Q+_p>~w7R#e^S>%U1L|Z)`@p=S(*afr;3K}83uvB)cG|0UBrZ>3@M_!(;8O>`> zut@txOE?Zv_tYM|=EI?EH3+LHOXmyGlFv@sgbp(OD|=bi)$EFh6W%D8lY_M1-jt`cp3c+1S@2E#u?k&18CIsb6d|L+s;!%bX#CK@{@0a>5_PF(lQ(Q1Fj zigOyzg9xz>koh$ixh;$C-mhzo}Y45(R(;)*-(mpwTS288#Py1a?{xZTu(J9c>8 zb;^iFS3QBZUum#)sx*07Aw^M`p$^GlUz247p&$d(W^%0Ag-%%r|XEP5U>cxbEv0qoGOjS*|qs_Jk0w}`)AlG!yM6C zj=Zv>?8e-pd|gxL;6TKj@^*Vi9ri5g5}Dn9^Uko4c7oeduH zn~UCo(>|mLz}kHq`Pyj}?*?*jnD#U8qvv@aRo}1BwXzL3$ipU8MW7-cs*fEOeGk&Xv0>Nd$qCf0f|WpqfX|Z5F$c zf>fnDuI^G)-j);8MQtgc?IPhXXme^yx{LY6J@zuU(Ccv94~=r#TV#8Efc9y>A57YZ z{{=4?WrTYhyf>spXWDEkZ=Z(RUXkA9p51c_WZqvjPww?L#hm&@rlejg#=9h}$r}cUD_-&ly z>F}K1u`gl=dmi(wyaL_``&eaEK7J$l_*JdJfOlzTwi0Ox4o3CWeU2}#p;2oSH4_G> zIb*=^8y>I%6Wy%S{&7o7NAW?gGjB~JX-*rIaZ)9UZ|WKZ4lVo-hf1 z$vRD$3At8WPg6;`Jz3+lNf3H@9Z@>XwSg%))V-Z{L4#l>*f2)MFumC~kV_)UP%ym2 zX+SGqthVr;;as1evrbb-?)*zWq)yih8Mx-5^1P^C>}P`MZNr0g+wx3yBHr^%(%!i` zb%kLL4+$!2Top&Xf5Pj%sVC?|H zEQz~W4PzC~u<|dv0{4y17ZGZYaO}gk%~>@5wwfbrGMOCV*aSu#T!sseY>@YDuE~q% zMQ-+HR`8)GdLUb~Uzqd-w%Z{|mJDP2zFDOZ+8xgi>gx>tqE&_!+Kx+I+09`4RNW-k zlAbctIKWLB9%!TDq{~5^WI~9~Z7a3;syMgD4zq^0cHaX;E50bHH+B+&j72Z6t3+P~ zm=-*S-H9MS*|0Xu^Qb@6MPc}gQJ#+>C*iFlmE!s)mmjFjl0UR32=>NByBkTpqMy)U z$pS6_u`u>~CdQ8>?-^|O>X3rkhP&ZQb*pOrU)&S!#~>OK@Ds?^k%jARLo09U8^d-9 ztxrU|rm4I3GRa5V*L33;ric1QCZnW14_bcFpjq;FQ%Alyf2A_2ctv?^VcG9j=Sal) zU?G_ES-1U(M%J6a z7Uf~j-yTQ3jc?I?$TfTQ2IY%MtM8Zb9p{0{P~Jy?<#?$@#QW{c>(;j@%cRv?lrX57 zy+K(8rs5`-r)?UFcIj=(CUD4FrVdZjp9juAq_1ecEo=HpB*Kjh`Sfn(ONeZnzx0jX zu6!wR>Dv{piCw&1xg>;qeuF;8KhRaLi5HjFE@!Vc|Jv)W?(pLw9}|ofa)OxWt2^X*b&|*0dMV81*8orJ_CGr0f34@QK1(KkyiB#&dbsfQC7Ac~>+L!VRLdUhKqwhJH7k_?sfRayxjVpH{`!V9lohU9p315 zi1bPQrtzunuN~R9RHRp)PU+v|>EnC7&S~q}w|m++<~JrZKb^O4_H^5hS@iXl_F05^ ze|;x-!W^mZ`L6tT=&!dDu9~CY?PbUI=)G5U+w0l)dfM0?@uF2Yzpn+S`siOElI>~h z+4r}k70&AURnLB)B5kL-{!mNWI1j4o@WY;#cJ0x)#69XqfNTGV?R__4<<}k+$4`6I zk9z+0IP$jaQSTwG_NX7@TQo;_REF~YIItWqwTO7TcZNOcQ7b3xJ73Ok?ryTP&5gz~ ztI4=*-;-WRTvrkoUf_g$uOjXMajTmlUmEu{#2rlX8C&l-zm~W|9;eG7_Yn(nfHjQI(SqH6% zx5wipbx7mBnKJu5ZaUEeRK9N|?j&(AuBbU5YjROzd$QubjkqD=)|#t})3exVQ+2%k z-$C4{#VzsTBt$8X;1j^{*TPO;z~2J=H1KoN>jqSBNiSb{zK6IM5vQ@k0a$Y_u49jX z8}SbkKfAcH+_Y{k#(d86Y0Nb~?B#a$6kg4Va~^LVGrjI_2fhegW1hlQ$5l@+OK})Z z9`le2RZl%(q6Tp~D}?<;@PCnO-lg)pwES zt;Ch;Ke3YEuZdTDFKOcLscMQx{0U$wk0_q!AUxtv0@vryp)0u$No!ooUeBHpEN8fumw}F3dLcBI>mxrZTNt<;SJ@piJnky@<8_@ zw}ZLg#9t<@*={aHhI5JHXlrmJZJ7!P$ZE>_&>r>+}WAia!GrcHGi5(l896xEj#xTS%dB&>y zUAFeo2b&no-Jg_HxI0FJF`T`Bo%U#4pI_>G`7S7EvE+Q+RC6af1cGa=2-XFyhn z3zCujX3{^%$l`*>(g#jf$8gp(&^LG-qwi)#TK9%whFm!vHNGx;!d}(mnO67kyY|e- zF6-Q``uw()E$*k#TNV6wa`@nS+#_R~n9-y!?gpW*CHvGnvw&-2#aeFdRyhegf14Z2 zLVuH98eA`4?FL_}x`+PVq<^^I3NILtf{jd$^$lQR$lutf&fB+7L%)P~GHr51k*uj8 zIh55RP0q2&Q>gz<4Fu=qrKxhYscjr;dw!pGMBexh_^ml~ta^@~80+nqJs$`uC+-tN zZa1zC4CXK=|H$#((}AY_i|N&@%`P5Wxe(`~-YDx_GV97Zjw=`rguH%yw}c@z-qm-?PR^SXCfuX=ka8+y?DG0A=v4TK0aevH=7;BB3`ZF_QCER#FKV$KeNcy zirGzcyn-Ld?#1qMb5UX|-D5B%^7eFK;rlAocu042R*rNl z4##%*y@%4?#XDxo4hF=XCVmaF9egeVH%`{d{7c5{sKE@U8rU~^rs})ami??BzZrulC5m0Fjiyx3FSb zW{in+((3fxN0Yuo@1?wNTj^D;vuxw8gR7Oh6vTGjB;G*9Z%uMUF-7isPj&H8(8+s_4mN{ zGnZv=e|oWqlgwJQ_#cun__w(Cu`h&{`7{evDxlOxyhYZg@7IvSlHp@$#almwxys3- zO|SjR>3l3M`&dMqnOgUpmRDuWWn>y7uC$CWUVB4%vRhc|h z5oLYcQIC;D!?mUj5vx3eypI3ubv%CMy>WASuCSeg%_kiKj2?YEeCN$bDHPT|Ni*yJ znzSeSl3^mB(J>%agl#f{to|M5EIyk?xVbdD+3E&A`?Y}$ht~SPdz-HDJ?&O?dv<;p z(r5KmxSpMtGOC5O=k3h4%9dN5{(b_s)6oN-HF=EYw#pjHSX(xI-=Kf-_ zL@>!h;iA)&`vWQH>ktb@jnT(_jH>0*a`G`cesW-7f`?nK5z+!PJheUl4W7t1W}hDT z#weectrLwcdtD}bxZ20B#R^ni>8QgFPk*G69-JKQ9U7Qm;x(*6MbP?0`JdqVUs-ya z!1(bXH}a9)l-c?=LG=nYXLzXzD-zSnF2wE@yAVGK3_ZkLe=+De;Lp+^frk=w3U)JgAmqHqUUB(67mk}b)3(BEw6QB&U0ruwlkXxO;d85c z0p@vklIB2$`3tcr_DCtzOZt-7xtPJ7G)^m)rq>d`?gv%hG{$jV11@aVtS+|X5iac3 z%-~oY0-d(;z?dT@S?j|xP`a_=oIKr6p`T|m8qF%DBc%K5Ss zMsCf`>nT@fsI{wkt1x(iGi%^dd9N_Dva)z+7IRl!D9x^KZ1Z$sD#_T>(>OJHte@hs zQIPKS%cb)`H-oY>TXs`w+*{*rQ~fHq^kw=s))@MSnwzU-x~ThMv}`ukRu*}h6f~8m ze6P77>0|L?D9?=W03D^Y{`gx5*0B*6@I_!n0;=EX?zk~LJcuRhXs9)Y$f5q;+`IOi~(%NkwLpK&s9F5{W zcV?6km_QhDY;s~?oZkKE()=&`o{~RgWasPan-DRldBJ}&C(**otU*$Q8nG;J)4~2NGt-E-GZ(hZG zUI=zK{2iAIdQp|H!K1Fbnc9TwQQozU+*XA0_A{m%3yUS#$!uZ;7fB_aKxv1})?g^3 z2|tg`!p#{B6{fZf9yD79MLpm>#ae{1gqN0_iziX_rzdmfTqggVHdpffE&=q2-bT5c z>VXxHe6A?G6aCc-8)aCkmn_~*XTfJAWwOuaMcf%yX%VKx>b+IMvpiX}>RpDBS9J54 zl%>5j>TQR5&z%q6LW=Pe-xu#6bvCP0&s&pvBCq9XP_m97Rd$~+YFy4>bJdbo}6WA`!MP?Y-=b&J_Gf4Kj7{1Up@vrct z*j)?fJ?YqfM$#_RvAqhvfU$m||F+Qm3iqU1hl24obaoo0Pw4_gSo%&tY4DdO1C4pS zY@J|Ma&6iKHsS71_4~}$`rUgBUJYAk_m=H1w1DYR=>S*n2fC}Vvk&(W+~Uc&Z(`ox zL_$^3hEwzCvwWQN`{N9V=9KoftX(!SI^H`vD2u!I%I2G{VFvJQ120jMxnC(2C9AAM zUhd1UhBt&xA8O7m%;Ied-cX^GH8jBd;>z@f{UW-EbHsZWQ! zHh9rQz^4mfOk_Aq(}(}8MgjHqe6F`=s=7VJn_Sg?xw$bt$77Mun7p=mA}ZHA852=e z%BVgcCM(ZsmxR4uN4#E-_&Ss<067FN7?-9uCZ_ZEFM{L8L`s}UmT*{en1qIX&YcTu1Cxgk40y(JA5s*+oz zD1&GPwl}X*hH?Y5mi1clF(=w_AUl5=4=A?pDtu7k=?i)IP{qVEiL*_Z;%5=?lFVA}_2upR=}lgE!o zrzzVcu=(17o^Z^c8tg|vW#_N_{aOnY45E+s_`20Qg$>4~n?HEroKHDwb%rU!R9Bos zO2^)5t~a$;DU2*9c-CZ|X$^``d0x_9_Nw(&Si9!Dn9XPuvjnm>J+Y=23yMG zxXj*y)z~&(kl=*p2nb@bGTH(P=Br)Xl7UvOZPrq0ZL@|-YnwGxTHCCl(%NPXmDVGHnN^5(yWo>V?tnCXeYx`v_Yx`2m+J3ZRZNH*o zZNI8wZL6=fj?=ZRx5FQ-SlhkHxc{EsrukaVZo^F>uNZvq*X?n|*R)Z<-W3 z;^A$1%)=nRF5+Bon$3CrxBe-D?`U7ECFT=njJOhrWqddhVV7Q;^J2^3e zkwAnr_0Y&^yDu%y?vR|t+gH9zw! zj2u8ZTqbiBod;AOPTGy^FS^bPWZrLzT7Xu!YMyRzY;`u=H?G@kO2XvQyc|(`9@U*f zZ7=jZdo%lPlW|nLqW-tijPj?uhWosJZRx3eRr+yHFMV<0iFX^5{J!lHWm7IRKbs;P zb;4tL(igwq^S8&5cMlo)#5YZ+Nh^KvGknLksSM@)LSQ*wY7y~1z&N(PX&NIf_e)6Z zHcSV0g0PCZ4;h#I3QN!Q0bogQnx5&4fVJwG%8$+$0oTX<=xjSC9rk;pW@9{n$JcH# zXh}I zj5Fkbye>`0QGH)eT_j=dJvBHCTNNL@=KNn(oY(EFmP2JfN$RLc^*D_(PPp2YpT?h z>FX^6iy!R9MNO3Y(`|<3)xAq@v<4^@76x< zRa#t|#PpJ-oa8-uwAUrxe;<5IGnk{#d3xDI3qnA|rOBQrTWBUQr97<@$&*);_M;1p zlCYL%B7-S|Y>cbdMq?a%yQfZ}d)PY^yf&2}*xIPNZaF^De)V;v{TCem8$SMDYIdjWo@O4wz{TZ_ zg5Nz)+I?Ak<`|5vX*|D%$5*`hN80Tgt3FN_Nq=*8d}$+qUC}knC*|qNB*84_>E>X0 zAe)vtFNYVd@b-hq)&m>>uK~ zEI4p3?%Z0SJ`TU>va{+vy@5@Ml5vV6O#YX9pMHszU+5UccI-@SVsul%cz#v9__y6z zcuo=Jyb*pgI(MjnbGVyJ5)|w75b}1JCS2pLY=%CNF8CwmKIn}mqJ~fd>o+yeWB8hB zj2wHR%rw)Cz&~F(9qrtrjEcQ2eOgd5fjhxw!IOkjS8X%5Jp-i%9`F+F(i-frjti?* zzR4w)t&CIE+IYF+(0r-WS6>a^6+g()Ba0Wb(%hP98=|9;{z& zpI01K3r6KjL1|yzme%^f(kc#aeawb1C`#*IHkxza(d9j7}bd zRzZOLjZBkJu>ELO6Wl!NV;VncTzk#x}H;Asc?@u~0`n5=S4`5WJ4GM1I z`bNhkxvlzIe@varuk^kMbITDq|D!ZJvj9u=_FfMz&II$zy^Bb(WkER5=t+1l_6E|TkI+_E&F^m_ZeLXn6d*;fmB+u`8QeD9*}R{wf-`Ryg$8)?mr6`I(J3 zWow6hPAlIo!gnO$-Gq-M;XQ=!Ov0Qo)}EV$_Y?j+55I->bEeR(@Hm%@`I+EVNQlm! zDDF33qww(}{5pjPity_d?k~b`%m(Hbk}}_fANn->=4@c*LK6R0(x>6KWdpNm_#N2* z2d9E3e<%4@lkmHn zB>cP=mWGjZLx`$>S2AxtP%jI~{cy@?2mgD?deD}JvLBDdk;2?J!jqjlKPkV9 zWmXxL_x-lM4?jhHAMIy$?)yT9t~9%_&A%i~FF2#fHwli-e!U&@i12PyXM*ob`oj4p z8Bh|*aVJiGlq$U??3l#*MtiVy-$b*QeeNjC&30p1uVQ_jd_QI5x3MuTLw!iqG+wd| zgHC)ymS9a$&(jKi9dOvFvm0*jTKTzKwX_XAx@U}at`m>+j#9hMVck>L1$uDizp1JA zymnp#d#PjN@Hl!|%ALo+7=#xg?l3N`!ldXN4^FlH2Pr$8b5s52LPv81F``}nIE|6L z$(_>g+Y0t2!$0FY!CiOD!Va-(jt^-l@EYw7OF{(cB2;I5&D%5f}Wpjp5i)`(@(N z`y9(Gi{ z^LnXn_C_to8%|Uy-aElt*7q#?BkO|BrM_xJk5tC5CuO*=n#p5EPr%;SJ9!Meon%Yq z8)~4}O&ai|fdd#pas>YPH^HrS7Vj2+i?H^+ZrY=>mcDfd`P)jzT>PDi^pfSarvE)p z|NEXk%7K2Du+1c=Uw=Rt`o)G5^jqq*_YW{J@jrd%nu&jR`9xddQRdJBO71?Nm3EizNQwwMFLeRuJY?xn zFq#!dA)ZC>C&lzJ!ugi#SXVb>^&D_CEcAy{z|bTD#!b` zj<%p8FOy9yE=*yEbQKgF)Y8~6_2TV%8JKqwk`rKpYaQD*C1h>rOT=MeLSh3 z+4OSRRq=>2uz0yptBA0=RrAZt%h7?M-m$UXGjUeNFu6p3|C@5PKXu&ihWiJDE=bTv z$@jZfxZ|tc6!5jq_xu^W&u#5hJF^x)2OQiw`Z*x3qn`ufI{7)+L4D$fl(IwA-byc~jeS9c4rr#PwcY^_)zqJPeD6I&LVW=q3kSU#cxn za(q$tasy$zcVl8mPV;2NlWvc`UB+{x=jp(goF1mfV?!~=c?yT@(db%roVW8S;EnCv z=Vf$iCpOGR`WnZ_1_roc%pD?g9o7mr-1R+A+a8|;ca7s_*mLCgao)=XuFnK|Ww_UM ze^S>^ciazD&wFGM~qq-&R z8;_&qjcx%_y5>DPW=Z+oj<=fsv-`<`)1&Mi__GUhP*`(Nj`Ki*^D`XhSUu2|aR16R zX|9+lQKVj=>Ch8+5Z${XN2$Dbwfk7VcNIT#E%>iu;TunClbF08%FcX zr{>niFm;6SWY;ptbsBe*W?wdKPTm)0@kcU;G}RNy=4;ds-AlUthHK!$>e_(4)e-OW zRN&Z2;?2y)eVe?*F@-s&uR+&t)!zo9a_2ms_R<5{yd7ST;e8hqOgZm)u;otX)4-2@ z-7utkWmf$Zo@rV8_1>4a23(ew?{RJ-4|eBJt3N)?>)>!{>}5QIxVyK}^Xnr1XcnH_ zdp87yLvK?zW%guCr8}}`k*7cFTTj!+e$)Iosq^%Oix@*d3CiE_s_&jnz9D=;)1d~{ zJbfy>>1P6upV6o{7)g99vDD;crdFSm;2+HSIx_bB0Zk6@`OTYM$`cQf-nlXrO~18j zzkoiBHhPaA$Ew>z;7b}ON-!`B*CFtB(-367xzC|4Yglp5^Vy`SCAtLa7xB$c3x1-4 zb7t@R&mryp05?M_qV05V{dVB-b0C!+jKMp}=kw@yW!p|(lJ;XWc2-=2YnpOi- zDD%LLz%glcrL&`RDoW6}y}-w9%G=*_kPjur$~?NQLU4j{f=o)kmj~a2DkT8Cke;-I4njeB{x@el(3xIbU6A+dB>!7812yn9VLFq-A-r!3=^GcP z&l?RB>>U{)PZ`U4C;f!Oc6hpG$u7XV1KjeePVddO7MkZRZ4P^1cD^}{WG_IAKKa>f zdS+cl0h00fpuvjw8tVH$%1GpWr0_>FEC(dvf6CTnQ84d=thSiZku2Du+S%!ajWS$#4}(`~ zBXKP6s!cC1ELqd@zPLN2L9ZgDyBS&B(He&9BqEiSX7795$Mn=@P$SW9SM+6n4I4B5 zZbfxDS;HbDPrx*mF|X<}D$YB_M&h1AD$BP_3kB^R6_Xlg|n6_xJBy)C7 zbw3;AxXO2~7Uogf-;2mwA8O7`qgkBSM`>4UEQ7guXnrU|_1UOtZZ=lteeNjTrP_?y z#)#z#_GpbYxVeaj_b`Tg$@_{L3!TZJ`YQaY+T7CF#=`RaA|p%dBK$SA=5llCVjg~7 zZJN6^F2uZD%KQ47d7jDBypcJhqYKG$dZv23sfL%6^Aw>@@ce?mxfVbwQ{lHVp7ik2 zwA-K*>}|D;=JZn0zwfBAW*Y5%{7%v>Hf7GPQCc(au1zz>LDeXZ(R%}o^V(*quisZY z&-7XgQ#q;U&jz?HGT{*2e?Q}87VtcsU>|T;x)%ukLDubt%dBJm->Q{uE%lJ@_iQXQ z4~q8wk-^p>+6C;-1WVTChZMF}hjCV!AE_;`;OWxFM&Z8=;rxx3U>^%Gd!H5S^-lqI zXB?*<()}CbCu$q}??0IfYYqAHSw9CjpZi&Tm8n%k#PmDsYtwV*kYg&(dj2#xMM^FF+bw8uHXPsPnRnQwR3&q5B_Q=QhSK1b{D4q=Ix)=*DfYi^YV zykfYOw!glx$+c8I)`Fc3uzaiq8w#*|tOXklu)AXYdw@;U=S%nmI~`y-KEYlTU^za) z9t^M?pXk?IeXE2|u+;#|@d@^_0L$?S_KE<@@o5gduHG!+GujkjIX=PO7+^U*!QK>L zhEIA=L-2giFZ_(JV^Jl%6Zw*?ULSV;ktSttt`{kE$DD`YV&fU+>fad_?*qr+({*n$ zl9Z);lQSqQ4)gl8cWk(L9hg50>=>*7tm_^a+waR2|T^+g#Pwq@x>qw&cy~!xtsx(1&_)BSReAA99J0 zj`vCAEDbzI>EUEJP;Q&V>hOS%U6++R6Yf!i!9t^Vg4ePcUZDq|XsvjrdNz|Qpa`aZ z(fw@>gg!~0#&N&?;-ucp&wgBXp;F81j!73prx0q@;VwX`w}ZUdwO4;<8b{oUM;kcr z+XpFEecM4M9%ji1p0wLt9u!cpY2M5@t`2u0e%&Gk;oxECnCw)AL8y*%ymOBCFG^?m zvTjT_W1zkb(;@6D*D`5!PnhZ=+)BFL+>J-mrM+tyP2GS|mni_>FO&uwZ$liPOvh7W zCtSKa>|I}PF3l`nEFOOqW$h!Lu{F(yQ;E*D^6ppO)m1n`lh|9d@P5ZW$+gc7ugq=2 zNr(4p(o>pG=7agl!6#7P#OeH;??D^K>ah!E04MICzY8;ftw77Ku{-B|TrcZ@n)?!M0}y=>1;Z%iM@i=EL5!La)PzcRmY)}Wz31;_rw z$>!o}DJ`~V`Ijh+&oB0k6pgS`&ay6md*D!#f8sdznfPUGGri` zXbqej2~O=_PS5+fVK{@36>H@qY-)I!OQhCUNMz*)ov}-GD?b0PXax_=Bd`_*EXvy69k>*lPPeo(1tDwX98p*dy(aUafiO$P)jVGcb@ zxO^{2ZFKPz=!(*5Y%w6YZ90`B8!o-bX11F7c40!|SP!j%XhR@R;qn9J54K(0Mz&oN zggPir_FbgW8n%NI*p1&@oHkR{A&vT{E9sxq7nkC?lejU6mx-#KpOC+j3&}jrNxMFb+HZR`+QKPaklx_LO0dnS z_4Tr(4Q3ZXx-p|H1l=_hx~OF+wK-KPznV|L>dK=0>T>aHdx7et@?~9q8ZTs%ve`Un z5>2x)qWU~is!wBJiaUJPg>WJi{-(4-bH?q8$*ljX>AH;I+{^i-?_@B=Ra%nO zabVL}T=KDqc1cCUGw!N+w$7WW=Guu#G%=muIRgEIU*8BZY|kzic@{Y|hZjRci5HN~ z)Gp}_aucbZ>Sqq=48roNzdY%ugEek&(4UJ6d||_k7ey5@)W7cPT8&~8rE%YCrfGp@F?nI z?NxR9{Z0qpcCfWi=bLuEVtr%oo_p9{n+TQ{8%S>1OqMr} znirBgg0}Aq4z$JNZREh=!#!jMHTC11XK$#!%Ia76)p}J@-x_xel+_qqN3a>nvtnW) zX$1Hk`D2&&f?N6~(q}edALWThs-b`I>UR8V==X0m8(S-ju*r+fqvw&Vt~G*T?8z4# zXo>D=-0uZl)|jZAUdlm;$SvP8QcH>OgZ}O&@HI2y9-!K9>(t>j?RD5(o?g4yn0Gs8 zN9R^H5q%%pTwY%|yWE`XqWQ7W<&-_A28%w8?Y@(qTRA~b96aX5b=i}% z$?zEs_lI9c-F064@=AN*Hb=NlTbOOEZ>%9?p4ps_V|d6S!+5Ug<!Uzso8!^@0N} zIT>EYJjs!dchS$Hb>E;mJ<1<6K))jm_(p!;MqPp1J?0w-$Gb|Udp&=;$NVO~^@-{J z3R+o}?wdVbdmMQ=rbyb~&AxpWe~sA@{cghS&)N6#eFI~yepeaQ<<+zA^ZaSr>ayzD_j_8q z#|H1)39GDk@Eylf>mlM2{a1Tc?;j*hF~0TehaA_D&iyHdkTV7w!BqI^U1>UpKTQ5O zx8KF@bZ-9$VU?*gd6~6Z_HM%ZsIFQMS|@3`_W--TR*bdcRR0`@^5%2ieoO_@L))$6KCXntNIcmd^V>^h>Z=1p4gfpRi-^ z6RGpplUDn+#-TBM(fFh%bG~~M;g)S6?i1T?AUCp`e>-{8H`Ic?8QA)HZa?8WA|DcV zl!7;S3u*9r!j=?xgBzdvluZ4i&m*5mWxOo)C$upjb(rW9G_nNKJXx8a&tbYVd7IL0 z&a5|^4-u7_9pE1*V5S#xBmMQx2-{$*h1U`6M+0nu-PdHAg8djUoQpwJGE4Jb!rUuP zZ{fRFeWNr#?zk>4&&tMd_7jBHXEv8sJ&%P!B7Yf*|4GFYmi}>`Ug{K{{-+eby15~@ zhB1%&bseF{dWv&%*{}*n%oEf9jN=GpgmGbNWsM>HBUrfshAb#+OfJ*Dhp2l!`&sfe z-JfC%pIzNp3vCVYtBkGq!x+EX65q58A^zvUcUFDj>9ro$n;YhbB<61#f{_0G#5YcG zezbPhGY{j$Tm7GhSJ#>Xg*?9)@+4zY&s6TJm#ca4fl#i^=N!){7rlm2kOc=wfu{~fgCJFj4DocC#L11y>3#PsHki#_b z1=GAgY%rVnmRIxlF2OW`ZBFmaegoLuz`|nC8Lj5Fj2kEBQ9BRsmjevl#?cfen#x_w zpeMAvf}!U(=m~Rt$p21g>Z{yX20F5%DNK2>oii8`hIE2;37;hlunp>q%;v-_cjU2t zf*k~33C2P|E^NcWXuf@6ecdd=V)@6-t`1icc>K8v3FRVA3YisI0be|f{<;|s| z)))4iV46OQo0uPVIM=ji>7fhq3>9ac=WoY1VwfaU!I{TA?9E}!w##o%!BYeYz%iKq z=pWMdc-GSI$dCRpzf*qnPY6eTLFxX8Kb^Jyly7~i;(DA9``(N@qZTp7^SGDhd=56QP z!bJKr!s0Fe+`m6um5=zye~X7#U#cwO|0uunzNI#$zJ(5?ak3eykM!7OFXs=)n?c{j z6X`cRnC*t*!TySHuo>kOf;Qjy)N5-W0scrSLhv26zXo3ByPi_}8({jh(v53$63HfQ zF7ASU{H>?^JHB^kwq{Bt*h#2jF5c65jx;aKHiIu`WzIvzIylxj?-~>rO`~KXlpqBT zjm5{Pb6gAh9p}Si{7&b?KN61fLFqVb+gkW1zV)e!i)*1Ou5}*$Gk7$Q{>8ulmG8EE z#HaH}^@#K6fAKr77p*AOi+PmBwa%k|Aa9&U`kl_Bepc2TVEVMqBaNZv&&NGJnLlOBngbWfbNxSV%dimkb z<>mEmgahFf3vJD?ZOOKG)b~i%5$HpG&o%IWPAm32fw71*mUur0H((bWz6jB*LO6Pv%>6&eA>_eyd(7ZQDyY(i)|^ zkw5M8PvKi1?Ug(E9ovOjwNn145w6PrX`a754xG*>NY<))?jx`!YuyW2BKr%!uaAqR=LyBzne32xyN z{-k!q)RCJgG49DofuQQe*u&7X|39QUAUFW@k>8J*FQNJnxXWXYax9p*5b6T^UEWz zgJ?oXU&IK{CUw(`m{7HVTW8C;1)i(e?Nf+RTAh1Vanmz>mMh`L%CZhh(kgH2n6rAZ zfd)BOVs^`E_1Gr8-ReD#^d_>CJm`AbvCb<5eCW1Uz#6!=8T}DS*0G25vV+PK$4tEJ zO@x#AxD7oIzP4^5eaeFfXSZ+$U5#9xb^w?jQ|Sb)`*PLwGl1n)VjKi}HZZ-euvbVv zmY)escbQs8tQeaQ2UD2lE%~)CJ`*12vxtkIcn@1Fv2B_J?<0<&NW1NF#MbXlM*Wh+ z%*m(v9P4YXw4>W{BY96xc6qJy9-GvsL)}3h?gY21eNmcobl9;Ccfg-be>Fz5XanaU zd4=ZlA>eT>i}uvB{q@iJ1pBs?4t}zv7gCC*&k*~Ou-{P0z9gcKv^>-um zRQsWREB#&kT@SbL9KQ95`?-$CtNbbLVZMvB_3ZOJZQQe;OIUmF-F(OLls}ePRo*?0 zqdl&ky;zy~L_RInL*GR`YT5Hz>T%TT@%*G7u@2IQZ7+*=oh>+e6C6+DUWsgZJ5+u( z9;}x;p4fkumh>vKT<>}|&{AfL}j&O!8ZI(SpbJKS10U@~8Hz{_6Yisb??p--=Tk6&Kbd zIQE28X#wQeWdxNb}aB)VVleJ zLY&LiMiy@x7iBfKJ70ST`66Gdbn)I*d!yEDV_>nl3VpwB1I0{W8TYrcTr zy#8Ho04Rl*SNtxwp1puH8@xU}4|l8lAfUpbW^wy4gD_y);Pg^um++e&YX_dDG00s#UU{ia$+ILJhb7I6~3aM9^=-gpD1P)irm>JF+h)9l3`uhHfyJ`j$5;!xxp8M|6^ri2i(q zaJJkRtB-f%&)^k?N4P}iLLav*pU}rGz}Uyt?;Zml-eO2Oxj1q(Qb;iur#jOmE^cu= zI*Vr%49%^#3)mqV{Y;J?j-+> znUnZiJ1B|@^leDjTwPyS#9&Aan}GdUP(RBC@>eJQ z;qr@eCqB-8-sb);7ss0pb<``)p*>M)+U~NyhI&QXtlyC~{SSVNZbsVlTEdYwDcx)M z6K(!lzV&I3D`-ok&95V^X!FDEjmDl%IEvcUZVr+gtwz;^N20tTk!a^K)p?x7)~(jAv-fTwLa%W&82oBl1(e z?HlN=QkOVR`W?sVoA{lM(;ErLu~51<@TYP5X1?`_=M&w}YwfkCt!Llbl2+&GPHDf* z)5bH{w-DACzRAD8o$t0Xh>tWudzI>`HYnX&_?_3AR>pc84)&5XF772;PFKXwi?6 zl}ucJvA-pkeoKDWx+D7@FDtG~rB&Z3eUYw~z0K1_yt+?G@hV)T-;urD(?|J7ynpGO zXJ__~mNH`6UBFc*h0`*A(9_2`crD?WR&%CEThHFvf;-mdrKA(?*80CIPk+r`@j^dL zSl>UwcPvk3#qtifl=q{aU-R(-He}N^^<%_YnWa3n?7f~xak@V*>R;SD#M8ypo~;DC8hu=)(_A#`F;1Jc&wej;pT#f1 zG^PU-{yxG%c_r+*-*53eSN8q(2MEJBb916I^Yz&e5oSj=f71#py)H_WUiA6hgu|Ul z!1o@)&6gIx7o8{gao`&(jiR|;-cJO0-ei^WKEq*bl68Y%KLw0qd!xBBZ}s|VrQx^u zf7yxs8N%`7dqF6x{EWx=wodO$r1!HUn;g{~`#JDkcPYxJD(@Q_$0eA`Ik~AMT<~$i z^$WuFXqcl~M+(26zt%H>rK3#E*Iy#OI$h21#r@?2q)XSruMk%LQaS7|zY1KR_PAo6 z8Xth1?$<~w-LDVw9qS+I|8D>*>eYf5nw7>y`u`s2zx3&Up1jgq|3$v_c_itvF#n!z zaiEbrW0qS%(my@>Wzw7Obbr%ens>hrEX}UH;WvSm_l6xcm337*q@>fQ^-Li7{V#{coXd$U(=@v5WZ+1s#BtjA10gduu7dY)1F6AO8=ziE)~jhU1dv zXgHt$G5OOx8c%Uze*#<|i(_&X_zGPI=^W}@`G=%UD$V@ck^K=c&a@m$yk$nao|ye< zIjsq~!aQz|n{%CH&C@?qzLvA6`t%9doBDI&;wRptCM9?5({M+T)jz6-8vcp-N6#HS z5;TfA8a77H^&B{SY#`AUz2ZB`1s>3~sEgSONGWVNzEzJE3_T}Wgj^>|)5_# zuckjb$hU%A4!59sy!px2D`2^D-Cld8`UFIJOIq%Uc2QwDzO|=vJXfyM8#>p?dxz>Y zB=j)t?sBEI<39P6aN!o@xtx->e)X#&TiLl`v<~O%6N=#@gD!^ z-~YmQtgG55T>l0vZxcNb+f)@7>mFqk|4v?&^S=ylp!>qtR!8vuCvbh*5gH|eF`$>d6M)dIinR>2UHLZr>=i{tf+<)U- z(RVt&HC;aP=`;?Ci#Rmrs^-B?$Dz3-Ia0b-t|6`}&$UUOUdl-GJh4Nb>ykV@EqQi# z$n&Hm&$C+cJh?-jJxLyI*=gPOcF6OTBu{rso~L%m^Ry(7?tjyA_IJqh=}Df=mOM}I zkmu$kkItcKIk$Ak^UNgAtu1+O?U1KC$s^r_w44JS@_a^;M{_gH^O+s;9P~Wf=wHCo z6iYh>oZ6f0_BL>&Wqmeb`G3&2DE}e8HJ?96-m|jUT-Vlp{e#Y1w70QnhsH;| zPdp1o{KJ%)%14AlbfqY}z>&5=Y1+#}r^(w8$5k@5_H=mP@pQ4T?jx-J9p_u=l`pSD zt*C?Iv@hjxtRKlg#AEz4x-B*C)wE{+Cx2R7lGiD1s^6k`!jO{8bU`(531gu)+@E|z zVcj`;_@fHTqoL60rx+8m`hu2qv z&2Z(>8pXQ#L$MC`DjZA`7|tQWW`@A)e2VZ{e?zVOBZT9-a@A=*vQsQvyp*t9ff;6uL^m|1 z@hqj^@htTKztg?(3klo$RHgZShCki8y@+ppBK;8kiae~=e32IYS5F)1!WR)%ng-vh zi^_~NOgNNxn!l8W#X75Qs?RL(c^T9`)~BtmB#U%E(wQ`0l(W9v@7c5l!aZ9(dyq2H zc|Suq&f_lGU}J8`7J%xEp2SG7SFt0TOVT|r%%55l*dvaN`Ba-H+&WKmPT7?$*Uu6c zKdwVj8sW!J9qzfui`IMzKOgrwrM^df6URy8r|<%G)qH3@FXnNii~X-L6x`>R{f_f) z2|Ve%TPCdWTI9RHRm)Zg>l4Q^jf-Qs=JLpwkhYbcX)Qkl{E>e5vrZ$RKqVenNJ8eT}&Iaas2#J$9w4niO-qI2=FDag1+bHD|BpO|0xM z=uPZK(k_>cw!DcoqlCF+ic6^|Brm7K2t$0d8uZU9&*kw*pqm2ePfojLmIr!bydN0? zP1~Z5*Ig2?7VZrHH+A0uXID}Ef8Tpc5?IQT&=pu91PH|>(u@H&g+PFWNJuD_=Vtfq z=E3g1lbLPyMGn?Sny}+wb4%+71oGphK9dzfY?4cD+!RMfNZtol|Qyiyn@#58s z*J@s)?CHA3>Ne%dnQ`wA3_MOYyjlwczUt{TFF?Ds{dziVzxC37PtBG)-7bsdL^Gv& zog8Rhs;#(VyV^ExZ8t-Y#3Swdpv(6m zBm2#*@9G+(oo>wo`K=yPiweUrUppOC*Wg|-*ihnp5?VHO`y3hr%C{4f4jT_-Dg?Ot zINU-^JW!1U`(#H^8U_9H=Jxq^n^O-l$BO4c=e326CfGe6Y>Za>2L^Cp*VPJ6YYelG zuPp{^pC`|F1NsB|WM_KZV7F@X4E9KgT`eLTUG-N0r}p_*68|>8mZARDtKes7J^CQi ze>r~L<#O_By!m8devZ&}&T9~seDZ7Y)^czRG4AW(=kOvYdbXeAk^Y*u8yQ#TE9Q%^ zH{utrjfihL`064U{rNLxfX&bw$voi6<|A8%w;&$Na1-9y@M&C{j>%t;4$JgX#Md(2 zjPH<^yhCtP{^ZL5JwN#K(fWKB+|0|{C49QfJ}-AcXN z)Ct*F*ggf?FYp*i&JN|f!?`>hY)2tucOYt2mX@ud9M>y8YyMu7YOStz0eouH(V(8+5 z$$sVc!e1ZNDSF6N%C(iJ*V;4>nl9=(gndQVAzTA+9db*Mf0^TCO);?18C=F};XDI= zSn)0n@RBwX?+04pO*35{wORznykq&3LcVYQscFV<$tk5pb=8*KF)?82S;S!w-Vnvt^>(rB-^h+Ii{mcKay?J z|7d--ns?pW!E5`cmlS%UAAO5+;KxuFozFHau=dFw9+L%4YTQIYFnubC<dg$V9hQ&%6n$fN=em=gHm$cK73>WNn2Gdnbv7%%c zr_U`*#5ZJyanDOJJu$=39n?&BzBJ68Ho-j|g?e$0n0QPn5~ID?^kMcN%fG=hw?hhp0yP|ZpK2v1^?*9$aO~Y``J}T1>1^18e zW?onpU+2CK4wtj{pEtNIU1zxP+!tXXuQ?7}F+a(&ruatW$1Ww+*W%vUb6}iz*l$7} zlzyxui{C@&&vO3%WIyUFD96s&kNO6}d;3x4{7A63QrSC|JNKagJF{HdE*&SWdWy6+}ze@T#H~vM^{Ttpa2g}ZSVcdV<+tmfq(Yj!`Uot$xX?gzzH{?oO2xvWj-zBGXz$Y&U8sGLG;k3>7gqvY{3h-*(YJXzg&qMeu?s76qa2ptSlQ4hUFSiQsGZ%PN&c<-z znwb3wZm4Bh{)OWSZl{;UbIqY17VFOv1FV51&aV(ByuXEf3de#w_=vR{{W>}8$@9~H z0zOBw+mJfyXZ;!BRX?lkjDWn5SNJ>P42;zJxz<-V?h`RbOjSqepA3WJqC=xr52}nh zpRCu6PSh^=ZVvi8U#7vWcU%zPu5b_4N8H^myTPrtmB_zz!yVdQ+8b^?drCO_h}S`@ zBs1y8UaC*Coa_TX8kAsusprD}a;j;)$tH6~KaTfBkZROn!GdL_AKS1GCk&Cj0p1PG z^jKDv0jeGa>$Q{fh5I5OeB!k>&zzQ$)v!g`weL~Tui8(-?T`0acFo;sGh4pPg>FBW zaXg#3!K|xF=3D2WgOEOHt&ZPEz^!A9aSnu=bI>F4=9350vn5%Wr>V3{z&Yk%;Nkla zc^`_m=1*z4iwTTx$+@!5x6UQlbtAsipVIDa@;Fn_Qv*`_+jX}Cwh zFI>+P2h(vl@U8P7VWe3_uynk1zS8mhoTBBU4GS$_jOV1Fe5?niZ}J`GjrH&I=J!%m zN87AV5ub0CB^|z!JSHa{)6b)HG=Fg(v@DuVHVx>POB$T-*xwhz&G+ee>z!%ufqeu1 zcu!9Foy9jT>5K3!7JNtIooz2)Cs|x+UW04&ur77J{AhGH8pG&Z$$6<4=~@!xnCdpO z6KN~#7b9Mpww9CG@KgHExv`UZmFLS@c0QSV(Ksm=uSd-M`{3u~a&k1%jqgJ{*892p z(2iHX;6AhytY7Lrw0ZCw4(>yn4|jYY+5*9)_o2}p-iKz~K%#e*J(_U1^*%HMr)?~A zH&-P&k?`m~G}dQ$ADW31+=r%dG>wx5hu(+A_~=fl`_SkY--mVz{KEUt=nn5gqdUA0 z&A5a6&`kW`KD1LAKe!K#V=cT7&4dr`LwhXX;eBZ0cK4QvJ9Qu0A{)ouWyZeDbi@15 z9%s{a_n{d)!F^~3M|24~=tPd>gSKVY(;MFSrkF z8T?L#pYn=^A43O%zFF!%G}77lJ~YzH_&zlH#rL5xZhRja{o?!37&pETjefmoo&WTG zXdE-0@S0~J9G{rir0j(Ep)D8q4d4|D?n7%$DML=vk@@!gW((O#+G3!nzO0aw>*kc5 zYQBJvzaD#;)QvdHl*6u@9xmMn(*Hr|PWR)EYpaQ1@zYk4O0hW?(N2+FTY*Ym>g;}2WrL+_S&j*iqvrXM~mflx({q5#*5}j zvDU;p=DO2u;ZD4)-ms(KWSJ?9uy(Q7>a4{WTkpYpd1nhfHplAlt~YHvvr}pX0BP$( z#aXAQ5Sw)&I^+(!&;c5^o1fa%3$4OpY}{2`&rKL_ZbEfIbwbkWI{CgGDDk*jkMV~( zCyG7v1Mbdr3AGR1`(VpvH;FV4>2g0@B}}LBkjlxm+Dgz7uGQ8RmziRXI`qb`z#S4J zAX(b~RJ$dHyZ%F2h^|#0k976}Ez|V?(_M`p^#sqyn~&y)azBlCL5p~6T|8@_fnl@w zOUZ>2PH|G7jlXQza&obR)wLYyF@O1auOv^1aBKKH+)s*dPod1zmn*_ujc{xDJly?J z*y23Hj<p?zBp#+)l*gf*bQwO2yPRy0u#lseey1{^OW{x1i`pE#3~u5mPPZ!= z5nS3%VVrE*m1Io9XJMse|3JRYwYu+{UM8V^hw0?kMLB6o8Y(AZ*u3;6CEWFLwt5ZR zOn05UFOv5q@_wScpDgdE$a}rK2jyLp_prR{@*b6UL*C=^zFgiD@}9z5$Dqo>Ho?!; z2RMz}f_;J*_RgRlW0;m%>xT4zbrXksD*XB6!7dcoT&cIsaI@aF$omR;KTY0G$2*J1 zkMTU1j?p}rj3&;Du8;D-@GN7tKa`V~=HOO3n+;z{UMAs{J`#6K@6!3{N?wtZ zAEig>u;t`cQCQZAj?Z*mmy_2>*h{4UJQr^E!{^ES1@eBOyk9Kum&p4DdB0rVuax(z z<^5W`wVcccf6N1a*}CaUUXSp6;y4;NFV2kxaj1{ZUtXLy6~qbqak^f+lD8DZ3Hx#! z=dBVa94jnKeqX92Z!burxIc9z?xkCBu_g2KPB$l@FtHzo=^9PSf89PK7(JpN0iR5FN^Nue-?3A-p}F9e4U4P z5w2ANGwY7Pri$YFg5dh1;G*os;lli?dlO8DXH^I@xB{5s`jX)KvfxU$Nt%yJr{l|* zO~=DDov%qccSt%MFFwycJaMsYi(u*e;cg$`){d-zDL+zjHp%#|a%+37bvNuVu7MN~iL1 zRgxb^=_-xN!~IhUt7GYhaI+15B=4Wd`)<4$pLOl(yObWMlc~1oN<7W9d#o-VQcxO9 zoauOeU6_S=dYXk*5~ZD481CIczWFQ=I(d(j>t1>PLf-eu`*A8+F0855WPU_29+ z?z5gh%fftpX`f&lvJW$?_GLTH%gOJMHlHjkT}Q;hyxGUEIW!I8)xMI>YdQHtkcPqx zZA6@KkDPm_Oe3a24`A<eIVU(Hc{bzWmN{6~N0{#9b#T|mCTdOC%ijw( z(tHf=W^H_=f56(4`Z(NvKl`Cdo9*2=PeHqlaaY=uuPga9(txdC^gOHY#56Q2Lu7(*3AGuFB2PZ6We95 zFj5^d`=U(eD~N}y^-P-l*7kV<&RG)ASK&84HL(Gk83StDh~*k@j9V{L_Hy!d_zg9A z>69%S-6o3U{~K@*RIPp(@zOomKiRM4`zGA}UWH0Rx8A4B@N|dz^vwHr;D<|~A;7hH zWtf5f@%{mK|4}93+>J1`Cazo{p6|k48|863TQA>Z9O&O^K7IhVzrO+Y%;{dUsUM|v zw$13LdKK)SKZ9HEcu;rKc(5)!9M#^0T>#v=5c%W&LgOv{NbyN{UfWO*M?g}?KWDzC z*0Yk4?zH4raQnL}D#@?mhU$Wz5@=ZaMwR3@@P`#M8HToAerx<#G1kp`te#=}I_vTG zbf3v<94&l1-7Cf>a4HS;+@0*8do@l+3;d6C%bkjh|0lXHLW>LBy0Nim-K9Sh9-XV> zKGM6e|N0le^pSfCA2w3;aP1?}jz#OUxEmWI{gd^PT4bw4PUI>yv{!Ns%3omnL-hZl z7T~w1NTjpmn!bLgFDG96edreZd9?Hm#fCs-DJO*h8crmVGq)cmxcZi1zb*$$>wM~- z7uRG)pZ#j^7?98NTjlfrLO-HBSb6IQ;8s40;rFr65t z`PH@0u82#$y4?(3yAQ=UnLGmT?(pZ6g&}^A)l;(e|8wnp*|94v+`4acY7<c#<0Jm zZTTpUBk-M<)`3x4s;3&`dqj)08dSQ%qiN9=cV1eDw7?O{IpVZ$l(OXER6D$y_TB|) zAJHQ166gt^Jp7Lm80}BX|G zEAJEV&dXVxx)!BHcgTglU_KmagvNnw$E%`f9@<&~DH+JLoI@W*=hBjdz zq~2y(Y#Q^dOlZ@XVZ-&ToTb4jM7yRFePMTY=I7;f^O(~-xW zAh2dF(v3K}4zTAm%E=z^Q=XUSVfKVu)>9o(Zt~a6ALTC(=FAS`?u9f{b}$8J5A$a4 zU@&Wzz2R;IwuooaEw+fsd(vG!j~=X}y^}|o@N&z`BD>~3xDzuO79lI&2d3mz&H!>_Yg3<8c+*MDLI`GE>wqX*R>hGE~Ob{Ib0+0xoR>9aFR?*p*yRzBpSB zl)xDIv_>2I$0ipUv%~XMbvFZtx#8LK0{!PbXH;gEk?xRMfv67kkJd-FR4GoGm>M5% zG$)~myPaVMT^O7knSy8!w3Gfd=g&yy_(K2sky=97<&ZAZR{a*{aI7{!Wb~izttL?4 z5Q4Y{F2oxfR-A`q(pDOGo_Cs7KY3_-ce6XsPD{MY?HGVh+TC2hy&_J_3&WrLa zY=eP~!s=rGFy}7jp*LCIY+P0wtB%*r*;@KtN=Y#DiCYb;{p)S%CC%X!Op1l7z!mYs zkgFNlCvjXBhJ(l&Rb^zCgpH(OIKE)(b|xg24VZ)+tZl4ATO79kFEjNt3ac9vll3u( zN0_0(K_*mf!W447sqNB(FeX-`3CKia3cAzP^-~j+S24|FpoQK=Q{^W41-!2KT+X^#z-j}z=_g7toYdRB&^gUcDPZ=%iWilD7 zO>Sy5FGJtngnR4hH|6{&shu?C+35VjDzbUqgqv*9)CK%tc@C+v$`o62MBXrrh9_tFqR6HanY>O+DlJo!O52^zM-TM!@MGHK!&xu1zhR$B@)Sv%FoyB4QqqTb zd=wYY1ctci_TekZfZ$S{7{ZCOI8IkmlQ^1&hP@qmWS-~_(-@ZUDvPHrG!4sjjt^T- z>Je_u&p5&ncbxyrT=;1-$q!!&H{T<8YkEve)0-EiHzx79{^H%e;ktVqFq38~PAR!u z;t-Z@8*eXA(0iK^oxwHo}kew}u^FhS|h0_~u#9 zeR)?2-1-Qev1!?par{>L68L+YaZ9i+BR!st6T&2yO2?1I?)tFsU%fc7PA-b!Hd@+g zzR3^aIOK_7QXW*GW-1@dF)<0wG(YSx7daTyUg;KAc-*t0v{CS-DT;fcARJ|9`g z;Pw{x!1%xm7moL1j&F{cwX1w*k=b*W+qiudJW;L<3XfXz!EyL>lu_kk{ML2wGw>ab z&uwsX43dU0+*bT3E4dPHK6x;eVHmj>CX%ZVmhqp7cP2diL)i+`VEPPq4ZdBP$YCl? z(9jU3Y2J^%K>eu;p|_&8nw|z&#M_Dm}Kl7=0QAF2}bqP^4Qc?K6&W+Q_M z`)dhf;`xG~c@TM!N7!M1<(yuyuOH3nlooU{r=RWS^j3GVEU8a!s^dVbxmbg!m6B9L zNZ;97FO&x}5&Qr7@?xOwh)Pd+_ zeR^VD+g;_1)Mr$=oxSg=r~K*;$|&c$+uog}Hrz>Ttc}uK8creD05qmZ!Plun^Gf>t zTI5OlCBL;_z8>FUzkCDSN^=?Rb@-8f--tJ#JecQit&PVwA}s0moAAzrhkr=FnTFEu zoAB+@L=IDFqMk#T((jvPoczwLJ-ByOPTmYWS_iB*?#;age%PCnS~BCQ^j7%kcvAYy za7Faj!rIf{w*d#AnEtZ;W+ZdUZx{G)kmubKGY7kz<+Y!#hdA%-%zEe@k`D7CbRnXh zV7odYoo6ZOYi5}54X-GjQ>9TIG20?Z$3JgyxX|# zT=GGDYv1Qw!m@BK`H;k6yxh5@!?Lup%d!dzamKo_u?Aw8&T86EC>Ppr6~;_K8-lN{ zHI1kPQm%1pIv7PnQhq8SnD5uh+b#gz>tx`{%!x*-D!4|U)`6&EH zvGu?;iTUo|?7l}Dn;@UJ>mR~u;}dmEyAIxLz&er$h&4Wh+7Pr?iPEf(7_UBt6`0f2 zwdp{{4-M5-{j0!#YFw^VAex5c#`<%giEHJ-`Y2~U{4XH<3&?l-ZWeY>k1Gp=- zav{E-fxk8DfKQk_dYRTIvw4O%4_XjTr_`m8j} zZKPiwZM+Ye#g3d6L4%GeEo?VZhaLv^~tAOo!2pWah|o}{H?OuJAi)*38-Ew z*A&xCJu}rx@^wjH<(C?s?UfE&PQEE&DNCWu^&4>W{Vlx1^cat65(jzpFum^x4#F75 z!_xLsSPln+U0AiP@&%EB5+2?Q#jxT1A4O-*cuq6ck6?cFgc#@LqH|*p<{l81vD5Qw z-viH%-K}wKC}Ed~8+6!F#@-UP#&~3=YUQJLubBC45uT#eoe6JL4Y|JgHrhwd>X|)v z@&w<7UwAJE{qBTccs_`J--BPL_kvsj8pV10`-r2D^#92jF^@E;^9h zX24~*^K(|DJk93%nq%~0_Mz1i{Wz+$eMo5LUD^CpmqS=P3A>$EcmTFyoT>(90U{?m zc>R`!V(J=3<-$H~-b+%%U#u}(lETPwu~rRzJdV?gaoF9y07d8_7>q9B4^d9#|M{)_ z|Bvw<^8Y`9TgNfO{Rls<*?)>RpBCjY`?LODM;0jUd;VO8go zc(du3lHW_Xh13zpq<%Ntq^ZA<_b=uBD|!D$-oKOgcDy++uwB{SOyh+}i*5M_{7Aob z9?qm6z=(r!*e(qBXMDTFiseDYu_ zL(7BRgEHHAwtppu+Wu9NcNyF}^}_B_?jXN* zy%3@_D~09Kb$4uECvn^9XSj7=$j)-w43#vh=QzBrBwfziqi}zsNmPhchfj2!=y^D;g91&1U}=i%wmA8bT_GV|icXYqxFW z=WSW{gIo6?t}$)hQ{F$D_xybp#UJFL?WP3m`ATM^>`5j;|J%qY=Fd+HDb9`WQ#%3` z--)c7JYg9;>OtA^MzZd>cXuT0Jx4_y9gl4 zI3i4GJm>hs;SR?N%fhj8gy1Az87pne()P|b^i5q!WOx5$2hE?`w)+o=Q*7nf_s^?} z`2xWsTNrH(Fxw>#78I#?o#f%V;ygghnwo~Gv+JGbBqw$!`Dw9c86bVpw$Pz#Jl)zY z+5Vy8@?a9J!pwqVu&tSs&2)f3dq)9iZdc)g6gfcc=OAlWW}SCPQ|F-nDsRVc9bd=d zI~-HT!L7U&!_CEy=i!gXn~&nUb{oI#8SzII#F-~?^6=?BN4oyG1$@dp;LnCFCyy39 zdLI4+xT)wfA8)Qh7RdWVyfuF;6LFmkKUWTvTFa3K)BNiBwNnt6>6~it+OiT~CXc|o z5dM6!Fyskzi$|GXW%^I+80{UgicSzOSfs)RT4W^AFjL=pN{V|KdeXghp_F! z^VDp253_X)FV`p8pYqyxanMe2-$*@AY^q?G0hsvXqmvf_}#``1I3xi^uqF zLB7*4^cm1;KI}uB7j-SB`0MZs*J8{U<#s-8k0US7tAjkJ)6Uu(7?C;|#hbWjZ@{Gk z8Jy;oFzyLB7{&o*8k}!#5_Tq{SDiAptN~cJFzIF$w8f8Y-WVE6`JIMz!=t;phB%%13v3ZQj^S3&7=e`=(p?X1 z6ZFw7wh3s9;1amC%%`7j?RX8qk2T8ukU{$mZ3t`6tj74m(5=9p0oN=XKRj7vWl=ce zD(;EKsK_cS3CGqrPxGOCj5AF4)TA-jM)wA|&GlrG=S$%p9)MDZ(fPnxPq_8IDduU6 zZr~f1@C~?W|A21ZJ;nONJyT0JI2^M|;|RkimU(flavEe_mkXR>o|1^(n7NPp|9-8q zzIe@w?h>6nc1vyQm(5c_S0-HF3SOh**JNDVPN0m+dr#t9X$<8#giYZW(wKEv!*ZX9 zb_c^V)(ju-Au_(oN!X?v;nsfD8|E2p#Pag2^(KVTN9BVLS9x2=&vJB0j9e(k-`5{y zw4^s%kY}g=GJt)`VV*X$>v_)KalOzFR_Snblt*XnkR~4MpS`z={^4FM-A=z2=}-nW z4KkT4a_SCLvLAZwcAGAzG{U{1&>^^HjBZ$M&{zi=hWe3nX6K zg%Ic?#|Ea@yz_okvB0Spoo{-vJ3cX)xn^vxYf&4#j~9jU=linCHmB|5$E@mCUzKf# z$UYF`#sZW$Lc6%-eRKd&xJo|%Nn{m`@#$_f~@o6A<_l41{>+4Ud3Wbv1Exzu^oD<#X>gHU2Rul|#$`GfR)o3aFdvp)0)L$kRUe+| z7wN-WSbKf=mjVZ$n6F`E)n91#)z5S#c&&LZB2t{XynD ztx$3(Mqh55|YKOBKUhO}}dJe*df(At7B7VU44 z=?b|S&0RWt-wNH@Ft%+<;GdKpyawgAbfVltzAB^*uLF!@Y>IUP*lXeDp2F*;u2k3j z)y8f6`Wx`A{fhf*+g)BQNLq?ih(1>ayFZg#$FRu)9;jJ` zX^{SrRAr|iuGY6Nk@>BC`)j7O;a#uVeuD5~tfx-)u{fu4AL}jII!U)%s#12YopnyV z73*x}gC8(u?J2)Cn=Y&%fh#c+S#?c)bR6bi7|U(Rh;?(l7?T`lIzTFS$FWFT}0p zglcPnd`&hy?!}10p9i{0x=#$44_5AygHW=>uC=MN%^(n%r|Kx_o)C6== zu;8evP0Cvkei+K<r&l&Kyv`K+izC* z;?KCaCw;lAQlzaoaaZ~UKHW;`Ge}qY1m!pwOy-rEmv9fOeJBze<^^Pn% zOq?%<(_9@94Rd&9ijVn)Im3hi_(R&!P9U&eF^@s8=`veP>0`a^hNdn?CFRH z=*lga*eUO(-&OGIqMy0zfpc?W&JAHTUH-DvH)9F!pFxcpUmJVsym_-gz0>B6~+PQtKXv?RY#iN=;0WWHS9@LlJ5a;RDqZerkB1C z|E)2=(Bn$!F2K_CZ&vAl;KwJXU8)EBzXA{RU}NkgSdpJ^OS^{7T{m%UnzLx~-fqQ& z{GVOS-|=j_GyI4Hf#$%SF;bB7^?70&{TSua{>5+YUq8in*uU7BAWE__!zQaC7f9+%U7`%7ZR{PS>e%o}rC$M-?q?MfzDUkPTvb?Q zZD)7p*9gZa?yKw@yTb0lZv-Cn)ogLtTQk1CZ?srPFjj5zKyBREoK!r{$Kzld{|5+YU)%8=_OBgqYae2`-{Z&r^#{E9negxr`wi33e)Cs+yEKu* zRGR2FAx!(tEjj(>&%l$e9NTC90)Nv-Tpii|@i+L#{exkP`iF(J?;n2$4nA@JV4Kn| z#yY1{nogVZlX59?t%!-55GdUMCpA0{h0j@gt{&CNr3 z>5=~l8Pc7!*I^6p$0)}M*T_jP|MBr_SB_u$D~;yZqPvV=9*y>}QnKFgr-%z#0{wN| z?}G1e+)smB$Eu5uaX%gYe6ldymm#>bFu!g;NY04O=(RLqS9$M-_npOUo>$`!Qwxj0 zB`<}CrA-sVFS35wUTV{FceszmSRGINxo7&ZuJ^#NyVRBJNjILnIE&%WdXD4t^fE?% zoFm|$7iVTKW8}x7JT5QJKD~^QALnrR=f&Btmof6==-oYWc@F3`QF7~G9zc2N93*j; zh<@2#aC4089ld9XdtZ6)FYg28{Rq6*0|)a)9F$M+n|OMHZ^|9$PkfX$@S8YEiup~v z_%q+cJzKts|7i1Fn#ugpj_5evllZY*bZdWL2@dIn8_yi*Rr9`>un&<>BfSWJaor@P z8A)$10^w2F9n)akqBIZhHNlY|d+&IdCgU=_Y&yFnvn8IU!+4szKC%}$pGU%v_v-Nb zV0=R!M#^;Mcs&bi$Lq~39S0nIVqTAY%^b+tj_)<#WE69z$bJ6PO+;?e2=Z9l|0%wv z&AGT!)BNBmjvwsY4i+!|P%Nm@z(f}A{BZb4gXW`kbTQ3Z&wqE8V zj-I15-(u^9-=VD+x82c}* z^S!XgwgBnqBWsFu#hS}j+ShrTwx1svZd#?Pk-8s4`vauGY&*W~8GYoeg!{I7Z4Nmf z&|lZK{8k?KRD=n6+{eI8T%3Cu?i9GWwq1xfpDfJVL{QnuV|(rX(;~bx;ekW@l;%t4 zsmCF_OA|RvrHOeegy}r>vPkZ>H>3(D15b5j|7F}@B~7F5?P>H|6B_EE9J-va{;+33 z*))t4m^E(?c{2ApvHDmDtzm`QO`K7PHk zu9)|a`kGUU@TbTv84E}HnS$BabUF;#S|)j84z*2oNPULmoMCmGpMf|!&ds-sbAE^8 zobGU((;bg<`o-g%e(^Y`Up&s~*J7OSluakrGi^F82TpzR$MnwCbKA45ywC#2IgPv^ zdvJ~0n*Ly;T}MldqJ^~YJ2!Q-2cotN+HHUMbG3OpAcCdk=7(y**c|$N>i!4mjqZP3 zBKsd__iAf6xecy(!FBijBU3fp#39PbDfOMa0HI8pH0Ko<^P!x8?sJh=C@0WxA#GfR zFiOvS9Nfhw`J9Wf!@aPTa97W3j&JD4txOPY({DBX*6@CG`dAxzWsu3oOWXvH^toVL zi(3ctjFNZksbiV>q|FVb?fh2SegSZY`CkjS=AYr#z)jk|4sSkru)dyRSiJ9YVXs|N zUL@~}@y_4`I;Az5ccuSNM0l4klp>X{t~5;P{}n>7R3=V-n&08R%O${T3=GOf7WZ79 z0KcuFr|`Z{f`3fopA0`fF^#9LBJGY;dkxsoc(L6ZVkU(T+`jKqziTJ;_&POg?raoL z23n9tN^8!mkQEySS1TWsldVUYwVw^(Tl?SPs0#J3!9VPOLvXV{Od$;858}u5=rG=V zR8O$KmoCo5IAeovZI4h-ux`RIoF6x#VTGM3Pm6onE!E{UgU|<&O?uMh0%{#^&*zcw z6tW^hj@jF7K0|QqcIKUKTF&0Ks-dOC&+6%<&*d(dh1&JENIi&9&y`fOS@t8=;y zq&<9c6edmA(88p27ga-U`$o_<(z7pMehO_Sj`kY*=FTFH(Y<(NatrM0GQ4wR4AD)Q zRP_QF!V`DHh98GT4-2Pz9TcRDDraK)$8_*Rm&0ElotrXE9WXDh!5?D(Xv;V02}a*F z`6X5a!^GYGgC3z@h8>w8Y}7L`Hm)h=xdlhc{zfM`$ca}p?ET!(f+kTWLc1A0?VJ<> zXi#3Qo74^taGCL%gQayowa;@NpFm&HIe_0f2W-N3I0tNoTX_P8+lU`+Wo*HlkK(#^ z8^5jnh^O}E$9Wq3`Q+hKTNzncIhl2^ji^)?T66t-1t3&X=~ooanw*_)2{2hd+Wd2JlpzqqnD9WS(h z5yL|J7cnffe-Xn%`xh}Rw0{x9Li-mnEVO?S!$SKPF)Xxy5yL|J7cnffe-Xpf{zYD0 z9|L(5AKJjUvX@_WoN$c38t&b;`Em6cxbtwl7XEy$m3^@1_u4W40(oB-ym@ z^1fc)FOm04<$Z&^UncLD%lj4bexa^^ok@hr8$S!AUT^HR_4-D6ze(P2k@rpVekBl|$5a%kD3n>0~!!MKzWN~EeP~40- zoJZb^H^b9bg3C|Ir%4#?P&gR+GuO4G?XMC$6!)Rbp&bf_#oE^KeuTsA>`>fq-Odih zB*U+udadOJ7oaXeI}}rd2X-j7!EF~k!Va`%B#f}NP7WEK9wpOK&K)b_-4kY=9kiRUtJf$fQF87{CrL3e0-;(2rjwkKW>x0Y9J zPrMC&YJ1}C_S@N>V1Ed0Pq6QYwkO^p?$GuG$3xVV}S8d8uig$JGMWL zH}k?Ym1fLCIL7@Xe%<&Edre5iaM+l2L?Z9+Os_ZRSE+dm6$K3dlf2EVYq=r4WA;L|?#W$!-| zq&)cw+{E=Iyge@5FAFyxZMP7n?bZ}|@fUlubc$_pJN&T^Whj-s7RjESxDx(|0jdv) zlxeq8@-_Hr`)a%00l&DNxMtWTIidV@!1R&(Q+BGIQrWV5SU#V9s`e*yNSk5JJv<|) zK!##FBvbI~^d1KCHlYm?>eiUEr1s>On*({TvD-aB{W0y^;b+5o2xU2xgM71BYs$+S zLy3)DRkxPqw2}**LF*CK#`;TZ1Guv)JlC9pIGfV!e@$wKG<`QgK1gw1Dr4-ssGDl4 zI&DQ$58zJ1w9vL068e9S{w~h~z#K%__X(3NVu6^uH@k3t=?8%6qjIyHq*2#Ao}7ZX zHl`gQ+K0IgyrVvXOErpVM#UWflinA?+#zVrn{PDu+MS8&bU%=+8>FKTb~7;VBoy-4 zqWyXQ84Rw}ufTco5l|IB9IohkMQd*my@@HM)1-3z{C7}pmYC^ zd+pr+6TG^>mhBpu09UX!bbo!8g-p8hV}+qhxu# ziCgdjKkysp@?KK5_a4d2^1XeTZ5 z_+Q}m=f_=dM%Z%lSB6~yYH7yj%!GN}JwZ7dur3iEgE#rJaFRft_f8#$7dXqbkA=IU z@eDc3b%6Ev#gjOMfn;UQkTc)y&XBWB!ZYM_@0oXo9GS{JLk|D=4Ef)YZp<5-ycC=v zx3Kp5tp5OBJ~59?8pLzs|Lis3B=6j~Yqb_Ms1?t+VuIJx8XJqj4VmO80*Jd^06Yuk z7oJajz~ss5pMX4-|1EiBPKCd~+2(xI0l;D2SWItqTNo_8-OEjxXmOm2+lvaq8&#r^ z#dfq=`8v{x(qWcnDy^Zrj9_dj<&lm5w!=f#)4L!};W&}>rf0(hea+g? z+uhbBl^0AN_n_Ofn3aXlZG4a}?Mjdz!MuPIDP%;wALfLWTVR}zd?;zwKHxj|G;tZ9 zbJ@=I8{r*;YH3fiK!f*XUpO2;%(3+hm`1I*=rF=7NAP8-YBgFM*im?UHgI3` zTcs1c6O_MwQNHeyrv;?@q#+IlDziJn@ga=$7Q(zOcifqVF#7`^-v{8$`GjFLP5RS) z5Yq&&t@oJfT;pLrKT4Y(A$T8&cP2b|-6L}HXwm`f&_bB!Z#A7mC7oWpRhG>%bIj+Z zdpN@J$-+v>yU5JpQQSue?%8-VJja!Adep6&toe=Jnd@9*~OZzlURu|2)`ky)}u*0`kqRjBW23H@=pp%`KdDr7= zrCTZ7G3GeZv$?42ke<i8ha}44r4@Mjz4;JfC zG99BciE?us9mnue*AJ~RExvigw-hG;hH;-W$Csq@Xp@ed1As5nKAC>74+n$N%uDGM zx^vd1?1#Hz44n$NJ`vyY(6VlaU8))$YCq&XlLhj)0{wG;go)ih)amZi6HMsex}IHV z>cZOFEMfWg*r0BNz8HJ#IVX33-k4=qthf`imFzG$N|mErZsmwUm_F5(-(k*Mk>@)t z$eZ?S%6-{)!}C@QtLLpwM;twGWxnOS6~DvtR&})=ThT8*Z$-cOycPZ8^H%hG zxX)WX4mkCZw!(rssKcGC=c_u};|T4wwbn6*yhC=e8eycC`sOE_K9p-a3+7xF&9^sS zpto4#E{_q4z4P|-vqo`+uSTwEZoiL4ZH-}DENuGvxb8UteU1DV`&TFSWO+V?_GFi3 z+bL}%Hr-C0Se13>Q*<1^@DTO{f2Zy8Y?@{qho@7_=snxdc}rT*niXQC+i(H80uj$} z|3LF|mPwyB%WjpKw3S8U0puezhUqf$g9On{MiDG)BZdzE*bH z8pCy(=EAKSp`~JT49R$hXX0AiJz8A_Wpl&0V{TaMT)xir4(OFqU%|QR^|%RVum(G< zfnRNNKUhT4Z_Img{@Mr|Y5y_s%RQ$(4gt2=0~DM)prqIAAFT7vAh!K<(EnB0b~3p} zB2hWi$CqVcG5x2hES`>lSy@h!-l^l4e9&s7O+JP^6~C3gIUnC4f3yZ}E$L1twDt@&h)-EK>Hjz~ z#fsoKyw}jTo^pRS-9lUMhK8n>Iusa&OC85y3^GL}We+hyR5q1|F0bGpN(t*s*<%q*dPb?|)a9k4}#EPq@2d&|~2PHHJolxn(*= zlHG@><)(|ELnHme6OyVrbJ8Tu83GQ{9NqKSpDUVvoBZ;ij2m*(qM{4bfFvn#Wl~}~ z^(dWxLw|6*HfD;+GU?vRWx45?pft8%Yf_z=l(-%(^^8Pm;fBREP-8V|g=HGcO^ZPX z>rF{YT$z-ZP9sXE&z1>xj3<+!piGzNr4tFdStLfx-%fGROg`>}ERExH5NQNG%*f2x zw(L2!JJ|Vin0dLZKE4Te5OVIMdkR~>IH6|rmyCOSyw)6`prbO-B0 z^#Nawq55X94jwncn=8;m+*D)jAHgyEARK!9U>##i)9D|)bZTO9s9qZxbm_6|*2m*F z$gQW@XJ8*Ux?da;Ql3lUH{56puE*{=@zY&v4AE)QqkE{oJ`%z)N2cJ_v-+EZ41_$h zt=Yfr=&|-kh<6lzP_QvL`Hh>+OnUrgb~H@?__+IqKEW7e3<|5RY7Ce=PSSqO+W1KS z0PaB4aO>-1{kRCu)%DAZvO09poXS;2ubtLAnNiQv8MUR( zn%r097e_|2VWvP%iE0~2g7uxb>?~m>Nsl(6u9Sb=jBm?VmV2nTWqHYR&tc%#_|S8`QO94*Tf@|aDhE4fOx7ZNqfDbo+YP+}w3>b?L^*jiAnEVQ0S~CeXTM{V~0lAT6KIsLs#_LYUUelVwkc zcdDs8meo)_W281JbZ?yQC0jtvEFEOt4YwkEDd`I1*g3@>|Dhk_)i!gU@qUbJco*ws z7Al^(toBfGqO-#&Y>{eg!IO&mHNjf{mcT;aSP0Zf^|_Q9PiYf zFLR5^w_auH%geW3E%nFxmbn?Cmf^8caAwuU(4v%7K7{lw7tGWtE0mu{a#RwXb&;Q- z!FVDKdM)y!dqSkGbiWQi>TKU{WQCq?dzhzrDkph8;xPUj@K)OD!ehU^5EtSoP3C;e zI65D{8Q+>W(jLOzf?uq|bPw`b1f!m?gOz+*O5+_Ym5*`{(+=mho8ivJDJAcKKOffR z&ykPawk65mu`VSIC2rjtqb%n}xTD4}wDFDb@1LO5-_p@H!96fi>$hi)D#=Z78@(pb zaMIGZ60Rpn3|*`wZ-d_`HkymSeE?3;Tg>&owjzdoXC9v8i3-&7e<3;XZpT!xX6n7P%PfF~f7 zHLGm7;GQ`h$NsDXg&vSuD2Nqurt9ozP1vmq_$D=Z6bJr?Y7x_b($)L=6`OK+o~Pnza^9Qn~Y z;J4PnC-EKD!KdI>TE=jnz>oawZFuuR-OeoGUBSP+aG#NISs3DC?ZC(Iws?OUVM#wf zEAP+Yorwpy#v{F9o|s>T`y#$w9#Nt&?HH!{SK58Mr1>ShiI?@DbeDWE@qPurnC>#a zMKJpFXP%PJx9U$(zvyr3w%eE0)wtc3o#%KOm6`XUFe)?W zUK7ve-5Hco=!e^?ODp9&Z>Klk;%=m94;<89Gna-qi8K2n=fLj=`O)#1r(eLZs$cK} z#8LeM^DX)X{0{XC=nnM@=#KRZ=ojl3&@a|6pkJ(CK);7ezkqd1d#-l@r#{j?=^6|L zPics&+tW>3C*>7cT;cw&x0}6z;%l1Zx_nfhPlF`$ya5!5+5qOB5^o%B+>5a>oV~BXE>m zn?~Q6QC_8@u(mVmP+XQmb;#RLq+F2W_xh|{FwcCf*+GxCxbH=iub&s%1$EWt($!gAib7jLG`G<2?{9F2JI zgI_#XavkDerBZUEoByp1aF-w8R+^$^(>eav!0W?B`Nq5v!gQY0yUczjdLLYe`~rB~ zIc(v|bveQP_pQ=>Kiqz8F}?IFxVIJ|kU8r&2ouh;oW~file^4*i*S76Igff{ zyvyu&0_UCeVpE|gH{=8hV4f%JbbS!&#H1)jpc_M61w3kf42EUg9Z}WE{$aCj$$IP9 z=Uysx)^?ck?%2-nPoN#yzb$W_l>Z=g!TJ)~JJe`y!sbUdr96P9^=_fRIrdILf1{;a zXLose+865UctSjdV{$);@1mL6o(X=Ya{BG zE4}zD;^JuPD=$O7^6$W;)4S2Pl@+gjn_8(Z?YDY5i{|T;>b#(e z>iII2WBtqIZ^!l_=_e25@sXrHTr1I@J!(B*-Lrj zJW33SyO+V`^zm>wr&-Dn;;eqmoFUd}rXmNW0T`~Y`2@6cc8ojriphl}!! zc_)PFymN=pF3w5Zo8Y`N19;3{Z=T^2GjB{!c0-tO?&*d*oO^bMdut&QyI$H8VRW3S zoSgAGnS1s^I6g&lPmjRExraI&c||glPXSOmrIACI&?W9N^RrD`#y>9Z9;i)1dSM6D z07;2mhdFxcf^amM0J;`a{Ol`d;Y_~v74{*zXQ3RF=jcLw+tYLCS%W@&WMIN6WZE>}43GK{3If_LGvJ ze{?Jx)0s!)f@y)0BM45n{UDRC9ouyc@`!9cjhHGzYt&*LHsp_WNZmcH!-Ih*qyvY* zO`Do*1BN;jZnjS^-`kRedZz3P?ba~5QjNuw;lB3K*b~%z96|h7`+L`TmXE)^F?LBK z_|5RM5w06l=19ExsH|pheDf?B!*ZVUVav%;5>{nNbKqwAj>cPUVKTm^nU~(&C_SE0 zWB6=X*q@ZJgfUM(FObWj?)hk5j+eZg5adPox|xQ-58CN*RFZiu@T+}G#Xn#0FTh*( z;I*9N$Orf0vt{T?PLwpXepwENXIQ>{e#*(o5?0eZNzyz8Z}uIAW!v(b?Hu;Eg>Vz6 zX%B>Z4BVV|9*Z}hEG)YpPy8BBX}j*nF9IIoK26@I<4v4X@MAptWcTA8P6W_7CzBWS zUcVo2??GhWqK%E2__2SX>5!g`|ZV65vC1;+Y5 z72jItIyasLe_x)cZqfcBOzThg?dO{_s8$Baa4Lf&@5nw8?&H&K@jWqsi%{T^a*si=4z!8$@1qcAvO#H6)0|1P?kQ@n8TX?B-&BWWN${TvH?)=@ z?X-GK;hz2D0JAfaql!k>*$00^`>`Fwz3|0wZ;b+SFMbKb$zDA3wiIscnIrd{!)KcE zfCSJ_i{<=f&))d6c#OZy#@FJR@}8l7wup#dPT0oPWer{d9q8R36d#@{AGmyKUsE>}1 z$mu;XVB)WVC|FE*4k$v z9xKU(@(upW?8h;@&O<(2DY;m}DPHRAF|6XH+lQ|tPmu6Bw-e5=#c{flCq-#!*pG>= z0J_68suEs#fx|H7G%VZChb<@l5pK;7$c-s)oc{qAe%ef~3)jQV_aNS^AI^0l{!f|t zNN}ZKrR3vsY_auLcj&=?)> zZ&LrEJGlgI)iQJ;rUNrn@W1~BJUjy9h zXmlq-aMv#9+-tu_%-W|r8HWF4qw0$*_{858S>x3%r<#GS2Kq4^=CmsGolU+rFdckz zeC-RGT!&j98JofA*}3s`jnL&Bc}Po{pOf~h04CQ!W${r?ooR$}L1(0x=3yBLMLMX) z#0n1%;Iti#KGO*5C!~LLkKz~Fs#0Fl!BC+oJ{05J!~C8z?LX5l%wp33=;4#|61vH= zg9m_nzHt){+cuMTk^yPr*qi55z zSTMhHk>~)vu3G4^pg*?Ke{%xEOgQSlspODr;R)nX*PxU5)^;HcC2R`6P+qkT^-J06 zQ$TA%*($@wvQ@@co{ROk5pLzNdfjdovWR(&Wu=UD6T;{tV<%GvKY{={uCuaIhFc)> zk92~J05{B?&VcD~xGY#zf?Dh+q{JHj8eBGbs9oc49%h?dfjZDOc`Ckj?MQicxORLx zU^<5~&eQOtyl5-ld{qBui*XydTk;HiYa3Aihk2*|&o+s}c*;+NIqW3wo!`Msa%id* zoNct(th>da$t)Yk?NveElm_JO<7|7zgWN7^b~iCz<=W&O6*?bWSwHdl7v+%#ge3*DJ!FWQ#< zoV*iu&dfd$d5dSGTuLv-&@Z{Zc}}*hdHc=bzVt?%gqp-{vTps67l9kp%XEVp`Po=Z zAKX-`I?ZO4=6oY@uk)ACZT3*O9-uuIj%($4pNBG&o~rH@WmMO?dVnszd@Dby;mvqS zg)Jx7Nm$CJNXK6QH{UPBJ4}yhFio9z!}MM(IF#0Sn75rn7|Y>c*vC-2I$sc;GqyX! zu%T@%!h`Cg5XJDE9M|#OV$RSsI5jlQxhu*HjV^d(-~Pea$YMSG|6=!wa+MdM9;Mz4 zFH9cwdiaI*s_6F;_=R?;==W0ib!sz*_!=zSnhu~$B13~=h|xz zcm87T6H*6d9Ucyz>O|!O6sg zLtf`bxRo|B&g=1`yyT5|^T~s$orpYGd|&gMfQR$Zo8|o$yfg6tSN=out}^DgA-u~M zT0fO9(AE&9GUlz|rKvB%d!F@d7{4K7Hb;`FJ9`uGhIMDxzSB!@h5yzR!0xNQ9sb%M z?7r%((#`PW6R%VB&gORrJg^Uu!b}Nd=%MY`IlmVuk7qfORf>=G&2`zkBtOiv*7rKG zEqklzNReM)SmpQLjX28hnQ!6u_#N_lbcg&N-7&vMznI^nU(D~(FXs2?m&fnXKFeTz z7^Kn4>AidYJhmyyyt@ zcGiaH7t@4@M-9#y7c2$Nla8VN;(b9LJM9;@AddD6^DX^?-(kO?JM0&9$NhqSalfEn z+%M=C_Y3;{|I{zoj_eojN51vR?-!l7qw0@O1FxoY7;WN_&;MXH9ok%($J61WI}{pB z(YY95j8#5r5uL?}&0$!i0MwEzUDkt7DC^YIAb3E_YlR<|yMUO=`+s?)fb8r#uqB zl}GwKzC#}A3vesX!f>C%k37;B@#d2UQyxim7j8#b@ez9);_D2TMR~>1oRebSL)mush*w=t#N~u?;=?Pu9n_jNy!K zb$t!0*w(&`@o)BzQ}2Oke;4&-d4q|`Eh9EeXn&9L|Glxld}p@(jQu^cM;%$<^M1Z> zEhv$8ccOO))~X7{b=~W+vby#C1DBzKCTdNu(Qen}_JE6=N)bhatb9*35aM$v>d!mR zf_u+WdXADI9F+mTpO+De#lmb9pRz$fCtcvtn+2jgZR;ugPrjJ*ek-|QZK#Ihe*?Al z0z(a%k`$VKFyhbAd3OBDaau#F+bB%RS-Po)eq?R=Y%6nY`^QL4XiCtO*vt*i<@-g8 zb(aa z@gjcM-pr@+cF)8&ar^*#W<;*$5{5ABhY5xZ^|SmOtai@YVC0Fw8c_L2dS$ z|4hF%V)qB5X4oJjPxBXsi}sc&3+4H$zXGO@p0COj1D#}TCa<23 z*tJ(K?}Dk7hLd$d>Gc+t-Qqxka7}O_e;)6ph6Z;yZ>6sxbbB`OY?8i}(5KZx7mFNG zwBDkZUuTg=`X}m9Y2Cl@t$mMs0E9h&UuaWdiO`ex3;*QgQ0L&{B+Nf_6Q(je_M?9T zhxQ|`JDBILWFK69qAi%_?*d5+Hj2}Erd}A+i1$ROch7mLoW&VkF5@=`xeL8m@4GNv zUr#0^+g~Q>P^UHCdtu#lx7~8kzcm7o_U+B^DLY!TN;BcdC#H#P!x_+}oh9&K?u;;V)=Yb88@7?ToRpTi zoG8&+>XO3NCDx6TDWl`!7wVE0_P^@I{mn5yTEPb!A3sLf@AgNTm1b2?H*_C>AN!Q{ z8`3%YYo9y_-(jD81l-z3!uXGbKc6hj_aC*5av;K15cXhsAA+~$Py1Fc{2YGdM)ODf zF-+4|UgI#qdpO>i{2<-1KeK#VC-VSfnn&Un@({$qJ>w!6_l?86YG416&_%+~zeR7q zk{n8R&|u^(j(}gf4_A`e@Y@;&#GJu7Vh;Sx$xPurj)HrjiY1!339p{PLz(t00pZo9 zCII4>4BqfQQSOhM9MaYf(xA>e=M2~_Sv4hhs~k-n5r4sT$zB*s#{i~}*enTi&4HBD zA4@&I1RtaQ>{#GnJE)!k^=kRkGfn(v_~Q_cXPSanS8?RFYF$;E&HVJx1^^#9Q^AwVZ5Ywtcn?UCAOz!DbdVP0N6X zxX+OHa=eL?dAqZt)QK4d-q1L z*#Rs()5JE^GfiyAc|knZwVr8Wee0Pf=3i;)YWVx|M0Jby4`Et=V`7UmJk!K*O2^1o zvTwK23nyKhkF@nn)1&dNhkr=NoI5zvbPB@gp&!P#Zhxlfv4DqXn)=`_I@5F}VD_kz zlY)ws7}C-1&4VOCO#P*NRIGtz1?erO^$0J@eAC*`?MQ5BWto<3M^MQj; zJeSbUAkR3h5qRc|Q`{nURx!;R?x%3ykaE{h=lFD4W3Cn4OkekIR`zeMk4}v)a=gEI z^vz!5_%^$4%sm5y?c%A46xU{aJkLh@_xR|%Hr*E?FSN<|Bz*Hx+TvlJ?kHWo7;!2H zdkNm;(->Cg&nMFFYKwq4N;>6Mwwk zV}5wq1Pu!5x|e=7zJr+l{{-Z@4qN>8!kT7vq(0$9)u#)8^JIj9ZFRBnTS@4qO?A?g zD!!S%@-a*Yy=}RXvIuWOKkzo^_D@VEv_Z26?uL5`;^`wiOmQ}B-;3dXrHFKH2Ht|T zq7`MMT+RB}u(dQ`IQOhn-Du6mBK15~+7z?eSD6$8rstG8zu9tV`Lcq zA@8vPZXI`wGlU;`k2>Cb@?haQq=GPEym)hc zPvr~qb_mmX`wEO>>WQ^lUylNBPUSmCGRnI-=--uW8Kg~j-utqP+-0*7^=5W;ChMa$ zBV${*a1e&PENWESg(o^^p9|y5*+RbQLYuMYTs|)Q-e#n)7Qm`G{?`}1}{@?Fqn+fRucDLHz=l&eDx$<=t z^bNY7iyz0^UBWwZ?9yMy$n)^+!Xb{1C5|)tI~dMg=oxb5F<$_91#zB_H}S4S8oO=7 zsF5-BZ20RKBA#$P$gtq)WP8kLl^I@<`vTQ<{Ua)mx)$;B_W2)fg#+?{ip($l#^FW{p$WS!)C*klGjSOEDY&VxP<3$ktMzYVJmRIM&7TJ_v`W2GAWI?5q>T| zm`AltnRI|p(;<$7QFg5t$|Z^8&A=6}Gb@M};!p9-n5RRS&eOjIjoB4zvzGziUfA_~ z1K!@kwjIlFgrAOO(cMel1V29BJ~-vxvy!*KA4w&fHrTriDEqz%eqtv;i06Vb}U=K&ASgs;Fk{xNh^%{fFHcss1twj1}Di*3&6(aR8* z41EO!_*&>_NBYC6qZYFCI{MQ=v0ztj-kdQ#2z^_5-uIyV+RrJ|And*HeRlXfV*x)pAv6=D33z@JYRhPXnnbRY0T2wOqe zkIMUFc$3BupVFyM;M?IxZZvZHI*hE%ESX~?3}*-_<~aEh z%B`6^)ShomQr^A-F^PrimXpTmX6zTLR(e0K-FwJ(sKunc9K zL-@MHVLX*(ha@9iO-lb##q85EoFM&^d!U`%xlBHc_uGFnn}>AO+uN@?X`|&zh}-B^ z%(tgaN!V6zz-gZI)H?E>r9!&+UsQOOW#WHW!;5nBRDkD)^8OLt zEEn^^a_L?-*Qm#0)0H$#Z6wf-xPO9Qcd0A+Dc*eY;w*+g^BTwbS&KLX<;A(DMI0O_ z$c^)h7IC-?$xG*#E#h$RIWNwyTEyXem>1_a5@(65KkkORg0Mf2-uH_8K6&3S?_bON zw|K9YJ#ymE{d3|W%fLMI8&j|OCO+<`(w{hWPn~#s#h*MI;k&D;f_A%2D>?kvt-l0OMf z)d^ud@*er&E6HDS!n4m8h5ws`S6ZO_)<59y#vMj?YP?F_SvnEe(Gp#OP`-L!ujL|e zyRy-HBL74A5I74eDq(%roqQK*>Ha(SY}Fnq_u{_?*w+6h>4k?l&(#9EoN`?2gFl%cBMUeI#<9sD4J#aens@_T$kSAkB{eJR-vcXj#DDD7#{ z{RiVF*t-8n_X-dHvvGU)U+G?r;HI8R$=~Tdzcwy1x6(i1R=!1e*b>{cNJeg9?PTOL zOaB56J~98v`F{@h&j$oP>Sg5r&E~Sq?tfwazp8khX!oDR#=WjPvzyP#ut!##Bpz6I zsD#^IXsoz6Uf#+3__3U;5o-#b9;mtIr;*R;#$o*_|EA&ghF{3PX2%7;qg}s5AL>fikM^%? zWj>v2`jn;btVfj{a1LOffxE$TrgXm?b<4SRy||72acjle?ZL!z##<0)(hOcZYY@+2 zKn*FM^#E}V>Akw#zomPk zHfc=B>fX;D3p)TTKaI1}3!r4D2aCA%KA5J$cgZea~_YFTP5-|+*t~oYO6)uT6 zqaVljB1&m$R>zxu99wrjEb=!%IdN#uGiRV??{W}Wt>X8E9A3WSy ziJU#%nHJN{EQ!;}{K4~U1u~(OAj6+~$k@u%9UgZ#$Wf*oY8yK#A1&o#*+q_G&Vq5Q zsMN%qs!~j7rxSAXgqFaEnMST`3ynHjlSu2-Av36v)vg2|!?{7% z0mmV~lgKOACQ7Rq#y-%Cm-6Ty6vO9-gx26;yri9l57imEDNJxW5%*DMqZF*VH`!6StVU-HfGUcmg_q+ccg30%pKpE z(PBUd$7}{1b_iiLVD=>}hVTemAS@y5H~~Tu%)TSDLkREptFAhy&vHj2+j;-@zVClN zjm|w)-PP4wb#--hH`C`>&TyLm&*R6!*_cJS$Z%I6JjeOikJ^u|F|OdAcm@LF3Hh*i z@w$>9=N}GwqcVff7xL5{@|4Q+MIkQ5FWXnd zQz{$8^e?X4O>LmaGc|Kcr{?Y_V&w|dB5{z&7zyxA)enWF|PWo z__6lgfURb#5-NtBLzsrNxa+VpdujsnQ>hdmmNYNM9;wQ~7>+zPv7Q^vb9V?1tuVOz znf>EI7-M@S56lPmbjTPRwHE6jY@0SdEPc&{C#qB?+Bm2!#Twsb)_8yR?kDt)O3K3l z@JM+`xx?v~$(=_5&N0BojUjxq|1Ka5;}7DSYaPRQ^Rcy#e);z8Xav8lUcWD06dmj(}G7EQ?DZQ*3OQX@hQvzun;V z)Ra8sxDnxygU{$(k>xYnlEi&BHIKXo^qRr&qw!{%q+@9k&hN)EO^l%r1wVX5ZsHx{ z?0nrU4)j=&cx+wvahhgH-`56d+c-Z4SVSLr3e!&GENz=VjVs*=yu&h(d|>>2Amq2_ zCoUh4i{-!3np9eQl~$rmKR*UzMV2ZQh!L?%H&2Fho4T@BTa40fCVA2u)L*~{hw$TCZx%Zzy_ zW^)x8XL)Wj=dCi$)UkLLvD4=Supi9+51rBc3Gf^5Qt|r0CjpaAU5YW(3n;JB`&XzB zO;jiKG@y8{%==(*1jlT7FPyYXII9f=)%lTA&XT`hWSXaNie9ovcupHnB)m*3IiBu8 zyI<;=%+zrngYY=xypCh5Fb8gSWqb$Cu+dq}q90Wd*5os7x}>*{^!&LH(b!)FEP0-E zv%3zkNQkQ5uph8!X9>o3mj4uByn2e=roG#j+jIy+i=~dib3-18F>?kudu(iodsU*jD9mhVxtXv7{mos^<(RGoqZNOmj>qd!CEiznIGo8))x0A z_W6QaQ@H-_9v|oVaOT_|-4WgxZE0~YOoMzR zRGZk(BkjQ-dV{o=?6g12!y(NB{RpA16b@(eAa;<*6(&VqY$6fWyN(_Aeu&zMUl3tY z8f|E^vRdSfGpxK+>eX>0o*~TN;TgjG4$lzgclr!r!qR656BeGQ$oVN@;aQ3XTjU%?uQ5Xo zbKNyQUphV$Iy_gJ<;%N7jvyU-RMsX7af#)-hz}z+f0SyICD|S(Mu8Au^-VqaD0s1X z2!Go=XlE`_tWss&;;Jv zkMVAL^vwt#(MK*4e6=KTwmx8I=qz>?{L?`g#lGWTkFCc~%B(0LYM ze9|^y+voRe#Rq=N3Cf(ah5)O-8&u|;=sjh!^%F|gM8(Dj_#PWDc|DmyCn`QsP1@h{ zeihbItnKi(wVmf8KVjQ>9=@$E8SXjwX4`qb=G$znR{*yG<&+Iua4*!bHeY!GzS&-0 zgg4s))3o^3YsgnLFGfi$Ss zQ?Gk5(wKwhTGumV{u@G;OtTVQC%6*ozl82z1Vv7=FOTI8=(IQ1tLMF{dmjQEOVBJ)eY;6->(9H zYy+F6tl~P4a0q8*ZZxz_2|a6TuLYg3t-TK4tfSZ99n->o1$^_d`U`PZe|6L!=K`-r z*wV06nm;iXV;SMM0)8ZcVBIx4wp+yLJIw9lQh!bE^$2VAZ1wjB(oOmMz7+L!lDo9< zM&Rtxvjr0cy_99Z&6^X3;{jHNw3d_MHfqvN7F>xo9IC`)Gtq zrI*Atx#xf{K4og|~s{Sh)K0rQQx$e3xdkdk4O4U6$?do%ojdzRHMq z5sxYJ-WsHfw$XP3Hc^=@FHGUCOk7c2=VW>U=RnkE#E$(Q;HRNWm-ouv8+SXtt(}@Y zVp{JF;E#BO=P!hvmjm0PvW)d2xdpT2i}LNQD0A5h#6w~L^JiY|EW8it*rRgF*q*3} z<`RF}xOW%Il={|}VH1J={QsY!eGkvj{=e~#6w{~c<%#Mcw5!d~b?%4x)%%0?Vs?st zoWw1LGMXdgv~PZCYe8GHxf<_l)oU45xOH1Zz9F|Qp^7AvhF30v`E7wJ<%`D{8A`=0qgQ{EE)VdRtY z`XicOlfN;p$(^mT+~oB~5ti})0q;zB=t{QVnd=v%W8?8ZBD{?knRNO}2k0JCv}d9`pH zH#i=!t|e!+$w?a{2*cjct>l|w*nV(dFg=|y%E=hi^cB#`TNC8k--Zh^&ws7JLf4ij`T9VI=vb<_~2pw(ztUMp=opCym&VD=ixq&@v2dJ=P#08lg^j&Xg+ii+=$u_ zPID`K{?r%M?`Q5o`Q^|AIG>w!|JBbCk22txzVAxCf1%&M)c3FS{cC;y zM&G~H_wV%mdwu^w-~XlWKkECx^<8Md=Z71XZNYuCAuid*lWhQd1s5sXA;p>OS`NNg zE-REj>LyWNO3kC2TLK*Fgzbs)>NNP9HNi$kKkV;_?H{KbPygng{9cCd$*F}o`b<*?JsIDkb1ME6e9u>=re@{)%%)TE z%_nXD;{KXTvHrYL@eDHvZFXYw<`b_zuiqu&9e0pI`EczH$>#YoP1W{R$Fa(pK2tt` z$7huKbN5>F?kNh-;<2Gv&)2b;W*CI`A9Y5DP4FyM)-m_}*&TyllR0cFHU_c8{G;<> zB^3E%-0R0dahgrv0&%v8lDW5TmvT7E&)=(Yb(`gkx}>xTxLm}JCW-T66PUP8>N?lY zKkLYBOW~r&mI`#@Hc1WWajTw2OC-BCF_c$>{r~QHx(=`%^=1A&FM=$MmaikDo$tG| z2$lBZ;oK+BSH{CJA;NuHwnvd|gT8U0-w*wAqN+h3yaVOHJ3Llr+lz=%o+-QGvW>p2 zG+tI0s|N1}4KD^woDg+^Ur~sNie+Ylm0|=&TJ58a)A1$Qy&Y#ub#!)*M$tUAcDs*^ z=QuQ+zo8n#HEY|4r}MKU7Ggpx5AuLI2=|4Y6_l0Pp!3$P8P?XV?}s?HZY{rc-I~9{ zb!&cy>(=~EuUiwAUbiMJy>3lddfl3^du!dAWz2Q!HK1va_Qzx?nq-sO&bkJKWxR9A z^%i+fL|aL+llSaH?pV&OyK_L(p8UEyv2woV#Op8ge92Z}-~+?{cRrXsH{f}(I%HU@!v`Xc z)uH^>I^^%L4*4C{A-~ggNLacK2}{=@Vd**~?B1$FmNo0J4K(dJP8}|}tl!qS9=#rg zB~2W!4I`L!?#3&|9uvFrnZ%8ZO(}|vbu%=Nhzvz@Ebn;+J<1?YSK~cDa2HEx1qzGx zfhC_^l)hp+vn9@MO1Jxnj?%0XJfcC!dO{8Kz^_tpCmL~>Q=!!TTHl5EHXWb)0$7&36YU{FgLEQ2Ye{_H*0}AIhNaoW zhEpjGgF@Nyibg5CA-?Upxd8MQaC~ck}xa)YYkIX(kUjH{dzgu#QLujz5O;wpS!eds6RO2h=OLUDjEUNa{5rAhy-n|{eu>zB{2Yb(3GFj^a~8^~ zrTYA{9K!hu%gpy2gZgw&WY57xC^PHAW*4~_uw;+)wv9^x4_d7C`0DiRl%H44nK<$` zn+*uxsPS7`8?#}8Cg#LW@^Gf>PX!da&6WI?%JRNM{1yoM0)2~ErhW~KmvO`}?6>PX zjNJ!JyAJub8h3B}xx{6Bp6hf1?Ik5|m(YW`rhZ?xfwlNU)nRXT^D6TD7s@}j+zbD# zXXIy)XB7qbj;U%{cxM~Oi3iKJAYSW<@QlTZd(y^_qeoyP0uNaixq)GZYDBFbX%Q&% zy@aeqMJ#cd`Hnw2PX?V1642{;XsVnS29&P;L_`&a9{Dry#%QJyPxNvNu%|42UlCm`* z`bo3z()NVD+%q-50qgV4cDEtEFOzTLv3`&5jbbzIL;5khJ`=PZ_XB<;jX;|Ou4#aA zQa+L_qh+p87zECql`1QiT1M3So6uKs?115U&ha*oXo~~2%wl|GbGz*T@qR?$CvPq? z3)6T)f)EhOkD12&1eV5$N{MP%V3MrX=+>8KmDI59yEbVU-^8?`v5kBW>n+yz_}lv4 zPLyld_jcji+6u#s;+wv@yS4oDa4!$mpV-FYcwrk`wu+OaJ)pz)HTr%u-lVw&`bHEF z+%-%OxJQa^lEWwHhHaW_R1wXlX7`4G&ou5$iZfm8TJXiZl$F0^_=0kXG@f_C_^jtNof`P(L)>|gLF7&H1Xx&?iFSoHVC&F!rVHcRU#5+sCg*a} zk+z*m$M{S0V0merM!_A_G}wmN#^>?P_aVGle~imD>2t9ry$tXh0O#L4;NkBq|I6It z5sr`1egeKpyM%W(eDVx2%J#UH`?rVJvXh&uns53MKMH+$J z0-3c3CGnikQ?}!dKG3r9+16Db2bis^GJUoq8hXREjh$;zKEe4~ypw===A&z{Ue~&N z%!wY(bno7IT?ID=US=1@xco_PHqrAdF^ukPvSvDIuz4^lWzy{SdYC^h%a4Js3fSJt zJPyO~@vg&nb*5B4P_9O2mh4wrhiArRtewL5+}OhOtj3XV5aGEk9CN3M$M=kW3x1|@ z2mu5?Lp*dBUdUo`SjKbnwYj;F=E96nB~6QC;b)bGPs7&{nw^{l$J$I1|wo8iO+t z4aRvQ>FPPDXWVy{lrhiowHwrZ9y}cLE~JNYn`FZvU#lG3%4)#TH4jdgXAXOQS2@-< zU4a&m&H5xP;ToQB4m}G2jBTY2utUDV2wm3gI)R~)%&=Tm$+&nSVAk*nE=WT5IOxMy_19~BhadCc4(FgS52x}uf3Fu)QOL3;nw(;5m zjwgs=7lK{_hIDbpO;H0%x|I1FNY4iZtl+)`IlKvR(K*Uf>hsEexRkT!o`i6G()#oB zFi#wSkHt~N^G?_+z5aa9MSJLT5lP|pZP1#%825*oZc8YmD0j~PIGz_!X6D~;Blt7_ zhHFGWZY}(!^2~hc+%2)vFG_ZsU3B87(nvcIhTaricIBC*U1+^}o!6tt2Y;I`{8XeD z>cUUMw~eg~_Y{0n7k;|(m4`FEB#R668Gp{&GeC#saI?OjiFYO*@TLb*hY;S6#y2&1D9u>>ROuXBaNg-Po5J__(KRJ?yeevF~)7c}M#3gM-QrW^|wt=@JEamn)@TQz2oiL4e;yXhJ9K8#0K8!=Y ztbVB0kD+q|JNKOy2#%_fbxlgGb~m4?-9}5Z#U*xwsi6#e<3NWMBON%Fo)^-{ZG$ zdxh5PF_y6{ti_nS9I2fP1)J+z{JQ}YP2&0YA;e)D;n+=DAH?6OZn^s~-h9|bcvnS+ z7GQ*b6yanY4YZyFx_PwzL1|@iE$&9d;gg5ENpa+Xyjk9u&#;|;65ou^zQAywz#se4 zr|{;J#bxiO3FFzgZ}-!D8gxkepY;71yh)Q|3*-4GzLO`D9s*e3&En#-Rf%ICBu!rr z$#}^+ig8vxEECfB65>bsLF-7A1L`TnSzi0~obsp2UIxGJDL#cgQx)EA&Hg_N-b$T^ z=eY*RZ}Nln%d+XqgfR|8c%?oQpRLAtnCc{8j4NB}d@va^J_5e0GOufPAH#2)HzIQ5 zRqi@}ecgW9;H zy~J01Qr6koRyjH=S4Ox{niky#k0m#BU-p%iZLuu56Z6nemV6ETS|4S&ui~4s`M0)ZcQXHH z0JA%pzX@2twYvjtgm*IEDRAOwXAutmCt3EbEH8!3_JQt{2|@M5glk}TyLkqxqH*lF z>+-mWpt2-y#?-RB#zTWn@nv4k$^qKB-}jiSYj}H$xdud2jU^k>t^9cUzioS5f~}>{ z`fb?tO*iIm(_6lW`Vafy_wj9gkm0_IZ}!0-XgkT`lKqZ-DvZ|>t!sIE#}7e=O4yI^ zX4oI&ouLVM*q0MD!MTl_*?8IeV}7RT{9Mzy4E#j=ftKZqGT=K1Lm6PUl3!>XzQZ`b z#5W(tVfmR3Z{dCoSm^gvu})_ezUvff21>&5-F( zm5Xr5bGS#-aE;RWqo(uUnhs?gY5DL4ch&g-;0e?5xa9pYjC1qRxNHj-|q&lZGbd7jjOR#=|NHdJuG0zZ5t9q46Y`B?k9P4%+%lCIag7%m(O*kym>)2FaDNQTn-YAn^(~Gu3OiIAGR*6NY2u3~ZC*a8o z8u$|3jnz8dCG%6z2=0G z7rt$Mfb{-^@9=IJTtJw(Tc!!$;oUOJ@EzVQ!?qL7o0s!Db+^n4z{0y_*l*K!%dqdK z@0MX5wx{lvVP0*#HeHZqy%hWY$>4)eTHkvr#&X^*bBf|~@0L078Vtu8G^FF(^u2F= z{@lE8!RxW+pBcGEmGUt0Sh{rEr5{71YzDThl=UvUBbT=SQ!(eVvG6pMpUrcJP{-l8 z*a{qF#RAHoaZblK?KEd-nVTK%KJxADaI5g!>N>P(o~dzIm$^1g$%|)D9TZ+FBm3%wv7jJGH`pNRADORm?o~%ZH7YgD{m5?K8W$FY0GQoz%Sdp(B-y z4Qh7EM0+=W=OuryXn($F;hkm>Yl8Z5R<`_QzeCh^B#(58MK)xoM!dhQ zUud)zMzZCeGH!b9U8$sSv2A)0Kh){k#6sGQOkt5HncAOo`&?y4W{%a#EgLQlomnF| z?tSivC_!EyS9i99gl)E$Z5<7^{8+@}YR|{aFD_@UnO*bnjn+2t<{oEiUU56)P>E(@ zZG^UUwvj8ejXa=18wtdUv<$Nd-rm^0nCMhd8v~(i@rBr{(w!`UOwCTP@`^6oUQEqR zbe$qGXDUW>CfYWvPvrPTqP*v@6ND=l-0^GjNWtyfE$e!IcWdEBv0t$qW4Tsj>qG1| zzYuV-HW2+Znz$iV8Y8#8Z%^!f_kNqLg?Fm%7tq!|7432+qiq)$$uzdTqr(_p#1;%W z748|11+kZ50j}L7vEOrg1{ga(Xfrl{$=ff?u(n@u9pc!2Mft7!75O{dugLFkzaqcW z`xOaG?^h%&y)!R}?I=c*Wz;7}9F6u9Z|xg{{nPM!+~c-DLRw`Hv8r75x~dy#w~YO;X6Jzce#5cz8jyj zyS%9#c$^iTn*eS6oxoe$v3VflEM*?pg>Zb*^FW@{a0+}u#&V>!q>$}>n!%;dFNNGvxa~7$DUZ$x=9gEaOso&F+=$x&7-jN# zsymrXE=u`%ncR!t)>guKWS@j#2}fm|5V^?`NT8zpvw!jIDDp*q`P<~mAn1p3k0^k$e>c9ZPVC%l`j3&%@EreZf^gQ)9}QT# z?{dw6=k`AaIC~Q3_S>3)b(_p$Q9Sip?A(4^G&tTe2FsP@Vdc*{5?p(s9A7^W zo!h_Ey5rtXoT}H*ch>7Q@w|z~fd($Lsh|l@TAV4>@a&~JE@Q6GRid4cUYE8F*JcDv zLXnmMa<*ZcWeK`=nmG0EH0clq!b>_U!p6Ki?{2E|_dnI?t1nx;5*}ti)v47jX zrf;-4_eIRJO^y>kh4#&}!>6^KTfCc(#_?*vHHtSI#q<8h44b9j(tDd$QO0pxp2c4yT8C47TKGKLk57dqpZRpL@1r4) zO|Ct~Bk3^Rd|J)!XhT{B_iEU+`J4scG>B98ZPYPoHKy0%{!-~#d53Yb`EGVkX_$VK zvpY<)@#1mA+5pqZ&tt(oW05rMZmH)vzveuHu&mqb^*yKW1$`gX_aS}XpzkN>`-r}u zr0*x|`$m1=r0=Kd`)T@qy1sAL_cQTkzUk)@^)2WqkI*{F!&%+u;Vhrf+r+n@{WmY% zbC52dJe>8r^;%ZXR$gz>_h0Gzx%z${-dQ?vpUlHqAIrm8AIZa6Tg~F)Hg>i0{Q~9h zh5CMxzAYaw*6)|-yHUQ_PQtpe^09Nm7b~C6dx010V`I4!wT8F8NIobRv$PBDH5%61VLs1I?sX|1Ozs%nWWQ*3uTSy7@XTYj zJrvv;fVW2Z|4b^pwJqx- z$vSLypVjbn?IZ8OH~YwY_5FAH{$Kk3dwqXM-yhNUKj{18`u>EzKc(+~()T~>`*V1+ z?Iy>CSXUt~-JeZA&9?c1`=Fc&oY(JSzcw3dzNkD{fB%wxe;IG;;opMnvH3a6kK@)I zz@^WENb(o+ZZ?^JQM&(%H+kNVcOzQYDNg1EuoK%{-)MbJX?v!X^1DxKOuA z;^J~J9=@wQd{24U&>$U?VU(-ZH?w>-yB~rMACuu>c*e`dX>mW+IK-v-H6Lu#2RLTu z(&LWjppmO`u?51f3NR9 z==;C$COzIc9`PUaS>lrQ9P3O% zG@Qsc#5B1he4;Nff1a1PZ~YKwo6xSiUe*fydIiIU{+q<%8$KEpIsfEGD68UU_Fp`wwF4laL}Ts%|77`X0j9_Ylh74{|jd#GM|*~Y1PMw;H^)Y5Li!J z<(>t6!qJ6m@L8j$tjwn!TLcJ)meXNTeLm=f_Se&~OX05p3-85zDZWb`b97fI)erEz zl@|9mK|J1Bb~>!-FJrvf*~-iWzfX1V!gqCMu2RRooYUc<@OgaKE3;E@my^9tU%+>K zp3L2Ifn#}bJ^5P5rWv06f^YKo70|BK*~h#am7d90iI*>xDp`Ve=|VL%iKOV5bZC`*GiMvQ191B{{!)`O-s_` zZ>yI_KUVfNx&H)g7FU4aQ2ud$b_?!~Bdj*-L6Y}^`xao6b!?bXy8M&u{jr5YLTS24fk0A7QXA$xu>8j5A)IEss~xT{T^fwFpzG zAMo}61AL3;hw||w#(`h5h5re@OI-kz{GQsM@_YDT8M%$_Ss~2)iCOQz!uMp=*Oh(O z1>oC-;Zf}MIo{bWWfaFNO_e=Z$})ia@VJ+xQ5;2SUVlx#a7Gc&;XM7m%iJIFJzkrh zEn_;y5Q=@-lj13U@ZszW;vF6d|M~2CgQi@>Pp2I z_+6Ztt4=VjQ(ZH^2XVWF;#>GVQk|e2W&D%)y&E;2_{L=s{<~=z@u~HgSHNcfR`@_K z2hJWn1NEMYrO*#r{p?O`ZxY)N^>ymup}n0t*-J6D*jP*a$>5*%_ER(;SzJ8!neKQh z!g73EiMOR=>!GIs7SV{1@d@bUgV@?hx*e?dCT6X!ver#}O&aEp?`fY?t@C;g#{!o8ebMOYNp!_EZE#t!aLWL$M}bVK}{ulyznFF48o@aJ;jW^d1m|v-?iZ4PYGGc&`1Q zVQ=IE0kCp3`_V-g=KQ~Srw?Tq`%Ne-IZq5_CGl%fKa`c{Ydx8)jB!~x zvkqa|w;zPJrDL-4!GJ|^Aw_KMh2bbmOg@qqhIe$ctfco-W8RWzKuSa+&5)O#wHXq+w_4pn?!PbxH@TF21 zo;*r`;25QyxRcF%V6JNH1H&`TXfKJ5w4(cs!lIL+Iwii{U12pKPHS?oMFr>gBMuyW zO?a9i+A-?Xc=tjxyvUf{S6LD`oL z-|X5oyxBGzhb_3y9NKJmjc9jk_-wibcMdm#;0gI8uZ?JJYe)-aB5gk}f2nhTkzQC< zc5XM<(P0{Nk3Tz#tq7K4{SOyF19l=Pa6<6 z#97+Ju}+DzC!|Sugu_@J#!KRoys+&@@sQW>{^TSs8IN@v#@nH7FwBGWBhVZR{8D&+ zG~*f0)@p9kInZYCW8*p7Z{$s{nu-LzUXtz`UX_SJ>;RO#4suQ$VM3tuP9tAVHrN!8=#4EMDssw z3}BmBKseTqf8ukt*ry1$KE-y$?{Uyi>%^Z1JP$`2yMYVm=#z-gbQAO-)AuUhc{po} zHhINwE895hcMNpmbF7xT34Rx6#-U%L zJuG(>es@>on{~7nG2s_JRGFL;o9=bM$L(&J#6RKzqAN`SpK8xdl16D_5_>HY$3d~q zJx=Ox(KDl_L6=XueQ>;A34i7p#eW=mRsVC}C^m2Q+_9O+uk2VY<1@x;t0R8T;xB9u zw9yc5HkvwqhxI>)Z^mbvW;p*exq1Dahcns7`sW$63kb{i0lY(AjF#yK);3N#8jrzD z_b~q0?z3^5-3`F;FR4y-3Fn_Br3LmbvReL(cW3W(ax6Iod(MO8u3CHfB&p9wMw)6v$G1rtit_@d3PJ zVgfCd^7v%;!~o9DW3-RPaP-?IcO$3VH$K5cU*<9V9RX!+HpziExK} zILd*iA}-E`+sfhY01lidjBO2PmkTU$W;ozDzr3qFKV6>N&-=6d{t}#DzMF=7ET{fF;~}R+))m-!J}u$aSx1LWwzK+BB_H6EJ}NWB^J|7cqSnd%{zy7 z8k-TTvs2Yd@&=|D+#Z|-Z*y*{!M3;8&K!7IP`*0nPM<2UB~eakY;Z;Z+ucR$;{L$j z)*oJpbi)4dDtud;XSi43oBiR{%1<87^mywJw<0Y2!)x+r0Uq`TreXczHiVDT1c#O; z`6r)|zSrWzy#cUrd>7snCwzm3^;LhCd%?XHaj@PujXgptQ=8rE06P)^DO2H#0+{tF z)9K&HxX_y^+Sso+FHvd)F9XB}28_E_s&s*P%3;{N!(IFK-8*VS9N8zO79# z+}rTY_VTxypFEt|wzIgnZP*#S?*tv{AMe7OZR*{4XW{`Kwkh&qZR))UAMpiB3BFK& zAOyWz2I`J_4HdXx-lJGUk4L(8_I_{V=&eoxov*5UtU+#`xs6 z#`w7H+xW^gWE)?-+-xm;ESrz?2r8OG+xkV1^%?B2D+JJA{P_S4WwIS0V%u^r0zBIoxPXEq?vsFpW8hB6F7p8se?Z78+PN4$?H|baRxTX#J_TAP zyV80j>xyTKd^%fh#(R8jN~nWgywUQR3D;g+x8X9aE{@N|svFBwkX zSMD+Gan!h-a=g7Pn6L1+jkljen&Ei+d3@XW$8ev;H^ zzm!J{aFcV!myM-&AbgZ2I83C8J{ICE&9CWLYV&Ni#eW8!++su76Hk3uW}W!vT<6OO zAD0{TtmW=2fE@{d)UW;pFl)ayk72k*`k2Sbv}F;y)tOEI3L1Q}KAt@96Bt zzqmi#+ITz<{pom;Hq$skPhToZJP4ALMDJ1uLXD<;2pM@LBKz?g<*izlIcIoLv!3&( z2uNIA%-;n$<<&k2DMy{VN@X*&6?zeuFn1DvS}#N8MBD_d0PoJ(!;{nV3cU(46!)wbXm|J)+MdWz zOtw{mdUB|iU7O@*yP>Qd+ZyG!5%(hKqNH=0TOoFOO0w?&PFeL`zQONSX+OE^zebuC zRQ#Qg}ca13W&2)A&Q z)%^a6gp232ChJ4otEq_M$>QSk$z^VZFh2!7(*Bvge~vffv3&FRY83CTR6OI;crm-c zFEyR~@CCOyT9fvB=YOr?8IOGNyy-BnXX`nrAue5(miBLz*6)-S*At^WLMYmpM_PuH ze5BSzt!%)GJYl>wsH2cS%Rgx@Yk)JG`uD&WX)|oHz6;LrqDwq%7i>SFK2QLTao8`y zw3{^!an{Z}mE?MDGOZ?eG3fBg@)4I&)IN`rC+`ojLisRyLIkb;C z2sa$_3SX}S@w{~p<3<*XFX49uI}O3(o@=vz#P=Z? znmzu%i9cAY+kTfn;d?gtZbF-^WA6>FS;QSXR*gQb7U1k`deS}#-@LQ7bg(+V57j$S ztx35oBOF^ne7??f%kjcRh`>E~}z`4GJnBud>Hi7k^;dwx~=YqQSeGn#!CUssA zdgedCHo-nc1)^N9mu>&q0mzNg))^0ycunqfrq_i$O`=8=b_QWvu_*;14Mu)#4+ib3 z>@!%C>cats>_)PNK^WGfdZdcMtA)dQ)K+#u(jts~iTCNE8pTG-?>1N3#r+?|p9S7= zKW+z7m+%L{H}1wIm%<~%@E%;;jmvv*Wlf7|BmWbXL%es&uY=*_LcNdqWM8f*57B4* zilDR&)}Qqin~z9dOUIvctU_Eq={X1O#aFung)h<%t2MOnx?qE2D@ z6!S$H!ZI*9$}sl@?NbZQ?kr8?YUqFLfA_<8SjYDPjBx?&=at6%CQbMn_|lR(X_hq5 z&ITuO#~0@yE$)=U8l}zHYRfd1;hkp<2{{?Hk38MV%Xj9<#!;rvI=1|M=p^hqe%<8)!c%@n)Zdq*E*=b=Jv!fw>q7WiOn)!5a!h0$&>qL%rpvDf-B1_1 z2;Ww&4EGRx(>8Olrf+SOetv%y^tm`}!CjgPOMlQtVK-=4TPwK)-_)ZXs_)D2&hP`g z)g{{o(>DER6T(NlAeY9s)p>|B{b&qz&VA0`5MA7l`x`;WbO_jLnl8sT{EPg2OU8lb zriTHRl#ORLT>%)MbUkuDw;VnJ4_7?bKUSyvl+kBZ>hE-adMbFe^OnbJQ&SvVqHi&T z`u($aVbGYa%~a;gb=iMuVbsta#hJ%4BF7!W>lwW=ju;H%N)&zuG#Q@$PAj0!{<-Fd zdDeDGx02)fH?!V&zV0bU*(Pxo2g+XCr})u+2j5oj#BD)3Y=@7~^s>0PO_;uY6~eMD zJreIsc)-Ip^leR_;n=pBW+&4O!VyQ`*9e!|8^ZIM^KjN@*as-vNr&^9C@f|LTQy%6 zmf_w6dU;{DYgqOf>IU2J4VFc3DB|~O{LaRU%g)N%`b;n4kQXUq)MBEHAtyte^_h+E zJ>op#FA$eHS3BOi7=|Xfw}w^+nRuq_0G!W}6!MJwp6$AT1Np$m^laA+*b2bnv!c&* zJ%FtQtkHSVO#fjUD~Lm9pUu&95kFKP(0eH9_h_Eq$SaWN)>UK8`Olr_+P zgyWNz0hHyZV-0jb@xl4hsnVeUNPLblXCh zX!|Jk-%r%0OXcx#+#;S>4fZ{*v}^ldXK7al{zjvio?v@yvuA&J0mc!wXB#Vcmvy+e zllW^(KO^**xt?(=$o7&jiv7GydJUA>*LH5PKubUz}?d=T1U4n4bH)exywzu>80A_nT>jBL6c7`z1K|+}6AR)~5c80Jm z%5w;_y`6JNH?g-9We><8ef)UW7Wa0}BaA)fucyNIo>q5Kz9*?2cY9~@M&MWFz+UBHn;(Ys-fO6B6+PC3%4&}vj5w{PHmva9x#%1cC{B8Q@wsC;rZov1c%bMI1wLcoIn~w@DnGZjyL7bx+Crhv3S}>>MlZUhWd+qGMBcQ{z zsVC!29pFZN|0UkWkLdzW0W9Jhxir3+P8w(Y*%G z9bg4;JZr?c+;wu_gS1XhyoJDoI~-pkA-ysLWNwvM{2FoJ5C3QQ)N57P6aCK<3_U%rc#z2VaJ9o`w8#;p$8V;XnXBDmkvxPd3Hef`-Y@xrzBbb7TljcJ~{2u-tp z?+j1l&R--w+sl@h-a}PC&BHxRar7}^dXz@&PwdOD$J<=Gx4owKHhCfOM5c&LGudc+x8s|Ak+Onu-iklk``&>! zpFEt6_15417GW9xop@)$18%lC^2PMczQ=KlX}$-4q5Z-5Hy!4^z(>5Hk0y9S{|#{_ z^X;B9wl&VrS-Voyh?+@UQ^>1}-^%>z1F04<&wLJ+v zYiA#h;i40N1mC3fA-rQ+P41)k<|FB#E<>EvWgRwM*3aJ~Y+7y*{z1U=?mY8jDWo-} zo%HD@_YVkbb!>I_G15(~zSuv^~l8b$%k?-`4y( z?A%kaSVq%as?D_NCee|%uao^D?_C?ul|BX9)_xXHNW^^_u&^(m$o>$<5BG=s6KGjo zHQFEYnQZu1`cpfoQ{09zwHr%>48}FTCERcbdDx7qYyMRpF~w8K;vQ zE-JRW?4nc}qb)7o5sV_t-E%cOzQ~5F21ujJ_Pq>rkNlbSPVu4Y=<4bj9xiqC_73do z=`Ia)Uft6*QtIgHk;aW54bbiFkPlnYm&~U~t+PCs7k*pb=cYw1wlI;+oBt7gaaIss zf^BA!o5$R-jo=OPwD6UnJXcB>i^-nGIQos$*K68-kMCfOjhHfvX|oMtB~D!YIlgap z%h1-`vVQ@6j7wd;#h(6=QWr8^8tNGt9qMOh0m#6S&MK@0ljd5XIdO1U&z3eA_BtKh zDh{ST?bBe3T;cW|oS7K(r!XLWhJ6j-E8RYvbUa^%v08kwJ_J}RV91qx(}s+_P;)m3 z#K$9SHDO(4ah+s-NRRSkjhh)P@2#j`oQIv`W`^MxF;9erC5?03YzE$hw$SEgXXj>p zoxL96@V##~h}(iN>)h<*3_bAlEN||wzYpr`t3iFiXK!$5U~qVQPtVBqo{sLGpwoN*&$ZR}XZSiv3#$N|$wLLrlOBo8$4cwjTTykk9`J^0~s1YKKo@RDUClmuh?TbSDl* z#TC?7i#ym|IZz$16uW(WWA4AgP0eDo_3#mFThlg7KaG_hM}DB?%Ml(@_r$e&T*p+k z9P!VzSED_4qGwg=!xglv3Hm0}=Z$^;n?XL-FduzgMJ&qg>?sWl_VkwqJBIp(eR(&) zA)lA#*I8H3&`4>hTYA!H$-WSt_4F+*`&$!bG(MK?OXI^ZXIBR6wF6t}Ii_XDGY?m| z`rg?CNi_R`_wCykAuJBdq7`KkA$%v5@?)IUE{?;r;C5Tzh_YhaW?6kFQC2=j!y^Mj zJ#6MXrE&U}DS1s{kngK<%c;1#ueW=kuVWte^sxm@tSH#hK*aWQlJBwHZt}X`3gn01 z-^br_==3kf&~!2XlQJyUVCJ8W zUePZ3$UFyjgP$R6Gu}VPo9%#MZH{smen)Y^h0&!C82#10auz9ZUU|0r0m8loU-0WL z+1X}<{}AwZC|uSCHT;hNe>dQm$CeDv`OGoE(}m6U0-d<&7r>eBL_POhaD1s7&3_Pw z^}8JYF26)PKEJ}dB}=_w{jyKSGRxC|R*lBR5qDq+BU5k3NO7Qlczbcsx3qj5T1x|3 z{iA&yrT&5Lo*Y{FIMC|M=L-^Vdmf!EyfKY!Lj$9OIlN@ypusr|`}a0Ffw`dyoB_FU zU|&_osZ6`$w3bU9N|RRZw1!BFkSBF?hXm}JArkTaWJ`r`MrGO zLV|@^H-o&h@BaZXdwMa0+A}=T(^u*p*j9wj5L6LIsG&ZorBcssUr9?0j2v=5y3gYq zMPV71TQ-K^=vA4Umyv*ZI3J9xa9()vo5j)UaNrfPHCCw)OhU{?|%XxlwWq% z809YOP2TuzvWwx|Lnzl;Toc}W&V~IJb>YJX?>5rNjl0Y>Yh1gZ&eCI=jpLo5gn4U z^FDwjYF*{#>41lFlkJ6Pp|k?d=ZlbXkc&a{$Zs!ewJ)%)kn$8RoRR*??-ti7-=tkY z`(CBA8FGc|Ee?;ApwJKPxqPG04gu}#XV)oh_9c`G)nlw?bHs)6&)+B(|bMVao|y<(H^ zfcZFZe*Z+7OdRYvRGshAeQHbxO{H*FkPhZHJ-dq|rIGDJ(7;RGJ)NW50!<|!my=GY zyHX!wI%^W?sD8Mur@v>Y*yS}x$xI$X>R>(Sxa@ggyk7@;pBd>HQDDH#CFEnNC!k)_ogb zErgBEj1kH?IOrD6ldufWc2=_7b{6})i~ZY57|uqD{ZI%yibK987Yl)WTH{ zJwtxNvr#8JDIj8do$!3kPd=^Uz*GhPdedE)ahIzzm=TL`PD4SBW%D4VHKgr~=dj=e zoY`U2N_D&<6AtzP!dn3EuFl~?tius}=lxhN8XDbdeql}rV0VmV$g$|bK^bBnR}U1A z(s0kv&SF;LV5Q58*ccJQTmf@n-|RZTzwL9Dgp;_*ooi zru6lV2+Q&3a=h6-NXN#Xhw(T5$k(ah!syaonI3;GMHr4haLM)Mfws#rWE0?dB}e`H z3gE(VWEnVUf&R_%KMCW>!-3~>CEgfMvgN!;`Tss8N43R9I@Vgyr5&ehq0WOd*^(pM z32`fkLyv;|pX-2&>+F0*_P?@k5Wf<5Fm(CGNI?5Bg*cgm`u;RLi><4Z)$u5l#pj&8 zix=pK8O!UbjJt+(%hmbqXs6-4_8h>qqZLhtF?<`~nm4a7VvOcEaWeYhW-UJigFUA~ z7xYprzk9Yfn)^fK(@fYak?jMay}a6jblKMP#d#lqpbO?F2a&2)qg(`(M+zQuMovBVQOz*1I_oD;jNNrJ<48IbZ(xFB0t&W5z zt5X%9EaN>Ml4*_Osem3veTDOh_Mq(BTy-2<()j z{iT6^ZBY>>1u=tu6pbdwEl$jV#d~hq7vDj{~luJr20V z>~X{Mho{W0N7=u|?b{XFhuKG&&tf{Cw9j?)7yAPHT$JHF9CGf@K0R8n^73zQzv?Uw z^!1ETVe9S~(cxCiS4o7FAKS8z#8w?dl*@#y$IU^8(k9V&s+mD zg}xwf(4|tz_Us-B6x9Yu;j4ih+14{s>g(w)c9cf;4EAWZN&%yM4QRe>&cSx;(4Xh` z#j>}>U0oZ4bY&YP|Bp)YpRiH;I!W5CcOkX>x+oU8RDs=#*I>J0UwH;%MAft$M8xwj zdA`XBKQ5z3m#!J;@97vp-FA+SSoV`JP-2~qYTj*s#aiTiCt#*~Fr5+nQTNz|Hy@i% zGc0wLe&`LHgMSFdh-|!*+@1#U+7O2{8pV5bPCSM`UcATV#A83>x(EMABahFL#xwf_ z!z~`C#g#RV$yt_z{N<+6?8ejK5svAEHjKE;n_VT!i?>C@xF% zcCi~_Rd;0nh%Dutr_*LZJd?(For}K)cvLxcPvW~4=H_eDgSDyZ_+j`oo$Ve2JZ&2q zKZAc9@N|#U_#BI%L&WikZ;Rt+@Ye#r4tVHi)3fs)?QP6wyD{Ks>guiSRfNye1mG6~ z-Uavi`3l+Yf#R0G+t~s@O_Ll4=FBRhI7su zu61@aTI(c2@<^IDD9uhCPyKv*mc!^gSN=GTeiDrnwg{{T_C+@9wJ6&atYNqoOmG4M zs}<)(oL@fyH0{9|7iKo-?%CQg+B>4ld0DXVWcDTMiD;EDxm6}cYWwAGUD8K)E*uHy z!@e{!umdZFy|5?4TR=X%2AhQ=1=&&wt z)ViEW=tdIWt@`tPSl=sTEuRh%GxI$&;{#*YLCH}4`7#Kum2Plh zj0Q#Y3({cSVEsQTBQaow{lti!RCC>AhvDm zQFB%bDDj#1r)u60%%p$(v4OyI`)%JkUO;UdnGp2s!hy_K20 zP)Fmr>V5jq_GAx{7@IA zAo0oTISHIn*Yruh4fK87Bz4RGh2#%gw0U>?Fvg#$DWpFHN5e|JC?_`sdAT^qi}t6! z@^$`R7NfTzCrouF8D>+&bAn2grz0B;r3EpA;n`hnI@%|3adzSs`isD*1# zpCa2CwmS%G^&vA4%|F9z55mOt;pHRoy#YSKS5TLO;C(Bs6J50hIScd%+B4Mk!m|Ro zu^YSiA@p|o6->y$5zfOphKGClI(zqE{a~b{*b6xytaEy~c%re|+arH1wk6sb!ntD` zWE{r42xfDxTLNA=XB^ryI5N;NSS)q+4s?1>k}#xmb4ng}P0KVDcWe1w!X|6UM~fTp zs?_JRIFZx!y|5Z2(AM@=I@s_az(vq&y?p}y3ayy`#t1+6rL2BVkPn=PM)MZtk65c2 z>FFQl5`RKw=OU3a@0;SXvRkIhSe+i=)Yr=+EgU-KBoRV~GW>Zeqj+|# zD5EJ`MY;`=yUTd2dyQTqnrEgsHg-AKN!a0hWVVEj!xdMFp3D&yAde0RMj zXD3>lq+ML?@ec~58wu}fFWJZ!(!U6Kv}GD*UQo6hL{nDY&59Ld%8}s22 zmhF`K|E&SMb z`D>9j=a&u2BIB$Y03sT(&f{hKBNUE>X)f%VoZoI0a0 zD>;9nF&1l55e02SEc@0ZUa9#yAidQ|e8QJ>4XhZ|15hINsu~f{JtxK`Xx7l9+G1Qp z@3(-ja~%uw`>5dJ23VL?F!Pah;!{u*Zv-#)V4c{{C&e=i-s%0_oWbsdGP2E#n~MaH zGJl-*LCO%U_eX0KERz*DJ#JyHBC^9|%1S+n*1lVvoE{gIGy53E_Ig?8W^7j++ut1U z?R{#8dwaJJ4D3kCoxTJV9NM}IeR;9V>V_`f7pr}PFzlVVVWc`Ats8J22*2`ygIv^4 z$cRHC8z?VY-Qno>YBw(X0GS`+);Jiz67@GHs}jW1{S5j$9M;Rz48t+~WaRCwLEc1O z^mP}z;93F;vk2A5rjmvuf0N>qZF|B?LxWi7i{$FSaB1hp(yrig4%$C1S&%8(2)3Wl z%X8uq1-9qMMk3(#_Jsaov+sD`)Z)6zv*ocWrW>$!#r4KBarxsIBWxcT87z$qb@UGp4nP@1?RCRd3X5mMC0(^RUMQqMne|TaNtt!7 zmiN1a@9p#RvoO=iq_vC#dha^MdT(+omc1Kz*o$(RzBlTf<>#`xa8JL?2m&xWIMPGYalIdX9X@Gbz9VD{qlaH0{YGSq-@Zs z@U#@LzCAER@2^1=ei6HCwqjN_I;2cBKuWzf7;h$I4*|~!*D4GE5|8!ue$CIagbl*4 zX)zC6^TM190-mc;;?g6s&adyz_Q63G{zFOlN;gX{Edd%0=*-=229}N@X(J%CRMDs__e6BP4p3Dlt5ly$uX@a8dfwWY;l9NIgtgi z>}dD?g<@G@d5~T=`~>H#Qwi91H&Vlab=2(=>GTFZ%@xck2i@?(82lROa$@wZ6(55* z%?a^EfbSLSQthae>HCD%_Uc}&YqBlDv|RW=&^D)BDNtlofyrNn#F*?oA(wj|cgcIUcMiFmYi2lFeWufaLL-M7}V;tW3?9 zr6>CK;q%3PLOk0lo_`Tezpoy>OUL-)92G(do5t>vJ_T`7_(Z@{D{dB?sQOzU&`X4= z1O!}dO!3rHuVWzbBFD;){%F)I6fE^!Kw6&)(lS2^C}VJe4ku$`5(>dc)%#<8PUjvC z=0yXT)%A7^4#IRJF4bQ3NJBx5ZRa!Kg>5IlPb2rVCwh;QNIV1};pv*@aIRdNpO((# z>*lkd-{Jrp!R}EQk1@-MWMv!bXA5yKa!#RxvD_XC0rv>P2Fo+GIa_SHwmLK&AE#WLzz!aL?fN--~_GeHy zjQ^GlUMU1+`EG`pL+`KduhbUig@Bd8`;xe5us8e%1V4)93nY(yiy{B4zYnMI5dlq~ z>wzC*nAxr6>FShMmjc`;6{oJ)k}t;jjKD=WM!Fc`pZDPxrl!2!#xbG|GUIcB%=oe^ z!Dxa7+@7E(YA?^g(L=d68zWBv*$E!>?T*piT^)n*eo^~Y+3*FG4Gq>@ML-Sr^m4a( z7mRIm=<{6UVU*^Vl;&7+Zi%UU9ecM2{bnp2ZC2_lcK4R(Bh2nRSK6>)gX}~e$;Gsn zk_3<#>cG~nWowq3q`477$e&sC74VTuO8Xn}Slbi1*o-p{?!dP_klD%Pe6Eu)uy7hA z>>1Ji!$CQt=3h1c8}rvcWR~ z=`jt){S|)4WfIf9Q_tc5D)97m`Zv7!zy}JZL+{)44ZtA!ToIo6^hajjW!QfQdpb6Q+-J1snZ2XOTt z>!Inu`1wBIZ4n(@FtvXaV$18BHZY( z_BdYGH0Ge(@9|5(1Mdy+-rV$Sz(OA~%Ch^yhwL|i^P!A`580x!?5dRh+_jH6^?Jct z(7>AIn6AT%Uf6~P0>7IGM%@=}x$rwplj&m3Qbr!^yzUz64VEm^Q1tjKQt6x3(e#2A zH(A`NW5FOA56>BAYXWvQ1p#{dd&8@pCoC(9Sq%^>mqDRgtfZPYJGm+&e{}gY(N;i&BLPz z2H)ViYcwwyjb%bZyb|DMB#Rev#s$|dmIwK2$C^FXSM&rRjC0|_SRMws>(};2o0@Yw zFi)e|p)4-5HeX@B;R7cy+q+6$3CCJi`9MWZY8QEK``1qn_(H!N*}ZkRG>l_P1_!WF zGV6`f7!Mw$?Lknp?U~;+*P}Vso{Dtn`^n$j8?zGM41XWK5&r7L`W$QoT)u>?H2%|P z|GY-}dh(1P`s=`Mip3mtyj8jI_a2VLJHJ#;nkRG~kY5}UUOoz1u&qwcbWiQ29o2ZG z?s`tJuER7=L*8IlO`PXL_yXz>cGYn>!|1_9KA+?tcGbBXwpYrS=lE2$42Xk$)o_@{ zc{J&HJL^7FeAhhBo8(;NbhNqCk-j~ff-{2#VIjwfL6>`VIC8HwFlw@)@1ps#7bzcxH5inG1{c=90dxE@= zxnfC&ZGW|!!3Hy;6cMy5oa^L)-ZL(m_n|I%RuFKpKR}z%5l|FvT^ue^UrhJHD12O3 z)JZS)ad_KWwLAr{GR+5Z8$2#UYg2G8#d)B8rSM(RNwzOX!Z&-k2%*qtinOcLoD`(-X&SM*3|>GuFleO;93+`2O=MSwg>89=LLDf+Gs*VU8&6>1r$Et zCVbjjI%)HX;`W!lDxU*j9|objnnI2^-4$;LVC=iOE>&+dciUN*E4-VR#l;5KL; zS!p(K!rENra0uf#u+HI3IJtbp%lwCcmkV7P3441S`!Lsq)(3SkNLi0O4G#3e{dD&T z44z&#WWkch2J7ra_`*@A=-I83B>+e~%IS-dE@ggx*_OsFB_B==X_bYhS=OQJg^h4-SK&UUhFi$Dcy}qH-DX{ zv(7khAeTHSp0pJUXV) zDFtQE7uzjt<%LHEb$KCWO=oeW5Bm}zEBw)?QWZIHlxcq3M_8VFlU|a^f) z7bJAAiGzLRz149o6XuP!upO1dl5PRKcLls-tm^dUrJk-XZXJvFRb=5v+4Q^)NEgR_ zZS;rPH!ZT>?_EQ?hY#|om>GOKI0tj@)wF*NFU-!`);84f5XzGMq9@>o``Eb0qXc$j zN89lB4){z37NCY`DVGLvya(n3R8Ek)5Q3O&=i9VA*~hZ7GxC6!nvK3RZjo_s!XNDD z{N1E=v;)7_9~HRR(R=Z2wsMBM8h_kp-G?`yEDmuo$Khjk^nQe;9en_A@=ZESgK-~) z-w|DKVRUJ)4A1DHZFZ1hZKp2yrEPWyu+TQkvS@*Ab{KFzAIH5O!T#P%S>&(vMXA`H z0%;v`E|sMpVzf+0ktWC03v`~o6n%sJe2qJVrD^Yr=KKBO#CMxJG+f7>N%?1ulx5Vk!SAKSr~WJGC^_g?U3Fv=A)mBKEqE1==OKmpPRH+>v)-L<{D2s!1g z$~kb9yY+8x&zps9(U;Q#XoY8OJ^=F@*wZs-sKL$^ouNh@1gdgjPrwgs-I+twV(V@$ z3S4==%50x3br!pe96$%LgQ};*eGDB~*4DkN4Uj^Q{pQiyz8ds*9_vNJl{8cRh~hq$ zaeaT6e*Id^#o7P3-bCEv@W=D&N_g|h;^KatFSAfTJY^1gT3lffAmU?;d>qA}^Xqiu z_|B%)$z0Ur)eqYnME`&FEeS*&2=uT+6!_VYxo)_eJA?Sy_>gNu8`c63?WEDhF^{bJEs6G7hnKp5{cACLm2V5KCVZAlmE@k{W z+f5?X zXc7bRnPce_0Sm`c`g7bz{W%5^hH~dLjIBoyj?a_u#@K39GIEFdQjQFScmLqP04!o7 z9bG$emPQ((BN_5!q{}uxnNR;Xy90J!zQk<=3>c;Pmzw5{3Efp@6f%Ccp*&h#u#icS zq~jiOCwbiV+WhR)g6`WOd>PKj;K7xK;Mhs{awogp<^iGgc_uV<7OsUo zMe6~T&O{OtoHgT0AURP!*%S^iwB2+ao0Y4eA93_T|+Qm-jsR4z|rxnNw$mtPnY zWLader%T8L-=IJl^9;l{8FRCiasHfLN$+f{#L_aS)&MLa!A>Db!YT9nT-0ed$7 zOy-gAr{j-nXt&_ahx{w0{f*KI`DMDKxe5>-qe6ejyNUGeEfH4e2&M~hB#LLt;Q$qBo1*?WA!@`mSgq1@FtI> z!!#K8J@_5b1s6uQo-UJ9*7Jd5vLg8+q#vVS2pq>~_`<_V z5+P+Ady}-IoE+FVz_&%TlK~k2mB4e1hFyoJbxNF9 z0mg9|It65db8TXBVaU6#3K({6F1t!amPv?TBL-VYoX8Fkcgd zy%H6OyMwyBP%r$ZY+RjMkL5Ztjvbup zYt1-9jJq^^T&{<&P2Fk4dFcf?Yq#rV?N+uZ$pS8U=9=!M0!NK5%tmnf6>J1tLMIk? zeY(V70ldV@!Lz(JyM2l1rausO74Cjvf)SkTnJ!{={_Ud%){k+rj&d>XdjiLH9`puKMWBOfl_<8jUw68PyNt`!& zPf8C#<1D{m(kalt_+9VvLVsmn_8yhxJbACz5p7>ICs`Kkg!O%|+X-u)_p$4w1F8AY z@BR4RYT^Mb{yu>3eO%t>>DR#b+c-OKG>UxNzAqUs-uL*ALUsxt({7⪻S^*t^BCT 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