- cd darkplaces && make sv-debug -j $(nproc) && export ENGINE="$PWD/darkplaces-dedicated -xonotic"
- cd ..
+ - mkdir -p data/maps
- wget -O data/g-23.pk3 http://beta.xonotic.org/autobuild-bsp/latest/g-23.pk3
+ - wget -O data/maps/g-23.mapinfo https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.mapinfo
+ - wget -O data/maps/g-23.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.waypoints
+ - wget -O data/maps/g-23.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.waypoints.cache
+ - wget -O data/maps/g-23.waypoints.hardwired https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/g-23.waypoints.hardwired
- make
- - EXPECT=07fdfd9a19025920a599995730eb2a78
+ - EXPECT=4bd5b0276cdd100c831c73f0400eca71
- HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg
| tee /dev/stderr
| grep '^:'
--- /dev/null
+cmake_minimum_required(VERSION 2.8.11)
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+project(xonotic-data LANGUAGES ASM)
+
+include_directories(qcsrc)
+
+add_definitions(-DNDEBUG=1)
+
+find_package(Git REQUIRED)
+execute_process(
+ COMMAND ${GIT_EXECUTABLE} describe --tags --dirty=~
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ OUTPUT_VARIABLE GIT_DESC
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+add_definitions(-DWATERMARK=\"${GIT_DESC}\")
+
+set_source_files_properties(
+ qcsrc/client/progs.inc
+ qcsrc/server/progs.inc
+ qcsrc/menu/progs.inc
+ PROPERTIES
+ LANGUAGE ASM
+ HEADER_FILE_ONLY FALSE
+)
+
+add_executable(csprogs qcsrc/client/progs.inc)
+target_compile_definitions(csprogs PRIVATE -DCSQC)
+add_dependencies(csprogs gmqcc)
+
+add_executable(progs qcsrc/server/progs.inc)
+target_compile_definitions(progs PRIVATE -DSVQC)
+add_dependencies(progs gmqcc)
+
+add_executable(menu qcsrc/menu/progs.inc)
+target_compile_definitions(menu PRIVATE -DMENUQC)
+add_dependencies(menu gmqcc)
+
+function(set_prelude target prelude)
+ get_target_property(MY_PROJECT_SOURCES target SOURCES)
+ foreach (source IN LISTS MY_PROJECT_SOURCES)
+ set_property(
+ SOURCE ${source}
+ APPEND PROPERTY COMPILE_FLAGS
+ "-include ${PROJECT_SOURCE_DIR}/${prelude}"
+ )
+ endforeach ()
+endfunction()
+# set_prelude(csprogs qcsrc/lib/_all.inc)
+
+function(copy prog)
+ add_custom_command(TARGET ${prog} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE_DIR:${prog}>/${prog}.dat" "${prog}.dat"
+ COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE_DIR:${prog}>/${prog}.lno" "${prog}.lno"
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ VERBATIM)
+endfunction()
+copy(csprogs)
+copy(progs)
+copy(menu)
+
+function(pack prog)
+ add_custom_target(${prog}.pk3
+ DEPENDS ${prog}-${GIT_DESC}.pk3
+ )
+ add_custom_command(OUTPUT ${prog}-${GIT_DESC}.pk3
+ DEPENDS ${prog}
+ COMMAND ${CMAKE_COMMAND} -E echo "http://xonotic.org" > "${prog}-${GIT_DESC}.txt"
+ COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE_DIR:${prog}>/${prog}.dat" "${prog}-${GIT_DESC}.dat"
+ COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE_DIR:${prog}>/${prog}.lno" "${prog}-${GIT_DESC}.lno"
+ COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${prog}-${GIT_DESC}.pk3" --format=zip
+ "${prog}-${GIT_DESC}.txt"
+ "${prog}-${GIT_DESC}.dat"
+ "${prog}-${GIT_DESC}.lno"
+ VERBATIM
+ )
+endfunction()
+pack(csprogs)
seta hud_colorset_background "7" "neutral/unimportant text"
// general hud panel cvars (i.e. shouldn't be adjusted by a skin config)
+seta hud_panel_weapons 1 "enable this panel"
+seta hud_panel_ammo 1 "enable this panel"
+seta hud_panel_powerups 1 "enable this panel"
+seta hud_panel_healtharmor 1 "enable this panel"
+seta hud_panel_notify 1 "enable this panel"
+seta hud_panel_timer 1 "enable this panel"
+seta hud_panel_radar 1 "enable this panel, 2 = also enable in non-teambased gamemodes"
+seta hud_panel_score 1 "enable this panel"
+seta hud_panel_racetimer 1 "enable this panel"
+seta hud_panel_vote 1 "enable this panel"
+seta hud_panel_modicons 1 "enable this panel"
+seta hud_panel_pressedkeys 1 "enable this panel, 1 = show only when spectating other players, 2 = show always"
+seta hud_panel_chat 1 "enable this panel"
+seta hud_panel_engineinfo 0 "enable this panel"
+seta hud_panel_infomessages 1 "enable this panel"
+seta hud_panel_physics 3 "enable this panel, 1 = show if not observing, 2 = show always, 3 = show only in race/cts if not observing"
+seta hud_panel_centerprint 1 "enable this panel"
+seta hud_panel_minigameboard 1 "enable this panel"
+seta hud_panel_minigamestatus 1 "enable this panel"
+seta hud_panel_minigamehelp 1 "enable this panel"
+seta hud_panel_minigamemenu 0 "enable this panel"
+seta hud_panel_mapvote 1 "enable this panel"
+seta hud_panel_itemstime 2 "enable this panel, 1 = show when spectating, 2 = even playing in warmup stage"
+seta hud_panel_quickmenu 1 "enable this panel"
+
seta hud_panel_weapons_ammo_full_shells 60 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_nails 320 "show 100% of the status bar at this ammo count"
seta hud_panel_weapons_ammo_full_cells 180 "show 100% of the status bar at this ammo count"
seta hud_configure_grid_xsize "" "snap to X * vid_conwidth"
seta hud_configure_grid_ysize "" "snap to Y * vid_conheight"
-seta hud_panel_weapons "" "enable/disable this panel"
seta hud_panel_weapons_pos "" "position of this panel"
seta hud_panel_weapons_size "" "size of this panel"
seta hud_panel_weapons_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_weapons_noncurrent_alpha "" "alpha of noncurrent weapons"
seta hud_panel_weapons_noncurrent_scale "" "scale of noncurrent weapons, relative to the current weapon"
-seta hud_panel_ammo "" "enable/disable this panel"
seta hud_panel_ammo_pos "" "position of this panel"
seta hud_panel_ammo_size "" "size of this panel"
seta hud_panel_ammo_onlycurrent "" "1 = show only current ammo type"
seta hud_panel_ammo_progressbar_name "" "name of progressbar to use behind ammo icons"
seta hud_panel_ammo_text "" "show text/icons in the ammo panel"
-seta hud_panel_powerups "" "enable/disable this panel"
seta hud_panel_powerups_pos "" "position of this panel"
seta hud_panel_powerups_size "" "size of this panel"
seta hud_panel_powerups_baralign "" "0 = align bars to the left, 1 = align bars to the right, 2 = align only left bar to the right, 3 = align only right bar to the right"
seta hud_panel_powerups_progressbar "" "enable progressbar in panel"
seta hud_panel_powerups_text "" "show text and icons in the powerups panel"
-seta hud_panel_healtharmor "" "enable/disable this panel, 2 = combined health/armor display"
seta hud_panel_healtharmor_pos "" "position of this panel"
seta hud_panel_healtharmor_size "" "size of this panel"
+seta hud_panel_healtharmor_combined "" "combined health/armor display"
seta hud_panel_healtharmor_flip "" "flip health/armor positions"
seta hud_panel_healtharmor_baralign "" "0 = align bars to the left, 1 = align bars to the right, 2 = align only left bar to the right, 3 = align only right bar to the right"
seta hud_panel_healtharmor_iconalign "" "0 = align icons to the left, 1 = align icons to the right, 2 = align only left icon to the right, 3 = align only right icon to the right"
seta hud_panel_healtharmor_progressbar_gfx "" "enable graphic effects on the progressbars"
seta hud_panel_healtharmor_progressbar_gfx_smooth "" "smooth changes of the progressbar when health/armor change at least by this amount; 0 disables the effect"
-seta hud_panel_notify "" "enable/disable this panel"
seta hud_panel_notify_pos "" "position of this base of the panel"
seta hud_panel_notify_size "" "size of this panel with all notifications on"
seta hud_panel_notify_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_notify_time "" "time that a new entry stays until it fades out"
seta hud_panel_notify_icon_aspect "" "aspect ratio of total drawing area per icon"
-seta hud_panel_timer "" "enable/disable this panel"
seta hud_panel_timer_pos "" "position of this base of the panel"
seta hud_panel_timer_size "" "size of this panel"
seta hud_panel_timer_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_timer_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_timer_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_radar "" "enable/disable this panel, 2 = also enable in non-teambased gamemodes"
seta hud_panel_radar_pos "" "position of this base of the panel"
seta hud_panel_radar_size "" "size of this panel"
seta hud_panel_radar_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_radar_maximized_rotation "" "rotation mode: you set what points up. 0 = player, 1 = west, 2 = south, 3 = east, 4 = north"
seta hud_panel_radar_maximized_zoommode "" "zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out"
-seta hud_panel_score "" "enable/disable this panel"
seta hud_panel_score_pos "" "position of this base of the panel"
seta hud_panel_score_size "" "size of this panel"
seta hud_panel_score_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_score_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
seta hud_panel_score_rankings "" "show rankings: 1 always show my own score; 2 pure rankings"
-seta hud_panel_racetimer "" "enable/disable this panel"
seta hud_panel_racetimer_pos "" "position of this base of the panel"
seta hud_panel_racetimer_size "" "size of this panel"
seta hud_panel_racetimer_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_racetimer_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_racetimer_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_vote "" "enable/disable this panel"
seta hud_panel_vote_pos "" "position of this base of the panel"
seta hud_panel_vote_size "" "size of this panel"
seta hud_panel_vote_alreadyvoted_alpha "" "alpha of the vote dialog after you have voted"
seta hud_panel_vote_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_vote_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_modicons "" "enable/disable this panel"
seta hud_panel_modicons_pos "" "position of this base of the panel"
seta hud_panel_modicons_size "" "size of this panel"
seta hud_panel_modicons_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_modicons_dom_layout "" "3 possible layouts: 0) only icons; 1) icons and percentage of average pps (points per second); 2) icons and average pps"
seta hud_panel_modicons_freezetag_layout "" "2 possible layouts: 0) number of alive players; 1) icons and number of alive players"
-seta hud_panel_pressedkeys "" "enable/disable this panel, 1 = show only when spectating other players, 2 = show always"
seta hud_panel_pressedkeys_pos "" "position of this base of the panel"
seta hud_panel_pressedkeys_size "" "size of this panel"
seta hud_panel_pressedkeys_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_pressedkeys_aspect "" "forced aspect on panel"
seta hud_panel_pressedkeys_attack "" "show attack buttons too"
-seta hud_panel_chat "" "enable/disable this panel"
seta hud_panel_chat_pos "" "position of this base of the panel"
seta hud_panel_chat_size "" "size of this panel"
seta hud_panel_chat_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_chat_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_chat_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_engineinfo "" "enable/disable this panel"
seta hud_panel_engineinfo_pos "" "position of this base of the panel"
seta hud_panel_engineinfo_size "" "size of this panel"
seta hud_panel_engineinfo_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_engineinfo_framecounter_decimals "" "amount of decimals to show"
seta hud_panel_engineinfo_framecounter_time "" "time between framerate display updates"
-seta hud_panel_infomessages "" "enable/disable this panel"
seta hud_panel_infomessages_pos "" "position of this base of the panel"
seta hud_panel_infomessages_size "" "size of this panel"
seta hud_panel_infomessages_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_infomessages_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
seta hud_panel_infomessages_flip "" "1 = align the items to the right"
-seta hud_panel_physics "" "enable/disable this panel, 1 = show if not observing, 2 = show always, 3 = show only in race/cts if not observing"
seta hud_panel_physics_pos "" "position of this base of the panel"
seta hud_panel_physics_size "" "size of this panel"
seta hud_panel_physics_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_physics_topspeed "" "also show top speed"
seta hud_panel_physics_topspeed_time "" "how many seconds the top speed takes to fade out"
-seta hud_panel_centerprint "" "enable/disable this panel"
seta hud_panel_centerprint_pos "" "position of this base of the panel"
seta hud_panel_centerprint_size "" "size of this panel"
seta hud_panel_centerprint_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_centerprint_fade_subsequent_minfontsize "" "minimum factor for the font size from the subsequent fading effects"
seta hud_panel_centerprint_fade_minfontsize "" "minimum factor for the font size from the fading in/out effects"
-seta hud_panel_minigameboard "" "enable/disable this panel"
seta hud_panel_minigameboard_pos "" "position of this panel"
seta hud_panel_minigameboard_size "" "size of this panel"
seta hud_panel_minigameboard_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_minigameboard_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_minigameboard_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_minigamestatus "" "enable/disable this panel"
seta hud_panel_minigamestatus_pos "" "position of this panel"
seta hud_panel_minigamestatus_size "" "size of this panel"
seta hud_panel_minigamestatus_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_minigamestatus_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_minigamestatus_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_minigamehelp "" "enable/disable this panel"
seta hud_panel_minigamehelp_pos "" "position of this panel"
seta hud_panel_minigamehelp_size "" "size of this panel"
seta hud_panel_minigamehelp_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_minigamehelp_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_minigamehelp_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_minigamemenu "" "enable/disable this panel"
seta hud_panel_minigamemenu_pos "" "position of this panel"
seta hud_panel_minigamemenu_size "" "size of this panel"
seta hud_panel_minigamemenu_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_minigamemenu_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_minigamemenu_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_mapvote "" "enable/disable this panel"
seta hud_panel_mapvote_pos "" "position of this panel"
seta hud_panel_mapvote_size "" "size of this panel"
seta hud_panel_mapvote_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_mapvote_bg_border "" "if set to something else than \"\" = override default size of border around the background"
seta hud_panel_mapvote_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
-seta hud_panel_itemstime "" "enable/disable this panel, it shows left time until important items (mega health, large armor, powerups, superweapons, etc...) respawn in the map: 1 when spectating, 2 even playing in warmup stage"
seta hud_panel_itemstime_pos "" "position of this base of the panel"
seta hud_panel_itemstime_size "" "size of this panel"
seta hud_panel_itemstime_bg "" "if set to something else than \"\" = override default background"
seta hud_panel_itemstime_ratio "" "ratio between space reserved for text and icon width of each item entry (min value is 2)"
seta hud_panel_itemstime_dynamicsize "" "allow panel size reduction by removing spacing among items"
-seta hud_panel_quickmenu "" "enable/disable this panel"
seta hud_panel_quickmenu_pos "" "position of this base of the panel"
seta hud_panel_quickmenu_size "" "size of this panel"
seta hud_panel_quickmenu_bg "" "if set to something else than \"\" = override default background"
--- /dev/null
+set(CMAKE_ASM_COMPILER "@CMAKE_ASM_COMPILER@")
+set(CMAKE_ASM_COMPILER_LOADED 1)
+
+set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS qc;qh;inc)
+set(CMAKE_ASM_OUTPUT_EXTENSION .o)
+set(CMAKE_ASM_OUTPUT_EXTENSION_REPLACE 1)
+set(CMAKE_ASM_LINKER_PREFERENCE 42)
+set(CMAKE_ASM_COMPILER_ENV_VAR "QCC")
--- /dev/null
+if (${CMAKE_VERSION} VERSION_LESS "3.4")
+ set(_CMAKE_ASM_INCLUDES "")
+else()
+ set(_CMAKE_ASM_INCLUDES "<INCLUDES>")
+endif()
+mark_as_advanced(_CMAKE_ASM_INCLUDES)
+
+set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> compile <OBJECT> <DEFINES> -DGMQCC ${_CMAKE_ASM_INCLUDES} <FLAGS> <SOURCE>")
+set(CMAKE_ASM_LINK_EXECUTABLE "env CMAKE_EXECUTABLE_SUFFIX=${CMAKE_EXECUTABLE_SUFFIX} <CMAKE_ASM_COMPILER> link <OBJECTS> -o <TARGET>")
+
+set(CMAKE_INCLUDE_FLAG_ASM "-I")
+set(CMAKE_INCLUDE_FLAG_ASM_SEP "")
+set(CMAKE_EXECUTABLE_PREFIX_ASM "")
+set(CMAKE_EXECUTABLE_SUFFIX_ASM ".dat")
--- /dev/null
+set(CMAKE_ASM_COMPILER ${PROJECT_SOURCE_DIR}/cmake/qcc.sh)
+
+configure_file(cmake/CMakeASMCompiler.cmake.in
+ ${CMAKE_PLATFORM_INFO_DIR}/CMakeASMCompiler.cmake @ONLY)
+set(CMAKE_ASM_COMPILER_ENV_VAR "QCC")
--- /dev/null
+set(CMAKE_ASM_COMPILER_WORKS 1 CACHE INTERNAL "")
--- /dev/null
+#!/bin/bash
+CPP=${CPP:-cpp}
+QCC=${QCC:-$PWD/../../gmqcc/gmqcc${CMAKE_EXECUTABLE_SUFFIX}}
+case $1 in
+ compile)
+ ${CPP} ${@:3} | sed 's/^#\(line\)\? \([[:digit:]]\+\) "\(.*\)".*/\n#pragma file(\3)\n#pragma line(\2)/g' > $2
+ ;;
+ link)
+ ${QCC} \
+ -std=gmqcc \
+ -Ooverlap-locals \
+ -O3 \
+ -Werror -Wall \
+ -Wno-field-redeclared \
+ -flno -futf8 -fno-bail-on-werror \
+ -frelaxed-switch -freturn-assignments \
+ ${@:2}
+ ;;
+esac
set sv_spectator_speed_multiplier 1.5
seta sv_spectate 1 "if set to 1, new clients are allowed to spectate or observe the game, if set to 0 joining clients spawn as players immediately (no spectating)"
seta sv_defaultcharacter 0 "master switch, if set to 1 the further configuration for replacing all player models, skins and colors is taken from the sv_defaultplayermodel, sv_defaultplayerskin and sv_defaultplayercolors variables"
+seta sv_defaultcharacterskin 0 "if set to 1 the further configuration for replacing all skins is taken from the sv_defaultplayerskin variables"
seta sv_defaultplayermodel "models/player/erebus.iqm" "default model selection, only works if sv_defaultcharacter is set to 1; you may append a :<skinnumber> suffix to model names; you can specify multiple, separated by space, and a random one will be chosen"
seta sv_defaultplayerskin 0 "each model has 1 or more skins (combination of model and skin = character), set which skin of the model you wish the default character to have, only works if sv_defaultcharacter is set to 1; can be overriden by :<skinnumber> suffix in sv_defaultplayermodel"
seta sv_defaultplayermodel_red "" "\"\" means see sv_defaultplayermodel"
seta teamplay_mode 4 "default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the cvars g_mirrordamage*, g_friendlyfire* and g_teamdamage_threshold*"
seta g_mirrordamage 0.700000 "for teamplay 4: mirror damage factor"
seta g_mirrordamage_virtual 1 "for teamplay 4: do not actually apply mirror damage, just show graphics effect for it"
+seta g_mirrordamage_onlyweapons 0 "for teamplay 4: only apply mirror damage if the attack was from a weapon"
seta g_friendlyfire 0.500000 "for teamplay 4: fiendly fire factor"
seta g_friendlyfire_virtual 1 "for teamplay 4: do not actually apply friendly fire, just show graphics effect for it"
seta g_friendlyfire_virtual_force 1 "for teamplay 4: apply force even though damage was made virtual only"
seta g_waypointsprite_turrets_maxdist 5000 "max distace for turret sprites"
seta g_waypointsprite_tactical 1 "tactical overlay on turrets when in a vehicle"
+seta cl_damagetext "0" "Draw damage dealt where you hit the enemy"
+seta cl_damagetext_format "-{total}" "How to format the damage text. {health}, {armor}, {total}"
+seta cl_damagetext_color "1 1 0" "Damage text color"
+seta cl_damagetext_color_per_weapon "0" "Damage text uses weapon color"
+seta cl_damagetext_size "8" "Damage text font size"
+seta cl_damagetext_alpha_start "1" "Damage text initial alpha"
+seta cl_damagetext_alpha_lifetime "3" "Damage text lifetime in seconds"
+seta cl_damagetext_velocity "0 0 20" "Damage text move direction"
+seta cl_damagetext_offset "0 -40 0" "Damage text offset"
+seta cl_damagetext_accumulate_range "30" "Damage text spawned within this range is accumulated"
+
set sv_itemstime 1 "enable networking of left time until respawn for items such as mega health and large armor"
// so it can be stuffcmd-ed still
seta menu_tooltips 1 "menu tooltips: 0 disabled, 1 enabled, 2 also shows cvar or console command (when available) changed or executed by the item"
set menu_picmip_bypass 0 "bypass texture quality enforcement based on system resources, not recommended and may cause crashes!"
set menu_showboxes 0 "show item bounding boxes (debug)"
+set menu_cvarlist_onlymodified 0 "show only modified cvars in the cvar list"
r_textbrightness 0.2
r_textcontrast 0.8
// ======
set g_race 0 "Race: be faster than your opponents"
set g_race_qualifying_timelimit 0
-set g_race_qualifying_timelimit_override -1
+set g_race_qualifying_timelimit_override -1 "qualifying session time limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
set g_race_teams 0 "when 2, 3, or 4, the race is played as a team game (the team members can add up their laps)"
// ==========
seta hud_dock_color_team "1"
seta hud_dock_alpha "1"
-seta hud_progressbar_alpha "0.600000"
+seta hud_progressbar_alpha "0.6"
seta hud_progressbar_strength_color "1 0.39 0"
seta hud_progressbar_superweapons_color "0.77 0.67 0"
seta hud_progressbar_shield_color "0.36 1 0.07"
seta hud_configure_grid_xsize "0.005000"
seta hud_configure_grid_ysize "0.005000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.965000 0.125000"
seta hud_panel_weapons_size "0.035000 0.770000"
seta hud_panel_weapons_bg "border_default_east"
seta hud_panel_weapons_bg_padding "0"
seta hud_panel_weapons_accuracy "0"
seta hud_panel_weapons_label "1"
-seta hud_panel_weapons_label_scale "0.300000"
+seta hud_panel_weapons_label_scale "0.3"
seta hud_panel_weapons_complainbubble "1"
seta hud_panel_weapons_complainbubble_padding "0"
seta hud_panel_weapons_complainbubble_time "0"
seta hud_panel_weapons_timeout_speed_in "0.25"
seta hud_panel_weapons_timeout_speed_out "0.75"
seta hud_panel_weapons_onlyowned "1"
-seta hud_panel_weapons_noncurrent_alpha "0.800000"
-seta hud_panel_weapons_noncurrent_scale "0.900000"
+seta hud_panel_weapons_noncurrent_alpha "0.8"
+seta hud_panel_weapons_noncurrent_scale "0.9"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.315000 0.865000"
seta hud_panel_ammo_size "0.370000 0.060000"
seta hud_panel_ammo_bg "border_tab_south"
seta hud_panel_ammo_bg_border ""
seta hud_panel_ammo_bg_padding "4"
seta hud_panel_ammo_onlycurrent "0"
-seta hud_panel_ammo_noncurrent_alpha "0.600000"
-seta hud_panel_ammo_noncurrent_scale "0.400000"
+seta hud_panel_ammo_noncurrent_alpha "0.6"
+seta hud_panel_ammo_noncurrent_scale "0.4"
seta hud_panel_ammo_iconalign "0"
seta hud_panel_ammo_progressbar "0"
seta hud_panel_ammo_progressbar_name "progressbar"
seta hud_panel_ammo_progressbar_xoffset "0"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.325000 0.815000"
seta hud_panel_powerups_size "0.350000 0.055000"
seta hud_panel_powerups_bg "border_shadow_south"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.300000 0.925000"
seta hud_panel_healtharmor_size "0.400000 0.070000"
seta hud_panel_healtharmor_bg "border_default_south"
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border "4"
seta hud_panel_healtharmor_bg_padding ""
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "3"
seta hud_panel_healtharmor_baralign "3"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "1"
-seta hud_panel_notify "1"
seta hud_panel_notify_pos "0.730000 0.800000"
seta hud_panel_notify_size "0.265000 0.200000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "1"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.456000 0"
seta hud_panel_timer_size "0.088000 0.030000"
seta hud_panel_timer_bg "border_plain_north"
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "1"
seta hud_panel_radar_pos "0 0"
seta hud_panel_radar_size "0.200000 0.250000"
seta hud_panel_radar_bg "border_corner_northwest"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.880000 0"
seta hud_panel_score_size "0.120000 0.080000"
seta hud_panel_score_bg "border_corner_northeast"
seta hud_panel_score_bg_padding "1"
seta hud_panel_score_rankings "1"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.110000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0.740000 0.690000"
seta hud_panel_vote_size "0.190000 0.090000"
seta hud_panel_vote_bg " "
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding ""
-seta hud_panel_vote_alreadyvoted_alpha "0.700000"
+seta hud_panel_vote_alreadyvoted_alpha "0.7"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.370000 0.030000"
seta hud_panel_modicons_size "0.260000 0.07000"
seta hud_panel_modicons_bg "border_fading_north"
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.445000 0.710000"
seta hud_panel_pressedkeys_size "0.110000 0.090000"
seta hud_panel_pressedkeys_bg " "
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding "1"
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0.010000 0.700000"
seta hud_panel_chat_size "0.460000 0.190000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.930000 0.970000"
seta hud_panel_engineinfo_size "0.070000 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.720000 0.100000"
seta hud_panel_infomessages_size "0.280000 0.080000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.410000 0.625000"
seta hud_panel_physics_size "0.180000 0.080000"
seta hud_panel_physics_bg "0"
seta hud_panel_physics_bg_color ""
seta hud_panel_physics_bg_color_team ""
-seta hud_panel_physics_bg_alpha "0.700000"
+seta hud_panel_physics_bg_alpha "0.7"
seta hud_panel_physics_bg_border ""
seta hud_panel_physics_bg_padding ""
seta hud_panel_physics_speed_unit_show "1"
seta hud_panel_physics_text "1"
seta hud_panel_physics_text_scale "0.7"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.220000"
seta hud_panel_centerprint_size "0.650000 0.220000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "border_default"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.030000 0.260000"
seta hud_panel_itemstime_size "0.070000 0.230000"
-seta hud_panel_itemstime_bg "border_itemstime"
+seta hud_panel_itemstime_bg "border_default"
seta hud_panel_itemstime_bg_color ""
seta hud_panel_itemstime_bg_color_team ""
seta hud_panel_itemstime_bg_alpha ""
seta hud_panel_itemstime_ratio "2"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.600000 0.445000"
seta hud_panel_quickmenu_size "0.220000 0.240000"
seta hud_panel_quickmenu_bg ""
seta hud_dock_color_team "1"
seta hud_dock_alpha "1"
-seta hud_progressbar_alpha "0.500000"
+seta hud_progressbar_alpha "0.5"
seta hud_progressbar_strength_color "0 0 0.6"
seta hud_progressbar_superweapons_color "0.6 0.3 0"
seta hud_progressbar_shield_color "0.6 0 0.6"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.930000 0.170000"
seta hud_panel_weapons_size "0.070000 0.650000"
seta hud_panel_weapons_bg "border_small_weapons"
seta hud_panel_weapons_bg_padding "4"
seta hud_panel_weapons_accuracy "1"
seta hud_panel_weapons_label "1"
-seta hud_panel_weapons_label_scale "0.500000"
+seta hud_panel_weapons_label_scale "0.5"
seta hud_panel_weapons_complainbubble "1"
seta hud_panel_weapons_complainbubble_padding "-1"
seta hud_panel_weapons_complainbubble_time "0"
seta hud_panel_weapons_noncurrent_alpha "1"
seta hud_panel_weapons_noncurrent_scale "1"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.330000 0.960000"
seta hud_panel_ammo_size "0.350000 0.040000"
seta hud_panel_ammo_bg ""
seta hud_panel_ammo_bg_border ""
seta hud_panel_ammo_bg_padding ""
seta hud_panel_ammo_onlycurrent "0"
-seta hud_panel_ammo_noncurrent_alpha "0.700000"
+seta hud_panel_ammo_noncurrent_alpha "0.7"
seta hud_panel_ammo_noncurrent_scale "1"
seta hud_panel_ammo_iconalign "0"
seta hud_panel_ammo_progressbar "0"
seta hud_panel_ammo_progressbar_xoffset "0"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.360000 0.850000"
seta hud_panel_powerups_size "0.290000 0.030000"
seta hud_panel_powerups_bg "border_small_powerups"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.320000 0.910000"
seta hud_panel_healtharmor_size "0.370000 0.060000"
seta hud_panel_healtharmor_bg "border_small_healtharmor"
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "3"
seta hud_panel_healtharmor_baralign "3"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "1"
-seta hud_panel_notify "1"
seta hud_panel_notify_pos "0.710000 0.800000"
seta hud_panel_notify_size "0.290000 0.190000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "2"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.800000 0.040000"
seta hud_panel_timer_size "0.070000 0.040000"
seta hud_panel_timer_bg "border_small_timer"
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "2"
seta hud_panel_radar_pos "0 0"
seta hud_panel_radar_size "0.200000 0.240000"
seta hud_panel_radar_bg "border_small_radar"
seta hud_panel_radar_bg_color ""
seta hud_panel_radar_bg_color_team ""
-seta hud_panel_radar_bg_alpha "0.800000"
+seta hud_panel_radar_bg_alpha "0.8"
seta hud_panel_radar_bg_border ""
seta hud_panel_radar_bg_padding "-1"
-seta hud_panel_radar_foreground_alpha "0.800000"
+seta hud_panel_radar_foreground_alpha "0.8"
seta hud_panel_radar_rotation "0"
seta hud_panel_radar_zoommode "0"
seta hud_panel_radar_scale "4096"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.890000 0.030000"
seta hud_panel_score_size "0.100000 0.050000"
seta hud_panel_score_bg "border_small_score"
seta hud_panel_score_bg_padding "0"
seta hud_panel_score_rankings "1"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.110000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0.720000 0.670000"
seta hud_panel_vote_size "0.190000 0.090000"
-seta hud_panel_vote_bg "border_vote"
+seta hud_panel_vote_bg "border_default"
seta hud_panel_vote_bg_color ""
seta hud_panel_vote_bg_color_team ""
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding ""
-seta hud_panel_vote_alreadyvoted_alpha "0.500000"
+seta hud_panel_vote_alreadyvoted_alpha "0.5"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.410000 0"
seta hud_panel_modicons_size "0.180000 0.080000"
seta hud_panel_modicons_bg "border_small_modicons"
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.450000 0.720000"
seta hud_panel_pressedkeys_size "0.110000 0.090000"
seta hud_panel_pressedkeys_bg "0"
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding ""
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0.010000 0.700000"
seta hud_panel_chat_size "0.460000 0.190000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.930000 0.970000"
seta hud_panel_engineinfo_size "0.070000 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.720000 0.100000"
seta hud_panel_infomessages_size "0.280000 0.080000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.420000 0.620000"
seta hud_panel_physics_size "0.170000 0.080000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_text "1"
seta hud_panel_physics_text_scale "0.7"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.220000"
seta hud_panel_centerprint_size "0.650000 0.220000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "0"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.030000 0.260000"
seta hud_panel_itemstime_size "0.070000 0.230000"
-seta hud_panel_itemstime_bg "border_itemstime"
+seta hud_panel_itemstime_bg "border_default"
seta hud_panel_itemstime_bg_color ""
seta hud_panel_itemstime_bg_color_team ""
seta hud_panel_itemstime_bg_alpha ""
seta hud_panel_itemstime_ratio "2"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.610000 0.450000"
seta hud_panel_quickmenu_size "0.200000 0.210000"
seta hud_panel_quickmenu_bg ""
seta hud_dock "0"
seta hud_dock_color "0 0.449576 0.860796"
-seta hud_dock_color_team "0.700000"
+seta hud_dock_color_team "0.7"
seta hud_dock_alpha "1"
-seta hud_progressbar_alpha "0.500000"
+seta hud_progressbar_alpha "0.5"
seta hud_progressbar_strength_color "0 0 0.6"
seta hud_progressbar_superweapons_color "0.6 0.3 0"
seta hud_progressbar_shield_color "0.6 0 0.6"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.350000 0.940000"
seta hud_panel_weapons_size "0.300000 0.060000"
seta hud_panel_weapons_bg ""
seta hud_panel_weapons_noncurrent_alpha "1"
seta hud_panel_weapons_noncurrent_scale "1"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.650000 0.890000"
seta hud_panel_ammo_size "0.055000 0.110000"
seta hud_panel_ammo_bg ""
seta hud_panel_ammo_progressbar_xoffset "0"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.290000 0.890000"
seta hud_panel_powerups_size "0.055000 0.110000"
seta hud_panel_powerups_bg "0"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.350000 0.890000"
seta hud_panel_healtharmor_size "0.300000 0.050000"
seta hud_panel_healtharmor_bg ""
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "3"
seta hud_panel_healtharmor_baralign "3"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "1"
-seta hud_panel_notify "1"
seta hud_panel_notify_pos "0 0"
seta hud_panel_notify_size "0.210000 0.260000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "2"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.435000 0"
seta hud_panel_timer_size "0.135000 0.060000"
seta hud_panel_timer_bg "0"
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "2"
seta hud_panel_radar_pos "0.810000 0"
seta hud_panel_radar_size "0.190000 0.250000"
-seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg "border_default"
seta hud_panel_radar_bg_color ""
seta hud_panel_radar_bg_color_team ""
-seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_alpha "0.5"
seta hud_panel_radar_bg_border "0"
seta hud_panel_radar_bg_padding "0"
-seta hud_panel_radar_foreground_alpha "0.500000"
+seta hud_panel_radar_foreground_alpha "0.5"
seta hud_panel_radar_rotation "0"
seta hud_panel_radar_zoommode "0"
seta hud_panel_radar_scale "4096"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.465000 0.045000"
seta hud_panel_score_size "0.090000 0.060000"
seta hud_panel_score_bg ""
seta hud_panel_score_bg_padding ""
seta hud_panel_score_rankings "1"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.090000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0 0.890000"
seta hud_panel_vote_size "0.170000 0.110000"
seta hud_panel_vote_bg ""
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding ""
-seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+seta hud_panel_vote_alreadyvoted_alpha "0.8"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.560000 0"
seta hud_panel_modicons_size "0.050000 0.100000"
seta hud_panel_modicons_bg ""
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.450000 0.650000"
seta hud_panel_pressedkeys_size "0.100000 0.110000"
seta hud_panel_pressedkeys_bg "0"
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding ""
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0 0.775000"
seta hud_panel_chat_size "0.460000 0.110000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.910000 0.970000"
seta hud_panel_engineinfo_size "0.090000 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.710000 0"
seta hud_panel_infomessages_size "0.290000 0.100000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.440000 0.590000"
seta hud_panel_physics_size "0.120000 0.050000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_text "1"
seta hud_panel_physics_text_scale "0.7"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.220000"
seta hud_panel_centerprint_size "0.650000 0.220000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "0"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.000000 0.310000"
seta hud_panel_itemstime_size "0.070000 0.180000"
seta hud_panel_itemstime_bg ""
seta hud_panel_itemstime_ratio "2"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.600000 0.460000"
seta hud_panel_quickmenu_size "0.190000 0.190000"
seta hud_panel_quickmenu_bg ""
seta hud_dock "0"
seta hud_dock_color "0 0.449576 0.860796"
-seta hud_dock_color_team "0.700000"
+seta hud_dock_color_team "0.7"
seta hud_dock_alpha "1"
seta hud_progressbar_alpha "0.3"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.350000 0.940000"
seta hud_panel_weapons_size "0.300000 0.060000"
seta hud_panel_weapons_bg ""
seta hud_panel_weapons_noncurrent_alpha "1"
seta hud_panel_weapons_noncurrent_scale "1"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.450000 0.630000"
seta hud_panel_ammo_size "0.080000 0.040000"
seta hud_panel_ammo_bg ""
seta hud_panel_ammo_progressbar_xoffset "0.32"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.270000 0.940000"
seta hud_panel_powerups_size "0.080000 0.060000"
seta hud_panel_powerups_bg "0"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.350000 0.380000"
seta hud_panel_healtharmor_size "0.070000 0.240000"
seta hud_panel_healtharmor_bg "border_healtharmor"
seta hud_panel_healtharmor_bg_color "0.464391 0.464391 0.464391"
seta hud_panel_healtharmor_bg_color_team ""
-seta hud_panel_healtharmor_bg_alpha "0.600000"
+seta hud_panel_healtharmor_bg_alpha "0.6"
seta hud_panel_healtharmor_bg_border "-1"
seta hud_panel_healtharmor_bg_padding "0"
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "1"
seta hud_panel_healtharmor_baralign "1"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "0"
-seta hud_panel_notify "1"
seta hud_panel_notify_pos "0 0"
seta hud_panel_notify_size "0.210000 0.260000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "2"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.435000 0"
seta hud_panel_timer_size "0.135000 0.060000"
seta hud_panel_timer_bg "0"
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "2"
seta hud_panel_radar_pos "0.810000 0"
seta hud_panel_radar_size "0.190000 0.250000"
-seta hud_panel_radar_bg "border_radar"
+seta hud_panel_radar_bg "border_default"
seta hud_panel_radar_bg_color ""
seta hud_panel_radar_bg_color_team ""
-seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_alpha "0.5"
seta hud_panel_radar_bg_border "0"
seta hud_panel_radar_bg_padding "0"
-seta hud_panel_radar_foreground_alpha "0.500000"
+seta hud_panel_radar_foreground_alpha "0.5"
seta hud_panel_radar_rotation "0"
seta hud_panel_radar_zoommode "0"
seta hud_panel_radar_scale "4096"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.465000 0.045000"
seta hud_panel_score_size "0.090000 0.060000"
seta hud_panel_score_bg ""
seta hud_panel_score_bg_padding ""
seta hud_panel_score_rankings "1"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.090000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0 0.890000"
seta hud_panel_vote_size "0.170000 0.110000"
seta hud_panel_vote_bg ""
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding ""
-seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+seta hud_panel_vote_alreadyvoted_alpha "0.8"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.560000 0"
seta hud_panel_modicons_size "0.050000 0.100000"
seta hud_panel_modicons_bg ""
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.450000 0.690000"
seta hud_panel_pressedkeys_size "0.100000 0.110000"
seta hud_panel_pressedkeys_bg "0"
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding ""
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0 0.775000"
seta hud_panel_chat_size "0.460000 0.110000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.910000 0.970000"
seta hud_panel_engineinfo_size "0.090000 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.710000 0"
seta hud_panel_infomessages_size "0.290000 0.100000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.270000 0.730000"
seta hud_panel_physics_size "0.170000 0.030000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_text "1"
seta hud_panel_physics_text_scale "0.7"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.220000"
seta hud_panel_centerprint_size "0.650000 0.220000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "0"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.000000 0.310000"
seta hud_panel_itemstime_size "0.070000 0.180000"
seta hud_panel_itemstime_bg ""
seta hud_panel_itemstime_ratio "2"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.600000 0.460000"
seta hud_panel_quickmenu_size "0.190000 0.190000"
seta hud_panel_quickmenu_bg ""
seta hud_dock "dock"
seta hud_dock_color "0 0.1875 0.40625"
-seta hud_dock_color_team "0.700000"
+seta hud_dock_color_team "0.7"
seta hud_dock_alpha "1"
-seta hud_progressbar_alpha "0.500000"
+seta hud_progressbar_alpha "0.5"
seta hud_progressbar_strength_color "0 0 0.6"
seta hud_progressbar_superweapons_color "0.6 0.3 0"
seta hud_progressbar_shield_color "0.6 0 0.6"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.920000 0.090000"
seta hud_panel_weapons_size "0.060000 0.630000"
seta hud_panel_weapons_bg ""
seta hud_panel_weapons_noncurrent_alpha "1"
seta hud_panel_weapons_noncurrent_scale "1"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.190000 0.920000"
seta hud_panel_ammo_size "0.120000 0.070000"
seta hud_panel_ammo_bg ""
seta hud_panel_ammo_progressbar_xoffset "0"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.660000 0.940000"
seta hud_panel_powerups_size "0.330000 0.060000"
seta hud_panel_powerups_bg "0"
seta hud_panel_powerups_progressbar "1"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.330000 0.920000"
seta hud_panel_healtharmor_size "0.310000 0.070000"
seta hud_panel_healtharmor_bg ""
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "3"
seta hud_panel_healtharmor_baralign "3"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "1"
-seta hud_panel_notify "1"
seta hud_panel_notify_pos "0.660000 0.730000"
seta hud_panel_notify_size "0.320000 0.190000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "2"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.870000 0"
seta hud_panel_timer_size "0.130000 0.060000"
seta hud_panel_timer_bg "0"
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "2"
seta hud_panel_radar_pos "0.030000 0.020000"
seta hud_panel_radar_size "0.170000 0.220000"
seta hud_panel_radar_bg ""
seta hud_panel_radar_bg_alpha ""
seta hud_panel_radar_bg_border ""
seta hud_panel_radar_bg_padding "-3"
-seta hud_panel_radar_foreground_alpha "0.800000"
+seta hud_panel_radar_foreground_alpha "0.8"
seta hud_panel_radar_rotation "0"
seta hud_panel_radar_zoommode "0"
seta hud_panel_radar_scale "4096"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.020000 0.920000"
seta hud_panel_score_size "0.150000 0.070000"
seta hud_panel_score_bg ""
seta hud_panel_score_bg_padding ""
seta hud_panel_score_rankings "1"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.090000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0.020000 0.650000"
seta hud_panel_vote_size "0.230000 0.110000"
seta hud_panel_vote_bg ""
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding ""
-seta hud_panel_vote_alreadyvoted_alpha "0.800000"
+seta hud_panel_vote_alreadyvoted_alpha "0.8"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.040000 0.270000"
seta hud_panel_modicons_size "0.080000 0.200000"
seta hud_panel_modicons_bg ""
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.410000 0.710000"
seta hud_panel_pressedkeys_size "0.180000 0.130000"
seta hud_panel_pressedkeys_bg "0"
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding ""
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0.020000 0.780000"
seta hud_panel_chat_size "0.630000 0.110000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.910000 0.970000"
seta hud_panel_engineinfo_size "0.090000 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.510000 0"
seta hud_panel_infomessages_size "0.340000 0.090000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding "0"
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.410000 0.590000"
seta hud_panel_physics_size "0.180000 0.100000"
seta hud_panel_physics_bg ""
seta hud_panel_physics_text "1"
seta hud_panel_physics_text_scale "0.7"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.220000"
seta hud_panel_centerprint_size "0.650000 0.220000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "0"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.020000 0.490000"
seta hud_panel_itemstime_size "0.090000 0.140000"
seta hud_panel_itemstime_bg "0"
seta hud_panel_itemstime_progressbar_name "progressbar"
seta hud_panel_itemstime_progressbar_reduced "1"
seta hud_panel_itemstime_text "1"
-seta hud_panel_itemstime_ratio "3.500000"
+seta hud_panel_itemstime_ratio "3.5"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.700000 0.460000"
seta hud_panel_quickmenu_size "0.210000 0.250000"
seta hud_panel_quickmenu_bg ""
seta hud_panel_bg "border_default"
seta hud_panel_bg_color "0.299327 1 0.81275"
seta hud_panel_bg_color_team "0"
-seta hud_panel_bg_alpha "0.700000"
+seta hud_panel_bg_alpha "0.7"
seta hud_panel_bg_border "8"
seta hud_panel_bg_padding "0"
seta hud_panel_fg_alpha "1"
seta hud_dock "dock"
seta hud_dock_color "0 0.697965 0.418232"
-seta hud_dock_color_team "0.700000"
-seta hud_dock_alpha "0.700000"
+seta hud_dock_color_team "0.7"
+seta hud_dock_alpha "0.7"
seta hud_progressbar_alpha "0.5"
seta hud_progressbar_strength_color "0 0 0.6"
seta hud_configure_grid_xsize "0.010000"
seta hud_configure_grid_ysize "0.010000"
-seta hud_panel_weapons "1"
seta hud_panel_weapons_pos "0.375000 0.870000"
seta hud_panel_weapons_size "0.300000 0.060000"
seta hud_panel_weapons_bg "0"
seta hud_panel_weapons_noncurrent_alpha "1"
seta hud_panel_weapons_noncurrent_scale "1"
-seta hud_panel_ammo "1"
seta hud_panel_ammo_pos "0.160000 0.910000"
seta hud_panel_ammo_size "0.190000 0.090000"
seta hud_panel_ammo_bg "0"
seta hud_panel_ammo_progressbar_xoffset "0"
seta hud_panel_ammo_text "1"
-seta hud_panel_powerups "1"
seta hud_panel_powerups_pos "0.660000 0.910000"
seta hud_panel_powerups_size "0.130000 0.090000"
seta hud_panel_powerups_bg "0"
seta hud_panel_powerups_progressbar "0"
seta hud_panel_powerups_text "1"
-seta hud_panel_healtharmor "1"
seta hud_panel_healtharmor_pos "0.370000 0.930000"
seta hud_panel_healtharmor_size "0.300000 0.070000"
seta hud_panel_healtharmor_bg "0"
seta hud_panel_healtharmor_bg_alpha ""
seta hud_panel_healtharmor_bg_border ""
seta hud_panel_healtharmor_bg_padding ""
+seta hud_panel_healtharmor_combined "0"
seta hud_panel_healtharmor_flip "0"
seta hud_panel_healtharmor_iconalign "0"
seta hud_panel_healtharmor_baralign "0"
seta hud_panel_healtharmor_progressbar_gfx_smooth "2"
seta hud_panel_healtharmor_text "1"
-seta hud_panel_notify "0"
seta hud_panel_notify_pos "0.010000 0.650000"
seta hud_panel_notify_size "0.300000 0.070000"
seta hud_panel_notify_bg "0"
seta hud_panel_notify_fadetime "3"
seta hud_panel_notify_icon_aspect "2"
-seta hud_panel_timer "1"
seta hud_panel_timer_pos "0.850000 0"
seta hud_panel_timer_size "0.150000 0.060000"
seta hud_panel_timer_bg ""
seta hud_panel_timer_bg_border ""
seta hud_panel_timer_bg_padding "0"
-seta hud_panel_radar "2"
seta hud_panel_radar_pos "0 0"
seta hud_panel_radar_size "0.200000 0.260000"
seta hud_panel_radar_bg "border_radar"
seta hud_panel_radar_bg_color ""
seta hud_panel_radar_bg_color_team ""
-seta hud_panel_radar_bg_alpha "0.500000"
+seta hud_panel_radar_bg_alpha "0.5"
seta hud_panel_radar_bg_border "0"
seta hud_panel_radar_bg_padding "0"
seta hud_panel_radar_foreground_alpha "1"
seta hud_panel_radar_maximized_rotation "1"
seta hud_panel_radar_maximized_zoommode "3"
-seta hud_panel_score "1"
seta hud_panel_score_pos "0.760000 0.910000"
seta hud_panel_score_size "0.200000 0.080000"
seta hud_panel_score_bg "0"
seta hud_panel_score_bg_padding ""
seta hud_panel_score_rankings "0"
-seta hud_panel_racetimer "1"
seta hud_panel_racetimer_pos "0.360000 0.140000"
seta hud_panel_racetimer_size "0.280000 0.090000"
seta hud_panel_racetimer_bg "0"
seta hud_panel_racetimer_bg_border ""
seta hud_panel_racetimer_bg_padding ""
-seta hud_panel_vote "1"
seta hud_panel_vote_pos "0.690000 0.750000"
seta hud_panel_vote_size "0.300000 0.100000"
seta hud_panel_vote_bg ""
seta hud_panel_vote_bg_alpha ""
seta hud_panel_vote_bg_border ""
seta hud_panel_vote_bg_padding "-3"
-seta hud_panel_vote_alreadyvoted_alpha "0.750000"
+seta hud_panel_vote_alreadyvoted_alpha "0.75"
-seta hud_panel_modicons "1"
seta hud_panel_modicons_pos "0.010000 0.910000"
seta hud_panel_modicons_size "0.135000 0.090000"
seta hud_panel_modicons_bg "0"
seta hud_panel_modicons_dom_layout "1"
seta hud_panel_modicons_freezetag_layout "1"
-seta hud_panel_pressedkeys "1"
seta hud_panel_pressedkeys_pos "0.440000 0.760000"
seta hud_panel_pressedkeys_size "0.120000 0.094368"
seta hud_panel_pressedkeys_bg "0"
seta hud_panel_pressedkeys_bg_alpha ""
seta hud_panel_pressedkeys_bg_border ""
seta hud_panel_pressedkeys_bg_padding ""
-seta hud_panel_pressedkeys_aspect "1.600000"
+seta hud_panel_pressedkeys_aspect "1.6"
seta hud_panel_pressedkeys_attack "0"
-seta hud_panel_chat "1"
seta hud_panel_chat_pos "0 0.760000"
seta hud_panel_chat_size "0.420000 0.130000"
seta hud_panel_chat_bg "0"
seta hud_panel_chat_bg_border ""
seta hud_panel_chat_bg_padding ""
-seta hud_panel_engineinfo "0"
seta hud_panel_engineinfo_pos "0.887500 0.870000"
seta hud_panel_engineinfo_size "0.112500 0.030000"
seta hud_panel_engineinfo_bg "0"
seta hud_panel_engineinfo_framecounter_time "0.1"
seta hud_panel_engineinfo_framecounter_decimals "0"
-seta hud_panel_infomessages "1"
seta hud_panel_infomessages_pos "0.690000 0.620000"
seta hud_panel_infomessages_size "0.300000 0.100000"
seta hud_panel_infomessages_bg "0"
seta hud_panel_infomessages_bg_padding ""
seta hud_panel_infomessages_flip "1"
-seta hud_panel_physics "3"
seta hud_panel_physics_pos "0.430000 0.640000"
seta hud_panel_physics_size "0.140000 0.100000"
seta hud_panel_physics_bg "0"
seta hud_panel_physics_text "2"
seta hud_panel_physics_text_scale "1"
-seta hud_panel_centerprint "1"
seta hud_panel_centerprint_pos "0.175000 0.260000"
seta hud_panel_centerprint_size "0.650000 0.200000"
seta hud_panel_centerprint_bg "0"
seta hud_panel_centerprint_fade_subsequent_minfontsize "0.75"
seta hud_panel_centerprint_fade_minfontsize "0"
-seta hud_panel_minigameboard "1"
seta hud_panel_minigameboard_pos "0.22 0.15"
seta hud_panel_minigameboard_size "0.50 0.60"
seta hud_panel_minigameboard_bg "border_small"
seta hud_panel_minigameboard_bg_border ""
seta hud_panel_minigameboard_bg_padding ""
-seta hud_panel_minigamestatus "1"
seta hud_panel_minigamestatus_pos "0.74 0.15"
seta hud_panel_minigamestatus_size "0.2 0.60"
seta hud_panel_minigamestatus_bg "border_small"
seta hud_panel_minigamestatus_bg_border ""
seta hud_panel_minigamestatus_bg_padding ""
-seta hud_panel_minigamehelp "1"
seta hud_panel_minigamehelp_pos "0.22 0.78"
seta hud_panel_minigamehelp_size "0.50 0.20"
seta hud_panel_minigamehelp_bg ""
seta hud_panel_minigamehelp_bg_border ""
seta hud_panel_minigamehelp_bg_padding ""
-seta hud_panel_minigamemenu "0"
seta hud_panel_minigamemenu_pos "0 0.26"
seta hud_panel_minigamemenu_size "0.2 0.49"
seta hud_panel_minigamemenu_bg "border_small"
seta hud_panel_minigamemenu_bg_border ""
seta hud_panel_minigamemenu_bg_padding ""
-seta hud_panel_mapvote "1"
seta hud_panel_mapvote_pos "0 0"
seta hud_panel_mapvote_size "1 1"
seta hud_panel_mapvote_bg "0"
seta hud_panel_mapvote_bg_border ""
seta hud_panel_mapvote_bg_padding ""
-seta hud_panel_itemstime "2"
seta hud_panel_itemstime_pos "0.000000 0.290000"
seta hud_panel_itemstime_size "0.150000 0.060000"
seta hud_panel_itemstime_bg "0"
seta hud_panel_itemstime_ratio "2"
seta hud_panel_itemstime_dynamicsize "1"
-seta hud_panel_quickmenu "1"
seta hud_panel_quickmenu_pos "0.010000 0.380000"
seta hud_panel_quickmenu_size "0.210000 0.250000"
seta hud_panel_quickmenu_bg ""
set g_instagib_damagedbycontents 1 "allow damage from lava pits in instagib"
set g_instagib_blaster_keepdamage 0 "allow secondary fire to hurt players"
set g_instagib_blaster_keepforce 0 "allow secondary fire to push players"
+set g_instagib_mirrordamage 0 "allow damage mirror instagib"
+set g_instagib_friendlypush 1 "allow pushing teammates with the vaporizer primary attack"
// ==========
// Nades
// =======
set g_nades 0 "enable off-hand grenades"
+set g_nades_spread 0.04 "random spread offset of throw direction"
set g_nades_throw_offset "0 0 0" "nade throwing offset"
set g_nades_spawn 1 "give nades right away when player spawns rather than delaying entire refire"
set g_nades_client_select 0 "allow client side selection of nade type"
// generated file; do not modify
-#include "announcer.qc"
-#include "bgmscript.qc"
-#include "csqcmodel_hooks.qc"
-#include "main.qc"
-#include "mapvoting.qc"
-#include "miscfunctions.qc"
-#include "player_skeleton.qc"
-#include "scoreboard.qc"
-#include "shownames.qc"
-#include "teamradar.qc"
-#include "view.qc"
-#include "wall.qc"
+#include <client/announcer.qc>
+#include <client/bgmscript.qc>
+#include <client/csqcmodel_hooks.qc>
+#include <client/main.qc>
+#include <client/mapvoting.qc>
+#include <client/miscfunctions.qc>
+#include <client/player_skeleton.qc>
+#include <client/scoreboard.qc>
+#include <client/shownames.qc>
+#include <client/teamradar.qc>
+#include <client/view.qc>
+#include <client/wall.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/announcer.qh>
+#include <client/bgmscript.qh>
+#include <client/csqcmodel_hooks.qh>
+#include <client/main.qh>
+#include <client/mapvoting.qh>
+#include <client/miscfunctions.qh>
+#include <client/player_skeleton.qh>
+#include <client/scoreboard.qh>
+#include <client/shownames.qh>
+#include <client/teamradar.qh>
+#include <client/view.qh>
+#include <client/wall.qh>
float autocvar_hud_panel_fg_alpha;
bool autocvar_hud_panel_healtharmor;
int autocvar_hud_panel_healtharmor_baralign;
+bool autocvar_hud_panel_healtharmor_combined;
bool autocvar_hud_panel_healtharmor_flip;
int autocvar_hud_panel_healtharmor_iconalign;
int autocvar_hud_panel_healtharmor_maxarmor;
// generated file; do not modify
-#include "all.qc"
-#include "cl_cmd.qc"
+#include <client/commands/all.qc>
+#include <client/commands/cl_cmd.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/commands/all.qh>
+#include <client/commands/cl_cmd.qh>
// generated file; do not modify
-#include "hud.qc"
-#include "hud_config.qc"
+#include <client/hud/hud.qc>
+#include <client/hud/hud_config.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/hud/hud.qh>
+#include <client/hud/hud_config.qh>
{
panel = hud_panels_from(i);
- HUD_Write_PanelCvar("");
HUD_Write_PanelCvar("_pos");
HUD_Write_PanelCvar("_size");
HUD_Write_PanelCvar("_bg");
HUD_Write_PanelCvar("_progressbar_armor");
HUD_Write_PanelCvar("_progressbar_gfx");
HUD_Write_PanelCvar("_progressbar_gfx_smooth");
+ HUD_Write_PanelCvar("_combined");
HUD_Write_PanelCvar("_text");
break;
case HUD_PANEL_NOTIFY:
// generated file; do not modify
-#include "ammo.qc"
-#include "centerprint.qc"
-#include "chat.qc"
-#include "engineinfo.qc"
-#include "healtharmor.qc"
-#include "infomessages.qc"
-#include "minigame.qc"
-#include "modicons.qc"
-#include "notify.qc"
-#include "physics.qc"
-#include "powerups.qc"
-#include "pressedkeys.qc"
-#include "quickmenu.qc"
-#include "racetimer.qc"
-#include "radar.qc"
-#include "score.qc"
-#include "timer.qc"
-#include "vote.qc"
-#include "weapons.qc"
+#include <client/hud/panel/ammo.qc>
+#include <client/hud/panel/centerprint.qc>
+#include <client/hud/panel/chat.qc>
+#include <client/hud/panel/engineinfo.qc>
+#include <client/hud/panel/healtharmor.qc>
+#include <client/hud/panel/infomessages.qc>
+#include <client/hud/panel/minigame.qc>
+#include <client/hud/panel/modicons.qc>
+#include <client/hud/panel/notify.qc>
+#include <client/hud/panel/physics.qc>
+#include <client/hud/panel/powerups.qc>
+#include <client/hud/panel/pressedkeys.qc>
+#include <client/hud/panel/quickmenu.qc>
+#include <client/hud/panel/racetimer.qc>
+#include <client/hud/panel/radar.qc>
+#include <client/hud/panel/score.qc>
+#include <client/hud/panel/timer.qc>
+#include <client/hud/panel/vote.qc>
+#include <client/hud/panel/weapons.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/hud/panel/ammo.qh>
+#include <client/hud/panel/centerprint.qh>
+#include <client/hud/panel/chat.qh>
+#include <client/hud/panel/engineinfo.qh>
+#include <client/hud/panel/healtharmor.qh>
+#include <client/hud/panel/infomessages.qh>
+#include <client/hud/panel/minigame.qh>
+#include <client/hud/panel/modicons.qh>
+#include <client/hud/panel/notify.qh>
+#include <client/hud/panel/physics.qh>
+#include <client/hud/panel/powerups.qh>
+#include <client/hud/panel/pressedkeys.qh>
+#include <client/hud/panel/quickmenu.qh>
+#include <client/hud/panel/racetimer.qh>
+#include <client/hud/panel/radar.qh>
+#include <client/hud/panel/score.qh>
+#include <client/hud/panel/timer.qh>
+#include <client/hud/panel/vote.qh>
+#include <client/hud/panel/weapons.qh>
int maxhealth = autocvar_hud_panel_healtharmor_maxhealth;
int maxarmor = autocvar_hud_panel_healtharmor_maxarmor;
- if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display
+ if(autocvar_hud_panel_healtharmor_combined) // combined health and armor display
{
vector v;
v = healtharmor_maxdamage(health, armor, armorblockpercent, DEATH_WEAPON.m_id);
return aj - ai; // the string is in REVERSE order (higher prio at the right is what we want, but higher prio first is the string)
}
+#define HUD_WEAPONS_GET_FULL_LAYOUT() MACRO_BEGIN { \
+ int nHidden = 0; \
+ FOREACH(Weapons, it != WEP_Null, { \
+ if (weapons_stat & WepSet_FromWeapon(it)) continue; \
+ if (it.spawnflags & WEP_FLAG_MUTATORBLOCKED) nHidden += 1; \
+ }); \
+ vector table_size = HUD_GetTableSize_BestItemAR((Weapons_COUNT - 1) - nHidden, panel_size, aspect); \
+ columns = table_size.x; \
+ rows = table_size.y; \
+ weapon_size.x = panel_size.x / columns; \
+ weapon_size.y = panel_size.y / rows; \
+} MACRO_END
+
void HUD_Weapons()
{
// declarations
if(autocvar__hud_configure)
{
if(!weapons_stat)
- for(i = WEP_FIRST; i <= WEP_LAST; i += floor((WEP_LAST-WEP_FIRST)/5))
- weapons_stat |= WepSet_FromWeapon(Weapons_from(i));
+ {
+ int j = 0;
+ FOREACH(Weapons, it != WEP_Null && it.impulse >= 0 && (it.impulse % 3 != 0) && j < 6, {
+ if(!(it.spawnflags & WEP_FLAG_MUTATORBLOCKED))
+ {
+ weapons_stat |= it.m_wepset;
+ ++j;
+ }
+ });
+ }
#if 0
/// debug code
if(cvar("wep_add"))
{
+ int j;
+ int nHidden = 0;
+ FOREACH(Weapons, it != WEP_Null, {
+ if (it.spawnflags & WEP_FLAG_MUTATORBLOCKED) nHidden += 1;
+ });
weapons_stat = '0 0 0';
- float countw = 1 + floor((floor(time * cvar("wep_add"))) % (Weapons_COUNT - 1));
- for(i = WEP_FIRST; i <= countw; ++i)
- weapons_stat |= WepSet_FromWeapon(Weapons_from(i));
+ float countw = 1 + floor((floor(time * cvar("wep_add"))) % ((Weapons_COUNT - 1) - nHidden));
+ for(i = 0, j = 0; i <= (Weapons_COUNT - 1) && j < countw; ++i)
+ {
+ if(weaponorder[i].spawnflags & WEP_FLAG_MUTATORBLOCKED)
+ continue;
+ weapons_stat |= weaponorder[i].m_wepset;
+ ++j;
+ }
}
#endif
}
return;
vector old_panel_size = panel_size;
- vector padded_panel_size = panel_size - '2 2 0' * panel_bg_padding;
-
- // get the all-weapons layout
- int nHidden = 0;
- WepSet weapons_stat = WepSet_GetFromStat();
- FOREACH(Weapons, it != WEP_Null, {
- if (weapons_stat & it.m_wepset) continue;
- if (it.spawnflags & WEP_FLAG_MUTATORBLOCKED) nHidden += 1;
- });
- vector table_size = HUD_GetTableSize_BestItemAR((Weapons_COUNT - 1) - nHidden, padded_panel_size, aspect);
- columns = table_size.x;
- rows = table_size.y;
- weapon_size.x = padded_panel_size.x / columns;
- weapon_size.y = padded_panel_size.y / rows;
+ panel_size -= '2 2 0' * panel_bg_padding;
+
+ HUD_WEAPONS_GET_FULL_LAYOUT();
// NOTE: although weapons should aways look the same even if onlyowned is enabled,
// we enlarge them a bit when possible to better match the desired aspect ratio
- if(padded_panel_size.x / padded_panel_size.y < aspect)
+ if(panel_size.x / panel_size.y < aspect)
{
// maximum number of rows that allows to display items with the desired aspect ratio
- int max_rows = floor(padded_panel_size.y / (weapon_size.x / aspect));
+ int max_rows = floor(panel_size.y / (weapon_size.x / aspect));
columns = min(columns, ceil(weapon_count / max_rows));
rows = ceil(weapon_count / columns);
- weapon_size.y = min(padded_panel_size.y / rows, weapon_size.x / aspect);
- weapon_size.x = min(padded_panel_size.x / columns, aspect * weapon_size.y);
+ weapon_size.y = min(panel_size.y / rows, weapon_size.x / aspect);
+ weapon_size.x = min(panel_size.x / columns, aspect * weapon_size.y);
vertical_order = false;
}
else
{
- int max_columns = floor(padded_panel_size.x / (weapon_size.y * aspect));
+ int max_columns = floor(panel_size.x / (weapon_size.y * aspect));
rows = min(rows, ceil(weapon_count / max_columns));
columns = ceil(weapon_count / rows);
- weapon_size.x = min(padded_panel_size.x / columns, aspect * weapon_size.y);
- weapon_size.y = min(padded_panel_size.y / rows, weapon_size.x / aspect);
+ weapon_size.x = min(panel_size.x / columns, aspect * weapon_size.y);
+ weapon_size.y = min(panel_size.y / rows, weapon_size.x / aspect);
vertical_order = true;
}
HUD_Panel_DrawBg(1);
if(center.x == -1)
- return;
+ return; // panel has gone off screen
if(panel_bg_padding)
{
if(!rows) // if rows is > 0 onlyowned code has already updated these vars
{
- vector table_size = HUD_GetTableSize_BestItemAR((Weapons_COUNT - 1), panel_size, aspect);
- columns = table_size.x;
- rows = table_size.y;
- weapon_size.x = panel_size.x / columns;
- weapon_size.y = panel_size.y / rows;
+ HUD_WEAPONS_GET_FULL_LAYOUT();
vertical_order = (panel_size.x / panel_size.y >= aspect);
}
// retrieve information about the current weapon to be drawn
entity it = weaponorder[i];
weapon_id = it.impulse;
- isCurrent = (it == switchweapon);
// skip if this weapon doesn't exist
if(!it || weapon_id < 0) { continue; }
// skip this weapon if we don't own it (and onlyowned is enabled)-- or if weapons_complainbubble is showing for this weapon
if(autocvar_hud_panel_weapons_onlyowned)
- if (!((weapons_stat & WepSet_FromWeapon(it)) || (it.m_id == complain_weapon)))
- continue;
+ {
+ if (!((weapons_stat & WepSet_FromWeapon(it)) || (it.m_id == complain_weapon)))
+ continue;
+ }
+ else
+ {
+ if (it.spawnflags & WEP_FLAG_MUTATORBLOCKED && !(weapons_stat & WepSet_FromWeapon(it)))
+ continue;
+ }
// figure out the drawing position of weapon
weapon_pos = (panel_pos + eX * column * weapon_size.x + eY * row * weapon_size.y);
noncurrent_pos.y = weapon_pos.y + (weapon_size.y - noncurrent_size.y) / 2;
// draw background behind currently selected weapon
+ isCurrent = (it == switchweapon);
if(isCurrent)
drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
--- /dev/null
+// generated file; do not modify
#include <lib/_all.inc>
#include "_all.qh"
-#include "_mod.inc"
+#include "../client/_mod.inc"
#include "commands/_mod.inc"
#include "hud/_mod.inc"
#include "mutators/_mod.inc"
"other gamemodes except DM.\n"));
}
-#define HUD_DefaultColumnLayout() \
-"ping pl name | " \
-"-teams,cts,lms/kills +ft,tdm/kills -teams,lms/deaths +ft,tdm/deaths -teams,lms,rc,ka/suicides +ft,tdm/suicides -cts,dm,tdm,ka,ft/frags " /* tdm already has this in "score" */ \
-"-rc,cts,nb/dmg -rc,cts,nb/dmgtaken " \
-"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns +ons/caps +ons/takes " \
-"+lms/lives +lms/rank " \
-"+kh/caps +kh/pushes +kh/destroyed " \
-"?+rc/laps ?+rc/time ?+rc/fastest " \
-"+as/objectives +nb/faults +nb/goals +ka/pickups +ka/bckills +ka/bctime +ft/revivals " \
-"-lms,rc,nb/score"
+// NOTE: adding a gametype with ? to not warn for an optional field
+// make sure it's excluded in a previous exclusive rule, if any
+// otherwise the previous exclusive rule warns anyway
+// e.g. -teams,rc,cts,lms/kills ?+rc/kills
+#define SCOREBOARD_DEFAULT_COLUMNS \
+"ping pl name |" \
+" -teams,rc,cts,inv,lms/kills +ft,tdm/kills ?+rc,inv/kills" \
+" -teams,lms/deaths +ft,tdm/deaths" \
+" -teams,lms,rc,cts,inv,ka/suicides +ft,tdm/suicides ?+rc,inv/suicides" \
+" -cts,dm,tdm,ka,ft/frags" /* tdm already has this in "score" */ \
+" -rc,cts,nb/dmg -rc,cts,nb/dmgtaken" \
+" +ctf/caps +ctf/pickups +ctf/fckills +ctf/returns +ons/caps +ons/takes" \
+" +lms/lives +lms/rank" \
+" +kh/caps +kh/pushes +kh/destroyed" \
+" ?+rc/laps ?+rc/time +rc,cts/fastest" \
+" +as/objectives +nb/faults +nb/goals" \
+" +ka/pickups +ka/bckills +ka/bctime +ft/revivals" \
+" -lms,rc,cts,inv,nb/score"
void Cmd_HUD_SetFields(int argc)
{
argc = tokenizebyseparator(strcat("0 1 ", autocvar_scoreboard_columns), " ");
if(argc < 3)
- argc = tokenizebyseparator(strcat("0 1 ", HUD_DefaultColumnLayout()), " ");
+ argc = tokenizebyseparator(strcat("0 1 ", SCOREBOARD_DEFAULT_COLUMNS), " ");
if(argc == 3)
{
if(argv(2) == "default")
- argc = tokenizebyseparator(strcat("0 1 ", HUD_DefaultColumnLayout()), " ");
+ argc = tokenizebyseparator(strcat("0 1 ", SCOREBOARD_DEFAULT_COLUMNS), " ");
else if(argv(2) == "all")
{
string s;
{
case "ping": hud_field[hud_num_fields] = SP_PING; break;
case "pl": hud_field[hud_num_fields] = SP_PL; break;
- case "pl": hud_field[hud_num_fields] = SP_PL; break;
case "kd": case "kdr": case "kdratio": case "k/d": hud_field[hud_num_fields] = SP_KDRATIO; break;
case "sum": case "diff": case "k-d": hud_field[hud_num_fields] = SP_SUM; break;
case "name": case "nick": hud_field[hud_num_fields] = SP_NAME; have_name = true; break;
this.viewmodel_angles = this.angles;
}
anim_update(this);
- if (!this.animstate_override)
+ if (!this.animstate_override && !this.animstate_looping)
anim_set(this, this.anim_idle, true, false, false);
}
float f = 0; // 0..1; 0: fully active
// generated file; do not modify
-#include "projectile.qc"
+#include <client/weapons/projectile.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/weapons/projectile.qh>
// generated file; do not modify
-#include "anim.qc"
-#include "animdecide.qc"
-#include "campaign_file.qc"
-#include "campaign_setup.qc"
-#include "ent_cs.qc"
-#include "mapinfo.qc"
-#include "net_notice.qc"
-#include "playerstats.qc"
-#include "state.qc"
-#include "t_items.qc"
-#include "util.qc"
-#include "viewloc.qc"
+#include <common/anim.qc>
+#include <common/animdecide.qc>
+#include <common/campaign_file.qc>
+#include <common/campaign_setup.qc>
+#include <common/ent_cs.qc>
+#include <common/mapinfo.qc>
+#include <common/net_notice.qc>
+#include <common/playerstats.qc>
+#include <common/state.qc>
+#include <common/t_items.qc>
+#include <common/util.qc>
+#include <common/viewloc.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/anim.qh>
+#include <common/animdecide.qh>
+#include <common/campaign_file.qh>
+#include <common/campaign_setup.qh>
+#include <common/ent_cs.qh>
+#include <common/mapinfo.qh>
+#include <common/net_notice.qh>
+#include <common/playerstats.qh>
+#include <common/state.qh>
+#include <common/t_items.qh>
+#include <common/util.qh>
+#include <common/viewloc.qh>
// generated file; do not modify
-#include "all.qc"
-#include "generic.qc"
-#include "markup.qc"
-#include "rpn.qc"
+#include <common/command/all.qc>
+#include <common/command/generic.qc>
+#include <common/command/markup.qc>
+#include <common/command/rpn.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/command/all.qh>
+#include <common/command/generic.qh>
+#include <common/command/markup.qh>
+#include <common/command/rpn.qh>
// generated file; do not modify
-#include "all.qc"
+#include <common/deathtypes/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/deathtypes/all.qh>
// generated file; do not modify
-#include "all.qc"
-#include "effectinfo.qc"
+#include <common/effects/all.qc>
+#include <common/effects/effectinfo.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/effects/all.qh>
+#include <common/effects/effectinfo.qh>
// generated file; do not modify
-#include "all.qc"
-#include "casings.qc"
-#include "damageeffects.qc"
-#include "gibs.qc"
-#include "globalsound.qc"
-#include "lightningarc.qc"
-#include "modeleffects.qc"
+#include <common/effects/qc/all.qc>
+#include <common/effects/qc/casings.qc>
+#include <common/effects/qc/damageeffects.qc>
+#include <common/effects/qc/gibs.qc>
+#include <common/effects/qc/globalsound.qc>
+#include <common/effects/qc/lightningarc.qc>
+#include <common/effects/qc/modeleffects.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/effects/qc/all.qh>
+#include <common/effects/qc/casings.qh>
+#include <common/effects/qc/damageeffects.qh>
+#include <common/effects/qc/gibs.qh>
+#include <common/effects/qc/globalsound.qh>
+#include <common/effects/qc/lightningarc.qh>
+#include <common/effects/qc/modeleffects.qh>
// generated file; do not modify
-#include "all.qc"
+#include <common/gamemodes/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/gamemodes/all.qh>
--- /dev/null
+// generated file; do not modify
// generated file; do not modify
-#include "nexball.qc"
-#include "weapon.qc"
+#include <common/gamemodes/gamemode/nexball/nexball.qc>
+#include <common/gamemodes/gamemode/nexball/weapon.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/gamemodes/gamemode/nexball/nexball.qh>
+#include <common/gamemodes/gamemode/nexball/weapon.qh>
WEP_NEXBALL.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
ActivateTeamplay();
- SetLimits(autocvar_g_nexball_goallimit, autocvar_g_nexball_goalleadlimit, -1, -1);
+ SetLimits(autocvar_g_nexball_goallimit, autocvar_g_nexball_goalleadlimit, autocvar_timelimit_override, -1);
have_team_spawns = -1; // request team spawns
}
// generated file; do not modify
-#include "cl_controlpoint.qc"
-#include "cl_generator.qc"
-#include "onslaught.qc"
-#include "sv_controlpoint.qc"
-#include "sv_generator.qc"
+#include <common/gamemodes/gamemode/onslaught/cl_controlpoint.qc>
+#include <common/gamemodes/gamemode/onslaught/cl_generator.qc>
+#include <common/gamemodes/gamemode/onslaught/onslaught.qc>
+#include <common/gamemodes/gamemode/onslaught/sv_controlpoint.qc>
+#include <common/gamemodes/gamemode/onslaught/sv_generator.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/gamemodes/gamemode/onslaught/cl_controlpoint.qh>
+#include <common/gamemodes/gamemode/onslaught/cl_generator.qh>
+#include <common/gamemodes/gamemode/onslaught/onslaught.qh>
+#include <common/gamemodes/gamemode/onslaught/sv_controlpoint.qh>
+#include <common/gamemodes/gamemode/onslaught/sv_generator.qh>
ons_Initialize();
ActivateTeamplay();
- SetLimits(autocvar_g_onslaught_point_limit, -1, -1, -1);
+ SetLimits(autocvar_g_onslaught_point_limit, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
have_team_spawns = -1; // request team spawns
}
// generated file; do not modify
-#include "all.qc"
+#include <common/impulses/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/impulses/all.qh>
// generated file; do not modify
-#include "all.qc"
+#include <common/items/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/items/all.qh>
// generated file; do not modify
-#include "ammo.qc"
-#include "armor.qc"
-#include "health.qc"
-#include "jetpack.qc"
-#include "pickup.qc"
-#include "powerup.qc"
+#include <common/items/item/ammo.qc>
+#include <common/items/item/armor.qc>
+#include <common/items/item/health.qc>
+#include <common/items/item/jetpack.qc>
+#include <common/items/item/pickup.qc>
+#include <common/items/item/powerup.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/items/item/ammo.qh>
+#include <common/items/item/armor.qh>
+#include <common/items/item/health.qh>
+#include <common/items/item/jetpack.qh>
+#include <common/items/item/pickup.qh>
+#include <common/items/item/powerup.qh>
// generated file; do not modify
-#include "cl_minigames.qc"
-#include "cl_minigames_hud.qc"
-#include "minigames.qc"
-#include "sv_minigames.qc"
+#include <common/minigames/cl_minigames_hud.qc>
+#include <common/minigames/minigames.qc>
+#ifdef CSQC
+ #include <common/minigames/cl_minigames.qc>
+#endif
+#ifdef SVQC
+ #include <common/minigames/sv_minigames.qc>
+#endif
--- /dev/null
+// generated file; do not modify
+#include <common/minigames/cl_minigames_hud.qh>
+#include <common/minigames/minigames.qh>
// generated file; do not modify
-#include "bd.qc"
-#include "c4.qc"
-#include "nmm.qc"
-#include "pong.qc"
-#include "pp.qc"
-#include "ps.qc"
-#include "snake.qc"
-#include "ttt.qc"
+#include <common/minigames/minigame/bd.qc>
+#include <common/minigames/minigame/c4.qc>
+#include <common/minigames/minigame/nmm.qc>
+#include <common/minigames/minigame/pong.qc>
+#include <common/minigames/minigame/pp.qc>
+#include <common/minigames/minigame/ps.qc>
+#include <common/minigames/minigame/snake.qc>
+#include <common/minigames/minigame/ttt.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/minigames/minigame/bd.qh>
+#include <common/minigames/minigame/c4.qh>
+#include <common/minigames/minigame/nmm.qh>
+#include <common/minigames/minigame/pong.qh>
+#include <common/minigames/minigame/pp.qh>
+#include <common/minigames/minigame/ps.qh>
+#include <common/minigames/minigame/snake.qh>
+#include <common/minigames/minigame/ttt.qh>
--- /dev/null
+// generated file; do not modify
// generated file; do not modify
-#include "all.qc"
-#include "spawn.qc"
-#include "sv_monsters.qc"
+#include <common/monsters/all.qc>
+#include <common/monsters/spawn.qc>
+#include <common/monsters/sv_monsters.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/monsters/all.qh>
+#include <common/monsters/spawn.qh>
+#include <common/monsters/sv_monsters.qh>
// generated file; do not modify
-#include "mage.qc"
-#include "shambler.qc"
-#include "spider.qc"
-#include "wyvern.qc"
-#include "zombie.qc"
+#include <common/monsters/monster/mage.qc>
+#include <common/monsters/monster/shambler.qc>
+#include <common/monsters/monster/spider.qc>
+#include <common/monsters/monster/wyvern.qc>
+#include <common/monsters/monster/zombie.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/monsters/monster/mage.qh>
+#include <common/monsters/monster/shambler.qh>
+#include <common/monsters/monster/spider.qh>
+#include <common/monsters/monster/wyvern.qh>
+#include <common/monsters/monster/zombie.qh>
// generated file; do not modify
-#include "all.qc"
+#include <common/mutators/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/all.qh>
// generated file; do not modify
-#include "itemstime.qc"
+#include <common/mutators/mutator/itemstime.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/itemstime.qh>
// generated file; do not modify
-#include "bloodloss.qc"
+#include <common/mutators/mutator/bloodloss/bloodloss.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/bloodloss/bloodloss.qh>
// generated file; do not modify
-#include "breakablehook.qc"
+#include <common/mutators/mutator/breakablehook/breakablehook.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/breakablehook/breakablehook.qh>
// generated file; do not modify
-#include "all.qc"
-#include "buffs.qc"
+#include <common/mutators/mutator/buffs/all.qc>
+#include <common/mutators/mutator/buffs/buffs.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/buffs/all.qh>
+#include <common/mutators/mutator/buffs/buffs.qh>
// generated file; do not modify
-#include "bugrigs.qc"
+#include <common/mutators/mutator/bugrigs/bugrigs.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/bugrigs/bugrigs.qh>
// generated file; do not modify
-#include "campcheck.qc"
+#include <common/mutators/mutator/campcheck/campcheck.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/campcheck/campcheck.qh>
// generated file; do not modify
-#include "cloaked.qc"
+#include <common/mutators/mutator/cloaked/cloaked.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/cloaked/cloaked.qh>
// generated file; do not modify
-#include "damagetext.qc"
+#include <common/mutators/mutator/damagetext/damagetext.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/damagetext/damagetext.qh>
METHOD(XonoticDamageTextSettings, showNotify, void(entity this)) { loadAllCvars(this); }
METHOD(XonoticDamageTextSettings, fill, void(entity this))
{
+ entity e;
this.gotoRC(this, 0, 1); this.setFirstColumn(this, this.currentColumn);
this.TD(this, 1, 3, makeXonoticCheckBox(0, "cl_damagetext", _("Draw damage numbers")));
this.TR(this);
- this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Font size:")));
- this.TD(this, 1, 2, makeXonoticSlider(0, 50, 1, "cl_damagetext_size"));
+ this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Font size:")));
+ setDependent(e, "cl_damagetext", 1, 1);
+ this.TD(this, 1, 2, e = makeXonoticSlider(0, 50, 1, "cl_damagetext_size"));
+ setDependent(e, "cl_damagetext", 1, 1);
this.TR(this);
- this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Accumulate range:")));
- this.TD(this, 1, 2, makeXonoticSlider(0, 500, 1, "cl_damagetext_accumulate_range"));
+ this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Accumulate range:")));
+ setDependent(e, "cl_damagetext", 1, 1);
+ this.TD(this, 1, 2, e = makeXonoticSlider(0, 500, 1, "cl_damagetext_accumulate_range"));
+ setDependent(e, "cl_damagetext", 1, 1);
this.TR(this);
- this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Lifetime:")));
- this.TD(this, 1, 2, makeXonoticSlider(0, 10, 1, "cl_damagetext_alpha_lifetime"));
+ this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Lifetime:")));
+ setDependent(e, "cl_damagetext", 1, 1);
+ this.TD(this, 1, 2, e = makeXonoticSlider(0, 10, 1, "cl_damagetext_alpha_lifetime"));
+ setDependent(e, "cl_damagetext", 1, 1);
this.TR(this);
- this.TD(this, 1, 1, makeXonoticTextLabel(0, _("Color:")));
- this.TD(this, 2, 2, makeXonoticColorpickerString("cl_damagetext_color", "cl_damagetext_color"));
+ this.TD(this, 1, 1, e = makeXonoticTextLabel(0, _("Color:")));
+ setDependent(e, "cl_damagetext", 1, 1);
+ this.TD(this, 2, 2, e = makeXonoticColorpickerString("cl_damagetext_color", "cl_damagetext_color"));
+ setDependent(e, "cl_damagetext", 1, 1);
}
ENDCLASS(XonoticDamageTextSettings)
#endif
// generated file; do not modify
-#include "dodging.qc"
+#include <common/mutators/mutator/dodging/dodging.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/dodging/dodging.qh>
// generated file; do not modify
-#include "doublejump.qc"
+#include <common/mutators/mutator/doublejump/doublejump.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/doublejump/doublejump.qh>
// generated file; do not modify
-#include "hook.qc"
+#include <common/mutators/mutator/hook/hook.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/hook/hook.qh>
// generated file; do not modify
-#include "instagib.qc"
-#include "items.qc"
+#include <common/mutators/mutator/instagib/instagib.qc>
+#include <common/mutators/mutator/instagib/items.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/instagib/instagib.qh>
+#include <common/mutators/mutator/instagib/items.qh>
if(IS_PLAYER(frag_attacker))
if(DEATH_ISWEAPON(frag_deathtype, WEP_VAPORIZER))
{
+ if(!autocvar_g_instagib_friendlypush && SAME_TEAM(frag_target, frag_attacker))
+ frag_force = '0 0 0';
+
if(frag_target.armorvalue)
{
frag_target.armorvalue -= 1;
if(frag_deathtype & HITTYPE_SECONDARY)
{
if(!autocvar_g_instagib_blaster_keepdamage || frag_attacker == frag_target)
- frag_damage = frag_mirrordamage = 0;
+ {
+ frag_damage = 0;
+ if(!autocvar_g_instagib_mirrordamage)
+ frag_mirrordamage = 0; // never do mirror damage on enemies
+ }
if(frag_target != frag_attacker)
{
}
}
+ if(!autocvar_g_instagib_mirrordamage) // only apply the taking lives hack if we don't want to support real damage mirroring
if(IS_PLAYER(frag_attacker))
if(frag_mirrordamage > 0)
{
}
if(frag_target.alpha && frag_target.alpha < 1)
+ if(IS_PLAYER(frag_target))
yoda = 1;
return false;
// generated file; do not modify
-#include "invincibleproj.qc"
+#include <common/mutators/mutator/invincibleproj/invincibleproj.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/invincibleproj/invincibleproj.qh>
// generated file; do not modify
-#include "melee_only.qc"
+#include <common/mutators/mutator/melee_only/melee_only.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/melee_only/melee_only.qh>
// generated file; do not modify
-#include "midair.qc"
+#include <common/mutators/mutator/midair/midair.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/midair/midair.qh>
// generated file; do not modify
-#include "multijump.qc"
+#include <common/mutators/mutator/multijump/multijump.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/multijump/multijump.qh>
// generated file; do not modify
-#include "nades.qc"
-#include "net.qc"
+#include <common/mutators/mutator/nades/nades.qc>
+#include <common/mutators/mutator/nades/net.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/nades/nades.qh>
+#include <common/mutators/mutator/nades/net.qh>
#ifdef SVQC
bool autocvar_g_nades_nade_small;
+float autocvar_g_nades_spread = 0.04;
#endif
REGISTER_STAT(NADES_SMALL, int, autocvar_g_nades_nade_small)
float _force = time - held_nade.nade_time_primed;
_force /= autocvar_g_nades_nade_lifetime;
_force = autocvar_g_nades_nade_minforce + (_force * (autocvar_g_nades_nade_maxforce - autocvar_g_nades_nade_minforce));
- toss_nade(self, true, (v_forward * 0.75 + v_up * 0.2 + v_right * 0.05) * _force, 0);
+ vector dir = (v_forward * 0.75 + v_up * 0.2 + v_right * 0.05);
+ dir = W_CalculateSpread(dir, autocvar_g_nades_spread, g_weaponspreadfactor, autocvar_g_projectiles_spread_style);
+ toss_nade(self, true, dir * _force, 0);
}
}
}
float _force = time - held_nade.nade_time_primed;
_force /= autocvar_g_nades_nade_lifetime;
_force = autocvar_g_nades_nade_minforce + (_force * (autocvar_g_nades_nade_maxforce - autocvar_g_nades_nade_minforce));
- toss_nade(player, false, (v_forward * 0.7 + v_up * 0.2 + v_right * 0.1) * _force, 0);
+ vector dir = (v_forward * 0.7 + v_up * 0.2 + v_right * 0.1);
+ dir = W_CalculateSpread(dir, autocvar_g_nades_spread, g_weaponspreadfactor, autocvar_g_projectiles_spread_style);
+ toss_nade(player, false, dir * _force, 0);
}
}
}
// generated file; do not modify
-#include "new_toys.qc"
+#include <common/mutators/mutator/new_toys/new_toys.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/new_toys/new_toys.qh>
// generated file; do not modify
-#include "nix.qc"
+#include <common/mutators/mutator/nix/nix.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/nix/nix.qh>
// generated file; do not modify
-#include "hmg.qc"
-#include "overkill.qc"
-#include "rpc.qc"
+#include <common/mutators/mutator/overkill/hmg.qc>
+#include <common/mutators/mutator/overkill/overkill.qc>
+#include <common/mutators/mutator/overkill/rpc.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/overkill/hmg.qh>
+#include <common/mutators/mutator/overkill/overkill.qh>
+#include <common/mutators/mutator/overkill/rpc.qh>
// generated file; do not modify
-#include "physical_items.qc"
+#include <common/mutators/mutator/physical_items/physical_items.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/physical_items/physical_items.qh>
// generated file; do not modify
-#include "pinata.qc"
+#include <common/mutators/mutator/pinata/pinata.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/pinata/pinata.qh>
// generated file; do not modify
-#include "random_gravity.qc"
+#include <common/mutators/mutator/random_gravity/random_gravity.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/random_gravity/random_gravity.qh>
// generated file; do not modify
-#include "rocketflying.qc"
+#include <common/mutators/mutator/rocketflying/rocketflying.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/rocketflying/rocketflying.qh>
// generated file; do not modify
-#include "rocketminsta.qc"
+#include <common/mutators/mutator/rocketminsta/rocketminsta.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/rocketminsta/rocketminsta.qh>
// generated file; do not modify
-#include "running_guns.qc"
+#include <common/mutators/mutator/running_guns/running_guns.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/running_guns/running_guns.qh>
// generated file; do not modify
-#include "sandbox.qc"
+#include <common/mutators/mutator/sandbox/sandbox.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/sandbox/sandbox.qh>
// generated file; do not modify
-#include "spawn_near_teammate.qc"
+#include <common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh>
// generated file; do not modify
-#include "superspec.qc"
+#include <common/mutators/mutator/superspec/superspec.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/superspec/superspec.qh>
// generated file; do not modify
-#include "touchexplode.qc"
+#include <common/mutators/mutator/touchexplode/touchexplode.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/touchexplode/touchexplode.qh>
// generated file; do not modify
-#include "vampire.qc"
+#include <common/mutators/mutator/vampire/vampire.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/vampire/vampire.qh>
// generated file; do not modify
-#include "vampirehook.qc"
+#include <common/mutators/mutator/vampirehook/vampirehook.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/vampirehook/vampirehook.qh>
// generated file; do not modify
-#include "waypointsprites.qc"
+#include <common/mutators/mutator/waypoints/waypointsprites.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/waypoints/waypointsprites.qh>
// generated file; do not modify
-#include "weaponarena_random.qc"
+#include <common/mutators/mutator/weaponarena_random/weaponarena_random.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/mutators/mutator/weaponarena_random/weaponarena_random.qh>
// generated file; do not modify
-#include "all.qc"
+#include <common/notifications/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/notifications/all.qh>
// generated file; do not modify
-#include "movelib.qc"
-#include "player.qc"
+#include <common/physics/movelib.qc>
+#include <common/physics/player.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/physics/movelib.qh>
+#include <common/physics/player.qh>
// generated file; do not modify
-#include "follow.qc"
-#include "movetypes.qc"
-#include "push.qc"
-#include "step.qc"
-#include "toss.qc"
-#include "walk.qc"
+#include <common/physics/movetypes/follow.qc>
+#include <common/physics/movetypes/movetypes.qc>
+#include <common/physics/movetypes/push.qc>
+#include <common/physics/movetypes/step.qc>
+#include <common/physics/movetypes/toss.qc>
+#include <common/physics/movetypes/walk.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/physics/movetypes/follow.qh>
+#include <common/physics/movetypes/movetypes.qh>
+#include <common/physics/movetypes/push.qh>
+#include <common/physics/movetypes/step.qh>
+#include <common/physics/movetypes/toss.qh>
+#include <common/physics/movetypes/walk.qh>
{
float air_jump = !PlayerJump(this) || player_multijump; // PlayerJump() has important side effects
float activate = JETPACK_JUMP(this) && air_jump && PHYS_INPUT_BUTTON_JUMP(this) || PHYS_INPUT_BUTTON_JETPACK(this);
- float has_fuel = !PHYS_JETPACK_FUEL(this) || PHYS_AMMO_FUEL(this) || ITEMS_STAT(this) & IT_UNLIMITED_WEAPON_AMMO;
+ float has_fuel = !PHYS_JETPACK_FUEL(this) || PHYS_AMMO_FUEL(this) || (ITEMS_STAT(this) & IT_UNLIMITED_WEAPON_AMMO);
if (!(ITEMS_STAT(this) & ITEM_Jetpack.m_itemid)) { }
else if (this.jetpack_stopped) { }
this.spectatorspeed = STAT(SPECTATORSPEED);
- vector oldv_angle = this.v_angle;
- vector oldangles = this.angles; // we need to save these, as they're abused by other code
- this.v_angle = PHYS_INPUT_ANGLES(this);
- this.angles = PHYS_WORLD_ANGLES(this);
-
this.team = myteam + 1; // is this correct?
if (!(PHYS_INPUT_BUTTON_JUMP(this))) // !jump
UNSET_JUMP_HELD(this); // canjump = true
this.lastflags = this.flags;
this.lastclassname = this.classname;
-
-#ifdef CSQC
- this.v_angle = oldv_angle;
- this.angles = oldangles;
-#endif
}
#if defined(SVQC)
PS_B_IN_DB = db_create();
// now request the information
- uri = strcat(uri, "/player/", uri_escape(uri_escape(joiningplayer.crypto_idfp)), "/elo.txt");
+ uri = strcat(uri, "/player/", uri_escape(uri_escape(uri_escape(joiningplayer.crypto_idfp))), "/elo.txt");
LOG_TRACE("Retrieving playerstats from URL: ", uri, "\n");
url_single_fopen(
uri,
// generated file; do not modify
-#include "all.qc"
+#include <common/sounds/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/sounds/all.qh>
GetCvars(this, 0); // get other cvars from player
- // TODO: xonstat elo.txt support, until then just 404s
- if (false && IS_REAL_CLIENT(this)) { PlayerStats_PlayerBasic_CheckUpdate(this); }
+ if (IS_REAL_CLIENT(this)) { PlayerStats_PlayerBasic_CheckUpdate(this); }
// TODO: fold all of these into ClientState
other.last_pickup = time;
Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
- _sound (other, CH_TRIGGER, (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM);
+ _sound (other, (this.itemdef.instanceOfPowerup ? CH_TRIGGER_SINGLE : CH_TRIGGER), (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM);
if (this.classname == "droppedweapon")
remove (this);
// generated file; do not modify
-#include "include.qc"
-#include "platforms.qc"
-#include "subs.qc"
-#include "teleporters.qc"
-#include "triggers.qc"
+#include <common/triggers/include.qc>
+#include <common/triggers/platforms.qc>
+#include <common/triggers/subs.qc>
+#include <common/triggers/teleporters.qc>
+#include <common/triggers/triggers.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/triggers/include.qh>
+#include <common/triggers/platforms.qh>
+#include <common/triggers/subs.qh>
+#include <common/triggers/teleporters.qh>
+#include <common/triggers/triggers.qh>
// generated file; do not modify
-#include "bobbing.qc"
-#include "breakable.qc"
-#include "button.qc"
-#include "conveyor.qc"
-#include "door.qc"
-#include "door_rotating.qc"
-#include "door_secret.qc"
-#include "fourier.qc"
-#include "include.qc"
-#include "ladder.qc"
-#include "pendulum.qc"
-#include "plat.qc"
-#include "pointparticles.qc"
-#include "rainsnow.qc"
-#include "rotating.qc"
-#include "stardust.qc"
-#include "train.qc"
-#include "vectormamamam.qc"
+#include <common/triggers/func/bobbing.qc>
+#include <common/triggers/func/breakable.qc>
+#include <common/triggers/func/button.qc>
+#include <common/triggers/func/conveyor.qc>
+#include <common/triggers/func/door.qc>
+#include <common/triggers/func/door_rotating.qc>
+#include <common/triggers/func/door_secret.qc>
+#include <common/triggers/func/fourier.qc>
+#include <common/triggers/func/include.qc>
+#include <common/triggers/func/ladder.qc>
+#include <common/triggers/func/pendulum.qc>
+#include <common/triggers/func/plat.qc>
+#include <common/triggers/func/pointparticles.qc>
+#include <common/triggers/func/rainsnow.qc>
+#include <common/triggers/func/rotating.qc>
+#include <common/triggers/func/stardust.qc>
+#include <common/triggers/func/train.qc>
+#include <common/triggers/func/vectormamamam.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/triggers/func/bobbing.qh>
+#include <common/triggers/func/breakable.qh>
+#include <common/triggers/func/button.qh>
+#include <common/triggers/func/conveyor.qh>
+#include <common/triggers/func/door.qh>
+#include <common/triggers/func/door_rotating.qh>
+#include <common/triggers/func/door_secret.qh>
+#include <common/triggers/func/fourier.qh>
+#include <common/triggers/func/include.qh>
+#include <common/triggers/func/ladder.qh>
+#include <common/triggers/func/pendulum.qh>
+#include <common/triggers/func/plat.qh>
+#include <common/triggers/func/pointparticles.qh>
+#include <common/triggers/func/rainsnow.qh>
+#include <common/triggers/func/rotating.qh>
+#include <common/triggers/func/stardust.qh>
+#include <common/triggers/func/train.qh>
+#include <common/triggers/func/vectormamamam.qh>
// generated file; do not modify
-#include "corner.qc"
-#include "follow.qc"
-#include "include.qc"
-#include "laser.qc"
-#include "teleport_dest.qc"
+#include <common/triggers/misc/corner.qc>
+#include <common/triggers/misc/follow.qc>
+#include <common/triggers/misc/include.qc>
+#include <common/triggers/misc/laser.qc>
+#include <common/triggers/misc/teleport_dest.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/triggers/misc/corner.qh>
+#include <common/triggers/misc/follow.qh>
+#include <common/triggers/misc/include.qh>
+#include <common/triggers/misc/laser.qh>
+#include <common/triggers/misc/teleport_dest.qh>
// generated file; do not modify
-#include "changelevel.qc"
-#include "include.qc"
-#include "location.qc"
-#include "music.qc"
-#include "spawn.qc"
-#include "speaker.qc"
-#include "voicescript.qc"
+#include <common/triggers/target/changelevel.qc>
+#include <common/triggers/target/include.qc>
+#include <common/triggers/target/location.qc>
+#include <common/triggers/target/music.qc>
+#include <common/triggers/target/spawn.qc>
+#include <common/triggers/target/speaker.qc>
+#include <common/triggers/target/voicescript.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/triggers/target/changelevel.qh>
+#include <common/triggers/target/include.qh>
+#include <common/triggers/target/location.qh>
+#include <common/triggers/target/music.qh>
+#include <common/triggers/target/spawn.qh>
+#include <common/triggers/target/speaker.qh>
+#include <common/triggers/target/voicescript.qh>
// generated file; do not modify
-#include "counter.qc"
-#include "delay.qc"
-#include "disablerelay.qc"
-#include "flipflop.qc"
-#include "gamestart.qc"
-#include "gravity.qc"
-#include "heal.qc"
-#include "hurt.qc"
-#include "impulse.qc"
-#include "include.qc"
-#include "jumppads.qc"
-#include "keylock.qc"
-#include "magicear.qc"
-#include "monoflop.qc"
-#include "multi.qc"
-#include "multivibrator.qc"
-#include "relay.qc"
-#include "relay_activators.qc"
-#include "relay_if.qc"
-#include "relay_teamcheck.qc"
-#include "secret.qc"
-#include "swamp.qc"
-#include "teleport.qc"
-#include "viewloc.qc"
+#include <common/triggers/trigger/counter.qc>
+#include <common/triggers/trigger/delay.qc>
+#include <common/triggers/trigger/disablerelay.qc>
+#include <common/triggers/trigger/flipflop.qc>
+#include <common/triggers/trigger/gamestart.qc>
+#include <common/triggers/trigger/gravity.qc>
+#include <common/triggers/trigger/heal.qc>
+#include <common/triggers/trigger/hurt.qc>
+#include <common/triggers/trigger/impulse.qc>
+#include <common/triggers/trigger/include.qc>
+#include <common/triggers/trigger/jumppads.qc>
+#include <common/triggers/trigger/keylock.qc>
+#include <common/triggers/trigger/magicear.qc>
+#include <common/triggers/trigger/monoflop.qc>
+#include <common/triggers/trigger/multi.qc>
+#include <common/triggers/trigger/multivibrator.qc>
+#include <common/triggers/trigger/relay.qc>
+#include <common/triggers/trigger/relay_activators.qc>
+#include <common/triggers/trigger/relay_if.qc>
+#include <common/triggers/trigger/relay_teamcheck.qc>
+#include <common/triggers/trigger/secret.qc>
+#include <common/triggers/trigger/swamp.qc>
+#include <common/triggers/trigger/teleport.qc>
+#include <common/triggers/trigger/viewloc.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/triggers/trigger/counter.qh>
+#include <common/triggers/trigger/delay.qh>
+#include <common/triggers/trigger/disablerelay.qh>
+#include <common/triggers/trigger/flipflop.qh>
+#include <common/triggers/trigger/gamestart.qh>
+#include <common/triggers/trigger/gravity.qh>
+#include <common/triggers/trigger/heal.qh>
+#include <common/triggers/trigger/hurt.qh>
+#include <common/triggers/trigger/impulse.qh>
+#include <common/triggers/trigger/include.qh>
+#include <common/triggers/trigger/jumppads.qh>
+#include <common/triggers/trigger/keylock.qh>
+#include <common/triggers/trigger/magicear.qh>
+#include <common/triggers/trigger/monoflop.qh>
+#include <common/triggers/trigger/multi.qh>
+#include <common/triggers/trigger/multivibrator.qh>
+#include <common/triggers/trigger/relay.qh>
+#include <common/triggers/trigger/relay_activators.qh>
+#include <common/triggers/trigger/relay_if.qh>
+#include <common/triggers/trigger/relay_teamcheck.qh>
+#include <common/triggers/trigger/secret.qh>
+#include <common/triggers/trigger/swamp.qh>
+#include <common/triggers/trigger/teleport.qh>
+#include <common/triggers/trigger/viewloc.qh>
NET_HANDLE(ENT_CLIENT_TRIGGER_PUSH, bool isnew)
{
- make_pure(this);
-
this.classname = "jumppad";
int mytm = ReadByte(); if(mytm) { this.team = mytm - 1; }
this.spawnflags = ReadInt24_t();
// generated file; do not modify
-#include "all.qc"
-#include "checkpoint.qc"
-#include "cl_turrets.qc"
-#include "config.qc"
-#include "sv_turrets.qc"
-#include "targettrigger.qc"
-#include "util.qc"
+#include <common/turrets/all.qc>
+#include <common/turrets/checkpoint.qc>
+#include <common/turrets/cl_turrets.qc>
+#include <common/turrets/config.qc>
+#include <common/turrets/sv_turrets.qc>
+#include <common/turrets/targettrigger.qc>
+#include <common/turrets/util.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/turrets/all.qh>
+#include <common/turrets/checkpoint.qh>
+#include <common/turrets/cl_turrets.qh>
+#include <common/turrets/config.qh>
+#include <common/turrets/sv_turrets.qh>
+#include <common/turrets/targettrigger.qh>
+#include <common/turrets/util.qh>
// generated file; do not modify
-#include "ewheel.qc"
-#include "ewheel_weapon.qc"
-#include "flac.qc"
-#include "flac_weapon.qc"
-#include "fusionreactor.qc"
-#include "hellion.qc"
-#include "hellion_weapon.qc"
-#include "hk.qc"
-#include "hk_weapon.qc"
-#include "machinegun.qc"
-#include "machinegun_weapon.qc"
-#include "mlrs.qc"
-#include "mlrs_weapon.qc"
-#include "phaser.qc"
-#include "phaser_weapon.qc"
-#include "plasma.qc"
-#include "plasma_dual.qc"
-#include "plasma_weapon.qc"
-#include "tesla.qc"
-#include "tesla_weapon.qc"
-#include "walker.qc"
-#include "walker_weapon.qc"
+#include <common/turrets/turret/ewheel.qc>
+#include <common/turrets/turret/ewheel_weapon.qc>
+#include <common/turrets/turret/flac.qc>
+#include <common/turrets/turret/flac_weapon.qc>
+#include <common/turrets/turret/fusionreactor.qc>
+#include <common/turrets/turret/hellion.qc>
+#include <common/turrets/turret/hellion_weapon.qc>
+#include <common/turrets/turret/hk.qc>
+#include <common/turrets/turret/hk_weapon.qc>
+#include <common/turrets/turret/machinegun.qc>
+#include <common/turrets/turret/machinegun_weapon.qc>
+#include <common/turrets/turret/mlrs.qc>
+#include <common/turrets/turret/mlrs_weapon.qc>
+#include <common/turrets/turret/phaser.qc>
+#include <common/turrets/turret/phaser_weapon.qc>
+#include <common/turrets/turret/plasma.qc>
+#include <common/turrets/turret/plasma_dual.qc>
+#include <common/turrets/turret/plasma_weapon.qc>
+#include <common/turrets/turret/tesla.qc>
+#include <common/turrets/turret/tesla_weapon.qc>
+#include <common/turrets/turret/walker.qc>
+#include <common/turrets/turret/walker_weapon.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/turrets/turret/ewheel.qh>
+#include <common/turrets/turret/ewheel_weapon.qh>
+#include <common/turrets/turret/flac.qh>
+#include <common/turrets/turret/flac_weapon.qh>
+#include <common/turrets/turret/fusionreactor.qh>
+#include <common/turrets/turret/hellion.qh>
+#include <common/turrets/turret/hellion_weapon.qh>
+#include <common/turrets/turret/hk.qh>
+#include <common/turrets/turret/hk_weapon.qh>
+#include <common/turrets/turret/machinegun.qh>
+#include <common/turrets/turret/machinegun_weapon.qh>
+#include <common/turrets/turret/mlrs.qh>
+#include <common/turrets/turret/mlrs_weapon.qh>
+#include <common/turrets/turret/phaser.qh>
+#include <common/turrets/turret/phaser_weapon.qh>
+#include <common/turrets/turret/plasma.qh>
+#include <common/turrets/turret/plasma_dual.qh>
+#include <common/turrets/turret/plasma_weapon.qh>
+#include <common/turrets/turret/tesla.qh>
+#include <common/turrets/turret/tesla_weapon.qh>
+#include <common/turrets/turret/walker.qh>
+#include <common/turrets/turret/walker_weapon.qh>
}
#endif
-#ifdef SVQC
-void dedicated_print(string input) // print(), but only print if the server is not local
-{
- if(server_is_dedicated) { LOG_INFO(input); }
-}
-#endif
-
#ifndef MENUQC
Notification Announcer_PickNumber(int type, int num)
{
float median(float a, float b, float c);
// converts a number to a string with the indicated number of decimals
-// works for up to 10 decimals!
string ftos_decimals(float number, float decimals);
+string ftos_mindecimals(float number);
bool fexists(string f);
vector animfixfps(entity e, vector a, vector b);
#endif
-#ifdef SVQC
-void dedicated_print(string input);
-#endif
-
#ifndef MENUQC
const float CNT_NORMAL = 1;
const float CNT_GAMESTART = 2;
// generated file; do not modify
-#include "all.qc"
-#include "cl_vehicles.qc"
-#include "sv_vehicles.qc"
+#include <common/vehicles/all.qc>
+#include <common/vehicles/cl_vehicles.qc>
+#include <common/vehicles/sv_vehicles.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/vehicles/all.qh>
+#include <common/vehicles/cl_vehicles.qh>
+#include <common/vehicles/sv_vehicles.qh>
float autocvar_g_vehicles_tag_damagerate = 5;
float autocvar_g_vehicles_weapon_damagerate = 1;
+.float vehicle_last_trace;
+
// flags:
.int vehicle_flags;
// generated file; do not modify
-#include "bumblebee.qc"
-#include "bumblebee_weapons.qc"
-#include "racer.qc"
-#include "racer_weapon.qc"
-#include "raptor.qc"
-#include "raptor_weapons.qc"
-#include "spiderbot.qc"
-#include "spiderbot_weapons.qc"
+#include <common/vehicles/vehicle/bumblebee.qc>
+#include <common/vehicles/vehicle/bumblebee_weapons.qc>
+#include <common/vehicles/vehicle/racer.qc>
+#include <common/vehicles/vehicle/racer_weapon.qc>
+#include <common/vehicles/vehicle/raptor.qc>
+#include <common/vehicles/vehicle/raptor_weapons.qc>
+#include <common/vehicles/vehicle/spiderbot.qc>
+#include <common/vehicles/vehicle/spiderbot_weapons.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/vehicles/vehicle/bumblebee.qh>
+#include <common/vehicles/vehicle/bumblebee_weapons.qh>
+#include <common/vehicles/vehicle/racer.qh>
+#include <common/vehicles/vehicle/racer_weapon.qh>
+#include <common/vehicles/vehicle/raptor.qh>
+#include <common/vehicles/vehicle/raptor_weapons.qh>
+#include <common/vehicles/vehicle/spiderbot.qh>
+#include <common/vehicles/vehicle/spiderbot_weapons.qh>
bool autocvar_g_vehicle_racer = true;
+float autocvar_g_vehicle_racer_thinkrate = 0.05; // TODO: any higher causes it to sink in liquids
+
float autocvar_g_vehicle_racer_speed_afterburn = 3000;
// energy consumed per second
float autocvar_g_vehicle_racer_afterburn_cost = 100;
vehicles_frame(vehic, this);
- if(pointcontents(vehic.origin) != CONTENT_WATER)
+ traceline(vehic.origin, vehic.origin + '0 0 1', MOVE_NOMONSTERS, this);
+ int cont = trace_dpstartcontents;
+ if(cont & DPCONTENTS_WATER)
vehic.air_finished = time + autocvar_g_vehicle_racer_water_time;
if(IS_DEAD(vehic))
PHYS_INPUT_BUTTON_ZOOM(this) = PHYS_INPUT_BUTTON_CROUCH(this) = false;
- crosshair_trace(this);
+ if(time >= vehic.vehicle_last_trace)
+ {
+ crosshair_trace(this);
+ vehic.vehicle_last_trace = time + autocvar_g_vehicle_racer_thinkrate;
+ }
vehic.angles_x *= -1;
vector df = vehic.velocity * -autocvar_g_vehicle_racer_friction;
//vehic.velocity_z = ftmp;
- int cont = pointcontents(vehic.origin);
if(this.movement)
{
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(cont & DPCONTENTS_LIQUIDSMASK)
{
if(this.movement_x) { df += v_forward * ((this.movement_x > 0) ? autocvar_g_vehicle_racer_water_speed_forward : -autocvar_g_vehicle_racer_water_speed_forward); }
if(this.movement_y) { df += v_right * ((this.movement_y > 0) ? autocvar_g_vehicle_racer_water_speed_strafe : -autocvar_g_vehicle_racer_water_speed_strafe); }
vehic.wait = time;
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(cont & DPCONTENTS_LIQUIDSMASK)
{
vehic.vehicle_energy -= autocvar_g_vehicle_racer_waterburn_cost * PHYS_INPUT_TIMELENGTH;
df += (v_forward * autocvar_g_vehicle_racer_waterburn_speed);
sound (vehic.tur_head, CH_TRIGGER_SINGLE, SND_Null, VOL_VEHICLEENGINE, ATTEN_NORM);
}
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(cont & DPCONTENTS_LIQUIDSMASK)
vehic.racer_watertime = time;
float dforce = autocvar_g_vehicle_racer_downforce;
if(autocvar_g_vehicle_racer_rocket_locktarget)
{
+ if(vehic.vehicle_last_trace == time + autocvar_g_vehicle_racer_thinkrate)
vehicles_locktarget(vehic, (1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
(1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
autocvar_g_vehicle_racer_rocket_locked_time);
void racer_think()
{SELFPARAM();
- self.nextthink = time;
-
- float pushdeltatime = time - self.lastpushtime;
- if (pushdeltatime > 0.15) pushdeltatime = 0;
- self.lastpushtime = time;
- if(!pushdeltatime) return;
+ this.nextthink = time + autocvar_g_vehicle_racer_thinkrate;
- tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, self);
+ tracebox(this.origin, this.mins, this.maxs, this.origin - ('0 0 1' * autocvar_g_vehicle_racer_springlength), MOVE_NOMONSTERS, this);
- vector df = self.velocity * -autocvar_g_vehicle_racer_friction;
+ vector df = this.velocity * -autocvar_g_vehicle_racer_friction;
df_z += (1 - trace_fraction) * autocvar_g_vehicle_racer_hoverpower + sin(time * 2) * (autocvar_g_vehicle_racer_springlength * 2);
float forced = autocvar_g_vehicle_racer_upforcedamper;
- int cont = pointcontents(self.origin - '0 0 64');
- if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ //int cont = pointcontents(self.origin - '0 0 64');
+ traceline(this.origin - '0 0 64', this.origin - '0 0 64', MOVE_NOMONSTERS, this);
+ //if(cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME)
+ if(trace_dpstartcontents & DPCONTENTS_LIQUIDSMASK)
{
forced = autocvar_g_vehicle_racer_water_upforcedamper;
- self.velocity_z += 200;
+ this.velocity_z += 200;
}
- self.velocity += df * pushdeltatime;
- if(self.velocity_z > 0)
- self.velocity_z *= 1 - forced * pushdeltatime;
+ this.velocity += df * autocvar_g_vehicle_racer_thinkrate;
+ if(this.velocity_z > 0)
+ this.velocity_z *= 1 - forced * autocvar_g_vehicle_racer_thinkrate;
- self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
- self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * pushdeltatime);
+ this.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
+ this.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * autocvar_g_vehicle_racer_thinkrate);
- CSQCMODEL_AUTOUPDATE(self);
+ CSQCMODEL_AUTOUPDATE(this);
}
void racer_exit(float eject)
// generated file; do not modify
-#include "all.qc"
-#include "calculations.qc"
-#include "config.qc"
+#include <common/weapons/all.qc>
+#include <common/weapons/calculations.qc>
+#include <common/weapons/config.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/weapons/all.qh>
+#include <common/weapons/calculations.qh>
+#include <common/weapons/config.qh>
float sigma;
vector v1 = '0 0 0', v2;
float dx, dy, r;
- float sstyle;
spread *= spreadfactor; //g_weaponspreadfactor;
if(spread <= 0)
return forward;
- sstyle = spreadstyle; //autocvar_g_projectiles_spread_style;
- if(sstyle == 0)
+ switch(spreadstyle)
{
- // this is the baseline for the spread value!
- // standard deviation: sqrt(2/5)
- // density function: sqrt(1-r^2)
- return forward + randomvec() * spread;
+ case 0:
+ {
+ // this is the baseline for the spread value!
+ // standard deviation: sqrt(2/5)
+ // density function: sqrt(1-r^2)
+ return forward + randomvec() * spread;
+ }
+ case 1:
+ {
+ // same thing, basically
+ return normalize(forward + cliptoplane(randomvec() * spread, forward));
+ }
+ case 2:
+ {
+ // circle spread... has at sigma=1 a standard deviation of sqrt(1/2)
+ sigma = spread * 0.89442719099991587855; // match baseline stddev
+ v1 = findperpendicular(forward);
+ v2 = cross(forward, v1);
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = sqrt(r);
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
+ }
+ case 3: // gauss 3d
+ {
+ sigma = spread * 0.44721359549996; // match baseline stddev
+ // note: 2D gaussian has sqrt(2) times the stddev of 1D, so this factor is right
+ v1 = forward;
+ v1_x += gsl_ran_gaussian(sigma);
+ v1_y += gsl_ran_gaussian(sigma);
+ v1_z += gsl_ran_gaussian(sigma);
+ return v1;
+ }
+ case 4: // gauss 2d
+ {
+ sigma = spread * 0.44721359549996; // match baseline stddev
+ // note: 2D gaussian has sqrt(2) times the stddev of 1D, so this factor is right
+ v1_x = gsl_ran_gaussian(sigma);
+ v1_y = gsl_ran_gaussian(sigma);
+ v1_z = gsl_ran_gaussian(sigma);
+ return normalize(forward + cliptoplane(v1, forward));
+ }
+ case 5: // 1-r
+ {
+ sigma = spread * 1.154700538379252; // match baseline stddev
+ v1 = findperpendicular(forward);
+ v2 = cross(forward, v1);
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = solve_cubic_abcd(-2, 3, 0, -r) * '0 1 0';
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
+ }
+ case 6: // 1-r^2
+ {
+ sigma = spread * 1.095445115010332; // match baseline stddev
+ v1 = findperpendicular(forward);
+ v2 = cross(forward, v1);
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = sqrt(1 - r);
+ r = sqrt(1 - r);
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
+ }
+ case 7: // (1-r) (2-r)
+ {
+ sigma = spread * 1.224744871391589; // match baseline stddev
+ v1 = findperpendicular(forward);
+ v2 = cross(forward, v1);
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = 1 - sqrt(r);
+ r = 1 - sqrt(r);
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
+ }
+ default:
+ error("g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff), 6 (quadratic falloff), 7 (stronger falloff)!");
}
- else if(sstyle == 1)
- {
- // same thing, basically
- return normalize(forward + cliptoplane(randomvec() * spread, forward));
- }
- else if(sstyle == 2)
- {
- // circle spread... has at sigma=1 a standard deviation of sqrt(1/2)
- sigma = spread * 0.89442719099991587855; // match baseline stddev
- v1 = findperpendicular(forward);
- v2 = cross(forward, v1);
- // random point on unit circle
- dx = random() * 2 * M_PI;
- dy = sin(dx);
- dx = cos(dx);
- // radius in our dist function
- r = random();
- r = sqrt(r);
- return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
- }
- else if(sstyle == 3) // gauss 3d
- {
- sigma = spread * 0.44721359549996; // match baseline stddev
- // note: 2D gaussian has sqrt(2) times the stddev of 1D, so this factor is right
- v1 = forward;
- v1_x += gsl_ran_gaussian(sigma);
- v1_y += gsl_ran_gaussian(sigma);
- v1_z += gsl_ran_gaussian(sigma);
- return v1;
- }
- else if(sstyle == 4) // gauss 2d
- {
- sigma = spread * 0.44721359549996; // match baseline stddev
- // note: 2D gaussian has sqrt(2) times the stddev of 1D, so this factor is right
- v1_x = gsl_ran_gaussian(sigma);
- v1_y = gsl_ran_gaussian(sigma);
- v1_z = gsl_ran_gaussian(sigma);
- return normalize(forward + cliptoplane(v1, forward));
- }
- else if(sstyle == 5) // 1-r
- {
- sigma = spread * 1.154700538379252; // match baseline stddev
- v1 = findperpendicular(forward);
- v2 = cross(forward, v1);
- // random point on unit circle
- dx = random() * 2 * M_PI;
- dy = sin(dx);
- dx = cos(dx);
- // radius in our dist function
- r = random();
- r = solve_cubic_abcd(-2, 3, 0, -r) * '0 1 0';
- return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
- }
- else if(sstyle == 6) // 1-r^2
- {
- sigma = spread * 1.095445115010332; // match baseline stddev
- v1 = findperpendicular(forward);
- v2 = cross(forward, v1);
- // random point on unit circle
- dx = random() * 2 * M_PI;
- dy = sin(dx);
- dx = cos(dx);
- // radius in our dist function
- r = random();
- r = sqrt(1 - r);
- r = sqrt(1 - r);
- return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
- }
- else if(sstyle == 7) // (1-r) (2-r)
- {
- sigma = spread * 1.224744871391589; // match baseline stddev
- v1 = findperpendicular(forward);
- v2 = cross(forward, v1);
- // random point on unit circle
- dx = random() * 2 * M_PI;
- dy = sin(dx);
- dx = cos(dx);
- // radius in our dist function
- r = random();
- r = 1 - sqrt(r);
- r = 1 - sqrt(r);
- return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
- }
- else
- error("g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff), 6 (quadratic falloff), 7 (stronger falloff)!");
+
return '0 0 0';
/*
* how to derive falloff functions:
// generated file; do not modify
-#include "arc.qc"
-#include "blaster.qc"
-#include "crylink.qc"
-#include "devastator.qc"
-#include "electro.qc"
-#include "fireball.qc"
-#include "hagar.qc"
-#include "hlac.qc"
-#include "hook.qc"
-#include "machinegun.qc"
-#include "minelayer.qc"
-#include "mortar.qc"
-#include "porto.qc"
-#include "rifle.qc"
-#include "seeker.qc"
-#include "shockwave.qc"
-#include "shotgun.qc"
-#include "tuba.qc"
-#include "vaporizer.qc"
-#include "vortex.qc"
+#include <common/weapons/weapon/arc.qc>
+#include <common/weapons/weapon/blaster.qc>
+#include <common/weapons/weapon/crylink.qc>
+#include <common/weapons/weapon/devastator.qc>
+#include <common/weapons/weapon/electro.qc>
+#include <common/weapons/weapon/fireball.qc>
+#include <common/weapons/weapon/hagar.qc>
+#include <common/weapons/weapon/hlac.qc>
+#include <common/weapons/weapon/hook.qc>
+#include <common/weapons/weapon/machinegun.qc>
+#include <common/weapons/weapon/minelayer.qc>
+#include <common/weapons/weapon/mortar.qc>
+#include <common/weapons/weapon/porto.qc>
+#include <common/weapons/weapon/rifle.qc>
+#include <common/weapons/weapon/seeker.qc>
+#include <common/weapons/weapon/shockwave.qc>
+#include <common/weapons/weapon/shotgun.qc>
+#include <common/weapons/weapon/tuba.qc>
+#include <common/weapons/weapon/vaporizer.qc>
+#include <common/weapons/weapon/vortex.qc>
--- /dev/null
+// generated file; do not modify
+#include <common/weapons/weapon/arc.qh>
+#include <common/weapons/weapon/blaster.qh>
+#include <common/weapons/weapon/crylink.qh>
+#include <common/weapons/weapon/devastator.qh>
+#include <common/weapons/weapon/electro.qh>
+#include <common/weapons/weapon/fireball.qh>
+#include <common/weapons/weapon/hagar.qh>
+#include <common/weapons/weapon/hlac.qh>
+#include <common/weapons/weapon/hook.qh>
+#include <common/weapons/weapon/machinegun.qh>
+#include <common/weapons/weapon/minelayer.qh>
+#include <common/weapons/weapon/mortar.qh>
+#include <common/weapons/weapon/porto.qh>
+#include <common/weapons/weapon/rifle.qh>
+#include <common/weapons/weapon/seeker.qh>
+#include <common/weapons/weapon/shockwave.qh>
+#include <common/weapons/weapon/shotgun.qh>
+#include <common/weapons/weapon/tuba.qh>
+#include <common/weapons/weapon/vaporizer.qh>
+#include <common/weapons/weapon/vortex.qh>
}
}
+void W_Hagar_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity, int fire)
+{
+ if(!(fire & 1) || actor.hagar_load || actor.hagar_loadblock)
+ {
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+
+ if(!thiswep.wr_checkammo1(thiswep))
+ if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+ {
+ W_SwitchWeapon_Force(actor, w_getbestweapon(actor));
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+
+ W_Hagar_Attack(thiswep);
+
+ int slot = weaponslot(weaponentity);
+ ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(hagar, refire) * W_WeaponRateFactor();
+ int theframe = WFRAME_FIRE1;
+ entity this = actor.(weaponentity);
+ if(this)
+ {
+ if(this.wframe == WFRAME_FIRE1)
+ theframe = WFRAME_DONTCHANGE;
+ }
+ weapon_thinkf(actor, weaponentity, theframe, WEP_CVAR_PRI(hagar, refire), W_Hagar_Attack_Auto);
+}
+
METHOD(Hagar, wr_aim, void(entity thiswep))
{
SELFPARAM();
W_Hagar_Attack2_Load(thiswep, weaponentity); // must always run each frame
if(autocvar_g_balance_hagar_reload_ammo && actor.clip_load < min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo))) { // forced reload
thiswep.wr_reload(thiswep, actor, weaponentity);
- } else if((fire & 1) && !actor.hagar_load && !actor.hagar_loadblock) // not while secondary is loaded or awaiting reset
- {
- if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(hagar, refire)))
- {
- W_Hagar_Attack(thiswep);
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(hagar, refire), w_ready);
- }
}
+ else if((fire & 1) && !actor.hagar_load && !actor.hagar_loadblock) // not while secondary is loaded or awaiting reset
+ {
+ if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0))
+ W_Hagar_Attack_Auto(thiswep, actor, weaponentity, fire);
+ }
else if((fire & 2) && !loadable_secondary && WEP_CVAR(hagar, secondary))
{
if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(hagar, refire)))
#include "functional.qh"
#include "i18n.qh"
#include "iter.qh"
+#include "json.qc"
#include "lazy.qh"
#include "linkedlist.qh"
#include "log.qh"
#include "urllib.qc"
#include "vector.qh"
#include "yenc.qh"
+
+#include "matrix/_mod.inc"
// generated file; do not modify
-#include "angle.qc"
-#include "p2mathlib.qc"
-#include "random.qc"
-#include "sortlist.qc"
-#include "test.qc"
-#include "urllib.qc"
+#include <lib/angle.qc>
+#include <lib/json.qc>
+#include <lib/p2mathlib.qc>
+#include <lib/random.qc>
+#include <lib/sortlist.qc>
+#include <lib/test.qc>
+#include <lib/urllib.qc>
--- /dev/null
+// generated file; do not modify
+#include <lib/angle.qh>
+#include <lib/json.qh>
+#include <lib/p2mathlib.qh>
+#include <lib/random.qh>
+#include <lib/sortlist.qh>
+#include <lib/test.qh>
+#include <lib/urllib.qh>
// generated file; do not modify
-#include "cl_model.qc"
-#include "cl_player.qc"
-#include "interpolate.qc"
-#include "sv_model.qc"
+#include <lib/csqcmodel/cl_model.qc>
+#include <lib/csqcmodel/cl_player.qc>
+#include <lib/csqcmodel/interpolate.qc>
+#include <lib/csqcmodel/sv_model.qc>
--- /dev/null
+// generated file; do not modify
+#include <lib/csqcmodel/cl_model.qh>
+#include <lib/csqcmodel/cl_player.qh>
+#include <lib/csqcmodel/interpolate.qh>
+#include <lib/csqcmodel/sv_model.qh>
if(autocvar_cl_movement == 1)
CSQCPlayer_CheckWater(this); // we apparently need to check water *before* physics so it can use this for water jump
+ vector oldv_angle = this.v_angle;
+ vector oldangles = this.angles; // we need to save these, as they're abused by other code
+ this.v_angle = PHYS_INPUT_ANGLES(this);
+ this.angles = PHYS_WORLD_ANGLES(this);
+
CSQC_ClientMovement_PlayerMove_Frame(this);
if(autocvar_cl_movement == 1)
Movetype_Physics_Spam(this);
}
+ view_angles = this.v_angle;
+ input_angles = this.angles;
+ this.v_angle = oldv_angle;
+ this.angles = oldangles;
+
this.pmove_flags =
((this.flags & FL_DUCKED) ? PMF_DUCKED : 0) |
(!(this.flags & FL_JUMPRELEASED) ? PMF_JUMP_HELD : 0) |
class(Defer).entity owner;
class(Defer).void() think;
class(Defer).float nextthink;
+ class(Defer).void(entity) defer_func;
/** Remove self */
void SUB_Remove(entity this)
SELFPARAM();
this.think = SUB_Remove_self;
this.nextthink = time;
- WITHSELF(this.owner, this.selfthink(this));
+ this.defer_func(this.owner);
}
/**
* Execute func() after time + fdelay.
* self when func is executed = self when defer is called
*/
- void defer(entity this, float fdelay, void(entity this) func)
+ void defer(entity this, float fdelay, void(entity) func)
{
entity e = new_pure(deferred);
e.owner = this;
- setthink(e, func);
+ e.defer_func = func;
e.think = defer_think;
e.nextthink = time + fdelay;
}
} MACRO_END
#define STRING_ITERATOR_GET(this) str2chr(this##_s, this##_i++)
+#define STRING_ITERATOR_PEEK(this) str2chr(this##_s, this##_i)
+#define STRING_ITERATOR_NEXT(this) MACRO_BEGIN ++this##_i; MACRO_END
+#define STRING_ITERATOR_UNGET(this) MACRO_BEGIN --this##_i; MACRO_END
+#define STRING_ITERATOR_SAVE(this) this##_i
+#define STRING_ITERATOR_LOAD(this, n) MACRO_BEGIN this##_i = n; MACRO_END
#define FOREACH_CHAR(s, cond, body) \
MACRO_BEGIN \
--- /dev/null
+#include "test.qh"
+
+STRING_ITERATOR(_json, string_null, 0);
+// Store interleaved keys/values in a string buffer
+int _json_buffer;
+// Last read string
+string _json_temp;
+
+/** parse a json object */
+bool _json_parse_object();
+ bool _json_parse_members();
+ bool _json_parse_pair();
+bool _json_parse_array();
+bool _json_parse_value();
+ bool _json_parse_true();
+ bool _json_parse_false();
+ bool _json_parse_null();
+bool _json_parse_string(bool add);
+bool _json_parse_number();
+ bool _json_parse_float();
+ bool _json_parse_int();
+
+#define JSON_BEGIN() int __i = STRING_ITERATOR_SAVE(_json)
+#define JSON_FAIL(reason) goto fail
+#define JSON_END() \
+ return true; \
+:fail \
+ STRING_ITERATOR_LOAD(_json, __i); \
+ return false;
+// Current namespace
+string _json_ns;
+// Current keys
+int _json_keys;
+
+bool _json_parse_object() {
+ JSON_BEGIN();
+ if (STRING_ITERATOR_GET(_json) != '{') JSON_FAIL("expected '{'");
+ WITH(int, _json_keys, bufstr_add(_json_buffer, "", 0), _json_parse_members());
+ if (STRING_ITERATOR_GET(_json) != '}') JSON_FAIL("expected '}'");
+ JSON_END();
+}
+
+ bool _json_parse_members() {
+ JSON_BEGIN();
+ for (;;) {
+ if (!_json_parse_pair()) JSON_FAIL("expected pair");
+ if (STRING_ITERATOR_PEEK(_json) == ',') {
+ STRING_ITERATOR_NEXT(_json);
+ continue;
+ }
+ break;
+ }
+ JSON_END();
+ }
+
+ bool _json_parse_pair() {
+ JSON_BEGIN();
+ if (!_json_parse_string(false)) JSON_FAIL("expected string");
+ string key = _json_temp;
+ bufstr_set(_json_buffer, _json_keys, cons(bufstr_get(_json_buffer, _json_keys), key));
+ key = _json_ns ? strcat(_json_ns, ".", key) : key;
+ bufstr_add(_json_buffer, key, 0);
+ if (STRING_ITERATOR_GET(_json) != ':') JSON_FAIL("expected ':'");
+ bool ret = false; WITH(string, _json_ns, key, ret = _json_parse_value());
+ if (!ret) JSON_FAIL("expected value");
+ JSON_END();
+ }
+
+bool _json_parse_array() {
+ JSON_BEGIN();
+ if (STRING_ITERATOR_GET(_json) != '[') JSON_FAIL("expected '['");
+ int len = bufstr_add(_json_buffer, "0", 0);
+ if (len) bufstr_set(_json_buffer, len - 1, strcat(bufstr_get(_json_buffer, len - 1), ".length"));
+ bool required = false;
+ for (int n = 0; ; n++) {
+ string key = ftos(n);
+ key = _json_ns ? strcat(_json_ns, ".", key) : key;
+ int it = bufstr_add(_json_buffer, key, 0);
+ bool ret = false; WITH(string, _json_ns, key, ret = _json_parse_value());
+ if (!ret) {
+ bufstr_free(_json_buffer, it);
+ if (required) JSON_FAIL("expected value"); else break;
+ }
+ bufstr_set(_json_buffer, len, ftos(n + 1));
+ if (STRING_ITERATOR_PEEK(_json) == ',') {
+ STRING_ITERATOR_NEXT(_json);
+ required = true;
+ continue;
+ }
+ break;
+ }
+ if (STRING_ITERATOR_GET(_json) != ']') JSON_FAIL("expected ']'");
+ JSON_END();
+}
+
+bool _json_parse_value() {
+ JSON_BEGIN();
+ if (!(_json_parse_string(true)
+ || _json_parse_number()
+ || _json_parse_object()
+ || _json_parse_array()
+ || _json_parse_true()
+ || _json_parse_false()
+ || _json_parse_null())) JSON_FAIL("expected value");
+ JSON_END();
+}
+
+ bool _json_parse_true() {
+ JSON_BEGIN();
+ if (!(STRING_ITERATOR_GET(_json) == 't'
+ && STRING_ITERATOR_GET(_json) == 'r'
+ && STRING_ITERATOR_GET(_json) == 'u'
+ && STRING_ITERATOR_GET(_json) == 'e'))
+ JSON_FAIL("expected 'true'");
+ bufstr_add(_json_buffer, "1", 0);
+ JSON_END();
+ }
+
+ bool _json_parse_false() {
+ JSON_BEGIN();
+ if (!(STRING_ITERATOR_GET(_json) == 'f'
+ && STRING_ITERATOR_GET(_json) == 'a'
+ && STRING_ITERATOR_GET(_json) == 'l'
+ && STRING_ITERATOR_GET(_json) == 's'
+ && STRING_ITERATOR_GET(_json) == 'e'))
+ JSON_FAIL("expected 'false'");
+ bufstr_add(_json_buffer, "0", 0);
+ JSON_END();
+ }
+
+ bool _json_parse_null() {
+ JSON_BEGIN();
+ if (!(STRING_ITERATOR_GET(_json) == 'n'
+ && STRING_ITERATOR_GET(_json) == 'u'
+ && STRING_ITERATOR_GET(_json) == 'l'
+ && STRING_ITERATOR_GET(_json) == 'l'))
+ JSON_FAIL("expected 'null'");
+ bufstr_add(_json_buffer, "", 0);
+ JSON_END();
+ }
+
+bool _json_parse_string(bool add) {
+ JSON_BEGIN();
+ if (STRING_ITERATOR_GET(_json) != '"') JSON_FAIL("expected opening '\"'");
+ string s = "";
+ for (int c; (c = STRING_ITERATOR_GET(_json)); ) {
+ if (c == '"') {
+ STRING_ITERATOR_UNGET(_json);
+ break;
+ } else if (c == '\\') {
+ string esc;
+ switch (STRING_ITERATOR_GET(_json)) {
+ default:
+ JSON_FAIL("expected ( '\"' | '\\' | 'n' | 't' )");
+ case '"': esc = "\""; break;
+ case '\\': esc = "\\"; break;
+ case 'n': esc = "\n"; break;
+ case 't': esc = "\t"; break;
+ case 'u': esc = "\\u"; break; // TODO
+ case '/': esc = "/"; break;
+ }
+ s = strcat(s, esc);
+ } else {
+ s = strcat(s, chr2str(c));
+ }
+ }
+ if (STRING_ITERATOR_GET(_json) != '"') JSON_FAIL("expected closing '\"'");
+ if (add) bufstr_add(_json_buffer, s, 0);
+ _json_temp = s;
+ JSON_END();
+}
+
+bool _json_parse_number() {
+ JSON_BEGIN();
+ if (!(_json_parse_float() || _json_parse_int())) JSON_FAIL("expected number");
+ JSON_END();
+}
+
+ bool _json_parse_float() {
+ JSON_BEGIN();
+ string s = "";
+ bool needdot = true;
+ for (int c; (c = STRING_ITERATOR_GET(_json)); ) {
+ if (!(c >= '0' && c <= '9')) {
+ if (c == '.' && needdot) {
+ // fine
+ needdot = false;
+ } else {
+ STRING_ITERATOR_UNGET(_json);
+ break;
+ }
+ }
+ s = strcat(s, chr2str(c));
+ }
+ if (s == "") JSON_FAIL("expected float");
+ bufstr_add(_json_buffer, s, 0);
+ JSON_END();
+ }
+
+ bool _json_parse_int() {
+ JSON_BEGIN();
+ string s = "";
+ for (int c; (c = STRING_ITERATOR_GET(_json)); ) {
+ if (!(c >= '0' && c <= '9')) {
+ STRING_ITERATOR_UNGET(_json);
+ break;
+ }
+ if (s == "" && c == '0') JSON_FAIL("expected [1-9]");
+ s = strcat(s, chr2str(c));
+ }
+ if (s == "") JSON_FAIL("expected int");
+ if (ftos(stof(s)) != s) JSON_FAIL("expected int");
+ bufstr_add(_json_buffer, s, 0);
+ JSON_END();
+ }
+
+int json_parse(string in, bool() func) {
+ string trimmed = "";
+ LABEL(trim) {
+ int o = strstrofs(in, "\"", 0);
+ if (o >= 0) {
+ string part = substring(in, 0, o + 1); in = substring(in, o + 1, -1);
+ part = strreplace(" ", "", part);
+ part = strreplace("\n", "", part);
+ trimmed = strcat(trimmed, part);
+ goto trim_str;
+ } else {
+ string part = in;
+ part = strreplace(" ", "", part);
+ part = strreplace("\n", "", part);
+ trimmed = strcat(trimmed, part);
+ goto done;
+ }
+ }
+ LABEL(trim_str) {
+ int o = strstrofs(in, "\"", 0);
+ int esc = strstrofs(in, "\\\"", 0);
+ if (o < esc || esc < 0) {
+ // simple string
+ string part = substring(in, 0, o + 1); in = substring(in, o + 1, -1);
+ trimmed = strcat(trimmed, part);
+ goto trim;
+ } else {
+ // has escape
+ string part = substring(in, 0, esc + 2); in = substring(in, esc + 2, -1);
+ trimmed = strcat(trimmed, part);
+ goto trim_str;
+ }
+ }
+ LABEL(done);
+
+ STRING_ITERATOR_SET(_json, trimmed, 0);
+ _json_buffer = buf_create();
+ bool ret = func();
+ if (!ret) {
+ buf_del(_json_buffer);
+ _json_buffer = -1;
+ }
+ return _json_buffer;
+}
+
+string json_get(int buf, string key)
+{
+ for (int i = 1, n = buf_getsize(buf); i < n; i += 2) {
+ if (bufstr_get(buf, i) == key) return bufstr_get(buf, i + 1);
+ }
+ return string_null;
+}
+
+void json_del(int buf)
+{
+ buf_del(buf);
+}
+
+void json_dump(int buf)
+{
+ for (int i = 0, n = buf_getsize(buf); i < n; ++i) {
+ print(bufstr_get(buf, i), "\n");
+ }
+}
+
+#undef JSON_BEGIN
+#undef JSON_FAIL
+#undef JSON_END
+
+TEST(json, Parse)
+{
+ string s = "{\n\
+ \"m_string\": \"\\\"string\\\"\",\n\
+ \"m_int\": 123,\n\
+ \"m_bool\": true,\n\
+ \"m_null\": null,\n\
+ \"m_obj\": { },\n\
+ \"m_arr\": [ ]\n}"; // "
+ print(s, "\n");
+ int buf = json_parse(s, _json_parse_object);
+ EXPECT_NE(-1, buf);
+ json_dump(buf);
+ SUCCEED();
+}
string(string...) strcat0n = #115;
#endif
-#define __SOURCELOC__ (sprintf("^9"__FILE__"^7" ":" "^9%s^7" ":" "^9"STR(__LINE__)"^7", __FUNC__))
+#define __SOURCELOC__ (sprintf("^7%s^9" "(" "^9"__FILE__"^7" ":" "^9"STR(__LINE__)"^7" ")", __FUNC__))
#define _LOG(f, level, s) \
MACRO_BEGIN { \
- f(sprintf("^9[::^7" PROGNAME "^9::" level "^9] [%s^9]\n^7%s\n", __SOURCELOC__, s)); \
+ f(sprintf("^9[::" "^7"PROGNAME"^9" "::" level"^9" "] %s\n^7%s\n", __SOURCELOC__, s)); \
} MACRO_END
#define LOG_FATAL(...) _LOG_FATAL(strcat0n(__VA_ARGS__))
--- /dev/null
+// generated file; do not modify
+#include <lib/matrix/command.qc>
+#include <lib/matrix/matrix.qc>
--- /dev/null
+// generated file; do not modify
+#include <lib/matrix/command.qh>
+#include <lib/matrix/matrix.qh>
--- /dev/null
+#include "command.qh"
+
+#include <common/command/all.qh>
+
+GENERIC_COMMAND(mx, "Send a matrix command") {
+ switch (argv(1)) {
+ case "user":
+ if (matrix_user) strunzone(matrix_user);
+ matrix_user = strzone(substring(command, argv_start_index(2), -1));
+ break;
+ case "token":
+ if (matrix_access_token) strunzone(matrix_access_token);
+ matrix_access_token = strzone(substring(command, argv_start_index(2), -1));
+ break;
+ case "messages":
+ MX_Messages(string_null);
+ break;
+ case "nick":
+ MX_Nick(substring(command, argv_start_index(2), -1));
+ break;
+ case "join":
+ string s = substring(command, argv_start_index(2), -1);
+ if (s != matrix_room && matrix_room != "") {
+ MX_Leave(matrix_room);
+ strunzone(matrix_room);
+ }
+ matrix_room = strzone(s);
+ MX_Join(matrix_room);
+ break;
+ case "sync":
+ MX_Sync(string_null);
+ break;
+ case "typing":
+ MX_Typing(true);
+ break;
+ case "say":
+ MX_Say(substring(command, argv_start_index(2), -1));
+ break;
+ case "leave":
+ MX_Leave(matrix_room);
+ matrix_room = string_null;
+ break;
+ case "forget":
+ MX_Forget(matrix_room);
+ matrix_room = "";
+ break;
+ }
+}
--- /dev/null
+#pragma once
+
+#include "matrix.qh"
--- /dev/null
+#include "matrix.qh"
+
+.string message;
+
+void MX_Nick_(entity fh, entity pass, int status);
+void MX_Nick(string name)
+{
+ if (!matrix_access_token) return;
+ entity pass = new_pure(mx);
+ pass.message = name;
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/profile/%s/displayname?access_token=%s", autocvar_matrix_server, matrix_user, matrix_access_token),
+ FILE_WRITE,
+ MX_Nick_,
+ pass
+ );
+}
+void MX_Nick_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ case URL_READY_CANWRITE: {
+ fh.url_verb = "PUT";
+ fh.url_content_type = "application/json";
+ url_fputs(fh, sprintf("{\"displayname\": \"%s\"}", pass.message));
+ remove(pass);
+ url_fclose(fh);
+ break;
+ }
+ }
+}
+
+
+void MX_Messages_(entity fh, entity pass, int status);
+void MX_Messages(string from)
+{
+ if (!matrix_access_token) return;
+ string s = sprintf("%s/_matrix/client/r0/events?room_id=%s&limit=50&timeout=30000&from=%s&access_token=%s", autocvar_matrix_server, matrix_room, from, matrix_access_token);
+ url_single_fopen(
+ s,
+ FILE_READ,
+ MX_Messages_,
+ NULL
+ );
+}
+void MX_Messages_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ default: {
+ LOG_WARNINGF("status: %d", status);
+ break;
+ }
+ case URL_READY_CLOSED: break;
+ case URL_READY_CANREAD: {
+ string json = "";
+ for (string s; (s = url_fgets(fh)); ) { json = strcat(json, s, "\n"); }
+ url_fclose(fh);
+ int buf = json_parse(json, _json_parse_object);
+ EXPECT_NE(-1, buf);
+ for (int i = 0, n = stof(json_get(buf, "chunk.length")); i < n; ++i) {
+ MX_Handle(buf, sprintf("chunk.%d", i));
+ }
+ MX_Messages(json_get(buf, "end"));
+ break;
+ }
+ }
+}
+
+
+void MX_Sync_(entity fh, entity pass, int status);
+void MX_Sync(string since)
+{
+ if (!matrix_access_token) return;
+ string s = strcat(autocvar_matrix_server, "/_matrix/client/r0/sync?");
+ if (since) {
+ s = strcat(s,
+ "since=", since, "&",
+ "timeout=30000&",
+ sprintf("filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[\"%s\"]}}&", matrix_room)
+ );
+ } else {
+ s = strcat(s,
+ "timeout=0&",
+ "filter={\"account_data\":{\"types\":[]},\"presence\":{\"types\":[]},\"room\":{\"rooms\":[]}}&"
+ );
+ }
+ s = strcat(s, "access_token=", matrix_access_token);
+ url_single_fopen(s, FILE_READ, MX_Sync_, NULL);
+}
+void MX_Sync_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ default: {
+ LOG_WARNINGF("status: %d", status);
+ break;
+ }
+ case URL_READY_CLOSED: break;
+ case URL_READY_CANREAD: {
+ string json = "";
+ for (string s; (s = url_fgets(fh)); ) { json = strcat(json, s, "\n"); }
+ url_fclose(fh);
+ int buf = json_parse(json, _json_parse_object);
+ EXPECT_NE(-1, buf);
+ string arr = sprintf("rooms.join.%s.timeline.events", matrix_room);
+ for (int i = 0, n = stof(json_get(buf, sprintf("%s.length", arr))); i < n; ++i) {
+ MX_Handle(buf, sprintf("%s.%d", arr, i));
+ }
+ MX_Sync(json_get(buf, "next_batch"));
+ break;
+ }
+ }
+}
+
+
+void MX_JLF_(entity fh, entity pass, int status);
+void MX_Join(string room)
+{
+ if (!matrix_access_token) return;
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/rooms/%s/join?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
+ FILE_WRITE,
+ MX_JLF_,
+ NULL
+ );
+}
+void MX_Leave(string room)
+{
+ if (!matrix_access_token) return;
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/rooms/%s/leave?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
+ FILE_WRITE,
+ MX_JLF_,
+ NULL
+ );
+}
+void MX_Forget(string room)
+{
+ if (!matrix_access_token) return;
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/rooms/%s/forget?access_token=%s", autocvar_matrix_server, matrix_room, matrix_access_token),
+ FILE_WRITE,
+ MX_JLF_,
+ NULL
+ );
+}
+void MX_JLF_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ case URL_READY_CANWRITE: {
+ fh.url_content_type = "application/json";
+ url_fputs(fh, sprintf("{}", pass.message));
+ url_fclose(fh);
+ break;
+ }
+ }
+}
+
+
+void MX_Typing_(entity fh, entity pass, int status);
+void MX_Typing(bool state)
+{
+ if (!matrix_access_token) return;
+ entity pass = new_pure(mx);
+ pass.message = state ? "true" : "false";
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/rooms/%s/typing/%s?access_token=%s", autocvar_matrix_server, matrix_room, matrix_user, matrix_access_token),
+ FILE_WRITE,
+ MX_Typing_,
+ pass
+ );
+}
+void MX_Typing_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ case URL_READY_CANWRITE: {
+ fh.url_verb = "PUT";
+ fh.url_content_type = "application/json";
+ url_fputs(fh, sprintf("{\"typing\": %s, \"timeout\": 30000}", pass.message));
+ remove(pass);
+ url_fclose(fh);
+ break;
+ }
+ }
+}
+
+
+void MX_Say_(entity fh, entity pass, int status);
+void MX_Say(string body)
+{
+ if (!matrix_access_token) return;
+ static int txnid;
+ entity pass = new_pure(mx);
+ pass.message = strzone(body);
+ url_single_fopen(
+ sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message/%d?access_token=%s", autocvar_matrix_server, matrix_room, ++txnid, matrix_access_token),
+ FILE_WRITE,
+ MX_Say_,
+ pass
+ );
+}
+void MX_Say_(entity fh, entity pass, int status)
+{
+ switch (status) {
+ case URL_READY_CANWRITE: {
+ fh.url_verb = "PUT";
+ fh.url_content_type = "application/json";
+ url_fputs(fh, sprintf("{\"msgtype\": \"m.text\", \"body\": \"%s\"}", pass.message));
+ strunzone(pass.message); remove(pass);
+ url_fclose(fh);
+ break;
+ }
+ }
+}
--- /dev/null
+#pragma once
+
+string autocvar_matrix_server = "http://matrix.org";
+string matrix_user;
+string matrix_access_token;
+string matrix_room;
+
+void MX_Messages(string from);
+void MX_Nick(string name);
+void MX_Join(string room);
+void MX_Sync(string since);
+void MX_Typing(bool state);
+void MX_Say(string body);
+void MX_Leave(string room);
+void MX_Forget(string room);
+
+var void(int buf, string ancestor) MX_Handle;
if (pure) {
make_pure(this);
#ifdef CSQC
- setorigin(this, '0 0 10000');
+ setorigin(this, (world.mins + world.maxs) * 0.5);
#endif
#ifdef SVQC
- setorigin(this, '0 0 -10000');
+ setorigin(this, (world.mins + world.maxs) * 0.5);
#endif
}
return this;
/**
* converts a number to a string with the indicated number of decimals
- * works for up to 10 decimals!
*/
string ftos_decimals(float number, int decimals)
{
// inhibit stupid negative zero
if (number == 0) number = 0;
- // we have sprintf...
return sprintf("%.*f", decimals, number);
}
+/**
+ * converts a number to a string with the minimum number of decimals
+ */
+string ftos_mindecimals(float number)
+{
+ // inhibit stupid negative zero
+ if (number == 0) number = 0;
+ return sprintf("%.7g", number);
+}
+
int vercmp_recursive(string v1, string v2)
{
int dot1 = strstrofs(v1, ".", 0);
#define EXPECT_FALSE(condition) EXPECT_EQ(false, condition)
#define ASSERT_FALSE(condition) ASSERT_EQ(false, condition)
-#define EXPECT_NE(val1, val2) EXPECT_TRUE(val1 != val2)
+#define EXPECT_NE(val1, val2) EXPECT_TRUE((val1) != (val2))
#define ASSERT_NE(val1, val2) _TEST_ASSERT(EXPECT_NE(val1, val2))
-#define EXPECT_LT(val1, val2) EXPECT_TRUE(val1 < val2)
+#define EXPECT_LT(val1, val2) EXPECT_TRUE((val1) < (val2))
#define ASSERT_LT(val1, val2) _TEST_ASSERT(EXPECT_LT(val1, val2))
-#define EXPECT_LE(val1, val2) EXPECT_TRUE(val1 <= val2)
+#define EXPECT_LE(val1, val2) EXPECT_TRUE((val1) <= (val2))
#define ASSERT_LE(val1, val2) _TEST_ASSERT(EXPECT_LE(val1, val2))
-#define EXPECT_GT(val1, val2) EXPECT_TRUE(val1 > val2)
+#define EXPECT_GT(val1, val2) EXPECT_TRUE((val1) > (val2))
#define ASSERT_GT(val1, val2) _TEST_ASSERT(EXPECT_GT(val1, val2))
-#define EXPECT_GE(val1, val2) EXPECT_TRUE(val1 >= val2)
+#define EXPECT_GE(val1, val2) EXPECT_TRUE((val1) >= (val2))
#define ASSERT_GE(val1, val2) _TEST_ASSERT(EXPECT_GE(val1, val2))
#define EXPECT_NO_FATAL_FAILURE(statement) EXPECT_NO_FATAL_FAILURE_(statement, { })
// URLs
.string url_url;
+.string url_content_type;
+.string url_verb;
.float url_wbuf;
.float url_wbufpos;
.float url_rbuf;
// create a writing end that does nothing yet
e = new_pure(url_single_fopen_file);
e.url_url = strzone(url);
+ e.url_content_type = "text/plain";
+ e.url_verb = "";
e.url_fh = URL_FH_CURL;
e.url_wbuf = buf_create();
if (e.url_wbuf < 0)
}
// POST the data
- if (!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, "text/plain", "", e.url_wbuf, 0))
+ if (!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, e.url_content_type, e.url_verb, e.url_wbuf, 0))
{
LOG_INFO("url_fclose: failure in crypto_uri_postbuf\n");
e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
// generated file; do not modify
-#include "anglestransform.qc"
-#include "client.qc"
-#include "common.qc"
-#include "mathlib.qc"
-#include "server.qc"
-#include "util_server.qc"
+#include <lib/warpzone/anglestransform.qc>
+#include <lib/warpzone/client.qc>
+#include <lib/warpzone/common.qc>
+#include <lib/warpzone/mathlib.qc>
+#include <lib/warpzone/server.qc>
+#include <lib/warpzone/util_server.qc>
--- /dev/null
+// generated file; do not modify
+#include <lib/warpzone/anglestransform.qh>
+#include <lib/warpzone/client.qh>
+#include <lib/warpzone/common.qh>
+#include <lib/warpzone/mathlib.qh>
+#include <lib/warpzone/server.qh>
+#include <lib/warpzone/util_server.qh>
// generated file; do not modify
-#include "draw.qc"
-#include "item.qc"
-#include "menu.qc"
+#include <menu/draw.qc>
+#include <menu/item.qc>
+#include <menu/matrix.qc>
+#include <menu/menu.qc>
--- /dev/null
+// generated file; do not modify
+#include <menu/draw.qh>
+#include <menu/item.qh>
+#include <menu/matrix.qh>
+#include <menu/menu.qh>
// generated file; do not modify
-#include "animation.qc"
-#include "animhost.qc"
-#include "easing.qc"
-#include "keyframe.qc"
+#include <menu/anim/animation.qc>
+#include <menu/anim/animhost.qc>
+#include <menu/anim/easing.qc>
+#include <menu/anim/keyframe.qc>
--- /dev/null
+// generated file; do not modify
+#include <menu/anim/animation.qh>
+#include <menu/anim/animhost.qh>
+#include <menu/anim/easing.qh>
+#include <menu/anim/keyframe.qh>
// generated file; do not modify
-#include "all.qc"
-#include "menu_cmd.qc"
+#include <menu/command/all.qc>
+#include <menu/command/menu_cmd.qc>
--- /dev/null
+// generated file; do not modify
+#include <menu/command/all.qh>
+#include <menu/command/menu_cmd.qh>
// generated file; do not modify
-#include "borderimage.qc"
-#include "button.qc"
-#include "checkbox.qc"
-#include "container.qc"
-#include "dialog.qc"
-#include "image.qc"
-#include "inputbox.qc"
-#include "inputcontainer.qc"
-#include "label.qc"
-#include "listbox.qc"
-#include "modalcontroller.qc"
-#include "nexposee.qc"
-#include "radiobutton.qc"
-#include "slider.qc"
-#include "tab.qc"
-#include "textslider.qc"
+#include <menu/item/borderimage.qc>
+#include <menu/item/button.qc>
+#include <menu/item/checkbox.qc>
+#include <menu/item/container.qc>
+#include <menu/item/dialog.qc>
+#include <menu/item/image.qc>
+#include <menu/item/inputbox.qc>
+#include <menu/item/inputcontainer.qc>
+#include <menu/item/label.qc>
+#include <menu/item/listbox.qc>
+#include <menu/item/modalcontroller.qc>
+#include <menu/item/nexposee.qc>
+#include <menu/item/radiobutton.qc>
+#include <menu/item/slider.qc>
+#include <menu/item/tab.qc>
+#include <menu/item/textslider.qc>
--- /dev/null
+// generated file; do not modify
+#include <menu/item/borderimage.qh>
+#include <menu/item/button.qh>
+#include <menu/item/checkbox.qh>
+#include <menu/item/container.qh>
+#include <menu/item/dialog.qh>
+#include <menu/item/image.qh>
+#include <menu/item/inputbox.qh>
+#include <menu/item/inputcontainer.qh>
+#include <menu/item/label.qh>
+#include <menu/item/listbox.qh>
+#include <menu/item/modalcontroller.qh>
+#include <menu/item/nexposee.qh>
+#include <menu/item/radiobutton.qh>
+#include <menu/item/slider.qh>
+#include <menu/item/tab.qh>
+#include <menu/item/textslider.qh>
--- /dev/null
+var void MX_Handle(int buf, string ancestor)
+{
+ string type = json_get(buf, strcat(ancestor, ".type"));
+ switch (type) {
+ case "m.typing": {
+ string arr = strcat(ancestor, ".content.user_ids");
+ for (int i = 0, n = stof(json_get(buf, sprintf("%s.length", arr))); i < n; ++i) {
+ string s = json_get(buf, sprintf("%s.%d", arr, i));
+ print("\{1}", s, " is typing...\n");
+ }
+ break;
+ }
+ case "m.room.message": {
+ string msgtype = json_get(buf, strcat(ancestor, ".content.msgtype"));
+ switch (msgtype) {
+ case "m.text": {
+ string sender = json_get(buf, strcat(ancestor, ".sender"));
+ string body = json_get(buf, strcat(ancestor, ".content.body"));
+ if (body) print("\{1}", sender, ": ", body, "\n");
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
--- /dev/null
+// generated file; do not modify
#include <lib/_all.inc>
-#include "_mod.inc"
+#include "../menu/_mod.inc"
#include "anim/_mod.inc"
#include "command/_mod.inc"
#include "item/_mod.inc"
// generated file; do not modify
-#include "bigbutton.qc"
-#include "bigcommandbutton.qc"
-#include "button.qc"
-#include "campaign.qc"
-#include "charmap.qc"
-#include "checkbox.qc"
-#include "checkbox_slider_invalid.qc"
-#include "checkbox_string.qc"
-#include "colorbutton.qc"
-#include "colorpicker.qc"
-#include "colorpicker_string.qc"
-#include "commandbutton.qc"
-#include "credits.qc"
-#include "crosshairpicker.qc"
-#include "crosshairpreview.qc"
-#include "cvarlist.qc"
-#include "datasource.qc"
-#include "demolist.qc"
-#include "dialog.qc"
-#include "dialog_credits.qc"
-#include "dialog_firstrun.qc"
-#include "dialog_hudpanel_ammo.qc"
-#include "dialog_hudpanel_centerprint.qc"
-#include "dialog_hudpanel_chat.qc"
-#include "dialog_hudpanel_engineinfo.qc"
-#include "dialog_hudpanel_healtharmor.qc"
-#include "dialog_hudpanel_infomessages.qc"
-#include "dialog_hudpanel_itemstime.qc"
-#include "dialog_hudpanel_modicons.qc"
-#include "dialog_hudpanel_notification.qc"
-#include "dialog_hudpanel_physics.qc"
-#include "dialog_hudpanel_powerups.qc"
-#include "dialog_hudpanel_pressedkeys.qc"
-#include "dialog_hudpanel_quickmenu.qc"
-#include "dialog_hudpanel_racetimer.qc"
-#include "dialog_hudpanel_radar.qc"
-#include "dialog_hudpanel_score.qc"
-#include "dialog_hudpanel_timer.qc"
-#include "dialog_hudpanel_vote.qc"
-#include "dialog_hudpanel_weapons.qc"
-#include "dialog_hudsetup_exit.qc"
-#include "dialog_monstertools.qc"
-#include "dialog_multiplayer.qc"
-#include "dialog_multiplayer_create.qc"
-#include "dialog_multiplayer_create_mapinfo.qc"
-#include "dialog_multiplayer_create_mutators.qc"
-#include "dialog_multiplayer_join.qc"
-#include "dialog_multiplayer_join_serverinfo.qc"
-#include "dialog_multiplayer_media.qc"
-#include "dialog_multiplayer_media_demo.qc"
-#include "dialog_multiplayer_media_demo_startconfirm.qc"
-#include "dialog_multiplayer_media_demo_timeconfirm.qc"
-#include "dialog_multiplayer_media_musicplayer.qc"
-#include "dialog_multiplayer_media_screenshot.qc"
-#include "dialog_multiplayer_media_screenshot_viewer.qc"
-#include "dialog_multiplayer_profile.qc"
-#include "dialog_quit.qc"
-#include "dialog_sandboxtools.qc"
-#include "dialog_settings.qc"
-#include "dialog_settings_audio.qc"
-#include "dialog_settings_effects.qc"
-#include "dialog_settings_game.qc"
-#include "dialog_settings_game_crosshair.qc"
-#include "dialog_settings_game_hud.qc"
-#include "dialog_settings_game_hudconfirm.qc"
-#include "dialog_settings_game_messages.qc"
-#include "dialog_settings_game_model.qc"
-#include "dialog_settings_game_view.qc"
-#include "dialog_settings_game_weapons.qc"
-#include "dialog_settings_input.qc"
-#include "dialog_settings_input_userbind.qc"
-#include "dialog_settings_misc.qc"
-#include "dialog_settings_misc_cvars.qc"
-#include "dialog_settings_misc_reset.qc"
-#include "dialog_settings_user.qc"
-#include "dialog_settings_user_languagewarning.qc"
-#include "dialog_settings_video.qc"
-#include "dialog_singleplayer.qc"
-#include "dialog_singleplayer_winner.qc"
-#include "dialog_teamselect.qc"
-#include "gametypelist.qc"
-#include "hudskinlist.qc"
-#include "image.qc"
-#include "inputbox.qc"
-#include "keybinder.qc"
-#include "languagelist.qc"
-#include "listbox.qc"
-#include "mainwindow.qc"
-#include "maplist.qc"
-#include "nexposee.qc"
-#include "picker.qc"
-#include "playerlist.qc"
-#include "playermodel.qc"
-#include "playlist.qc"
-#include "radiobutton.qc"
-#include "rootdialog.qc"
-#include "screenshotimage.qc"
-#include "screenshotlist.qc"
-#include "serverlist.qc"
-#include "skinlist.qc"
-#include "slider.qc"
-#include "slider_decibels.qc"
-#include "slider_particles.qc"
-#include "slider_picmip.qc"
-#include "slider_resolution.qc"
-#include "slider_sbfadetime.qc"
-#include "soundlist.qc"
-#include "statslist.qc"
-#include "tab.qc"
-#include "tabcontroller.qc"
-#include "textlabel.qc"
-#include "textslider.qc"
-#include "util.qc"
-#include "weaponarenacheckbox.qc"
-#include "weaponslist.qc"
+#include <menu/xonotic/bigbutton.qc>
+#include <menu/xonotic/bigcommandbutton.qc>
+#include <menu/xonotic/button.qc>
+#include <menu/xonotic/campaign.qc>
+#include <menu/xonotic/charmap.qc>
+#include <menu/xonotic/checkbox.qc>
+#include <menu/xonotic/checkbox_slider_invalid.qc>
+#include <menu/xonotic/checkbox_string.qc>
+#include <menu/xonotic/colorbutton.qc>
+#include <menu/xonotic/colorpicker.qc>
+#include <menu/xonotic/colorpicker_string.qc>
+#include <menu/xonotic/commandbutton.qc>
+#include <menu/xonotic/credits.qc>
+#include <menu/xonotic/crosshairpicker.qc>
+#include <menu/xonotic/crosshairpreview.qc>
+#include <menu/xonotic/cvarlist.qc>
+#include <menu/xonotic/datasource.qc>
+#include <menu/xonotic/demolist.qc>
+#include <menu/xonotic/dialog.qc>
+#include <menu/xonotic/dialog_credits.qc>
+#include <menu/xonotic/dialog_firstrun.qc>
+#include <menu/xonotic/dialog_hudpanel_ammo.qc>
+#include <menu/xonotic/dialog_hudpanel_centerprint.qc>
+#include <menu/xonotic/dialog_hudpanel_chat.qc>
+#include <menu/xonotic/dialog_hudpanel_engineinfo.qc>
+#include <menu/xonotic/dialog_hudpanel_healtharmor.qc>
+#include <menu/xonotic/dialog_hudpanel_infomessages.qc>
+#include <menu/xonotic/dialog_hudpanel_itemstime.qc>
+#include <menu/xonotic/dialog_hudpanel_modicons.qc>
+#include <menu/xonotic/dialog_hudpanel_notification.qc>
+#include <menu/xonotic/dialog_hudpanel_physics.qc>
+#include <menu/xonotic/dialog_hudpanel_powerups.qc>
+#include <menu/xonotic/dialog_hudpanel_pressedkeys.qc>
+#include <menu/xonotic/dialog_hudpanel_quickmenu.qc>
+#include <menu/xonotic/dialog_hudpanel_racetimer.qc>
+#include <menu/xonotic/dialog_hudpanel_radar.qc>
+#include <menu/xonotic/dialog_hudpanel_score.qc>
+#include <menu/xonotic/dialog_hudpanel_timer.qc>
+#include <menu/xonotic/dialog_hudpanel_vote.qc>
+#include <menu/xonotic/dialog_hudpanel_weapons.qc>
+#include <menu/xonotic/dialog_hudsetup_exit.qc>
+#include <menu/xonotic/dialog_monstertools.qc>
+#include <menu/xonotic/dialog_multiplayer.qc>
+#include <menu/xonotic/dialog_multiplayer_create.qc>
+#include <menu/xonotic/dialog_multiplayer_create_mapinfo.qc>
+#include <menu/xonotic/dialog_multiplayer_create_mutators.qc>
+#include <menu/xonotic/dialog_multiplayer_join.qc>
+#include <menu/xonotic/dialog_multiplayer_join_serverinfo.qc>
+#include <menu/xonotic/dialog_multiplayer_media.qc>
+#include <menu/xonotic/dialog_multiplayer_media_demo.qc>
+#include <menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc>
+#include <menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc>
+#include <menu/xonotic/dialog_multiplayer_media_musicplayer.qc>
+#include <menu/xonotic/dialog_multiplayer_media_screenshot.qc>
+#include <menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc>
+#include <menu/xonotic/dialog_multiplayer_profile.qc>
+#include <menu/xonotic/dialog_quit.qc>
+#include <menu/xonotic/dialog_sandboxtools.qc>
+#include <menu/xonotic/dialog_settings.qc>
+#include <menu/xonotic/dialog_settings_audio.qc>
+#include <menu/xonotic/dialog_settings_effects.qc>
+#include <menu/xonotic/dialog_settings_game.qc>
+#include <menu/xonotic/dialog_settings_game_crosshair.qc>
+#include <menu/xonotic/dialog_settings_game_hud.qc>
+#include <menu/xonotic/dialog_settings_game_hudconfirm.qc>
+#include <menu/xonotic/dialog_settings_game_messages.qc>
+#include <menu/xonotic/dialog_settings_game_model.qc>
+#include <menu/xonotic/dialog_settings_game_view.qc>
+#include <menu/xonotic/dialog_settings_game_weapons.qc>
+#include <menu/xonotic/dialog_settings_input.qc>
+#include <menu/xonotic/dialog_settings_input_userbind.qc>
+#include <menu/xonotic/dialog_settings_misc.qc>
+#include <menu/xonotic/dialog_settings_misc_cvars.qc>
+#include <menu/xonotic/dialog_settings_misc_reset.qc>
+#include <menu/xonotic/dialog_settings_user.qc>
+#include <menu/xonotic/dialog_settings_user_languagewarning.qc>
+#include <menu/xonotic/dialog_settings_video.qc>
+#include <menu/xonotic/dialog_singleplayer.qc>
+#include <menu/xonotic/dialog_singleplayer_winner.qc>
+#include <menu/xonotic/dialog_teamselect.qc>
+#include <menu/xonotic/gametypelist.qc>
+#include <menu/xonotic/hudskinlist.qc>
+#include <menu/xonotic/image.qc>
+#include <menu/xonotic/inputbox.qc>
+#include <menu/xonotic/keybinder.qc>
+#include <menu/xonotic/languagelist.qc>
+#include <menu/xonotic/listbox.qc>
+#include <menu/xonotic/mainwindow.qc>
+#include <menu/xonotic/maplist.qc>
+#include <menu/xonotic/nexposee.qc>
+#include <menu/xonotic/picker.qc>
+#include <menu/xonotic/playerlist.qc>
+#include <menu/xonotic/playermodel.qc>
+#include <menu/xonotic/playlist.qc>
+#include <menu/xonotic/radiobutton.qc>
+#include <menu/xonotic/rootdialog.qc>
+#include <menu/xonotic/screenshotimage.qc>
+#include <menu/xonotic/screenshotlist.qc>
+#include <menu/xonotic/serverlist.qc>
+#include <menu/xonotic/skinlist.qc>
+#include <menu/xonotic/slider.qc>
+#include <menu/xonotic/slider_decibels.qc>
+#include <menu/xonotic/slider_particles.qc>
+#include <menu/xonotic/slider_picmip.qc>
+#include <menu/xonotic/slider_resolution.qc>
+#include <menu/xonotic/slider_sbfadetime.qc>
+#include <menu/xonotic/soundlist.qc>
+#include <menu/xonotic/statslist.qc>
+#include <menu/xonotic/tab.qc>
+#include <menu/xonotic/tabcontroller.qc>
+#include <menu/xonotic/textlabel.qc>
+#include <menu/xonotic/textslider.qc>
+#include <menu/xonotic/util.qc>
+#include <menu/xonotic/weaponarenacheckbox.qc>
+#include <menu/xonotic/weaponslist.qc>
--- /dev/null
+// generated file; do not modify
+#include <menu/xonotic/bigbutton.qh>
+#include <menu/xonotic/bigcommandbutton.qh>
+#include <menu/xonotic/button.qh>
+#include <menu/xonotic/campaign.qh>
+#include <menu/xonotic/charmap.qh>
+#include <menu/xonotic/checkbox.qh>
+#include <menu/xonotic/checkbox_slider_invalid.qh>
+#include <menu/xonotic/checkbox_string.qh>
+#include <menu/xonotic/colorbutton.qh>
+#include <menu/xonotic/colorpicker.qh>
+#include <menu/xonotic/colorpicker_string.qh>
+#include <menu/xonotic/commandbutton.qh>
+#include <menu/xonotic/credits.qh>
+#include <menu/xonotic/crosshairpicker.qh>
+#include <menu/xonotic/crosshairpreview.qh>
+#include <menu/xonotic/cvarlist.qh>
+#include <menu/xonotic/datasource.qh>
+#include <menu/xonotic/demolist.qh>
+#include <menu/xonotic/dialog.qh>
+#include <menu/xonotic/dialog_credits.qh>
+#include <menu/xonotic/dialog_firstrun.qh>
+#include <menu/xonotic/dialog_hudpanel_ammo.qh>
+#include <menu/xonotic/dialog_hudpanel_centerprint.qh>
+#include <menu/xonotic/dialog_hudpanel_chat.qh>
+#include <menu/xonotic/dialog_hudpanel_engineinfo.qh>
+#include <menu/xonotic/dialog_hudpanel_healtharmor.qh>
+#include <menu/xonotic/dialog_hudpanel_infomessages.qh>
+#include <menu/xonotic/dialog_hudpanel_itemstime.qh>
+#include <menu/xonotic/dialog_hudpanel_modicons.qh>
+#include <menu/xonotic/dialog_hudpanel_notification.qh>
+#include <menu/xonotic/dialog_hudpanel_physics.qh>
+#include <menu/xonotic/dialog_hudpanel_powerups.qh>
+#include <menu/xonotic/dialog_hudpanel_pressedkeys.qh>
+#include <menu/xonotic/dialog_hudpanel_quickmenu.qh>
+#include <menu/xonotic/dialog_hudpanel_racetimer.qh>
+#include <menu/xonotic/dialog_hudpanel_radar.qh>
+#include <menu/xonotic/dialog_hudpanel_score.qh>
+#include <menu/xonotic/dialog_hudpanel_timer.qh>
+#include <menu/xonotic/dialog_hudpanel_vote.qh>
+#include <menu/xonotic/dialog_hudpanel_weapons.qh>
+#include <menu/xonotic/dialog_hudsetup_exit.qh>
+#include <menu/xonotic/dialog_monstertools.qh>
+#include <menu/xonotic/dialog_multiplayer.qh>
+#include <menu/xonotic/dialog_multiplayer_create.qh>
+#include <menu/xonotic/dialog_multiplayer_create_mapinfo.qh>
+#include <menu/xonotic/dialog_multiplayer_create_mutators.qh>
+#include <menu/xonotic/dialog_multiplayer_join.qh>
+#include <menu/xonotic/dialog_multiplayer_join_serverinfo.qh>
+#include <menu/xonotic/dialog_multiplayer_media.qh>
+#include <menu/xonotic/dialog_multiplayer_media_demo.qh>
+#include <menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh>
+#include <menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qh>
+#include <menu/xonotic/dialog_multiplayer_media_musicplayer.qh>
+#include <menu/xonotic/dialog_multiplayer_media_screenshot.qh>
+#include <menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qh>
+#include <menu/xonotic/dialog_multiplayer_profile.qh>
+#include <menu/xonotic/dialog_quit.qh>
+#include <menu/xonotic/dialog_sandboxtools.qh>
+#include <menu/xonotic/dialog_settings.qh>
+#include <menu/xonotic/dialog_settings_audio.qh>
+#include <menu/xonotic/dialog_settings_effects.qh>
+#include <menu/xonotic/dialog_settings_game.qh>
+#include <menu/xonotic/dialog_settings_game_crosshair.qh>
+#include <menu/xonotic/dialog_settings_game_hud.qh>
+#include <menu/xonotic/dialog_settings_game_hudconfirm.qh>
+#include <menu/xonotic/dialog_settings_game_messages.qh>
+#include <menu/xonotic/dialog_settings_game_model.qh>
+#include <menu/xonotic/dialog_settings_game_view.qh>
+#include <menu/xonotic/dialog_settings_game_weapons.qh>
+#include <menu/xonotic/dialog_settings_input.qh>
+#include <menu/xonotic/dialog_settings_input_userbind.qh>
+#include <menu/xonotic/dialog_settings_misc.qh>
+#include <menu/xonotic/dialog_settings_misc_cvars.qh>
+#include <menu/xonotic/dialog_settings_misc_reset.qh>
+#include <menu/xonotic/dialog_settings_user.qh>
+#include <menu/xonotic/dialog_settings_user_languagewarning.qh>
+#include <menu/xonotic/dialog_settings_video.qh>
+#include <menu/xonotic/dialog_singleplayer.qh>
+#include <menu/xonotic/dialog_singleplayer_winner.qh>
+#include <menu/xonotic/dialog_teamselect.qh>
+#include <menu/xonotic/gametypelist.qh>
+#include <menu/xonotic/hudskinlist.qh>
+#include <menu/xonotic/image.qh>
+#include <menu/xonotic/inputbox.qh>
+#include <menu/xonotic/keybinder.qh>
+#include <menu/xonotic/languagelist.qh>
+#include <menu/xonotic/listbox.qh>
+#include <menu/xonotic/mainwindow.qh>
+#include <menu/xonotic/maplist.qh>
+#include <menu/xonotic/nexposee.qh>
+#include <menu/xonotic/picker.qh>
+#include <menu/xonotic/playerlist.qh>
+#include <menu/xonotic/playermodel.qh>
+#include <menu/xonotic/playlist.qh>
+#include <menu/xonotic/radiobutton.qh>
+#include <menu/xonotic/rootdialog.qh>
+#include <menu/xonotic/screenshotimage.qh>
+#include <menu/xonotic/screenshotlist.qh>
+#include <menu/xonotic/serverlist.qh>
+#include <menu/xonotic/skinlist.qh>
+#include <menu/xonotic/slider.qh>
+#include <menu/xonotic/slider_decibels.qh>
+#include <menu/xonotic/slider_particles.qh>
+#include <menu/xonotic/slider_picmip.qh>
+#include <menu/xonotic/slider_resolution.qh>
+#include <menu/xonotic/slider_sbfadetime.qh>
+#include <menu/xonotic/soundlist.qh>
+#include <menu/xonotic/statslist.qh>
+#include <menu/xonotic/tab.qh>
+#include <menu/xonotic/tabcontroller.qh>
+#include <menu/xonotic/textlabel.qh>
+#include <menu/xonotic/textslider.qh>
+#include <menu/xonotic/util.qh>
+#include <menu/xonotic/weaponarenacheckbox.qh>
+#include <menu/xonotic/weaponslist.qh>
return;
if(me.checked)
- cvar_set(me.cvarName, ftos(me.yesValue));
+ cvar_set(me.cvarName, ftos_mindecimals(me.yesValue));
else
- cvar_set(me.cvarName, ftos(me.noValue));
+ cvar_set(me.cvarName, ftos_mindecimals(me.noValue));
CheckSendCvars(me, me.cvarName);
}
me.handle = buf_create();
me.nItems = 0;
}
+void CvarList_Load(entity me, string filter)
+{
+ if(me.handle < 0)
+ return;
+
+ buf_cvarlist(me.handle, filter, "_");
+ me.nItems = buf_getsize(me.handle);
+ if(autocvar_menu_cvarlist_onlymodified)
+ {
+ float newbuf = buf_create();
+ for (int i = 0; i < me.nItems; ++i)
+ {
+ string k = bufstr_get(me.handle, i);
+ if(cvar_string(k) != cvar_defstring(k))
+ bufstr_add(newbuf, k, false);
+ }
+ buf_del(me.handle);
+ me.handle = newbuf;
+ me.nItems = buf_getsize(me.handle);
+ }
+}
void XonoticCvarList_showNotify(entity me)
{
bool force_initial_selection = false;
if(me.handle >= 0 && me.nItems <= 0) // me.handle not loaded yet?
force_initial_selection = true;
- buf_cvarlist(me.handle, "", "_");
- me.nItems = buf_getsize(me.handle);
+ CvarList_Load(me, me.controlledTextbox.text);
if(force_initial_selection)
me.setSelected(me, 0);
}
+void XonoticCvarList_hideNotify(entity me)
+{
+ if(me.handle)
+ buf_del(me.handle);
+ me.handle = buf_create();
+ me.nItems = 0;
+}
void XonoticCvarList_destroy(entity me)
{
- buf_del(me.handle);
+ if(me.handle)
+ buf_del(me.handle);
}
string autocvar_menu_forced_saved_cvars;
string autocvar_menu_reverted_nonsaved_cvars;
}
void CvarList_Filter_Change(entity box, entity me)
{
- buf_cvarlist(me.handle, box.text, "_");
- me.nItems = buf_getsize(me.handle);
-
+ CvarList_Load(me, box.text);
+ me.setSelected(me, 0);
+}
+void CvarList_Filter_ModifiedCvars(entity box, entity me)
+{
+ cvar_set("menu_cvarlist_onlymodified", ftos(!autocvar_menu_cvarlist_onlymodified));
+ box.setChecked(box, autocvar_menu_cvarlist_onlymodified);
+ CvarList_Load(me, me.controlledTextbox.text);
me.setSelected(me, 0);
}
void XonoticCvarList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
METHOD(XonoticCvarList, resizeNotify, void(entity, vector, vector, vector, vector));
METHOD(XonoticCvarList, keyDown, float(entity, float, float, float));
METHOD(XonoticCvarList, showNotify, void(entity));
+ METHOD(XonoticCvarList, hideNotify, void(entity));
METHOD(XonoticCvarList, destroy, void(entity));
ENDCLASS(XonoticCvarList)
entity makeXonoticCvarList();
void CvarList_Filter_Change(entity box, entity me);
+void CvarList_Filter_ModifiedCvars(entity box, entity me);
void CvarList_Value_Change(entity box, entity me);
void CvarList_Revert_Click(entity btn, entity me);
void CvarList_End_Editing(entity box, entity me);
+
+float autocvar_menu_cvarlist_onlymodified;
DIALOG_HUDPANEL_COMMON();
+ me.TR(me);
+ me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_combined", _("Combine health and armor")));
me.TR(me);
me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "hud_panel_healtharmor_progressbar", _("Enable status bar")));
me.TR(me);
ATTRIB(XonoticHUDHealthArmorDialog, title, string, _("Health/Armor Panel"))
ATTRIB(XonoticHUDHealthArmorDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
ATTRIB(XonoticHUDHealthArmorDialog, intendedWidth, float, 0.4)
- ATTRIB(XonoticHUDHealthArmorDialog, rows, float, 15)
+ ATTRIB(XonoticHUDHealthArmorDialog, rows, float, 16)
ATTRIB(XonoticHUDHealthArmorDialog, columns, float, 4)
ATTRIB(XonoticHUDHealthArmorDialog, name, string, "HUDhealtharmor")
ATTRIB(XonoticHUDHealthArmorDialog, requiresConnection, float, true)
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Weapon ID scale:")));
+ setDependent(e, "hud_panel_weapons_label", 1, 2);
me.TD(me, 1, 2.4, e = makeXonoticSlider(0.1, 1, 0.05, "hud_panel_weapons_label_scale"));
setDependent(e, "hud_panel_weapons_label", 1, 2);
me.TR(me);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.4, e = makeXonoticTextLabel(0, _("Ammo bar alpha:")));
+ setDependent(e, "hud_panel_weapons_ammo", 1, 1);
me.TD(me, 1, 2.4, e = makeXonoticSlider(0.1, 1, 0.1, "hud_panel_weapons_ammo_alpha"));
setDependent(e, "hud_panel_weapons_ammo", 1, 1);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Ammo bar color:")));
+ setDependent(e, "hud_panel_weapons_ammo", 1, 1);
me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_weapons_ammo_color", "hud_panel_weapons_ammo_color"));
setDependent(e, "hud_panel_weapons_ammo", 1, 1);
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(1, "mod_q3bsp_nolightmaps", _("Use lightmaps"),
_("Use high resolution lightmaps, which will look pretty but use up some extra video memory (default: enabled)")));
+ e.applyButton = effectsApplyButton;
me.TD(me, 1, 1, e = makeXonoticCheckBox_T(0, "r_glsl_deluxemapping", _("Deluxe mapping"),
_("Use per-pixel lighting effects (default: enabled)")));
setDependentAND(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
setDependent(e, "crosshair_enabled", 1, 2);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Hit testing:")));
+ setDependent(e, "crosshair_enabled", 1, 2);
me.TD(me, 1, 2, e = makeXonoticTextSlider_T("crosshair_hittest",
_("None: do not do hit tests for the crosshair; TrueAim: blur the crosshair when you would not hit the wall; Enemies: also enlarge the crosshair when you would hit an enemy")));
e.addValue(e, ZCTX(_("HTTST^Disabled")), "0");
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Cvar filter:")));
- me.TD(me, 1, me.columns - 1, e = makeXonoticInputBox(0, string_null));
- e.color = SKINCOLOR_CVARLIST_CONTROLS;
- e.colorF = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_color = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_colorC = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_colorF = SKINCOLOR_CVARLIST_CONTROLS;
+ me.TD(me, 1, 3, e = makeXonoticInputBox(0, string_null));
+ e.color = e.colorF = SKINCOLOR_CVARLIST_CONTROLS;
+ e.cb_color = e.cb_colorC = e.cb_colorF = SKINCOLOR_CVARLIST_CONTROLS;
e.onChange = CvarList_Filter_Change;
e.onChangeEntity = cvarlist;
cvarlist.controlledTextbox = e; // this COULD also be the Value box, but this leads to accidentally editing stuff
+ me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "menu_cvarlist_onlymodified", _("Modified cvars only")));
+ e.color = e.colorC = e.colorF = e.colorD = SKINCOLOR_CVARLIST_CONTROLS;
+ e.onClickEntity = cvarlist;
+ e.onClick = CvarList_Filter_ModifiedCvars;
me.TR(me);
me.TD(me, me.rows - me.currentRow - 9, me.columns, cvarlist);
me.gotoRC(me, me.rows - 8, 0);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Value:")));
me.TD(me, 1, me.columns - 2, e = makeXonoticInputBox(0, string_null));
cvarlist.cvarValueBox = e;
- e.color = SKINCOLOR_CVARLIST_CONTROLS;
- e.colorF = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_color = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_colorC = SKINCOLOR_CVARLIST_CONTROLS;
- e.cb_colorF = SKINCOLOR_CVARLIST_CONTROLS;
+ e.color = e.colorF = SKINCOLOR_CVARLIST_CONTROLS;
+ e.cb_color = e.cb_colorC = e.cb_colorF = SKINCOLOR_CVARLIST_CONTROLS;
e.onChange = CvarList_Value_Change;
e.onChangeEntity = cvarlist;
e.onEnter = CvarList_End_Editing;
e.addValue(e, _("4x"), "4");
e.configureXonoticTextSliderValues(e);
setDependent(e, "r_viewfbo", 0, 0);
+ e.applyButton = videoApplyButton;
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(2, 0, "r_viewfbo", _("High-quality frame buffer")));
setDependent(e, "vid_samples", 1, 1);
_("Make the CPU wait for the GPU to finish each frame, can help with some strange input or video lag on some machines (default: disabled)")));
me.TR(me);
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_gl20", _("Use OpenGL 2.0 shaders (GLSL)")));
+ e.applyButton = videoApplyButton;
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 2.8, e = makeXonoticCheckBox_T(0, "v_glslgamma", _("Use GLSL to handle color control"),
if (!me.cvarName)
return;
- cvar_set(me.cvarName, ftos(me.value));
+ cvar_set(me.cvarName, ftos_mindecimals(me.value));
CheckSendCvars(me, me.cvarName);
}
// generated file; do not modify
-#include "anticheat.qc"
-#include "antilag.qc"
-#include "campaign.qc"
-#include "cheats.qc"
-#include "cl_client.qc"
-#include "cl_impulse.qc"
-#include "cl_player.qc"
-#include "g_damage.qc"
-#include "g_hook.qc"
-#include "g_lights.qc"
-#include "g_models.qc"
-#include "g_subs.qc"
-#include "g_world.qc"
-#include "ipban.qc"
-#include "item_key.qc"
-#include "mapvoting.qc"
-#include "miscfunctions.qc"
-#include "playerdemo.qc"
-#include "portals.qc"
-#include "race.qc"
-#include "round_handler.qc"
-#include "scores.qc"
-#include "scores_rules.qc"
-#include "spawnpoints.qc"
-#include "steerlib.qc"
-#include "sv_main.qc"
-#include "teamplay.qc"
-#include "tests.qc"
-#include "t_halflife.qc"
-#include "t_quake.qc"
-#include "t_quake3.qc"
+#include <server/anticheat.qc>
+#include <server/antilag.qc>
+#include <server/campaign.qc>
+#include <server/cheats.qc>
+#include <server/cl_client.qc>
+#include <server/cl_impulse.qc>
+#include <server/cl_player.qc>
+#include <server/g_damage.qc>
+#include <server/g_hook.qc>
+#include <server/g_lights.qc>
+#include <server/g_models.qc>
+#include <server/g_subs.qc>
+#include <server/g_world.qc>
+#include <server/ipban.qc>
+#include <server/item_key.qc>
+#include <server/mapvoting.qc>
+#include <server/matrix.qc>
+#include <server/miscfunctions.qc>
+#include <server/playerdemo.qc>
+#include <server/portals.qc>
+#include <server/race.qc>
+#include <server/round_handler.qc>
+#include <server/scores.qc>
+#include <server/scores_rules.qc>
+#include <server/spawnpoints.qc>
+#include <server/steerlib.qc>
+#include <server/sv_main.qc>
+#include <server/teamplay.qc>
+#include <server/tests.qc>
+#include <server/t_halflife.qc>
+#include <server/t_quake.qc>
+#include <server/t_quake3.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/anticheat.qh>
+#include <server/antilag.qh>
+#include <server/campaign.qh>
+#include <server/cheats.qh>
+#include <server/cl_client.qh>
+#include <server/cl_impulse.qh>
+#include <server/cl_player.qh>
+#include <server/g_damage.qh>
+#include <server/g_hook.qh>
+#include <server/g_lights.qh>
+#include <server/g_models.qh>
+#include <server/g_subs.qh>
+#include <server/g_world.qh>
+#include <server/ipban.qh>
+#include <server/item_key.qh>
+#include <server/mapvoting.qh>
+#include <server/matrix.qh>
+#include <server/miscfunctions.qh>
+#include <server/playerdemo.qh>
+#include <server/portals.qh>
+#include <server/race.qh>
+#include <server/round_handler.qh>
+#include <server/scores.qh>
+#include <server/scores_rules.qh>
+#include <server/spawnpoints.qh>
+#include <server/steerlib.qh>
+#include <server/sv_main.qh>
+#include <server/teamplay.qh>
+#include <server/tests.qh>
+#include <server/t_halflife.qh>
+#include <server/t_quake.qh>
+#include <server/t_quake3.qh>
bool autocvar_g_instagib_damagedbycontents = true;
bool autocvar_g_instagib_blaster_keepdamage = false;
bool autocvar_g_instagib_blaster_keepforce = false;
+bool autocvar_g_instagib_mirrordamage;
+bool autocvar_g_instagib_friendlypush = true;
#define autocvar_g_mirrordamage cvar("g_mirrordamage")
#define autocvar_g_mirrordamage_virtual cvar("g_mirrordamage_virtual")
+bool autocvar_g_mirrordamage_onlyweapons;
float autocvar_g_movement_highspeed = 1;
string autocvar_g_mutatormsg;
bool autocvar_sv_curl_serverpackages_auto;
bool autocvar_sv_db_saveasdump;
bool autocvar_sv_defaultcharacter;
+bool autocvar_sv_defaultcharacterskin;
string autocvar_sv_defaultplayercolors;
string autocvar_sv_defaultplayermodel;
string autocvar_sv_defaultplayermodel_blue;
// generated file; do not modify
-#include "aim.qc"
-#include "bot.qc"
-#include "navigation.qc"
-#include "scripting.qc"
-#include "waypoints.qc"
+#include <server/bot/aim.qc>
+#include <server/bot/bot.qc>
+#include <server/bot/navigation.qc>
+#include <server/bot/scripting.qc>
+#include <server/bot/waypoints.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/bot/aim.qh>
+#include <server/bot/bot.qh>
+#include <server/bot/navigation.qh>
+#include <server/bot/scripting.qh>
+#include <server/bot/waypoints.qh>
}
this.bot_aimtarg = e1;
this.bot_aimlatency = this.ping; // FIXME? Shouldn't this be in the lag item?
- this.bot_aimselforigin = v1;
- this.bot_aimselfvelocity = v2;
+ //this.bot_aimselforigin = v1;
+ //this.bot_aimselfvelocity = v2;
this.bot_aimtargorigin = v3;
this.bot_aimtargvelocity = v4;
if(skill <= 0)
.vector bot_5th_order_aimfilter;
.vector bot_olddesiredang;
-.vector bot_aimselforigin;
-.vector bot_aimselfvelocity;
+//.vector bot_aimselforigin;
+//.vector bot_aimselfvelocity;
.vector bot_aimtargorigin;
.vector bot_aimtargvelocity;
// generated file; do not modify
-#include "havocbot.qc"
-#include "roles.qc"
+#include <server/bot/havocbot/havocbot.qc>
+#include <server/bot/havocbot/roles.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/bot/havocbot/havocbot.qh>
+#include <server/bot/havocbot/roles.qh>
void havocbot_aim(entity this)
{
- vector selfvel, enemyvel;
+ vector myvel, enemyvel;
// if(this.flags & FL_INWATER)
// return;
if (time < this.nextaim)
return;
this.nextaim = time + 0.1;
- selfvel = this.velocity;
+ myvel = this.velocity;
if (!this.waterlevel)
- selfvel.z = 0;
+ myvel.z = 0;
if (this.enemy)
{
enemyvel = this.enemy.velocity;
if (!this.enemy.waterlevel)
enemyvel.z = 0;
- lag_additem(this, time + this.ping, 0, 0, this.enemy, this.origin, selfvel, (this.enemy.absmin + this.enemy.absmax) * 0.5, enemyvel);
+ lag_additem(this, time + this.ping, 0, 0, this.enemy, this.origin, myvel, (this.enemy.absmin + this.enemy.absmax) * 0.5, enemyvel);
}
else
- lag_additem(this, time + this.ping, 0, 0, world, this.origin, selfvel, ( this.goalcurrent.absmin + this.goalcurrent.absmax ) * 0.5, '0 0 0');
+ lag_additem(this, time + this.ping, 0, 0, world, this.origin, myvel, ( this.goalcurrent.absmin + this.goalcurrent.absmax ) * 0.5, '0 0 0');
}
bool havocbot_moveto_refresh_route(entity this)
// LordHavoc: disabled because this is too expensive
return '0 0 0';
#if 0
+SELFPARAM();
entity head;
vector dodge, v, n;
float danger, bestdanger, vl, d;
head = findchainfloat(bot_dodge, true);
while(head)
{
- if (head.owner != self)
+ if (head.owner != this)
{
vl = vlen(head.velocity);
if (vl > autocvar_sv_maxspeed * 0.3)
{
n = normalize(head.velocity);
- v = self.origin - head.origin;
+ v = this.origin - head.origin;
d = v * n;
if (d > (0 - head.bot_dodgerating))
if (d < (vl * 0.2 + head.bot_dodgerating))
}
else
{
- danger = head.bot_dodgerating - vlen(head.origin - self.origin);
+ danger = head.bot_dodgerating - vlen(head.origin - this.origin);
if (bestdanger < danger)
{
bestdanger = danger;
- dodge = normalize(self.origin - head.origin);
+ dodge = normalize(this.origin - head.origin);
}
}
}
// rough simulation of walking from one point to another to test if a path
// can be traveled, used for waypoint linking and havocbot
-float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode)
-{SELFPARAM();
+bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode)
+{
vector org;
vector move;
vector dir;
if(autocvar_bot_debug_tracewalk)
{
debugresetnodes();
- debugnode(self, start);
+ debugnode(e, start);
}
move = end - start;
return true;
}
if(autocvar_bot_debug_tracewalk)
- debugnode(self, org);
+ debugnode(e, org);
if (dist <= 0)
break;
tracebox(org, m1, m2, org + move * stepdist, movemode, e);
if(autocvar_bot_debug_tracewalk)
- debugnode(self, trace_endpos);
+ debugnode(e, trace_endpos);
if (trace_fraction < 1)
{
swimming = true;
org = trace_endpos - normalize(org - trace_endpos) * stepdist;
- for (; org.z < end.z + self.maxs.z; org.z += stepdist)
+ for (; org.z < end.z + e.maxs.z; org.z += stepdist)
{
if(autocvar_bot_debug_tracewalk)
- debugnode(self, org);
+ debugnode(e, org);
if(pointcontents(org) == CONTENT_EMPTY)
break;
tracebox(org, m1, m2, move, movemode, e);
if(autocvar_bot_debug_tracewalk)
- debugnode(self, trace_endpos);
+ debugnode(e, trace_endpos);
// hit something
if (trace_fraction < 1)
if(vdist(diff, <, maxdist))
{
head.wpconsidered = true;
- entity oldself = self;
- setself(this);
if (tracewalk(this, this.origin, this.mins, this.maxs, v, bot_navigation_movemode))
{
head.wpnearestpoint = v;
head.enemy = world;
c = c + 1;
}
- setself(oldself);
}
}
head = head.chain;
// evaluate the next goal on the queue
float d = vlen(this.origin - bot_waypoint_queue_goal.origin);
LOG_DEBUG(strcat(this.netname, " evaluating ", bot_waypoint_queue_goal.classname, " with distance ", ftos(d), "\n"));
- entity oldself = self;
- setself(this); // tracewalk has questionable use of self
if(tracewalk(bot_waypoint_queue_goal, this.origin, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), bot_waypoint_queue_goal.origin, bot_navigation_movemode))
{
if( d > bot_waypoint_queue_bestgoalrating)
bot_waypoint_queue_bestgoal = bot_waypoint_queue_goal;
}
}
- setself(oldself);
bot_waypoint_queue_goal = bot_waypoint_queue_goal.bot_waypoint_queue_nextgoal;
if (!bot_waypoint_queue_goal)
w = new(waypoint);
w.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
w.wpflags = f;
+ w.solid = SOLID_TRIGGER;
setorigin(w, (m1 + m2) * 0.5);
setsize(w, m1 - w.origin, m2 - w.origin);
if (vlen(w.size) > 0)
bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
- //dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n");
- sm1 = self.origin + self.mins;
- sm2 = self.origin + self.maxs;
+ //dprint("waypoint_think wpisbox = ", ftos(this.wpisbox), "\n");
+ sm1 = this.origin + this.mins;
+ sm2 = this.origin + this.maxs;
for(e = world; (e = find(e, classname, "waypoint")); )
{
- if (boxesoverlap(self.absmin, self.absmax, e.absmin, e.absmax))
+ if (boxesoverlap(this.absmin, this.absmax, e.absmin, e.absmax))
{
- waypoint_addlink(self, e);
- waypoint_addlink(e, self);
+ waypoint_addlink(this, e);
+ waypoint_addlink(e, this);
}
else
{
++relink_total;
- if(!checkpvs(self.origin, e))
+ if(!checkpvs(this.origin, e))
{
++relink_pvsculled;
continue;
sv.x = bound(sm1_x, sv.x, sm2_x);
sv.y = bound(sm1_y, sv.y, sm2_y);
sv.z = bound(sm1_z, sv.z, sm2_z);
- ev = self.origin;
+ ev = this.origin;
em1 = e.origin + e.mins;
em2 = e.origin + e.maxs;
ev.x = bound(em1_x, ev.x, em2_x);
continue;
}
navigation_testtracewalk = 0;
- if (!self.wpisbox)
+ if (!this.wpisbox)
{
- tracebox(sv - STAT(PL_MIN, NULL).z * '0 0 1', STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), sv, false, self);
+ tracebox(sv - STAT(PL_MIN, NULL).z * '0 0 1', STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), sv, false, this);
if (!trace_startsolid)
{
//dprint("sv deviation", vtos(trace_endpos - sv), "\n");
ev = trace_endpos + '0 0 1';
}
}
- //traceline(self.origin, e.origin, false, world);
+ //traceline(this.origin, e.origin, false, world);
//if (trace_fraction == 1)
- if (!self.wpisbox && tracewalk(self, sv, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), ev, MOVE_NOMONSTERS))
- waypoint_addlink(self, e);
+ if (!this.wpisbox && tracewalk(this, sv, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), ev, MOVE_NOMONSTERS))
+ waypoint_addlink(this, e);
else
relink_walkculled += 0.5;
if (!e.wpisbox && tracewalk(e, ev, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), sv, MOVE_NOMONSTERS))
- waypoint_addlink(e, self);
+ waypoint_addlink(e, this);
else
relink_walkculled += 0.5;
}
}
navigation_testtracewalk = 0;
- self.wplinked = true;
+ this.wplinked = true;
}
void waypoint_clearlinks(entity wp)
defaultmodel = substring(defaultmodel, 0, i);
}
}
+ if(autocvar_sv_defaultcharacterskin && !defaultskin)
+ {
+ if(teamplay)
+ {
+ string s = Static_Team_ColorName_Lower(player.team);
+ if (s != "neutral")
+ defaultskin = cvar(strcat("sv_defaultplayerskin_", s));
+ }
+
+ if(!defaultskin)
+ defaultskin = autocvar_sv_defaultplayerskin;
+ }
+
MUTATOR_CALLHOOK(FixPlayermodel, defaultmodel, defaultskin);
defaultmodel = ret_string;
defaultskin = ret_int;
chmdl = true;
}
- oldskin = player.skin;
- player.skin = stof(player.playerskin);
+ if(!autocvar_sv_defaultcharacterskin)
+ {
+ oldskin = player.skin;
+ player.skin = stof(player.playerskin);
+ }
+ else
+ {
+ oldskin = player.skin;
+ player.skin = defaultskin;
+ }
}
if(chmdl || oldskin != player.skin) // model or skin has changed
this.oldorigin = this.origin;
this.prevorigin = this.origin;
this.lastteleporttime = time; // prevent insane speeds due to changing origin
- this.hud = HUD_NORMAL;
+ this.conveyor = NULL; // prevent conveyors at the previous location from moving a freshly spawned player
+ this.hud = HUD_NORMAL;
this.event_damage = PlayerDamage;
LogTeamchange(client.playerid, client.team, type);
}
+/** print(), but only print if the server is not local */
+void dedicated_print(string input)
+{
+ if (server_is_dedicated) print(input);
+}
+
/**
* message "": do not say, just test flood control
* return value:
* 0 = reject
* -1 = fake accept
*/
-int Say(entity source, float teamsay, entity privatesay, string msgin, bool floodcontrol)
+int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol)
{
- string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr, colorprefix;
- float flood;
- var .float flood_field;
- float ret;
- string privatemsgprefix = string_null; float privatemsgprefixlen = 0;
-
- if(!teamsay && !privatesay)
- if(substring(msgin, 0, 1) == " ")
- msgin = substring(msgin, 1, strlen(msgin) - 1); // work around DP say bug (say_team does not have this!)
+ if (!teamsay && !privatesay) if (substring(msgin, 0, 1) == " ")
+ msgin = substring(msgin, 1, -1); // work around DP say bug (say_team does not have this!)
msgin = formatmessage(msgin);
+ string colorstr;
if (!IS_PLAYER(source))
colorstr = "^0"; // black for spectators
else if(teamplay)
if(intermission_running)
teamsay = false;
+ if (!source) {
+ colorstr = "";
+ teamsay = false;
+ }
+
if(msgin != "")
msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
}
*/
- if(autocvar_g_chat_teamcolors)
- namestr = playername(source);
- else
- namestr = source.netname;
+ string namestr = "";
+ if (source)
+ namestr = autocvar_g_chat_teamcolors ? playername(source) : source.netname;
- if(strdecolorize(namestr) == namestr)
- colorprefix = "^3";
- else
- colorprefix = "^7";
+ string colorprefix = (strdecolorize(namestr) == namestr) ? "^3" : "^7";
- if(msgin != "")
- {
+ string msgstr, cmsgstr;
+ string privatemsgprefix = string_null;
+ int privatemsgprefixlen = 0;
+ if (msgin == "") {
+ msgstr = cmsgstr = "";
+ } else {
if(privatesay)
{
msgstr = strcat("\{1}\{13}* ", colorprefix, namestr, "^3 tells you: ^7");
msgin = strreplace("/me", strcat(colorprefix, namestr), msgin);
msgstr = strcat("\{1}^4* ", "^7", msgin);
}
- else
- msgstr = strcat("\{1}", colorprefix, namestr, "^7: ", msgin);
+ else {
+ msgstr = "\{1}";
+ msgstr = strcat(msgstr, (namestr != "") ? strcat(colorprefix, namestr, "^7: ") : "^7");
+ msgstr = strcat(msgstr, msgin);
+ }
cmsgstr = "";
}
msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint
}
- else
- {
- msgstr = cmsgstr = "";
- }
- fullmsgstr = msgstr;
- fullcmsgstr = cmsgstr;
+ string fullmsgstr = msgstr;
+ string fullcmsgstr = cmsgstr;
// FLOOD CONTROL
- flood = 0;
- flood_field = floodcontrol_chat;
+ int flood = 0;
+ var .float flood_field = floodcontrol_chat;
if(floodcontrol)
{
float flood_spl;
source.(flood_field) = flood = 0;
}
+ string sourcemsgstr, sourcecmsgstr;
if(flood == 2) // cannot happen for empty msgstr
{
if(autocvar_g_chat_flood_notify_flooder)
sourcecmsgstr = cmsgstr;
}
- if(!privatesay)
- if (!IS_PLAYER(source))
+ if (!privatesay && source && !IS_PLAYER(source))
{
if (!intermission_running)
if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !(warmup_stage || gameover)))
if(privatesay)
sourcemsgstr = strcat(privatemsgprefix, substring(sourcemsgstr, privatemsgprefixlen, -1));
+ int ret;
if(source.muted)
{
// always fake the message
{
sprint(source, sourcemsgstr);
dedicated_print(msgstr); // send to server console too
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && it.active_minigame == source.active_minigame, LAMBDA(sprint(it, msgstr)));
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source && it.active_minigame == source.active_minigame, sprint(it, msgstr));
}
else if(teamsay > 0) // team message, only sent to team mates
{
dedicated_print(msgstr); // send to server console too
if(sourcecmsgstr != "")
centerprint(source, sourcecmsgstr);
- FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it != source && it.team == source.team, LAMBDA(
+ FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it != source && it.team == source.team, {
sprint(it, msgstr);
if(cmsgstr != "")
centerprint(it, cmsgstr);
- ));
+ });
}
else if(teamsay < 0) // spectator message, only sent to spectators
{
sprint(source, sourcemsgstr);
dedicated_print(msgstr); // send to server console too
- FOREACH_CLIENT(!IS_PLAYER(it) && IS_REAL_CLIENT(it) && it != source, LAMBDA(sprint(it, msgstr)));
- }
- else if(sourcemsgstr != msgstr) // trimmed/server fixed message, sent to all players
- {
- sprint(source, sourcemsgstr);
- dedicated_print(msgstr); // send to server console too
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source, LAMBDA(sprint(it, msgstr)));
+ FOREACH_CLIENT(!IS_PLAYER(it) && IS_REAL_CLIENT(it) && it != source, sprint(it, msgstr));
}
else
- bprint(msgstr); // entirely normal message, sent to all players -- bprint sends to server console too.
+ {
+ if (source) {
+ sprint(source, sourcemsgstr);
+ dedicated_print(msgstr); // send to server console too
+ MX_Say(strcat(playername(source), "^7: ", msgin));
+ }
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != source, sprint(it, msgstr));
+ }
}
return ret;
// generated file; do not modify
-#include "all.qc"
-#include "banning.qc"
-#include "cmd.qc"
-#include "common.qc"
-#include "getreplies.qc"
-#include "radarmap.qc"
-#include "sv_cmd.qc"
-#include "vote.qc"
+#include <server/command/all.qc>
+#include <server/command/banning.qc>
+#include <server/command/cmd.qc>
+#ifdef SVQC
+ #include <server/command/sv_cmd.qc>
+#endif
+#include <server/command/common.qc>
+#include <server/command/getreplies.qc>
+#include <server/command/radarmap.qc>
+#include <server/command/vote.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/command/all.qh>
+#include <server/command/banning.qh>
+#include <server/command/cmd.qh>
+#include <server/command/common.qh>
+#include <server/command/getreplies.qh>
+#include <server/command/radarmap.qh>
+#include <server/command/vote.qh>
{
float p, q, check, minargs;
string cvarname = strcat("sv_vote_command_restriction_", argv(startpos));
- string cmdrestriction = cvar_string(cvarname); // note: this warns on undefined cvar. We want that.
+ string cmdrestriction = ""; // No we don't.
string charlist, arg;
float checkmate;
+ if(cvar_type(cvarname) & CVAR_TYPEFLAG_EXISTS)
+ cmdrestriction = cvar_string(cvarname);
+ else
+ LOG_INFO("NOTE: ", cvarname, " does not exist, no restrictions will be applied.\n");
+
if (cmdrestriction == "") return true;
++startpos; // skip command name
return;
}
LogDeath("suicide", deathtype, targ, targ);
- GiveFrags(attacker, targ, -1, deathtype);
+ if(deathtype != DEATH_AUTOTEAMCHANGE.m_id) // special case: don't negate frags if auto switched
+ GiveFrags(attacker, targ, -1, deathtype);
}
// ======
setself(this);
// apply mirror damage if any
+ if(!autocvar_g_mirrordamage_onlyweapons || DEATH_WEAPONOF(deathtype) != WEP_Null)
if(mirrordamage > 0 || mirrorforce > 0)
{
attacker = attacker_save;
BADCVAR("sv_autotaunt");
BADCVAR("sv_curl_defaulturl");
BADCVAR("sv_defaultcharacter");
+ BADCVAR("sv_defaultcharacterskin");
BADCVAR("sv_defaultplayercolors");
BADCVAR("sv_defaultplayermodel");
BADCVAR("sv_defaultplayerskin");
MapInfo_Shutdown();
}
+void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override)
+{
+ if(!autocvar_g_campaign)
+ {
+ if(fraglimit_override >= 0) cvar_set("fraglimit", ftos(fraglimit_override));
+ if(timelimit_override >= 0) cvar_set("timelimit", ftos(timelimit_override));
+ if(leadlimit_override >= 0) cvar_set("leadlimit", ftos(leadlimit_override));
+ if(qualifying_override >= 0) cvar_set("g_race_qualifying_timelimit", ftos(qualifying_override));
+ }
+ limits_are_set = true;
+}
+
void Map_MarkAsRecent(string m);
float world_already_spawned;
void Nagger_Init();
{
server_is_dedicated = boolean(stof(cvar_defstring("is_dedicated")));
+ bool wantrestart = false;
{
- bool wantrestart = false;
-
if (!server_is_dedicated)
{
// force unloading of server pk3 files when starting a listen server
readlevelcvars();
GrappleHookInit();
+ if(!limits_are_set)
+ SetLimits(autocvar_fraglimit_override, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
+
+ if(warmup_limit == 0)
+ warmup_limit = (autocvar_timelimit > 0) ? autocvar_timelimit * 60 : autocvar_timelimit;
+
player_count = 0;
bot_waypoints_for_items = autocvar_g_waypoints_for_items;
if(bot_waypoints_for_items == 1)
CheatInit();
- localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
+ if (!wantrestart) localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
// fill sv_curl_serverpackages from .serverpackage files
if (autocvar_sv_curl_serverpackages_auto)
const int WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached
const int WINNING_STARTSUDDENDEATHOVERTIME = 3; // no winner, enter suddendeath overtime NOW
+bool limits_are_set = false;
+void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override);
+
float WinningCondition_Scores(float limit, float leadlimit);
void SetWinners(.float field, float value);
void CheckRules_Player();
--- /dev/null
+#include "matrix.qh"
+
+#include "cl_player.qh"
+
+var void MX_Handle(int buf, string ancestor)
+{
+ string type = json_get(buf, strcat(ancestor, ".type"));
+ switch (type) {
+ case "m.room.message": {
+ string msgtype = json_get(buf, strcat(ancestor, ".content.msgtype"));
+ switch (msgtype) {
+ case "m.text": {
+ string sender = json_get(buf, strcat(ancestor, ".sender"));
+ string body = json_get(buf, strcat(ancestor, ".content.body"));
+ if (sender != matrix_user && body) Say(NULL, false, NULL, body, false);
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
--- /dev/null
+#pragma once
warmup_stage = cvar("g_warmup");
warmup_limit = cvar("g_warmup_limit");
- if(warmup_limit == 0)
- warmup_limit = (autocvar_timelimit > 0) ? autocvar_timelimit * 60 : autocvar_timelimit;
g_warmup_allguns = cvar("g_warmup_allguns");
g_warmup_allow_timeout = cvar("g_warmup_allow_timeout");
// generated file; do not modify
-#include "all.qc"
+#include <server/mutators/all.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/mutators/all.qh>
// generated file; do not modify
-#include "gamemode_assault.qc"
-#include "gamemode_ca.qc"
-#include "gamemode_ctf.qc"
-#include "gamemode_cts.qc"
-#include "gamemode_deathmatch.qc"
-#include "gamemode_domination.qc"
-#include "gamemode_freezetag.qc"
-#include "gamemode_invasion.qc"
-#include "gamemode_keepaway.qc"
-#include "gamemode_keyhunt.qc"
-#include "gamemode_lms.qc"
-#include "gamemode_race.qc"
-#include "gamemode_tdm.qc"
+#include <server/mutators/mutator/gamemode_assault.qc>
+#include <server/mutators/mutator/gamemode_ca.qc>
+#include <server/mutators/mutator/gamemode_ctf.qc>
+#include <server/mutators/mutator/gamemode_cts.qc>
+#include <server/mutators/mutator/gamemode_deathmatch.qc>
+#include <server/mutators/mutator/gamemode_domination.qc>
+#include <server/mutators/mutator/gamemode_freezetag.qc>
+#include <server/mutators/mutator/gamemode_invasion.qc>
+#include <server/mutators/mutator/gamemode_keepaway.qc>
+#include <server/mutators/mutator/gamemode_keyhunt.qc>
+#include <server/mutators/mutator/gamemode_lms.qc>
+#include <server/mutators/mutator/gamemode_race.qc>
+#include <server/mutators/mutator/gamemode_tdm.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/mutators/mutator/gamemode_assault.qh>
+#include <server/mutators/mutator/gamemode_ca.qh>
+#include <server/mutators/mutator/gamemode_ctf.qh>
+#include <server/mutators/mutator/gamemode_cts.qh>
+#include <server/mutators/mutator/gamemode_deathmatch.qh>
+#include <server/mutators/mutator/gamemode_domination.qh>
+#include <server/mutators/mutator/gamemode_freezetag.qh>
+#include <server/mutators/mutator/gamemode_invasion.qh>
+#include <server/mutators/mutator/gamemode_keepaway.qh>
+#include <server/mutators/mutator/gamemode_keyhunt.qh>
+#include <server/mutators/mutator/gamemode_lms.qh>
+#include <server/mutators/mutator/gamemode_race.qh>
+#include <server/mutators/mutator/gamemode_tdm.qh>
EliminatedPlayers_Init(ca_isEliminated);
ActivateTeamplay();
- SetLimits(autocvar_g_ca_point_limit, autocvar_g_ca_point_leadlimit, -1, -1);
+ SetLimits(autocvar_g_ca_point_limit, autocvar_g_ca_point_leadlimit, autocvar_timelimit_override, -1);
if (autocvar_g_ca_team_spawns)
have_team_spawns = -1; // request team spawns
MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver)
{
SELFPARAM();
- if (this.caplayer == 1)
+ if (!IS_DEAD(this))
ca_LastPlayerForTeam_Notify();
if (this.killindicator_teamchange == -2)
this.caplayer = 0;
ctf_Initialize();
ActivateTeamplay();
- SetLimits(autocvar_capturelimit_override, autocvar_captureleadlimit_override, -1, -1);
+ SetLimits(autocvar_capturelimit_override, autocvar_captureleadlimit_override, autocvar_timelimit_override, -1);
have_team_spawns = -1; // request team spawns
}
if (flag.capeffect == "") { flag.capeffect = EFFECT_CAP(teamnumber).eent_eff_name; }
// sounds
- flag.snd_flag_taken = strzone(SND(CTF_TAKEN(teamnumber)));
- flag.snd_flag_returned = strzone(SND(CTF_RETURNED(teamnumber)));
- flag.snd_flag_capture = strzone(SND(CTF_CAPTURE(teamnumber)));
- flag.snd_flag_dropped = strzone(SND(CTF_DROPPED(teamnumber)));
- if (flag.snd_flag_respawn == "") flag.snd_flag_respawn = strzone(SND(CTF_RESPAWN)); // if there is ever a team-based sound for this, update the code to match.
- precache_sound(flag.snd_flag_respawn);
- if (flag.snd_flag_touch == "") flag.snd_flag_touch = strzone(SND(CTF_TOUCH)); // again has no team-based sound
- precache_sound(flag.snd_flag_touch);
- if (flag.snd_flag_pass == "") flag.snd_flag_pass = strzone(SND(CTF_PASS)); // same story here
- precache_sound(flag.snd_flag_pass);
+#define X(s,b) \
+ if(flag.s == "") flag.s = b; \
+ precache_sound(flag.s);
+
+ X(snd_flag_taken, strzone(SND(CTF_TAKEN(teamnumber))))
+ X(snd_flag_returned, strzone(SND(CTF_RETURNED(teamnumber))))
+ X(snd_flag_capture, strzone(SND(CTF_CAPTURE(teamnumber))))
+ X(snd_flag_dropped, strzone(SND(CTF_DROPPED(teamnumber))))
+ X(snd_flag_respawn, strzone(SND(CTF_RESPAWN)))
+ X(snd_flag_touch, strzone(SND(CTF_TOUCH)))
+ X(snd_flag_pass, strzone(SND(CTF_PASS)))
+#undef X
// precache
precache_model(flag.model);
g_race_qualifying = true;
independent_players = 1;
- SetLimits(0, 0, -1, -1);
+ SetLimits(0, 0, autocvar_timelimit_override, -1);
cts_Initialize();
}
fraglimit_override = autocvar_g_domination_roundbased_point_limit;
ActivateTeamplay();
- SetLimits(fraglimit_override, autocvar_g_domination_point_leadlimit, -1, -1);
+ SetLimits(fraglimit_override, autocvar_g_domination_point_leadlimit, autocvar_timelimit_override, -1);
have_team_spawns = -1; // request team spawns
}
freezetag_Initialize();
ActivateTeamplay();
- SetLimits(autocvar_g_freezetag_point_limit, autocvar_g_freezetag_point_leadlimit, -1, -1);
+ SetLimits(autocvar_g_freezetag_point_limit, autocvar_g_freezetag_point_leadlimit, autocvar_timelimit_override, -1);
if (autocvar_g_freezetag_team_spawns)
have_team_spawns = -1; // request team spawns
cvar_settemp("g_monsters", "1");
- SetLimits(autocvar_g_invasion_point_limit, -1, -1, -1);
+ SetLimits(autocvar_g_invasion_point_limit, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
if (autocvar_g_invasion_teams >= 2)
{
ActivateTeamplay();
kh_Initialize();
ActivateTeamplay();
- SetLimits(autocvar_g_keyhunt_point_limit, autocvar_g_keyhunt_point_leadlimit, -1, -1);
+ SetLimits(autocvar_g_keyhunt_point_limit, autocvar_g_keyhunt_point_leadlimit, autocvar_timelimit_override, -1);
if (autocvar_g_keyhunt_team_spawns)
have_team_spawns = -1; // request team spawns
}
error("This is a game type and it cannot be added at runtime.");
lms_Initialize();
- SetLimits(((!autocvar_g_lms_lives_override) ? -1 : autocvar_g_lms_lives_override), 0, -1, -1);
+ SetLimits(((!autocvar_g_lms_lives_override) ? -1 : autocvar_g_lms_lives_override), 0, autocvar_timelimit_override, -1);
}
MUTATOR_ONROLLBACK_OR_REMOVE
{
if(!g_race_qualifying)
{
- ret_float = WinningCondition_QualifyingThenRace(checkrules_fraglimit);
+ ret_float = WinningCondition_Race(checkrules_fraglimit);
return true;
}
else if(g_race_qualifying == 2)
qualifying_override = autocvar_g_race_qualifying_timelimit_override;
fraglimit_override = autocvar_g_race_laps_limit;
leadlimit_override = 0; // currently not supported by race
- timelimit_override = -1; // use default if we don't set it below
+ timelimit_override = autocvar_timelimit_override;
- // we need to find out the correct value for g_race_qualifying
float want_qualifying = ((qualifying_override >= 0) ? qualifying_override : autocvar_g_race_qualifying_timelimit) > 0;
if(autocvar_g_campaign)
g_race_qualifying = 1;
independent_players = 1;
}
- else if(!autocvar_g_campaign && want_qualifying)
+ else if(want_qualifying)
{
g_race_qualifying = 2;
independent_players = 1;
- race_fraglimit = (race_fraglimit >= 0) ? fraglimit_override : autocvar_fraglimit;
- race_leadlimit = (race_leadlimit >= 0) ? leadlimit_override : autocvar_leadlimit;
- race_timelimit = (race_timelimit >= 0) ? timelimit_override : autocvar_timelimit;
+ race_fraglimit = (fraglimit_override >= 0) ? fraglimit_override : autocvar_fraglimit;
+ race_leadlimit = (leadlimit_override >= 0) ? leadlimit_override : autocvar_leadlimit;
+ race_timelimit = (timelimit_override >= 0) ? timelimit_override : autocvar_timelimit;
+ qualifying_override = (qualifying_override >= 0) ? qualifying_override : autocvar_g_race_qualifying_timelimit;
fraglimit_override = 0;
leadlimit_override = 0;
- timelimit_override = autocvar_g_race_qualifying_timelimit;
+ timelimit_override = qualifying_override;
}
else
g_race_qualifying = 0;
-
SetLimits(fraglimit_override, leadlimit_override, timelimit_override, qualifying_override);
}
InitializeEntity(world, tdm_DelayedInit, INITPRIO_GAMETYPE);
ActivateTeamplay();
- SetLimits(autocvar_g_tdm_point_limit, autocvar_g_tdm_point_leadlimit, -1, -1);
+ SetLimits(autocvar_g_tdm_point_limit, autocvar_g_tdm_point_leadlimit, autocvar_timelimit_override, -1);
if (autocvar_g_tdm_team_spawns)
have_team_spawns = -1; // request team spawns
}
// generated file; do not modify
-#include "costs.qc"
-#include "debug.qc"
-#include "expandnode.qc"
-#include "main.qc"
-#include "movenode.qc"
-#include "path_waypoint.qc"
-#include "utility.qc"
+#include <server/pathlib/costs.qc>
+#include <server/pathlib/debug.qc>
+#include <server/pathlib/expandnode.qc>
+#include <server/pathlib/main.qc>
+#include <server/pathlib/movenode.qc>
+#include <server/pathlib/path_waypoint.qc>
+#include <server/pathlib/utility.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/pathlib/costs.qh>
+#include <server/pathlib/debug.qh>
+#include <server/pathlib/expandnode.qh>
+#include <server/pathlib/main.qh>
+#include <server/pathlib/movenode.qh>
+#include <server/pathlib/path_waypoint.qh>
+#include <server/pathlib/utility.qh>
#include <lib/_all.inc>
#include "_all.qh"
-#include "_mod.inc"
+#include "../server/_mod.inc"
#include "bot/_mod.inc"
#include "bot/havocbot/_mod.inc"
#include "command/_mod.inc"
cvar_set("teamplay", "2"); // DP needs this for sending proper getstatus replies.
}
-void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override)
-{
- // enforce the server's universal frag/time limits
- // set to -1 to not change value
- if(!autocvar_g_campaign)
- {
- if(fraglimit_override >= 0)
- cvar_set("fraglimit", ftos(fraglimit_override));
- if(timelimit_override >= 0)
- cvar_set("timelimit", ftos(timelimit_override));
- if(leadlimit_override >= 0)
- cvar_set("leadlimit", ftos(leadlimit_override));
- if(qualifying_override >= 0)
- cvar_set("g_race_qualifying_timelimit", ftos(qualifying_override));
- }
-}
-
void InitGameplayMode()
{
VoteReset();
MapInfo_ClearTemps();
- // set both here, gamemode can override it later
- SetLimits(autocvar_fraglimit_override, autocvar_leadlimit_override, autocvar_timelimit_override, -1);
gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype);
cache_mutatormsg = strzone("");
void ActivateTeamplay();
-void SetLimits(int fraglimit_override, int leadlimit_override, float timelimit_override, float qualifying_override);
-
void InitGameplayMode();
string GetClientVersionMessage();
// generated file; do not modify
-#include "accuracy.qc"
-#include "common.qc"
-#include "csqcprojectile.qc"
-#include "hitplot.qc"
-#include "selection.qc"
-#include "spawning.qc"
-#include "throwing.qc"
-#include "tracing.qc"
-#include "weaponstats.qc"
-#include "weaponsystem.qc"
+#include <server/weapons/accuracy.qc>
+#include <server/weapons/common.qc>
+#include <server/weapons/csqcprojectile.qc>
+#include <server/weapons/hitplot.qc>
+#include <server/weapons/selection.qc>
+#include <server/weapons/spawning.qc>
+#include <server/weapons/throwing.qc>
+#include <server/weapons/tracing.qc>
+#include <server/weapons/weaponstats.qc>
+#include <server/weapons/weaponsystem.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/weapons/accuracy.qh>
+#include <server/weapons/common.qh>
+#include <server/weapons/csqcprojectile.qh>
+#include <server/weapons/hitplot.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/spawning.qh>
+#include <server/weapons/throwing.qh>
+#include <server/weapons/tracing.qh>
+#include <server/weapons/weaponstats.qh>
+#include <server/weapons/weaponsystem.qh>
set -eu
cd "$(dirname "$0")"
cd ..
+ROOT=$PWD/
-MOD=_mod.inc
+MOD=_mod
function genmod() {
- echo '// generated file; do not modify' > ${MOD}
+ # use context to work around cmake issue #12619
+ CTX="${PWD#$ROOT}/"
+ echo '// generated file; do not modify' > ${MOD}.inc
+ echo '// generated file; do not modify' > ${MOD}.qh
for f in $(ls | sort -k 1,1 -t .); do
- if [[ "$f" == *.qc ]]; then echo "#include \"$f\"" >> ${MOD}; fi
+ if [[ "$f" == cl_* ]]; then if [[ -f "${f#cl_}" ]]; then continue; fi; fi
+ if [[ "$f" == sv_* ]]; then if [[ -f "${f#sv_}" ]]; then continue; fi; fi
+ if [[ "$f" == ui_* ]]; then if [[ -f "${f#ui_}" ]]; then continue; fi; fi
+ if [[ "$f" == *.qc ]]; then
+ echo "#include <${CTX}$f>" >> ${MOD}.inc
+ echo "#include <${CTX}${f%.qc}.qh>" >> ${MOD}.qh
+ if [[ -f "cl_$f" ]]; then echo -e "#ifdef CSQC\n #include <${CTX}cl_$f>\n#endif" >> ${MOD}.inc; fi
+ if [[ -f "sv_$f" ]]; then echo -e "#ifdef SVQC\n #include <${CTX}sv_$f>\n#endif" >> ${MOD}.inc; fi
+ if [[ -f "ui_$f" ]]; then echo -e "#ifdef MENUQC\n #include <${CTX}ui_$f>\n#endif" >> ${MOD}.inc; fi
+ fi
done
# echo >> ${MOD}
for f in *; do if [ -d "$f" ]; then
sv_logscores_bots 1
g_weaponarena all
g_weaponarena_random 2
+g_playerstats_gamereport_uri ""
// Start!