Merge commit 'cafad6'
This commit is contained in:
commit
a730c8a55d
27
.github/workflows/cpp_lint.yml
vendored
27
.github/workflows/cpp_lint.yml
vendored
@ -24,20 +24,21 @@ on:
|
|||||||
- '.github/workflows/**.yml'
|
- '.github/workflows/**.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
clang_format:
|
|
||||||
runs-on: ubuntu-18.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Install clang-format
|
|
||||||
run: |
|
|
||||||
sudo apt-get install clang-format-9 -qyy
|
|
||||||
|
|
||||||
- name: Run clang-format
|
# clang_format:
|
||||||
run: |
|
# runs-on: ubuntu-18.04
|
||||||
source ./util/ci/lint.sh
|
# steps:
|
||||||
perform_lint
|
# - uses: actions/checkout@v2
|
||||||
env:
|
# - name: Install clang-format
|
||||||
CLANG_FORMAT: clang-format-9
|
# run: |
|
||||||
|
# sudo apt-get install clang-format-9 -qyy
|
||||||
|
#
|
||||||
|
# - name: Run clang-format
|
||||||
|
# run: |
|
||||||
|
# source ./util/ci/clang-format.sh
|
||||||
|
# check_format
|
||||||
|
# env:
|
||||||
|
# CLANG_FORMAT: clang-format-9
|
||||||
|
|
||||||
clang_tidy:
|
clang_tidy:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-18.04
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -89,8 +89,7 @@ src/test_config.h
|
|||||||
src/cmake_config.h
|
src/cmake_config.h
|
||||||
src/cmake_config_githash.h
|
src/cmake_config_githash.h
|
||||||
src/unittest/test_world/world.mt
|
src/unittest/test_world/world.mt
|
||||||
src/lua/build/
|
/locale/
|
||||||
locale/
|
|
||||||
.directory
|
.directory
|
||||||
*.cbp
|
*.cbp
|
||||||
*.layout
|
*.layout
|
||||||
|
@ -67,7 +67,7 @@ Some can be changed in the key config dialog in the settings tab.
|
|||||||
| P | Enable/disable pitch move mode |
|
| P | Enable/disable pitch move mode |
|
||||||
| J | Enable/disable fast mode (needs fast privilege) |
|
| J | Enable/disable fast mode (needs fast privilege) |
|
||||||
| H | Enable/disable noclip mode (needs noclip privilege) |
|
| H | Enable/disable noclip mode (needs noclip privilege) |
|
||||||
| E | Move fast in fast mode |
|
| E | Aux1 (Move fast in fast mode. Games may add special features) |
|
||||||
| C | Cycle through camera modes |
|
| C | Cycle through camera modes |
|
||||||
| V | Cycle through minimap modes |
|
| V | Cycle through minimap modes |
|
||||||
| Shift + V | Change minimap orientation |
|
| Shift + V | Change minimap orientation |
|
||||||
|
143
build/android/icons/aux1_btn.svg
Normal file
143
build/android/icons/aux1_btn.svg
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:export-ydpi="24.000002"
|
||||||
|
inkscape:export-xdpi="24.000002"
|
||||||
|
inkscape:export-filename="/home/stu/Desktop/icons/png/aux_btn.png"
|
||||||
|
sodipodi:docname="aux_btn.svg"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
id="svg8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 135.46666 135.46667"
|
||||||
|
height="512"
|
||||||
|
width="512">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:snap-bbox-midpoints="true"
|
||||||
|
inkscape:snap-others="true"
|
||||||
|
inkscape:snap-object-midpoints="false"
|
||||||
|
inkscape:snap-to-guides="true"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-page="true"
|
||||||
|
inkscape:snap-grids="false"
|
||||||
|
inkscape:pagecheckerboard="false"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="31"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-height="1024"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
units="px"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:current-layer="layer2"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:cy="212.91276"
|
||||||
|
inkscape:cx="201.43176"
|
||||||
|
inkscape:zoom="1.4633894"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#404040"
|
||||||
|
id="base">
|
||||||
|
<inkscape:grid
|
||||||
|
empopacity="0.25098039"
|
||||||
|
empcolor="#40ff40"
|
||||||
|
opacity="0.1254902"
|
||||||
|
color="#40ff40"
|
||||||
|
empspacing="4"
|
||||||
|
spacingy="0.26458333"
|
||||||
|
spacingx="0.26458333"
|
||||||
|
id="grid16"
|
||||||
|
type="xygrid" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||||
|
</cc:Work>
|
||||||
|
<cc:License
|
||||||
|
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||||
|
<cc:requires
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||||
|
<cc:requires
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||||
|
<cc:requires
|
||||||
|
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||||
|
</cc:License>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
inkscape:label="Layer 2"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:groupmode="layer">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path7055"
|
||||||
|
d=""
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path7035"
|
||||||
|
d=""
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path7005"
|
||||||
|
d=""
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5127"
|
||||||
|
d=""
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
transform="scale(1.0078883,0.99217343)"
|
||||||
|
id="text4716"
|
||||||
|
y="85.59491"
|
||||||
|
x="67.78315"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48.4785px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
y="85.59491"
|
||||||
|
x="67.78315"
|
||||||
|
id="tspan4714"
|
||||||
|
sodipodi:role="line">Aux1</tspan></text>
|
||||||
|
<flowRoot
|
||||||
|
transform="scale(0.26458333)"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
||||||
|
id="flowRoot4718"
|
||||||
|
xml:space="preserve"><flowRegion
|
||||||
|
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
||||||
|
id="flowRegion4720"><rect
|
||||||
|
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
||||||
|
y="124.10143"
|
||||||
|
x="264.65997"
|
||||||
|
height="136.37059"
|
||||||
|
width="157.5838"
|
||||||
|
id="rect4722" /></flowRegion><flowPara
|
||||||
|
id="flowPara4724" /></flowRoot>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
@ -1,411 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="512"
|
|
||||||
height="512"
|
|
||||||
viewBox="0 0 135.46666 135.46667"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8"
|
|
||||||
inkscape:version="0.92.1 r15371"
|
|
||||||
sodipodi:docname="aux_btn.svg"
|
|
||||||
inkscape:export-filename="/home/stu/Desktop/icons/png/aux_btn.png"
|
|
||||||
inkscape:export-xdpi="24.000002"
|
|
||||||
inkscape:export-ydpi="24.000002">
|
|
||||||
<defs
|
|
||||||
id="defs2">
|
|
||||||
<filter
|
|
||||||
style="color-interpolation-filters:sRGB;"
|
|
||||||
inkscape:label="Colorize"
|
|
||||||
id="filter4628">
|
|
||||||
<feComposite
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="arithmetic"
|
|
||||||
k1="0"
|
|
||||||
k2="1"
|
|
||||||
result="composite1"
|
|
||||||
id="feComposite4614" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="composite1"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix1"
|
|
||||||
id="feColorMatrix4616" />
|
|
||||||
<feFlood
|
|
||||||
flood-opacity="1"
|
|
||||||
flood-color="rgb(158,0,0)"
|
|
||||||
result="flood1"
|
|
||||||
id="feFlood4618" />
|
|
||||||
<feBlend
|
|
||||||
in="flood1"
|
|
||||||
in2="colormatrix1"
|
|
||||||
mode="multiply"
|
|
||||||
result="blend1"
|
|
||||||
id="feBlend4620" />
|
|
||||||
<feBlend
|
|
||||||
in2="blend1"
|
|
||||||
mode="screen"
|
|
||||||
result="blend2"
|
|
||||||
id="feBlend4622" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="blend2"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix2"
|
|
||||||
id="feColorMatrix4624" />
|
|
||||||
<feComposite
|
|
||||||
in="colormatrix2"
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="in"
|
|
||||||
k2="1"
|
|
||||||
result="composite2"
|
|
||||||
id="feComposite4626" />
|
|
||||||
</filter>
|
|
||||||
<filter
|
|
||||||
style="color-interpolation-filters:sRGB;"
|
|
||||||
inkscape:label="Sharpen More"
|
|
||||||
id="filter5109"
|
|
||||||
inkscape:menu="Image Effects"
|
|
||||||
inkscape:menu-tooltip="Sharpen edges and boundaries within the object, force=0.3">
|
|
||||||
<feComposite
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="arithmetic"
|
|
||||||
k1="0"
|
|
||||||
k2="1"
|
|
||||||
result="composite1"
|
|
||||||
id="feComposite5095" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="composite1"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix1"
|
|
||||||
id="feColorMatrix5097" />
|
|
||||||
<feFlood
|
|
||||||
flood-opacity="1"
|
|
||||||
flood-color="rgb(158,67,0)"
|
|
||||||
result="flood1"
|
|
||||||
id="feFlood5099" />
|
|
||||||
<feBlend
|
|
||||||
in="flood1"
|
|
||||||
in2="colormatrix1"
|
|
||||||
mode="multiply"
|
|
||||||
result="blend1"
|
|
||||||
id="feBlend5101" />
|
|
||||||
<feBlend
|
|
||||||
in2="blend1"
|
|
||||||
mode="screen"
|
|
||||||
result="blend2"
|
|
||||||
id="feBlend5103" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="blend2"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix2"
|
|
||||||
id="feColorMatrix5105" />
|
|
||||||
<feComposite
|
|
||||||
in="colormatrix2"
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="in"
|
|
||||||
k2="1"
|
|
||||||
result="fbSourceGraphic"
|
|
||||||
id="feComposite5107" />
|
|
||||||
<feColorMatrix
|
|
||||||
result="fbSourceGraphicAlpha"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
|
||||||
id="feColorMatrix5111" />
|
|
||||||
<feComposite
|
|
||||||
in2="fbSourceGraphic"
|
|
||||||
id="feComposite5113"
|
|
||||||
operator="arithmetic"
|
|
||||||
k1="0"
|
|
||||||
k2="1"
|
|
||||||
result="composite1"
|
|
||||||
in="fbSourceGraphic" />
|
|
||||||
<feColorMatrix
|
|
||||||
id="feColorMatrix5115"
|
|
||||||
in="composite1"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix1" />
|
|
||||||
<feFlood
|
|
||||||
id="feFlood5117"
|
|
||||||
flood-opacity="1"
|
|
||||||
flood-color="rgb(158,0,0)"
|
|
||||||
result="flood1" />
|
|
||||||
<feBlend
|
|
||||||
in2="colormatrix1"
|
|
||||||
id="feBlend5119"
|
|
||||||
in="flood1"
|
|
||||||
mode="multiply"
|
|
||||||
result="blend1" />
|
|
||||||
<feBlend
|
|
||||||
in2="blend1"
|
|
||||||
id="feBlend5121"
|
|
||||||
mode="screen"
|
|
||||||
result="blend2" />
|
|
||||||
<feColorMatrix
|
|
||||||
id="feColorMatrix5123"
|
|
||||||
in="blend2"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix2" />
|
|
||||||
<feComposite
|
|
||||||
in2="fbSourceGraphic"
|
|
||||||
id="feComposite5125"
|
|
||||||
in="colormatrix2"
|
|
||||||
operator="in"
|
|
||||||
k2="1"
|
|
||||||
result="fbSourceGraphic" />
|
|
||||||
<feColorMatrix
|
|
||||||
result="fbSourceGraphicAlpha"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
|
||||||
id="feColorMatrix7007" />
|
|
||||||
<feConvolveMatrix
|
|
||||||
id="feConvolveMatrix7009"
|
|
||||||
order="3 3"
|
|
||||||
kernelMatrix="0 -0.15 0 -0.15 1.6 -0.15 0 -0.15 0"
|
|
||||||
divisor="1"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
targetX="1"
|
|
||||||
targetY="1"
|
|
||||||
result="fbSourceGraphic" />
|
|
||||||
<feColorMatrix
|
|
||||||
result="fbSourceGraphicAlpha"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
|
||||||
id="feColorMatrix7011" />
|
|
||||||
<feConvolveMatrix
|
|
||||||
id="feConvolveMatrix7013"
|
|
||||||
targetY="1"
|
|
||||||
targetX="1"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
divisor="1"
|
|
||||||
kernelMatrix="0 -0.3 0 -0.3 2.2 -0.3 0 -0.3 0"
|
|
||||||
order="3 3"
|
|
||||||
result="result1" />
|
|
||||||
<feBlend
|
|
||||||
in2="fbSourceGraphic"
|
|
||||||
id="feBlend7015"
|
|
||||||
mode="normal"
|
|
||||||
result="result2" />
|
|
||||||
</filter>
|
|
||||||
<marker
|
|
||||||
style="overflow:visible"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
orient="auto"
|
|
||||||
id="DistanceX">
|
|
||||||
<path
|
|
||||||
id="path7410"
|
|
||||||
style="stroke:#000000; stroke-width:0.5"
|
|
||||||
d="M 3,-3 L -3,3 M 0,-5 L 0,5" />
|
|
||||||
</marker>
|
|
||||||
<pattern
|
|
||||||
y="0"
|
|
||||||
x="0"
|
|
||||||
width="8"
|
|
||||||
patternUnits="userSpaceOnUse"
|
|
||||||
id="Hatch"
|
|
||||||
height="8">
|
|
||||||
<path
|
|
||||||
id="path7413"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M8 4 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path7415"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M6 2 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path7417"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M4 0 l-4,4" />
|
|
||||||
</pattern>
|
|
||||||
<symbol
|
|
||||||
id="*Model_Space" />
|
|
||||||
<symbol
|
|
||||||
id="*Paper_Space" />
|
|
||||||
<symbol
|
|
||||||
id="*Paper_Space0" />
|
|
||||||
<filter
|
|
||||||
style="color-interpolation-filters:sRGB;"
|
|
||||||
inkscape:label="Colorize"
|
|
||||||
id="filter4883">
|
|
||||||
<feComposite
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="arithmetic"
|
|
||||||
k1="0"
|
|
||||||
k2="1"
|
|
||||||
result="composite1"
|
|
||||||
id="feComposite4869" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="composite1"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix1"
|
|
||||||
id="feColorMatrix4871" />
|
|
||||||
<feFlood
|
|
||||||
flood-opacity="1"
|
|
||||||
flood-color="rgb(158,21,0)"
|
|
||||||
result="flood1"
|
|
||||||
id="feFlood4873" />
|
|
||||||
<feBlend
|
|
||||||
in="flood1"
|
|
||||||
in2="colormatrix1"
|
|
||||||
mode="multiply"
|
|
||||||
result="blend1"
|
|
||||||
id="feBlend4875" />
|
|
||||||
<feBlend
|
|
||||||
in2="blend1"
|
|
||||||
mode="screen"
|
|
||||||
result="blend2"
|
|
||||||
id="feBlend4877" />
|
|
||||||
<feColorMatrix
|
|
||||||
in="blend2"
|
|
||||||
values="1"
|
|
||||||
type="saturate"
|
|
||||||
result="colormatrix2"
|
|
||||||
id="feColorMatrix4879" />
|
|
||||||
<feComposite
|
|
||||||
in="colormatrix2"
|
|
||||||
in2="SourceGraphic"
|
|
||||||
operator="in"
|
|
||||||
k2="1"
|
|
||||||
result="composite2"
|
|
||||||
id="feComposite4881" />
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#404040"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="0.98994949"
|
|
||||||
inkscape:cx="-341.34157"
|
|
||||||
inkscape:cy="210.02973"
|
|
||||||
inkscape:document-units="mm"
|
|
||||||
inkscape:current-layer="layer2"
|
|
||||||
showgrid="true"
|
|
||||||
units="px"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1023"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="34"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:pagecheckerboard="false"
|
|
||||||
inkscape:snap-grids="false"
|
|
||||||
inkscape:snap-page="true"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
inkscape:snap-to-guides="true"
|
|
||||||
inkscape:snap-object-midpoints="false"
|
|
||||||
inkscape:snap-others="true"
|
|
||||||
inkscape:snap-bbox-midpoints="true">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid16"
|
|
||||||
spacingx="0.26458333"
|
|
||||||
spacingy="0.26458333"
|
|
||||||
empspacing="4"
|
|
||||||
color="#40ff40"
|
|
||||||
opacity="0.1254902"
|
|
||||||
empcolor="#40ff40"
|
|
||||||
empopacity="0.25098039" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
<cc:license
|
|
||||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
|
||||||
</cc:Work>
|
|
||||||
<cc:License
|
|
||||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
|
||||||
</cc:License>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer2"
|
|
||||||
inkscape:label="Layer 2"
|
|
||||||
style="display:inline">
|
|
||||||
<path
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d=""
|
|
||||||
id="path7055"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d=""
|
|
||||||
id="path7035"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d=""
|
|
||||||
id="path7005"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d=""
|
|
||||||
id="path5127"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48.47851181px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
x="67.78315"
|
|
||||||
y="85.59491"
|
|
||||||
id="text4716"
|
|
||||||
transform="scale(1.0078883,0.99217343)"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan4714"
|
|
||||||
x="67.78315"
|
|
||||||
y="85.59491"
|
|
||||||
style="fill:#d9d9d9;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">AUX</tspan></text>
|
|
||||||
<flowRoot
|
|
||||||
xml:space="preserve"
|
|
||||||
id="flowRoot4718"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
|
||||||
transform="scale(0.26458333)"><flowRegion
|
|
||||||
id="flowRegion4720"
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"><rect
|
|
||||||
id="rect4722"
|
|
||||||
width="157.5838"
|
|
||||||
height="136.37059"
|
|
||||||
x="264.65997"
|
|
||||||
y="124.10143"
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /></flowRegion><flowPara
|
|
||||||
id="flowPara4724" /></flowRoot> </g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 12 KiB |
@ -1,6 +1,5 @@
|
|||||||
-- Minetest: builtin/client/chatcommands.lua
|
-- Minetest: builtin/client/chatcommands.lua
|
||||||
|
|
||||||
|
|
||||||
core.register_on_sending_chat_message(function(message)
|
core.register_on_sending_chat_message(function(message)
|
||||||
if message:sub(1,2) == ".." then
|
if message:sub(1,2) == ".." then
|
||||||
return false
|
return false
|
||||||
@ -8,7 +7,7 @@ core.register_on_sending_chat_message(function(message)
|
|||||||
|
|
||||||
local first_char = message:sub(1,1)
|
local first_char = message:sub(1,1)
|
||||||
if first_char == "/" or first_char == "." then
|
if first_char == "/" or first_char == "." then
|
||||||
core.display_chat_message(core.gettext("issued command: ") .. message)
|
core.display_chat_message(core.gettext("Issued command: ") .. message)
|
||||||
end
|
end
|
||||||
|
|
||||||
if first_char ~= "." then
|
if first_char ~= "." then
|
||||||
@ -19,7 +18,7 @@ core.register_on_sending_chat_message(function(message)
|
|||||||
param = param or ""
|
param = param or ""
|
||||||
|
|
||||||
if not cmd then
|
if not cmd then
|
||||||
core.display_chat_message(core.gettext("-!- Empty command"))
|
core.display_chat_message("-!- " .. core.gettext("Empty command."))
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -36,7 +35,7 @@ core.register_on_sending_chat_message(function(message)
|
|||||||
core.display_chat_message(result)
|
core.display_chat_message(result)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
core.display_chat_message(core.gettext("-!- Invalid command: ") .. cmd)
|
core.display_chat_message("-!- " .. core.gettext("Invalid command: ") .. cmd)
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -66,7 +65,7 @@ core.register_chatcommand("clear_chat_queue", {
|
|||||||
description = core.gettext("Clear the out chat queue"),
|
description = core.gettext("Clear the out chat queue"),
|
||||||
func = function(param)
|
func = function(param)
|
||||||
core.clear_out_chat_queue()
|
core.clear_out_chat_queue()
|
||||||
return true, core.gettext("The out chat queue is now empty")
|
return true, core.gettext("The out chat queue is now empty.")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
-- handled by the engine.
|
-- handled by the engine.
|
||||||
|
|
||||||
core.register_on_death(function()
|
core.register_on_death(function()
|
||||||
core.display_chat_message(fgettext("You died"))
|
core.display_chat_message(core.gettext("You died."))
|
||||||
local formspec = "size[8,5]bgcolor[#320000b4;true]" ..
|
local formspec = "size[8,5]bgcolor[#320000b4;true]" ..
|
||||||
"background9[0,0;0,0;bg_common.png;true;40]" ..
|
"background9[0,0;0,0;bg_common.png;true;40]" ..
|
||||||
"style[you_died;font_size=+4;content_offset=0]" ..
|
"style[you_died;font_size=+4;content_offset=0]" ..
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
-- Minetest: builtin/common/chatcommands.lua
|
-- Minetest: builtin/common/chatcommands.lua
|
||||||
|
|
||||||
|
-- For server-side translations (if INIT == "game")
|
||||||
|
-- Otherwise, use core.gettext
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
|
|
||||||
core.registered_chatcommands = {}
|
core.registered_chatcommands = {}
|
||||||
|
|
||||||
function core.register_chatcommand(cmd, def)
|
function core.register_chatcommand(cmd, def)
|
||||||
@ -29,25 +33,12 @@ function core.override_chatcommand(name, redefinition)
|
|||||||
core.registered_chatcommands[name] = chatcommand
|
core.registered_chatcommands[name] = chatcommand
|
||||||
end
|
end
|
||||||
|
|
||||||
local cmd_marker = "/"
|
|
||||||
|
|
||||||
local function gettext(...)
|
|
||||||
return ...
|
|
||||||
end
|
|
||||||
|
|
||||||
local function gettext_replace(text, replace)
|
|
||||||
return text:gsub("$1", replace)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
if INIT == "client" then
|
|
||||||
cmd_marker = "."
|
|
||||||
gettext = core.gettext
|
|
||||||
gettext_replace = fgettext_ne
|
|
||||||
end
|
|
||||||
|
|
||||||
local function do_help_cmd(name, param)
|
local function do_help_cmd(name, param)
|
||||||
local function format_help_line(cmd, def)
|
local function format_help_line(cmd, def)
|
||||||
|
local cmd_marker = "/"
|
||||||
|
if INIT == "client" then
|
||||||
|
cmd_marker = "."
|
||||||
|
end
|
||||||
local msg = core.colorize("#00ffff", cmd_marker .. cmd)
|
local msg = core.colorize("#00ffff", cmd_marker .. cmd)
|
||||||
if def.params and def.params ~= "" then
|
if def.params and def.params ~= "" then
|
||||||
msg = msg .. " " .. def.params
|
msg = msg .. " " .. def.params
|
||||||
@ -65,9 +56,21 @@ local function do_help_cmd(name, param)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(cmds)
|
table.sort(cmds)
|
||||||
return true, gettext("Available commands: ") .. table.concat(cmds, " ") .. "\n"
|
local msg
|
||||||
.. gettext_replace("Use '$1help <cmd>' to get more information,"
|
if INIT == "game" then
|
||||||
.. " or '$1help all' to list everything.", cmd_marker)
|
msg = S("Available commands: @1",
|
||||||
|
table.concat(cmds, " ")) .. "\n"
|
||||||
|
.. S("Use '/help <cmd>' to get more "
|
||||||
|
.. "information, or '/help all' to list "
|
||||||
|
.. "everything.")
|
||||||
|
else
|
||||||
|
msg = core.gettext("Available commands: ")
|
||||||
|
.. table.concat(cmds, " ") .. "\n"
|
||||||
|
.. core.gettext("Use '.help <cmd>' to get more "
|
||||||
|
.. "information, or '.help all' to list "
|
||||||
|
.. "everything.")
|
||||||
|
end
|
||||||
|
return true, msg
|
||||||
elseif param == "all" then
|
elseif param == "all" then
|
||||||
local cmds = {}
|
local cmds = {}
|
||||||
for cmd, def in pairs(core.registered_chatcommands) do
|
for cmd, def in pairs(core.registered_chatcommands) do
|
||||||
@ -76,19 +79,31 @@ local function do_help_cmd(name, param)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(cmds)
|
table.sort(cmds)
|
||||||
return true, gettext("Available commands:").."\n"..table.concat(cmds, "\n")
|
local msg
|
||||||
|
if INIT == "game" then
|
||||||
|
msg = S("Available commands:")
|
||||||
|
else
|
||||||
|
msg = core.gettext("Available commands:")
|
||||||
|
end
|
||||||
|
return true, msg.."\n"..table.concat(cmds, "\n")
|
||||||
elseif INIT == "game" and param == "privs" then
|
elseif INIT == "game" and param == "privs" then
|
||||||
local privs = {}
|
local privs = {}
|
||||||
for priv, def in pairs(core.registered_privileges) do
|
for priv, def in pairs(core.registered_privileges) do
|
||||||
privs[#privs + 1] = priv .. ": " .. def.description
|
privs[#privs + 1] = priv .. ": " .. def.description
|
||||||
end
|
end
|
||||||
table.sort(privs)
|
table.sort(privs)
|
||||||
return true, "Available privileges:\n"..table.concat(privs, "\n")
|
return true, S("Available privileges:").."\n"..table.concat(privs, "\n")
|
||||||
else
|
else
|
||||||
local cmd = param
|
local cmd = param
|
||||||
local def = core.registered_chatcommands[cmd]
|
local def = core.registered_chatcommands[cmd]
|
||||||
if not def then
|
if not def then
|
||||||
return false, gettext("Command not available: ")..cmd
|
local msg
|
||||||
|
if INIT == "game" then
|
||||||
|
msg = S("Command not available: @1", cmd)
|
||||||
|
else
|
||||||
|
msg = core.gettext("Command not available: ") .. cmd
|
||||||
|
end
|
||||||
|
return false, msg
|
||||||
else
|
else
|
||||||
return true, format_help_line(cmd, def)
|
return true, format_help_line(cmd, def)
|
||||||
end
|
end
|
||||||
@ -97,16 +112,16 @@ end
|
|||||||
|
|
||||||
if INIT == "client" then
|
if INIT == "client" then
|
||||||
core.register_chatcommand("help", {
|
core.register_chatcommand("help", {
|
||||||
params = gettext("[all | <cmd>]"),
|
params = core.gettext("[all | <cmd>]"),
|
||||||
description = gettext("Get help for commands"),
|
description = core.gettext("Get help for commands"),
|
||||||
func = function(param)
|
func = function(param)
|
||||||
return do_help_cmd(nil, param)
|
return do_help_cmd(nil, param)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
else
|
else
|
||||||
core.register_chatcommand("help", {
|
core.register_chatcommand("help", {
|
||||||
params = "[all | privs | <cmd>]",
|
params = S("[all | privs | <cmd>]"),
|
||||||
description = "Get help for commands or list privileges",
|
description = S("Get help for commands or list privileges"),
|
||||||
func = do_help_cmd,
|
func = do_help_cmd,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
@ -22,7 +22,8 @@ local LIST_FORMSPEC_DESCRIPTION = [[
|
|||||||
button_exit[5,7;3,1;quit;%s]
|
button_exit[5,7;3,1;quit;%s]
|
||||||
]]
|
]]
|
||||||
|
|
||||||
local formspec_escape = core.formspec_escape
|
local F = core.formspec_escape
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
local check_player_privs = core.check_player_privs
|
local check_player_privs = core.check_player_privs
|
||||||
|
|
||||||
|
|
||||||
@ -53,16 +54,17 @@ core.after(0, load_mod_command_tree)
|
|||||||
|
|
||||||
local function build_chatcommands_formspec(name, sel, copy)
|
local function build_chatcommands_formspec(name, sel, copy)
|
||||||
local rows = {}
|
local rows = {}
|
||||||
rows[1] = "#FFF,0,Command,Parameters"
|
rows[1] = "#FFF,0,"..F(S("Command"))..","..F(S("Parameters"))
|
||||||
|
|
||||||
local description = "For more information, click on any entry in the list.\n" ..
|
local description = S("For more information, click on "
|
||||||
"Double-click to copy the entry to the chat history."
|
.. "any entry in the list.").. "\n" ..
|
||||||
|
S("Double-click to copy the entry to the chat history.")
|
||||||
|
|
||||||
for i, data in ipairs(mod_cmds) do
|
for i, data in ipairs(mod_cmds) do
|
||||||
for _, cmds in ipairs(data[2]) do
|
for _, cmds in ipairs(data[2]) do
|
||||||
local has_priv = check_player_privs(name, cmds[2].privs)
|
local has_priv = check_player_privs(name, cmds[2].privs)
|
||||||
if has_priv then
|
if has_priv then
|
||||||
rows[#rows + 1] = COLOR_BLUE .. ",0," .. formspec_escape(data[1]) .. ","
|
rows[#rows + 1] = COLOR_BLUE .. ",0," .. F(data[1]) .. ","
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -72,11 +74,11 @@ local function build_chatcommands_formspec(name, sel, copy)
|
|||||||
rows[#rows + 1] = ("%s,1,%s,%s"):format(
|
rows[#rows + 1] = ("%s,1,%s,%s"):format(
|
||||||
-- has_priv and COLOR_GREEN or COLOR_GRAY,
|
-- has_priv and COLOR_GREEN or COLOR_GRAY,
|
||||||
COLOR_GREEN,
|
COLOR_GREEN,
|
||||||
cmds[1], formspec_escape(cmds[2].params))
|
cmds[1], F(cmds[2].params))
|
||||||
if sel == #rows then
|
if sel == #rows then
|
||||||
description = cmds[2].description
|
description = cmds[2].description
|
||||||
if copy then
|
if copy then
|
||||||
core.chat_send_player(name, ("Command: %s %s"):format(
|
core.chat_send_player(name, S("Command: @1 @2",
|
||||||
core.colorize("#0FF", "/" .. cmds[1]), cmds[2].params))
|
core.colorize("#0FF", "/" .. cmds[1]), cmds[2].params))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -85,9 +87,9 @@ local function build_chatcommands_formspec(name, sel, copy)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return LIST_FORMSPEC_DESCRIPTION:format(
|
return LIST_FORMSPEC_DESCRIPTION:format(
|
||||||
"Available commands: (see also: /help <cmd>)",
|
F(S("Available commands: (see also: /help <cmd>)")),
|
||||||
table.concat(rows, ","), sel or 0,
|
table.concat(rows, ","), sel or 0,
|
||||||
description, "Close"
|
F(description), F(S("Close"))
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -102,19 +104,19 @@ local function build_privs_formspec(name)
|
|||||||
table.sort(privs, function(a, b) return a[1] < b[1] end)
|
table.sort(privs, function(a, b) return a[1] < b[1] end)
|
||||||
|
|
||||||
local rows = {}
|
local rows = {}
|
||||||
rows[1] = "#FFF,0,Privilege,Description"
|
rows[1] = "#FFF,0,"..F(S("Privilege"))..","..F(S("Description"))
|
||||||
|
|
||||||
local player_privs = core.get_player_privs(name)
|
local player_privs = core.get_player_privs(name)
|
||||||
for i, data in ipairs(privs) do
|
for i, data in ipairs(privs) do
|
||||||
rows[#rows + 1] = ("%s,0,%s,%s"):format(
|
rows[#rows + 1] = ("%s,0,%s,%s"):format(
|
||||||
player_privs[data[1]] and COLOR_GREEN or COLOR_GRAY,
|
player_privs[data[1]] and COLOR_GREEN or COLOR_GRAY,
|
||||||
data[1], formspec_escape(data[2].description))
|
data[1], F(data[2].description))
|
||||||
end
|
end
|
||||||
|
|
||||||
return LIST_FORMSPEC:format(
|
return LIST_FORMSPEC:format(
|
||||||
"Available privileges:",
|
F(S("Available privileges:")),
|
||||||
table.concat(rows, ","),
|
table.concat(rows, ","),
|
||||||
"Close"
|
F(S("Close"))
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,7 @@
|
|||||||
-- Minetest: builtin/privileges.lua
|
-- Minetest: builtin/privileges.lua
|
||||||
|
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Privileges
|
-- Privileges
|
||||||
--
|
--
|
||||||
@ -15,7 +17,7 @@ function core.register_privilege(name, param)
|
|||||||
def.give_to_admin = def.give_to_singleplayer
|
def.give_to_admin = def.give_to_singleplayer
|
||||||
end
|
end
|
||||||
if def.description == nil then
|
if def.description == nil then
|
||||||
def.description = "(no description)"
|
def.description = S("(no description)")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local def
|
local def
|
||||||
@ -33,69 +35,69 @@ if core.settings:get_bool("creative_mode") then
|
|||||||
creative = true
|
creative = true
|
||||||
end
|
end
|
||||||
|
|
||||||
core.register_privilege("interact", "Can interact with things and modify the world")
|
core.register_privilege("interact", S("Can interact with things and modify the world"))
|
||||||
core.register_privilege("shout", "Can speak in chat")
|
core.register_privilege("shout", S("Can speak in chat"))
|
||||||
core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
|
core.register_privilege("basic_privs", S("Can modify 'shout' and 'interact' privileges"))
|
||||||
core.register_privilege("privs", "Can modify privileges")
|
core.register_privilege("privs", S("Can modify privileges"))
|
||||||
|
|
||||||
core.register_privilege("teleport", {
|
core.register_privilege("teleport", {
|
||||||
description = "Can teleport self",
|
description = S("Can teleport self"),
|
||||||
give_to_singleplayer = creative,
|
give_to_singleplayer = creative,
|
||||||
})
|
})
|
||||||
core.register_privilege("bring", {
|
core.register_privilege("bring", {
|
||||||
description = "Can teleport other players",
|
description = S("Can teleport other players"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
core.register_privilege("settime", {
|
core.register_privilege("settime", {
|
||||||
description = "Can set the time of day using /time",
|
description = S("Can set the time of day using /time"),
|
||||||
give_to_singleplayer = creative,
|
give_to_singleplayer = creative,
|
||||||
})
|
})
|
||||||
core.register_privilege("server", {
|
core.register_privilege("server", {
|
||||||
description = "Can do server maintenance stuff",
|
description = S("Can do server maintenance stuff"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
give_to_admin = true,
|
give_to_admin = true,
|
||||||
})
|
})
|
||||||
core.register_privilege("protection_bypass", {
|
core.register_privilege("protection_bypass", {
|
||||||
description = "Can bypass node protection in the world",
|
description = S("Can bypass node protection in the world"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
core.register_privilege("ban", {
|
core.register_privilege("ban", {
|
||||||
description = "Can ban and unban players",
|
description = S("Can ban and unban players"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
give_to_admin = true,
|
give_to_admin = true,
|
||||||
})
|
})
|
||||||
core.register_privilege("kick", {
|
core.register_privilege("kick", {
|
||||||
description = "Can kick players",
|
description = S("Can kick players"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
give_to_admin = true,
|
give_to_admin = true,
|
||||||
})
|
})
|
||||||
core.register_privilege("give", {
|
core.register_privilege("give", {
|
||||||
description = "Can use /give and /giveme",
|
description = S("Can use /give and /giveme"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
core.register_privilege("password", {
|
core.register_privilege("password", {
|
||||||
description = "Can use /setpassword and /clearpassword",
|
description = S("Can use /setpassword and /clearpassword"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
give_to_admin = true,
|
give_to_admin = true,
|
||||||
})
|
})
|
||||||
core.register_privilege("fly", {
|
core.register_privilege("fly", {
|
||||||
description = "Can use fly mode",
|
description = S("Can use fly mode"),
|
||||||
give_to_singleplayer = creative,
|
give_to_singleplayer = creative,
|
||||||
})
|
})
|
||||||
core.register_privilege("fast", {
|
core.register_privilege("fast", {
|
||||||
description = "Can use fast mode",
|
description = S("Can use fast mode"),
|
||||||
give_to_singleplayer = creative,
|
give_to_singleplayer = creative,
|
||||||
})
|
})
|
||||||
core.register_privilege("noclip", {
|
core.register_privilege("noclip", {
|
||||||
description = "Can fly through solid nodes using noclip mode",
|
description = S("Can fly through solid nodes using noclip mode"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
core.register_privilege("rollback", {
|
core.register_privilege("rollback", {
|
||||||
description = "Can use the rollback functionality",
|
description = S("Can use the rollback functionality"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
core.register_privilege("debug", {
|
core.register_privilege("debug", {
|
||||||
description = "Allows enabling various debug options that may affect gameplay",
|
description = S("Allows enabling various debug options that may affect gameplay"),
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
give_to_admin = true,
|
give_to_admin = true,
|
||||||
})
|
})
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
-- Minetest: builtin/misc_register.lua
|
-- Minetest: builtin/misc_register.lua
|
||||||
|
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Make raw registration functions inaccessible to anyone except this file
|
-- Make raw registration functions inaccessible to anyone except this file
|
||||||
--
|
--
|
||||||
@ -329,7 +331,7 @@ end
|
|||||||
|
|
||||||
core.register_item(":unknown", {
|
core.register_item(":unknown", {
|
||||||
type = "none",
|
type = "none",
|
||||||
description = "Unknown Item",
|
description = S("Unknown Item"),
|
||||||
inventory_image = "unknown_item.png",
|
inventory_image = "unknown_item.png",
|
||||||
on_place = core.item_place,
|
on_place = core.item_place,
|
||||||
on_secondary_use = core.item_secondary_use,
|
on_secondary_use = core.item_secondary_use,
|
||||||
@ -339,7 +341,7 @@ core.register_item(":unknown", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
core.register_node(":air", {
|
core.register_node(":air", {
|
||||||
description = "Air",
|
description = S("Air"),
|
||||||
inventory_image = "blank.png",
|
inventory_image = "blank.png",
|
||||||
wield_image = "blank.png",
|
wield_image = "blank.png",
|
||||||
drawtype = "airlike",
|
drawtype = "airlike",
|
||||||
@ -357,7 +359,7 @@ core.register_node(":air", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
core.register_node(":ignore", {
|
core.register_node(":ignore", {
|
||||||
description = "Ignore",
|
description = S("Ignore"),
|
||||||
inventory_image = "ignore.png",
|
inventory_image = "ignore.png",
|
||||||
wield_image = "ignore.png",
|
wield_image = "ignore.png",
|
||||||
drawtype = "airlike",
|
drawtype = "airlike",
|
||||||
@ -375,7 +377,7 @@ core.register_node(":ignore", {
|
|||||||
core.chat_send_player(
|
core.chat_send_player(
|
||||||
placer:get_player_name(),
|
placer:get_player_name(),
|
||||||
core.colorize("#FF0000",
|
core.colorize("#FF0000",
|
||||||
"You can't place 'ignore' nodes!"))
|
S("You can't place 'ignore' nodes!")))
|
||||||
return ""
|
return ""
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
226
builtin/locale/template.txt
Normal file
226
builtin/locale/template.txt
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
# textdomain: __builtin
|
||||||
|
Empty command.=
|
||||||
|
Invalid command: @1=
|
||||||
|
Invalid command usage.=
|
||||||
|
You don't have permission to run this command (missing privileges: @1).=
|
||||||
|
Unable to get position of player @1.=
|
||||||
|
Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=
|
||||||
|
<action>=
|
||||||
|
Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=
|
||||||
|
Show the name of the server owner=
|
||||||
|
The administrator of this server is @1.=
|
||||||
|
There's no administrator named in the config file.=
|
||||||
|
[<name>]=
|
||||||
|
Show privileges of yourself or another player=
|
||||||
|
Player @1 does not exist.=
|
||||||
|
Privileges of @1: @2=
|
||||||
|
<privilege>=
|
||||||
|
Return list of all online players with privilege=
|
||||||
|
Invalid parameters (see /help haspriv).=
|
||||||
|
Unknown privilege!=
|
||||||
|
Players online with the "@1" privilege: @2=
|
||||||
|
Your privileges are insufficient.=
|
||||||
|
Unknown privilege: @1=
|
||||||
|
@1 granted you privileges: @2=
|
||||||
|
<name> (<privilege> | all)=
|
||||||
|
Give privileges to player=
|
||||||
|
Invalid parameters (see /help grant).=
|
||||||
|
<privilege> | all=
|
||||||
|
Grant privileges to yourself=
|
||||||
|
Invalid parameters (see /help grantme).=
|
||||||
|
@1 revoked privileges from you: @2=
|
||||||
|
Remove privileges from player=
|
||||||
|
Invalid parameters (see /help revoke).=
|
||||||
|
Revoke privileges from yourself=
|
||||||
|
Invalid parameters (see /help revokeme).=
|
||||||
|
<name> <password>=
|
||||||
|
Set player's password=
|
||||||
|
Name field required.=
|
||||||
|
Your password was cleared by @1.=
|
||||||
|
Password of player "@1" cleared.=
|
||||||
|
Your password was set by @1.=
|
||||||
|
Password of player "@1" set.=
|
||||||
|
<name>=
|
||||||
|
Set empty password for a player=
|
||||||
|
Reload authentication data=
|
||||||
|
Done.=
|
||||||
|
Failed.=
|
||||||
|
Remove a player's data=
|
||||||
|
Player "@1" removed.=
|
||||||
|
No such player "@1" to remove.=
|
||||||
|
Player "@1" is connected, cannot remove.=
|
||||||
|
Unhandled remove_player return code @1.=
|
||||||
|
Cannot teleport out of map bounds!=
|
||||||
|
Cannot get player with name @1.=
|
||||||
|
Cannot teleport, @1 is attached to an object!=
|
||||||
|
Teleporting @1 to @2.=
|
||||||
|
One does not teleport to oneself.=
|
||||||
|
Cannot get teleportee with name @1.=
|
||||||
|
Cannot get target player with name @1.=
|
||||||
|
Teleporting @1 to @2 at @3.=
|
||||||
|
<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=
|
||||||
|
Teleport to position or player=
|
||||||
|
You don't have permission to teleport other players (missing privilege: @1).=
|
||||||
|
([-n] <name> <value>) | <name>=
|
||||||
|
Set or read server configuration setting=
|
||||||
|
Failed. Use '/set -n <name> <value>' to create a new setting.=
|
||||||
|
@1 @= @2=
|
||||||
|
<not set>=
|
||||||
|
Invalid parameters (see /help set).=
|
||||||
|
Finished emerging @1 blocks in @2ms.=
|
||||||
|
emergeblocks update: @1/@2 blocks emerged (@3%)=
|
||||||
|
(here [<radius>]) | (<pos1> <pos2>)=
|
||||||
|
Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=
|
||||||
|
Started emerge of area ranging from @1 to @2.=
|
||||||
|
Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=
|
||||||
|
Successfully cleared area ranging from @1 to @2.=
|
||||||
|
Failed to clear one or more blocks in area.=
|
||||||
|
Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=
|
||||||
|
Successfully reset light in the area ranging from @1 to @2.=
|
||||||
|
Failed to load one or more blocks in area.=
|
||||||
|
List mods installed on the server=
|
||||||
|
Cannot give an empty item.=
|
||||||
|
Cannot give an unknown item.=
|
||||||
|
Giving 'ignore' is not allowed.=
|
||||||
|
@1 is not a known player.=
|
||||||
|
@1 partially added to inventory.=
|
||||||
|
@1 could not be added to inventory.=
|
||||||
|
@1 added to inventory.=
|
||||||
|
@1 partially added to inventory of @2.=
|
||||||
|
@1 could not be added to inventory of @2.=
|
||||||
|
@1 added to inventory of @2.=
|
||||||
|
<name> <ItemString> [<count> [<wear>]]=
|
||||||
|
Give item to player=
|
||||||
|
Name and ItemString required.=
|
||||||
|
<ItemString> [<count> [<wear>]]=
|
||||||
|
Give item to yourself=
|
||||||
|
ItemString required.=
|
||||||
|
<EntityName> [<X>,<Y>,<Z>]=
|
||||||
|
Spawn entity at given (or your) position=
|
||||||
|
EntityName required.=
|
||||||
|
Unable to spawn entity, player is nil.=
|
||||||
|
Cannot spawn an unknown entity.=
|
||||||
|
Invalid parameters (@1).=
|
||||||
|
@1 spawned.=
|
||||||
|
@1 failed to spawn.=
|
||||||
|
Destroy item in hand=
|
||||||
|
Unable to pulverize, no player.=
|
||||||
|
Unable to pulverize, no item in hand.=
|
||||||
|
An item was pulverized.=
|
||||||
|
[<range>] [<seconds>] [<limit>]=
|
||||||
|
Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=
|
||||||
|
Rollback functions are disabled.=
|
||||||
|
That limit is too high!=
|
||||||
|
Checking @1 ...=
|
||||||
|
Nobody has touched the specified location in @1 seconds.=
|
||||||
|
@1 @2 @3 -> @4 @5 seconds ago.=
|
||||||
|
Punch a node (range@=@1, seconds@=@2, limit@=@3).=
|
||||||
|
(<name> [<seconds>]) | (:<actor> [<seconds>])=
|
||||||
|
Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=
|
||||||
|
Invalid parameters. See /help rollback and /help rollback_check.=
|
||||||
|
Reverting actions of player '@1' since @2 seconds.=
|
||||||
|
Reverting actions of @1 since @2 seconds.=
|
||||||
|
(log is too long to show)=
|
||||||
|
Reverting actions succeeded.=
|
||||||
|
Reverting actions FAILED.=
|
||||||
|
Show server status=
|
||||||
|
This command was disabled by a mod or game.=
|
||||||
|
[<0..23>:<0..59> | <0..24000>]=
|
||||||
|
Show or set time of day=
|
||||||
|
Current time is @1:@2.=
|
||||||
|
You don't have permission to run this command (missing privilege: @1).=
|
||||||
|
Invalid time.=
|
||||||
|
Time of day changed.=
|
||||||
|
Invalid hour (must be between 0 and 23 inclusive).=
|
||||||
|
Invalid minute (must be between 0 and 59 inclusive).=
|
||||||
|
Show day count since world creation=
|
||||||
|
Current day is @1.=
|
||||||
|
[<delay_in_seconds> | -1] [reconnect] [<message>]=
|
||||||
|
Shutdown server (-1 cancels a delayed shutdown)=
|
||||||
|
Server shutting down (operator request).=
|
||||||
|
Ban the IP of a player or show the ban list=
|
||||||
|
The ban list is empty.=
|
||||||
|
Ban list: @1=
|
||||||
|
Player is not online.=
|
||||||
|
Failed to ban player.=
|
||||||
|
Banned @1.=
|
||||||
|
<name> | <IP_address>=
|
||||||
|
Remove IP ban belonging to a player/IP=
|
||||||
|
Failed to unban player/IP.=
|
||||||
|
Unbanned @1.=
|
||||||
|
<name> [<reason>]=
|
||||||
|
Kick a player=
|
||||||
|
Failed to kick player @1.=
|
||||||
|
Kicked @1.=
|
||||||
|
[full | quick]=
|
||||||
|
Clear all objects in world=
|
||||||
|
Invalid usage, see /help clearobjects.=
|
||||||
|
Clearing all objects. This may take a long time. You may experience a timeout.=
|
||||||
|
Cleared all objects.=
|
||||||
|
<name> <message>=
|
||||||
|
Send a private message to a player=
|
||||||
|
Invalid usage, see /help msg.=
|
||||||
|
The player @1 is not online.=
|
||||||
|
PM from @1: @2=
|
||||||
|
Message sent.=
|
||||||
|
Get the last login time of a player or yourself=
|
||||||
|
@1's last login time was @2.=
|
||||||
|
@1's last login time is unknown.=
|
||||||
|
Clear the inventory of yourself or another player=
|
||||||
|
You don't have permission to clear another player's inventory (missing privilege: @1).=
|
||||||
|
@1 cleared your inventory.=
|
||||||
|
Cleared @1's inventory.=
|
||||||
|
Player must be online to clear inventory!=
|
||||||
|
Players can't be killed, damage has been disabled.=
|
||||||
|
Player @1 is not online.=
|
||||||
|
You are already dead.=
|
||||||
|
@1 is already dead.=
|
||||||
|
@1 has been killed.=
|
||||||
|
Kill player or yourself=
|
||||||
|
Available commands: @1=
|
||||||
|
Use '/help <cmd>' to get more information, or '/help all' to list everything.=
|
||||||
|
Available commands:=
|
||||||
|
Command not available: @1=
|
||||||
|
[all | privs | <cmd>]=
|
||||||
|
Get help for commands or list privileges=
|
||||||
|
Available privileges:=
|
||||||
|
Command=
|
||||||
|
Parameters=
|
||||||
|
For more information, click on any entry in the list.=
|
||||||
|
Double-click to copy the entry to the chat history.=
|
||||||
|
Command: @1 @2=
|
||||||
|
Available commands: (see also: /help <cmd>)=
|
||||||
|
Close=
|
||||||
|
Privilege=
|
||||||
|
Description=
|
||||||
|
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=
|
||||||
|
Handle the profiler and profiling data=
|
||||||
|
Statistics written to action log.=
|
||||||
|
Statistics were reset.=
|
||||||
|
Usage: @1=
|
||||||
|
Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=
|
||||||
|
(no description)=
|
||||||
|
Can interact with things and modify the world=
|
||||||
|
Can speak in chat=
|
||||||
|
Can modify 'shout' and 'interact' privileges=
|
||||||
|
Can modify privileges=
|
||||||
|
Can teleport self=
|
||||||
|
Can teleport other players=
|
||||||
|
Can set the time of day using /time=
|
||||||
|
Can do server maintenance stuff=
|
||||||
|
Can bypass node protection in the world=
|
||||||
|
Can ban and unban players=
|
||||||
|
Can kick players=
|
||||||
|
Can use /give and /giveme=
|
||||||
|
Can use /setpassword and /clearpassword=
|
||||||
|
Can use fly mode=
|
||||||
|
Can use fast mode=
|
||||||
|
Can fly through solid nodes using noclip mode=
|
||||||
|
Can use the rollback functionality=
|
||||||
|
Allows enabling various debug options that may affect gameplay=
|
||||||
|
Unknown Item=
|
||||||
|
Air=
|
||||||
|
Ignore=
|
||||||
|
You can't place 'ignore' nodes!=
|
||||||
|
Sets the spawn point to your current position=
|
||||||
|
The spawn point has been set to @1=
|
@ -158,11 +158,26 @@ local function get_formspec(tabview, name, tabdata)
|
|||||||
return retval
|
return retval
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local function handle_doubleclick(pkg)
|
||||||
|
if pkg.type == "txp" then
|
||||||
|
if core.settings:get("texture_path") == pkg.path then
|
||||||
|
core.settings:set("texture_path", "")
|
||||||
|
else
|
||||||
|
core.settings:set("texture_path", pkg.path)
|
||||||
|
end
|
||||||
|
packages = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
local function handle_buttons(tabview, fields, tabname, tabdata)
|
local function handle_buttons(tabview, fields, tabname, tabdata)
|
||||||
if fields["pkglist"] ~= nil then
|
if fields["pkglist"] ~= nil then
|
||||||
local event = core.explode_table_event(fields["pkglist"])
|
local event = core.explode_table_event(fields["pkglist"])
|
||||||
tabdata.selected_pkg = event.row
|
tabdata.selected_pkg = event.row
|
||||||
|
if event.type == "DCL" then
|
||||||
|
handle_doubleclick(packages:get_list()[tabdata.selected_pkg])
|
||||||
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
--with this program; if not, write to the Free Software Foundation, Inc.,
|
--with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
|
|
||||||
local function get_bool_default(name, default)
|
local function get_bool_default(name, default)
|
||||||
local val = core.settings:get_bool(name)
|
local val = core.settings:get_bool(name)
|
||||||
if val == nil then
|
if val == nil then
|
||||||
@ -40,9 +42,9 @@ function profiler.init_chatcommand()
|
|||||||
instrumentation.init_chatcommand()
|
instrumentation.init_chatcommand()
|
||||||
end
|
end
|
||||||
|
|
||||||
local param_usage = "print [filter] | dump [filter] | save [format [filter]] | reset"
|
local param_usage = S("print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset")
|
||||||
core.register_chatcommand("profiler", {
|
core.register_chatcommand("profiler", {
|
||||||
description = "handle the profiler and profiling data",
|
description = S("Handle the profiler and profiling data"),
|
||||||
params = param_usage,
|
params = param_usage,
|
||||||
privs = { server=true },
|
privs = { server=true },
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
@ -51,21 +53,19 @@ function profiler.init_chatcommand()
|
|||||||
|
|
||||||
if command == "dump" then
|
if command == "dump" then
|
||||||
core.log("action", reporter.print(sampler.profile, arg0))
|
core.log("action", reporter.print(sampler.profile, arg0))
|
||||||
return true, "Statistics written to action log"
|
return true, S("Statistics written to action log.")
|
||||||
elseif command == "print" then
|
elseif command == "print" then
|
||||||
return true, reporter.print(sampler.profile, arg0)
|
return true, reporter.print(sampler.profile, arg0)
|
||||||
elseif command == "save" then
|
elseif command == "save" then
|
||||||
return reporter.save(sampler.profile, args[1] or "txt", args[2])
|
return reporter.save(sampler.profile, args[1] or "txt", args[2])
|
||||||
elseif command == "reset" then
|
elseif command == "reset" then
|
||||||
sampler.reset()
|
sampler.reset()
|
||||||
return true, "Statistics were reset"
|
return true, S("Statistics were reset.")
|
||||||
end
|
end
|
||||||
|
|
||||||
return false, string.format(
|
return false,
|
||||||
"Usage: %s\n" ..
|
S("Usage: @1", param_usage) .. "\n" ..
|
||||||
"Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).",
|
S("Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).")
|
||||||
param_usage
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ free_move (Flying) bool false
|
|||||||
# If enabled, makes move directions relative to the player's pitch when flying or swimming.
|
# If enabled, makes move directions relative to the player's pitch when flying or swimming.
|
||||||
pitch_move (Pitch move mode) bool false
|
pitch_move (Pitch move mode) bool false
|
||||||
|
|
||||||
# Fast movement (via the "special" key).
|
# Fast movement (via the "Aux1" key).
|
||||||
# This requires the "fast" privilege on the server.
|
# This requires the "fast" privilege on the server.
|
||||||
fast_move (Fast movement) bool false
|
fast_move (Fast movement) bool false
|
||||||
|
|
||||||
@ -99,14 +99,14 @@ invert_mouse (Invert mouse) bool false
|
|||||||
# Mouse sensitivity multiplier.
|
# Mouse sensitivity multiplier.
|
||||||
mouse_sensitivity (Mouse sensitivity) float 0.2
|
mouse_sensitivity (Mouse sensitivity) float 0.2
|
||||||
|
|
||||||
# If enabled, "special" key instead of "sneak" key is used for climbing down and
|
# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and
|
||||||
# descending.
|
# descending.
|
||||||
aux1_descends (Special key for climbing/descending) bool false
|
aux1_descends (Aux1 key for climbing/descending) bool false
|
||||||
|
|
||||||
# Double-tapping the jump key toggles fly mode.
|
# Double-tapping the jump key toggles fly mode.
|
||||||
doubletap_jump (Double tap jump for fly) bool false
|
doubletap_jump (Double tap jump for fly) bool false
|
||||||
|
|
||||||
# If disabled, "special" key is used to fly fast if both fly and fast mode are
|
# If disabled, "Aux1" key is used to fly fast if both fly and fast mode are
|
||||||
# enabled.
|
# enabled.
|
||||||
always_fly_fast (Always fly and fast) bool true
|
always_fly_fast (Always fly and fast) bool true
|
||||||
|
|
||||||
@ -135,9 +135,9 @@ touchscreen_threshold (Touch screen threshold) int 20 0 100
|
|||||||
# If disabled, virtual joystick will center to first-touch's position.
|
# If disabled, virtual joystick will center to first-touch's position.
|
||||||
fixed_virtual_joystick (Fixed virtual joystick) bool false
|
fixed_virtual_joystick (Fixed virtual joystick) bool false
|
||||||
|
|
||||||
# (Android) Use virtual joystick to trigger "aux" button.
|
# (Android) Use virtual joystick to trigger "Aux1" button.
|
||||||
# If enabled, virtual joystick will also tap "aux" button when out of main circle.
|
# If enabled, virtual joystick will also tap "Aux1" button when out of main circle.
|
||||||
virtual_joystick_triggers_aux (Virtual joystick triggers aux button) bool false
|
virtual_joystick_triggers_aux1 (Virtual joystick triggers Aux1 button) bool false
|
||||||
|
|
||||||
# Enable joysticks
|
# Enable joysticks
|
||||||
enable_joysticks (Enable joysticks) bool false
|
enable_joysticks (Enable joysticks) bool false
|
||||||
@ -199,7 +199,7 @@ keymap_inventory (Inventory key) key KEY_KEY_I
|
|||||||
|
|
||||||
# Key for moving fast in fast mode.
|
# Key for moving fast in fast mode.
|
||||||
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
|
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
|
||||||
keymap_special1 (Special key) key KEY_KEY_E
|
keymap_aux1 (Aux1 key) key KEY_KEY_E
|
||||||
|
|
||||||
# Key for opening the chat window.
|
# Key for opening the chat window.
|
||||||
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
|
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
|
||||||
|
@ -6,7 +6,7 @@ uniform sampler2D textureFlags;
|
|||||||
#define rightImage normalTexture
|
#define rightImage normalTexture
|
||||||
#define maskImage textureFlags
|
#define maskImage textureFlags
|
||||||
|
|
||||||
varying mediump vec2 varTexCoord;
|
varying mediump vec4 varTexCoord;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
varying mediump vec2 varTexCoord;
|
varying mediump vec4 varTexCoord;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
1
clientmods/preview/mod.conf
Normal file
1
clientmods/preview/mod.conf
Normal file
@ -0,0 +1 @@
|
|||||||
|
name = preview
|
@ -166,6 +166,15 @@ void ClientMap::updateDrawList()
|
|||||||
v3s16 p_blocks_max;
|
v3s16 p_blocks_max;
|
||||||
getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max);
|
getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max);
|
||||||
|
|
||||||
|
// Read the vision range, unless unlimited range is enabled.
|
||||||
|
#if !defined(__ANDROID__) && !defined(__IOS__)
|
||||||
|
float range = m_control.range_all ? 1e7 : m_control.wanted_range;
|
||||||
|
#else
|
||||||
|
// On mobile, "unlimited" range is only four times the regular range to
|
||||||
|
// prevent large FPS drops.
|
||||||
|
float range = m_control.range_all ? m_control.wanted_range * 4 : m_control.wanted_range;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Number of blocks currently loaded by the client
|
// Number of blocks currently loaded by the client
|
||||||
u32 blocks_loaded = 0;
|
u32 blocks_loaded = 0;
|
||||||
// Number of blocks with mesh in rendering range
|
// Number of blocks with mesh in rendering range
|
||||||
@ -183,6 +192,7 @@ void ClientMap::updateDrawList()
|
|||||||
occlusion_culling_enabled = false;
|
occlusion_culling_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Uncomment to debug occluded blocks in the wireframe mode
|
// Uncomment to debug occluded blocks in the wireframe mode
|
||||||
// TODO: Include this as a flag for an extended debugging setting
|
// TODO: Include this as a flag for an extended debugging setting
|
||||||
//if (occlusion_culling_enabled && m_control.show_wireframe)
|
//if (occlusion_culling_enabled && m_control.show_wireframe)
|
||||||
@ -219,33 +229,31 @@ void ClientMap::updateDrawList()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__ANDROID__) && !defined(__IOS__)
|
v3s16 block_coord = block->getPos();
|
||||||
float range = 100000 * BS;
|
v3s16 block_position = block->getPosRelative() + MAP_BLOCKSIZE / 2;
|
||||||
#else
|
|
||||||
float range = m_control.wanted_range * BS * 4;
|
|
||||||
#endif
|
|
||||||
if (!m_control.range_all)
|
|
||||||
range = m_control.wanted_range * BS;
|
|
||||||
|
|
||||||
float d = 0.0;
|
// First, perform a simple distance check, with a padding of one extra block.
|
||||||
if (!isBlockInSight(block->getPos(), camera_position,
|
if (!m_control.range_all &&
|
||||||
camera_direction, camera_fov, range, &d))
|
block_position.getDistanceFrom(cam_pos_nodes) > range + MAP_BLOCKSIZE)
|
||||||
continue;
|
continue; // Out of range, skip.
|
||||||
|
|
||||||
|
// Keep the block alive as long as it is in range.
|
||||||
|
block->resetUsageTimer();
|
||||||
blocks_in_range_with_mesh++;
|
blocks_in_range_with_mesh++;
|
||||||
|
|
||||||
/*
|
// Frustum culling
|
||||||
Occlusion culling
|
float d = 0.0;
|
||||||
*/
|
if (!isBlockInSight(block_coord, camera_position,
|
||||||
|
camera_direction, camera_fov, range * BS, &d))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Occlusion culling
|
||||||
if ((!m_control.range_all && d > m_control.wanted_range * BS) ||
|
if ((!m_control.range_all && d > m_control.wanted_range * BS) ||
|
||||||
(occlusion_culling_enabled && isBlockOccluded(block, cam_pos_nodes))) {
|
(occlusion_culling_enabled && isBlockOccluded(block, cam_pos_nodes))) {
|
||||||
blocks_occlusion_culled++;
|
blocks_occlusion_culled++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This block is in range. Reset usage timer.
|
|
||||||
block->resetUsageTimer();
|
|
||||||
|
|
||||||
// Add to set
|
// Add to set
|
||||||
block->refGrab();
|
block->refGrab();
|
||||||
m_drawlist.push_back({block, d});
|
m_drawlist.push_back({block, d});
|
||||||
@ -293,8 +301,6 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
|||||||
const u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
|
const u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
|
||||||
|
|
||||||
const v3f camera_position = m_camera_position;
|
const v3f camera_position = m_camera_position;
|
||||||
const v3f camera_direction = m_camera_direction;
|
|
||||||
const f32 camera_fov = m_camera_fov;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get all blocks and draw all visible ones
|
Get all blocks and draw all visible ones
|
||||||
@ -316,15 +322,15 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
|||||||
for (auto &item : m_drawlist) {
|
for (auto &item : m_drawlist) {
|
||||||
MapBlock *block = item.block;
|
MapBlock *block = item.block;
|
||||||
v3s16 block_pos = block->getPos();
|
v3s16 block_pos = block->getPos();
|
||||||
float d;
|
|
||||||
if (!isBlockInSight(block_pos, camera_position,
|
|
||||||
camera_direction, camera_fov, 100000 * BS, &d))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MapBlockMesh *mapBlockMesh = block->mesh;
|
MapBlockMesh *mapBlockMesh = block->mesh;
|
||||||
if (!mapBlockMesh)
|
if (!mapBlockMesh)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
v3f block_pos_r = intToFloat(block->getPosRelative() + MAP_BLOCKSIZE / 2, BS);
|
||||||
|
float d = camera_position.getDistanceFrom(block_pos_r);
|
||||||
|
d = MYMAX(0,d - BLOCK_MAX_RADIUS);
|
||||||
|
|
||||||
// Mesh animation
|
// Mesh animation
|
||||||
if (pass == scene::ESNRP_SOLID) {
|
if (pass == scene::ESNRP_SOLID) {
|
||||||
// Pretty random but this should work somewhat nicely
|
// Pretty random but this should work somewhat nicely
|
||||||
|
@ -2526,7 +2526,7 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
|
|||||||
input->isKeyDown(KeyType::LEFT),
|
input->isKeyDown(KeyType::LEFT),
|
||||||
input->isKeyDown(KeyType::RIGHT),
|
input->isKeyDown(KeyType::RIGHT),
|
||||||
isKeyDown(KeyType::JUMP),
|
isKeyDown(KeyType::JUMP),
|
||||||
isKeyDown(KeyType::SPECIAL1),
|
isKeyDown(KeyType::AUX1),
|
||||||
isKeyDown(KeyType::SNEAK),
|
isKeyDown(KeyType::SNEAK),
|
||||||
isKeyDown(KeyType::ZOOM),
|
isKeyDown(KeyType::ZOOM),
|
||||||
isKeyDown(KeyType::DIG),
|
isKeyDown(KeyType::DIG),
|
||||||
@ -2543,7 +2543,7 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
|
|||||||
( (u32)(isKeyDown(KeyType::LEFT) & 0x1) << 2) |
|
( (u32)(isKeyDown(KeyType::LEFT) & 0x1) << 2) |
|
||||||
( (u32)(isKeyDown(KeyType::RIGHT) & 0x1) << 3) |
|
( (u32)(isKeyDown(KeyType::RIGHT) & 0x1) << 3) |
|
||||||
( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) |
|
( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) |
|
||||||
( (u32)(isKeyDown(KeyType::SPECIAL1) & 0x1) << 5) |
|
( (u32)(isKeyDown(KeyType::AUX1) & 0x1) << 5) |
|
||||||
( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) |
|
( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) |
|
||||||
( (u32)(isKeyDown(KeyType::DIG) & 0x1) << 7) |
|
( (u32)(isKeyDown(KeyType::DIG) & 0x1) << 7) |
|
||||||
( (u32)(isKeyDown(KeyType::PLACE) & 0x1) << 8) |
|
( (u32)(isKeyDown(KeyType::PLACE) & 0x1) << 8) |
|
||||||
|
@ -40,7 +40,7 @@ void KeyCache::populate()
|
|||||||
key[KeyType::LEFT] = getKeySetting("keymap_left");
|
key[KeyType::LEFT] = getKeySetting("keymap_left");
|
||||||
key[KeyType::RIGHT] = getKeySetting("keymap_right");
|
key[KeyType::RIGHT] = getKeySetting("keymap_right");
|
||||||
key[KeyType::JUMP] = getKeySetting("keymap_jump");
|
key[KeyType::JUMP] = getKeySetting("keymap_jump");
|
||||||
key[KeyType::SPECIAL1] = getKeySetting("keymap_special1");
|
key[KeyType::AUX1] = getKeySetting("keymap_aux1");
|
||||||
key[KeyType::SNEAK] = getKeySetting("keymap_sneak");
|
key[KeyType::SNEAK] = getKeySetting("keymap_sneak");
|
||||||
key[KeyType::DIG] = getKeySetting("keymap_dig");
|
key[KeyType::DIG] = getKeySetting("keymap_dig");
|
||||||
key[KeyType::PLACE] = getKeySetting("keymap_place");
|
key[KeyType::PLACE] = getKeySetting("keymap_place");
|
||||||
@ -238,7 +238,7 @@ void RandomInputHandler::step(float dtime)
|
|||||||
{
|
{
|
||||||
static RandomInputHandlerSimData rnd_data[] = {
|
static RandomInputHandlerSimData rnd_data[] = {
|
||||||
{ "keymap_jump", 0.0f, 40 },
|
{ "keymap_jump", 0.0f, 40 },
|
||||||
{ "keymap_special1", 0.0f, 40 },
|
{ "keymap_aux1", 0.0f, 40 },
|
||||||
{ "keymap_forward", 0.0f, 40 },
|
{ "keymap_forward", 0.0f, 40 },
|
||||||
{ "keymap_left", 0.0f, 40 },
|
{ "keymap_left", 0.0f, 40 },
|
||||||
{ "keymap_dig", 0.0f, 30 },
|
{ "keymap_dig", 0.0f, 30 },
|
||||||
|
@ -79,7 +79,7 @@ JoystickLayout create_default_layout()
|
|||||||
|
|
||||||
// Accessible without any modifier pressed
|
// Accessible without any modifier pressed
|
||||||
JLO_B_PB(KeyType::JUMP, bm | 1 << 0, 1 << 0);
|
JLO_B_PB(KeyType::JUMP, bm | 1 << 0, 1 << 0);
|
||||||
JLO_B_PB(KeyType::SPECIAL1, bm | 1 << 1, 1 << 1);
|
JLO_B_PB(KeyType::AUX1, bm | 1 << 1, 1 << 1);
|
||||||
|
|
||||||
// Accessible with start button not pressed, but four pressed
|
// Accessible with start button not pressed, but four pressed
|
||||||
// TODO find usage for button 0
|
// TODO find usage for button 0
|
||||||
@ -126,11 +126,11 @@ JoystickLayout create_xbox_layout()
|
|||||||
// 4 Buttons
|
// 4 Buttons
|
||||||
JLO_B_PB(KeyType::JUMP, 1 << 0, 1 << 0); // A/green
|
JLO_B_PB(KeyType::JUMP, 1 << 0, 1 << 0); // A/green
|
||||||
JLO_B_PB(KeyType::ESC, 1 << 1, 1 << 1); // B/red
|
JLO_B_PB(KeyType::ESC, 1 << 1, 1 << 1); // B/red
|
||||||
JLO_B_PB(KeyType::SPECIAL1, 1 << 2, 1 << 2); // X/blue
|
JLO_B_PB(KeyType::AUX1, 1 << 2, 1 << 2); // X/blue
|
||||||
JLO_B_PB(KeyType::INVENTORY, 1 << 3, 1 << 3); // Y/yellow
|
JLO_B_PB(KeyType::INVENTORY, 1 << 3, 1 << 3); // Y/yellow
|
||||||
|
|
||||||
// Analog Sticks
|
// Analog Sticks
|
||||||
JLO_B_PB(KeyType::SPECIAL1, 1 << 11, 1 << 11); // left
|
JLO_B_PB(KeyType::AUX1, 1 << 11, 1 << 11); // left
|
||||||
JLO_B_PB(KeyType::SNEAK, 1 << 12, 1 << 12); // right
|
JLO_B_PB(KeyType::SNEAK, 1 << 12, 1 << 12); // right
|
||||||
|
|
||||||
// Triggers
|
// Triggers
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
LEFT,
|
LEFT,
|
||||||
RIGHT,
|
RIGHT,
|
||||||
JUMP,
|
JUMP,
|
||||||
SPECIAL1,
|
AUX1,
|
||||||
SNEAK,
|
SNEAK,
|
||||||
AUTOFORWARD,
|
AUTOFORWARD,
|
||||||
DIG,
|
DIG,
|
||||||
|
@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
#include "convert_json.h"
|
#include "convert_json.h"
|
||||||
|
#include "script/common/c_internal.h"
|
||||||
|
|
||||||
bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols)
|
bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols)
|
||||||
{
|
{
|
||||||
@ -44,20 +45,24 @@ bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols)
|
|||||||
return !dep.empty();
|
return !dep.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void log_mod_deprecation(const ModSpec &spec, const std::string &warning)
|
||||||
|
{
|
||||||
|
auto handling_mode = get_deprecated_handling_mode();
|
||||||
|
if (handling_mode != DeprecatedHandlingMode::Ignore) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << warning << " (" << spec.name << " at " << spec.path << ")" << std::endl;
|
||||||
|
|
||||||
|
if (handling_mode == DeprecatedHandlingMode::Error) {
|
||||||
|
throw ModError(os.str());
|
||||||
|
} else {
|
||||||
|
warningstream << os.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void parseModContents(ModSpec &spec)
|
void parseModContents(ModSpec &spec)
|
||||||
{
|
{
|
||||||
// NOTE: this function works in mutual recursion with getModsInPath
|
// NOTE: this function works in mutual recursion with getModsInPath
|
||||||
Settings info;
|
|
||||||
info.readConfigFile((spec.path + DIR_DELIM + "mod.conf").c_str());
|
|
||||||
|
|
||||||
if (info.exists("name"))
|
|
||||||
spec.name = info.get("name");
|
|
||||||
|
|
||||||
if (info.exists("author"))
|
|
||||||
spec.author = info.get("author");
|
|
||||||
|
|
||||||
if (info.exists("release"))
|
|
||||||
spec.release = info.getS32("release");
|
|
||||||
|
|
||||||
spec.depends.clear();
|
spec.depends.clear();
|
||||||
spec.optdepends.clear();
|
spec.optdepends.clear();
|
||||||
@ -78,6 +83,20 @@ void parseModContents(ModSpec &spec)
|
|||||||
spec.modpack_content = getModsInPath(spec.path, true);
|
spec.modpack_content = getModsInPath(spec.path, true);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
Settings info;
|
||||||
|
info.readConfigFile((spec.path + DIR_DELIM + "mod.conf").c_str());
|
||||||
|
|
||||||
|
if (info.exists("name"))
|
||||||
|
spec.name = info.get("name");
|
||||||
|
else
|
||||||
|
log_mod_deprecation(spec, "Mods not having a mod.conf file with the name is deprecated.");
|
||||||
|
|
||||||
|
if (info.exists("author"))
|
||||||
|
spec.author = info.get("author");
|
||||||
|
|
||||||
|
if (info.exists("release"))
|
||||||
|
spec.release = info.getS32("release");
|
||||||
|
|
||||||
// Attempt to load dependencies from mod.conf
|
// Attempt to load dependencies from mod.conf
|
||||||
bool mod_conf_has_depends = false;
|
bool mod_conf_has_depends = false;
|
||||||
if (info.exists("depends")) {
|
if (info.exists("depends")) {
|
||||||
@ -109,6 +128,10 @@ void parseModContents(ModSpec &spec)
|
|||||||
std::vector<std::string> dependencies;
|
std::vector<std::string> dependencies;
|
||||||
|
|
||||||
std::ifstream is((spec.path + DIR_DELIM + "depends.txt").c_str());
|
std::ifstream is((spec.path + DIR_DELIM + "depends.txt").c_str());
|
||||||
|
|
||||||
|
if (is.good())
|
||||||
|
log_mod_deprecation(spec, "depends.txt is deprecated, please use mod.conf instead.");
|
||||||
|
|
||||||
while (is.good()) {
|
while (is.good()) {
|
||||||
std::string dep;
|
std::string dep;
|
||||||
std::getline(is, dep);
|
std::getline(is, dep);
|
||||||
@ -127,14 +150,10 @@ void parseModContents(ModSpec &spec)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.exists("description")) {
|
if (info.exists("description"))
|
||||||
spec.desc = info.get("description");
|
spec.desc = info.get("description");
|
||||||
} else {
|
else if (fs::ReadFile(spec.path + DIR_DELIM + "description.txt", spec.desc))
|
||||||
std::ifstream is((spec.path + DIR_DELIM + "description.txt")
|
log_mod_deprecation(spec, "description.txt is deprecated, please use mod.conf instead.");
|
||||||
.c_str());
|
|
||||||
spec.desc = std::string((std::istreambuf_iterator<char>(is)),
|
|
||||||
std::istreambuf_iterator<char>());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ void set_default_settings()
|
|||||||
settings->setDefault("keymap_drop", "KEY_KEY_Q");
|
settings->setDefault("keymap_drop", "KEY_KEY_Q");
|
||||||
settings->setDefault("keymap_zoom", "KEY_KEY_Z");
|
settings->setDefault("keymap_zoom", "KEY_KEY_Z");
|
||||||
settings->setDefault("keymap_inventory", "KEY_KEY_I");
|
settings->setDefault("keymap_inventory", "KEY_KEY_I");
|
||||||
settings->setDefault("keymap_special1", "KEY_KEY_E");
|
settings->setDefault("keymap_aux1", "KEY_KEY_E");
|
||||||
settings->setDefault("keymap_chat", "KEY_KEY_T");
|
settings->setDefault("keymap_chat", "KEY_KEY_T");
|
||||||
settings->setDefault("keymap_cmd", "/");
|
settings->setDefault("keymap_cmd", "/");
|
||||||
settings->setDefault("keymap_cmd_local", ".");
|
settings->setDefault("keymap_cmd_local", ".");
|
||||||
@ -529,7 +529,7 @@ void set_default_settings()
|
|||||||
settings->setDefault("touchtarget", "true");
|
settings->setDefault("touchtarget", "true");
|
||||||
settings->setDefault("touchscreen_threshold", "20");
|
settings->setDefault("touchscreen_threshold", "20");
|
||||||
settings->setDefault("fixed_virtual_joystick", "true");
|
settings->setDefault("fixed_virtual_joystick", "true");
|
||||||
settings->setDefault("virtual_joystick_triggers_aux", "false");
|
settings->setDefault("virtual_joystick_triggers_aux1", "false");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Mobile Platform
|
// Mobile Platform
|
||||||
|
@ -47,7 +47,7 @@ enum
|
|||||||
GUI_ID_KEY_BACKWARD_BUTTON,
|
GUI_ID_KEY_BACKWARD_BUTTON,
|
||||||
GUI_ID_KEY_LEFT_BUTTON,
|
GUI_ID_KEY_LEFT_BUTTON,
|
||||||
GUI_ID_KEY_RIGHT_BUTTON,
|
GUI_ID_KEY_RIGHT_BUTTON,
|
||||||
GUI_ID_KEY_USE_BUTTON,
|
GUI_ID_KEY_AUX1_BUTTON,
|
||||||
GUI_ID_KEY_FLY_BUTTON,
|
GUI_ID_KEY_FLY_BUTTON,
|
||||||
GUI_ID_KEY_FAST_BUTTON,
|
GUI_ID_KEY_FAST_BUTTON,
|
||||||
GUI_ID_KEY_JUMP_BUTTON,
|
GUI_ID_KEY_JUMP_BUTTON,
|
||||||
@ -184,7 +184,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
|
|||||||
{
|
{
|
||||||
core::rect<s32> rect(0, 0, option_w, 30 * s);
|
core::rect<s32> rect(0, 0, option_w, 30 * s);
|
||||||
rect += topleft + v2s32(option_x, option_y);
|
rect += topleft + v2s32(option_x, option_y);
|
||||||
const wchar_t *text = wgettext("\"Special\" = climb down");
|
const wchar_t *text = wgettext("\"Aux1\" = climb down");
|
||||||
Environment->addCheckBox(g_settings->getBool("aux1_descends"), rect, this,
|
Environment->addCheckBox(g_settings->getBool("aux1_descends"), rect, this,
|
||||||
GUI_ID_CB_AUX1_DESCENDS, text);
|
GUI_ID_CB_AUX1_DESCENDS, text);
|
||||||
delete[] text;
|
delete[] text;
|
||||||
@ -423,7 +423,7 @@ void GUIKeyChangeMenu::init_keys()
|
|||||||
this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward");
|
this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward");
|
||||||
this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left");
|
this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left");
|
||||||
this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right");
|
this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right");
|
||||||
this->add_key(GUI_ID_KEY_USE_BUTTON, wgettext("Special"), "keymap_special1");
|
this->add_key(GUI_ID_KEY_AUX1_BUTTON, wgettext("Aux1"), "keymap_aux1");
|
||||||
this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump");
|
this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump");
|
||||||
this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak");
|
this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak");
|
||||||
this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop");
|
this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop");
|
||||||
|
@ -43,7 +43,7 @@ const char **button_imagenames = (const char *[]) {
|
|||||||
"drop_btn.png",
|
"drop_btn.png",
|
||||||
"down_btn.png",
|
"down_btn.png",
|
||||||
//"zoom.png",
|
//"zoom.png",
|
||||||
//"aux_btn.png",
|
//"aux1_btn.png",
|
||||||
"inventory_btn.png",
|
"inventory_btn.png",
|
||||||
"escape_btn.png",
|
"escape_btn.png",
|
||||||
"minimap_btn.png",
|
"minimap_btn.png",
|
||||||
@ -89,8 +89,8 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id)
|
|||||||
/*case zoom_id:
|
/*case zoom_id:
|
||||||
key = "zoom";
|
key = "zoom";
|
||||||
break;
|
break;
|
||||||
case special1_id:
|
case aux1_id:
|
||||||
key = "special1";
|
key = "aux1";
|
||||||
break;*/
|
break;*/
|
||||||
case fly_id:
|
case fly_id:
|
||||||
key = "freemove";
|
key = "freemove";
|
||||||
@ -437,7 +437,7 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver)
|
|||||||
m_touchscreen_threshold = g_settings->getU16("touchscreen_threshold");
|
m_touchscreen_threshold = g_settings->getU16("touchscreen_threshold");
|
||||||
m_mouse_sensitivity = rangelim(g_settings->getFloat("mouse_sensitivity"), 0.1, 1.0);
|
m_mouse_sensitivity = rangelim(g_settings->getFloat("mouse_sensitivity"), 0.1, 1.0);
|
||||||
m_fixed_joystick = g_settings->getBool("fixed_virtual_joystick");
|
m_fixed_joystick = g_settings->getBool("fixed_virtual_joystick");
|
||||||
m_joystick_triggers_special1 = g_settings->getBool("virtual_joystick_triggers_aux");
|
m_joystick_triggers_aux1 = g_settings->getBool("virtual_joystick_triggers_aux1");
|
||||||
m_screensize = m_device->getVideoDriver()->getScreenSize();
|
m_screensize = m_device->getVideoDriver()->getScreenSize();
|
||||||
button_size = std::min(m_screensize.Y / 4.5f,
|
button_size = std::min(m_screensize.Y / 4.5f,
|
||||||
RenderingEngine::getDisplayDensity() *
|
RenderingEngine::getDisplayDensity() *
|
||||||
@ -549,9 +549,9 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc)
|
|||||||
m_screensize.Y - (3 * button_size)),
|
m_screensize.Y - (3 * button_size)),
|
||||||
L"z", false);
|
L"z", false);
|
||||||
|
|
||||||
// init special1/aux button
|
// init aux1 button
|
||||||
if (!m_joystick_triggers_special1)
|
if (!m_joystick_triggers_aux1)
|
||||||
initButton(special1_id,
|
initButton(aux1_id,
|
||||||
rect<s32>(m_screensize.X - (1.25 * button_size),
|
rect<s32>(m_screensize.X - (1.25 * button_size),
|
||||||
m_screensize.Y - (2.5 * button_size),
|
m_screensize.Y - (2.5 * button_size),
|
||||||
m_screensize.X - (0.25 * button_size),
|
m_screensize.X - (0.25 * button_size),
|
||||||
@ -845,7 +845,7 @@ void TouchScreenGUI::moveJoystick(const SEvent &event, float dx, float dy) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (distance > button_size * 1.5) {
|
if (distance > button_size * 1.5) {
|
||||||
m_joystick_status[j_special1] = true;
|
m_joystick_status[j_aux1] = true;
|
||||||
// move joystick "button"
|
// move joystick "button"
|
||||||
s32 ndx = button_size * dx / distance * 1.5f - button_size / 2.0f * 1.5f;
|
s32 ndx = button_size * dx / distance * 1.5f - button_size / 2.0f * 1.5f;
|
||||||
s32 ndy = button_size * dy / distance * 1.5f - button_size / 2.0f * 1.5f;
|
s32 ndy = button_size * dy / distance * 1.5f - button_size / 2.0f * 1.5f;
|
||||||
@ -1124,7 +1124,7 @@ bool TouchScreenGUI::quickTapDetection()
|
|||||||
void TouchScreenGUI::applyJoystickStatus()
|
void TouchScreenGUI::applyJoystickStatus()
|
||||||
{
|
{
|
||||||
for (u32 i = 0; i < 5; i++) {
|
for (u32 i = 0; i < 5; i++) {
|
||||||
if (i == 4 && !m_joystick_triggers_special1)
|
if (i == 4 && !m_joystick_triggers_aux1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SEvent translated{};
|
SEvent translated{};
|
||||||
|
@ -42,7 +42,7 @@ typedef enum
|
|||||||
crunch_id,
|
crunch_id,
|
||||||
inventory_id,
|
inventory_id,
|
||||||
// zoom_id,
|
// zoom_id,
|
||||||
// special1_id,
|
// aux1_id,
|
||||||
escape_id,
|
escape_id,
|
||||||
minimap_id,
|
minimap_id,
|
||||||
range_id,
|
range_id,
|
||||||
@ -71,7 +71,7 @@ typedef enum
|
|||||||
j_backward,
|
j_backward,
|
||||||
j_left,
|
j_left,
|
||||||
j_right,
|
j_right,
|
||||||
j_special1
|
j_aux1
|
||||||
} touch_gui_joystick_move_id;
|
} touch_gui_joystick_move_id;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@ -224,7 +224,7 @@ private:
|
|||||||
|
|
||||||
// forward, backward, left, right
|
// forward, backward, left, right
|
||||||
touch_gui_button_id m_joystick_names[5] = {
|
touch_gui_button_id m_joystick_names[5] = {
|
||||||
forward_id, backward_id, left_id, right_id, /*special1_id*/};
|
forward_id, backward_id, left_id, right_id, /*aux1_id*/};
|
||||||
bool m_joystick_status[5] = {false, false, false, false, false};
|
bool m_joystick_status[5] = {false, false, false, false, false};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -246,7 +246,7 @@ private:
|
|||||||
size_t m_joystick_id;
|
size_t m_joystick_id;
|
||||||
bool m_joystick_has_really_moved = false;
|
bool m_joystick_has_really_moved = false;
|
||||||
bool m_fixed_joystick = false;
|
bool m_fixed_joystick = false;
|
||||||
bool m_joystick_triggers_special1 = false;
|
bool m_joystick_triggers_aux1 = false;
|
||||||
button_info *m_joystick_btn_off = nullptr;
|
button_info *m_joystick_btn_off = nullptr;
|
||||||
button_info *m_joystick_btn_bg = nullptr;
|
button_info *m_joystick_btn_bg = nullptr;
|
||||||
button_info *m_joystick_btn_center = nullptr;
|
button_info *m_joystick_btn_center = nullptr;
|
||||||
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "lua_api/l_settings.h"
|
#include "lua_api/l_settings.h"
|
||||||
#include "lua_api/l_internal.h"
|
#include "lua_api/l_internal.h"
|
||||||
#include "cpp_api/s_security.h"
|
#include "cpp_api/s_security.h"
|
||||||
|
#include "threading/mutex_auto_lock.h"
|
||||||
#include "util/string.h" // FlagDesc
|
#include "util/string.h" // FlagDesc
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "noise.h"
|
#include "noise.h"
|
||||||
@ -291,20 +292,36 @@ int LuaSettings::l_write(lua_State* L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void push_settings_table(lua_State *L, const Settings *settings)
|
||||||
|
{
|
||||||
|
std::vector<std::string> keys = settings->getNames();
|
||||||
|
lua_newtable(L);
|
||||||
|
for (const std::string &key : keys) {
|
||||||
|
std::string value;
|
||||||
|
Settings *group = nullptr;
|
||||||
|
|
||||||
|
if (settings->getNoEx(key, value)) {
|
||||||
|
lua_pushstring(L, value.c_str());
|
||||||
|
} else if (settings->getGroupNoEx(key, group)) {
|
||||||
|
// Recursively push tables
|
||||||
|
push_settings_table(L, group);
|
||||||
|
} else {
|
||||||
|
// Impossible case (multithreading) due to MutexAutoLock
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_setfield(L, -2, key.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// to_table(self) -> {[key1]=value1,...}
|
// to_table(self) -> {[key1]=value1,...}
|
||||||
int LuaSettings::l_to_table(lua_State* L)
|
int LuaSettings::l_to_table(lua_State* L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
LuaSettings* o = checkobject(L, 1);
|
LuaSettings* o = checkobject(L, 1);
|
||||||
|
|
||||||
std::vector<std::string> keys = o->m_settings->getNames();
|
MutexAutoLock(o->m_settings->m_mutex);
|
||||||
|
push_settings_table(L, o->m_settings);
|
||||||
lua_newtable(L);
|
|
||||||
for (const std::string &key : keys) {
|
|
||||||
lua_pushstring(L, o->m_settings->get(key).c_str());
|
|
||||||
lua_setfield(L, -2, key.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2660,7 +2660,9 @@ void Server::fillMediaCache()
|
|||||||
|
|
||||||
// Collect all media file paths
|
// Collect all media file paths
|
||||||
std::vector<std::string> paths;
|
std::vector<std::string> paths;
|
||||||
// The paths are ordered in descending priority
|
|
||||||
|
// ordered in descending priority
|
||||||
|
paths.push_back(getBuiltinLuaPath() + DIR_DELIM + "locale");
|
||||||
fs::GetRecursiveDirs(paths, porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server");
|
fs::GetRecursiveDirs(paths, porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server");
|
||||||
fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures");
|
fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures");
|
||||||
m_modmgr->getModsMediaPaths(paths);
|
m_modmgr->getModsMediaPaths(paths);
|
||||||
|
@ -239,6 +239,8 @@ private:
|
|||||||
|
|
||||||
// Allow TestSettings to run sanity checks using private functions.
|
// Allow TestSettings to run sanity checks using private functions.
|
||||||
friend class TestSettings;
|
friend class TestSettings;
|
||||||
|
// For sane mutex locking when iterating
|
||||||
|
friend class LuaSettings;
|
||||||
|
|
||||||
void updateNoLock(const Settings &other);
|
void updateNoLock(const Settings &other);
|
||||||
void clearNoLock();
|
void clearNoLock();
|
||||||
|
@ -106,10 +106,6 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
|
|||||||
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
|
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
|
||||||
f32 camera_fov, f32 range, f32 *distance_ptr)
|
f32 camera_fov, f32 range, f32 *distance_ptr)
|
||||||
{
|
{
|
||||||
// Maximum radius of a block. The magic number is
|
|
||||||
// sqrt(3.0) / 2.0 in literal form.
|
|
||||||
static constexpr const f32 block_max_radius = 0.866025403784f * MAP_BLOCKSIZE * BS;
|
|
||||||
|
|
||||||
v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
|
v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
|
||||||
|
|
||||||
// Block center position
|
// Block center position
|
||||||
@ -129,19 +125,19 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
|
|||||||
*distance_ptr = d;
|
*distance_ptr = d;
|
||||||
|
|
||||||
// If block is far away, it's not in sight
|
// If block is far away, it's not in sight
|
||||||
if (d > range + block_max_radius)
|
if (d > range + BLOCK_MAX_RADIUS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// If block is (nearly) touching the camera, don't
|
// If block is (nearly) touching the camera, don't
|
||||||
// bother validating further (that is, render it anyway)
|
// bother validating further (that is, render it anyway)
|
||||||
if (d <= block_max_radius)
|
if (d <= BLOCK_MAX_RADIUS)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Adjust camera position, for purposes of computing the angle,
|
// Adjust camera position, for purposes of computing the angle,
|
||||||
// such that a block that has any portion visible with the
|
// such that a block that has any portion visible with the
|
||||||
// current camera position will have the center visible at the
|
// current camera position will have the center visible at the
|
||||||
// adjusted postion
|
// adjusted postion
|
||||||
f32 adjdist = block_max_radius / cos((M_PI - camera_fov) / 2);
|
f32 adjdist = BLOCK_MAX_RADIUS / cos((M_PI - camera_fov) / 2);
|
||||||
|
|
||||||
// Block position relative to adjusted camera
|
// Block position relative to adjusted camera
|
||||||
v3f blockpos_adj = blockpos - (camera_pos - camera_dir * adjdist);
|
v3f blockpos_adj = blockpos - (camera_pos - camera_dir * adjdist);
|
||||||
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "basic_macros.h"
|
#include "basic_macros.h"
|
||||||
|
#include "constants.h"
|
||||||
#include "irrlichttypes.h"
|
#include "irrlichttypes.h"
|
||||||
#include "irr_v2d.h"
|
#include "irr_v2d.h"
|
||||||
#include "irr_v3d.h"
|
#include "irr_v3d.h"
|
||||||
@ -36,6 +37,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
y = temp; \
|
y = temp; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
// Maximum radius of a block. The magic number is
|
||||||
|
// sqrt(3.0) / 2.0 in literal form.
|
||||||
|
static constexpr const f32 BLOCK_MAX_RADIUS = 0.866025403784f * MAP_BLOCKSIZE * BS;
|
||||||
|
|
||||||
inline s16 getContainerPos(s16 p, s16 d)
|
inline s16 getContainerPos(s16 p, s16 d)
|
||||||
{
|
{
|
||||||
|
BIN
textures/base/pack/aux1_btn.png
Normal file
BIN
textures/base/pack/aux1_btn.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.8 KiB |
@ -1,6 +1,6 @@
|
|||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
function perform_lint() {
|
|
||||||
echo "Performing LINT..."
|
function setup_for_format() {
|
||||||
if [ -z "${CLANG_FORMAT}" ]; then
|
if [ -z "${CLANG_FORMAT}" ]; then
|
||||||
CLANG_FORMAT=clang-format
|
CLANG_FORMAT=clang-format
|
||||||
fi
|
fi
|
||||||
@ -8,6 +8,12 @@ function perform_lint() {
|
|||||||
CLANG_FORMAT_WHITELIST="util/ci/clang-format-whitelist.txt"
|
CLANG_FORMAT_WHITELIST="util/ci/clang-format-whitelist.txt"
|
||||||
|
|
||||||
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
|
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_format() {
|
||||||
|
echo "Checking format..."
|
||||||
|
|
||||||
|
setup_for_format
|
||||||
|
|
||||||
local errorcount=0
|
local errorcount=0
|
||||||
local fail=0
|
local fail=0
|
||||||
@ -41,3 +47,18 @@ function perform_lint() {
|
|||||||
echo "LINT OK"
|
echo "LINT OK"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function fix_format() {
|
||||||
|
echo "Fixing format..."
|
||||||
|
|
||||||
|
setup_for_format
|
||||||
|
|
||||||
|
for f in ${files_to_lint}; do
|
||||||
|
whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST")
|
||||||
|
if [ -z "${whitelisted}" ]; then
|
||||||
|
echo "$f"
|
||||||
|
$CLANG_FORMAT -i "$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
5
util/fix_format.sh
Executable file
5
util/fix_format.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
. ./util/ci/clang-format.sh
|
||||||
|
|
||||||
|
fix_format
|
@ -58,6 +58,7 @@ xgettext --package-name=minetest \
|
|||||||
--keyword=fgettext_ne \
|
--keyword=fgettext_ne \
|
||||||
--keyword=strgettext \
|
--keyword=strgettext \
|
||||||
--keyword=wstrgettext \
|
--keyword=wstrgettext \
|
||||||
|
--keyword=core.gettext \
|
||||||
--keyword=showTranslatedStatusText \
|
--keyword=showTranslatedStatusText \
|
||||||
--output $potfile \
|
--output $potfile \
|
||||||
--from-code=utf-8 \
|
--from-code=utf-8 \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user