board: added tunnel tile
Dieser Commit ist enthalten in:
Ursprung
5249fe89b6
Commit
bf08369357
86
client/gfx/dark/board_tile.rail.tunnel.svg
Normale Datei
86
client/gfx/dark/board_tile.rail.tunnel.svg
Normale Datei
@ -0,0 +1,86 @@
|
||||
<?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="96"
|
||||
height="96"
|
||||
viewBox="0 0 25.399999 25.400001"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="board_tile.rail.tunnel.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6"
|
||||
inkscape:cx="29.457824"
|
||||
inkscape:cy="31.95405"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3713"
|
||||
spacingx="0.26458333"
|
||||
empspacing="4" />
|
||||
</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-nc/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc/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:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-271.59998)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 36.001953 -0.001953125 L 36.001953 9.0253906 C 39.904201 7.8305339 43.948566 7.2246094 47.996094 7.2246094 C 52.045421 7.2246094 56.094449 7.8314231 60 9.0273438 L 60 -0.001953125 L 36.001953 -0.001953125 z M 47.996094 13.212891 C 40.521859 13.212891 33.054785 15.609158 26.818359 20.394531 C 14.345507 29.965316 9.8331809 46.795361 15.849609 61.320312 A 6.0005998 6.0005998 0 1 0 26.935547 56.728516 C 22.975386 47.167823 25.909202 36.209873 34.119141 29.910156 C 42.32908 23.61044 53.672874 23.61044 61.882812 29.910156 C 70.092751 36.209873 73.024612 47.167823 69.064453 56.728516 A 6.0005998 6.0005998 0 1 0 80.152344 61.320312 C 86.168773 46.795361 81.656443 29.965316 69.183594 20.394531 C 62.947165 15.609158 55.470329 13.212891 47.996094 13.212891 z M 48 31.173828 C 44.405816 31.173828 40.812676 32.339774 37.773438 34.671875 C 37.135901 35.161072 36.551655 35.693909 36.001953 36.251953 L 36.001953 96 L 60 96 L 60 36.251953 C 59.450114 35.693659 58.866308 35.161268 58.228516 34.671875 C 55.189275 32.339774 51.594184 31.173828 48 31.173828 z "
|
||||
transform="matrix(0.26458333,0,0,0.26458333,0,271.59998)"
|
||||
id="path935" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 4.8 KiB |
@ -70,5 +70,6 @@
|
||||
<file>board_tile.rail.bridge_45_left.svg</file>
|
||||
<file>board_tile.rail.bridge_45_right.svg</file>
|
||||
<file>board_tile.rail.sensor.svg</file>
|
||||
<file>board_tile.rail.tunnel.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
86
client/gfx/light/board_tile.rail.tunnel.svg
Normale Datei
86
client/gfx/light/board_tile.rail.tunnel.svg
Normale Datei
@ -0,0 +1,86 @@
|
||||
<?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="96"
|
||||
height="96"
|
||||
viewBox="0 0 25.399999 25.400001"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="board_tile.rail.tunnel.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6"
|
||||
inkscape:cx="29.457824"
|
||||
inkscape:cy="31.95405"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3713"
|
||||
spacingx="0.26458333"
|
||||
empspacing="4" />
|
||||
</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-nc/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-nc/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:prohibits
|
||||
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-271.59998)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#404040;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 36.001953 -0.001953125 L 36.001953 9.0253906 C 39.904201 7.8305339 43.948566 7.2246094 47.996094 7.2246094 C 52.045421 7.2246094 56.094449 7.8314231 60 9.0273438 L 60 -0.001953125 L 36.001953 -0.001953125 z M 47.996094 13.212891 C 40.521859 13.212891 33.054785 15.609158 26.818359 20.394531 C 14.345507 29.965316 9.8331809 46.795361 15.849609 61.320312 A 6.0005998 6.0005998 0 1 0 26.935547 56.728516 C 22.975386 47.167823 25.909202 36.209873 34.119141 29.910156 C 42.32908 23.61044 53.672874 23.61044 61.882812 29.910156 C 70.092751 36.209873 73.024612 47.167823 69.064453 56.728516 A 6.0005998 6.0005998 0 1 0 80.152344 61.320312 C 86.168773 46.795361 81.656443 29.965316 69.183594 20.394531 C 62.947165 15.609158 55.470329 13.212891 47.996094 13.212891 z M 48 31.173828 C 44.405816 31.173828 40.812676 32.339774 37.773438 34.671875 C 37.135901 35.161072 36.551655 35.693909 36.001953 36.251953 L 36.001953 96 L 60 96 L 60 36.251953 C 59.450114 35.693659 58.866308 35.161268 58.228516 34.671875 C 55.189275 32.339774 51.594184 31.173828 48 31.173828 z "
|
||||
transform="matrix(0.26458333,0,0,0.26458333,0,271.59998)"
|
||||
id="path935" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 4.8 KiB |
@ -47,5 +47,6 @@
|
||||
<file>board_tile.rail.bridge_45_left.svg</file>
|
||||
<file>board_tile.rail.bridge_45_right.svg</file>
|
||||
<file>board_tile.rail.sensor.svg</file>
|
||||
<file>board_tile.rail.tunnel.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@ -444,6 +444,7 @@ void BoardAreaWidget::paintEvent(QPaintEvent* event)
|
||||
case TileId::RailBridge45Right:
|
||||
case TileId::RailBridge90:
|
||||
case TileId::RailBufferStop:
|
||||
case TileId::RailTunnel:
|
||||
tilePainter.draw(id, r, a);
|
||||
break;
|
||||
|
||||
|
||||
@ -49,9 +49,10 @@ struct TileInfo
|
||||
uint8_t rotates;
|
||||
};
|
||||
|
||||
const std::array<TileInfo, 29> tileInfo = {
|
||||
const std::array<TileInfo, 30> tileInfo = {
|
||||
TileInfo{QStringLiteral("board_tile.rail.straight"), TileId::RailStraight, 0xFF},
|
||||
TileInfo{QStringLiteral("board_tile.rail.buffer_stop"), TileId::RailBufferStop, 0xFF},
|
||||
TileInfo{QStringLiteral("board_tile.rail.tunnel"), TileId::RailTunnel, 0xFF},
|
||||
TileInfo{QStringLiteral(""), TileId::None, 0},
|
||||
TileInfo{QStringLiteral("board_tile.rail.curve_45"), TileId::RailCurve45, 0xFF},
|
||||
TileInfo{QStringLiteral("board_tile.rail.curve_90"), TileId::RailCurve90, 0xFF},
|
||||
|
||||
@ -125,6 +125,23 @@ void TilePainter::draw(TileId id, const QRectF& r, TileRotate rotate)
|
||||
drawBlock(id, r, rotate);
|
||||
break;
|
||||
|
||||
case TileId::RailTunnel:
|
||||
{
|
||||
setTrackPen();
|
||||
drawStraight(r, rotate);
|
||||
|
||||
// tunnel arc:
|
||||
const int angle = -toDeg(rotate) * 16 - 45 * 8; // - 22.5 deg
|
||||
const int angleLength = 225 * 16; // 225 deg
|
||||
const qreal m = r.width() / 5;
|
||||
const QRectF rArc = r.adjusted(m, m, -m, -m);
|
||||
|
||||
m_painter.setPen(QPen(backgroundColor, m_trackWidth, Qt::SolidLine, Qt::FlatCap));
|
||||
m_painter.drawArc(rArc, angle, angleLength);
|
||||
m_painter.setPen(QPen(trackColor, m_trackWidth / 2., Qt::SolidLine, Qt::FlatCap));
|
||||
m_painter.drawArc(rArc, angle, angleLength);
|
||||
break;
|
||||
}
|
||||
case TileId::None:
|
||||
case TileId::ReservedForFutureExpension:
|
||||
break;
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
## Rail tiles {#tiles-rail}
|
||||
-  Straight
|
||||
-  Buffer stop
|
||||
-  Tunnel
|
||||
-  Curve 45°
|
||||
-  Curve 90°
|
||||
-  Crossover 45°
|
||||
|
||||
BIN
manual/traintasticmanual/gfx/board/tiles/board_tile.rail.tunnel.png
Normale Datei
BIN
manual/traintasticmanual/gfx/board/tiles/board_tile.rail.tunnel.png
Normale Datei
Binäre Datei nicht angezeigt.
|
Nachher Breite: | Höhe: | Größe: 660 B |
28
server/src/board/tile/rail/tunnelrailtile.cpp
Normale Datei
28
server/src/board/tile/rail/tunnelrailtile.cpp
Normale Datei
@ -0,0 +1,28 @@
|
||||
/**
|
||||
* server/src/board/tile/rail/tunnelrailtile.cpp
|
||||
*
|
||||
* This file is part of the traintastic source code.
|
||||
*
|
||||
* Copyright (C) 2021 Reinder Feenstra
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "tunnelrailtile.hpp"
|
||||
|
||||
TunnelRailTile::TunnelRailTile(const std::weak_ptr<World>& world, std::string_view _id)
|
||||
: StraightRailTile(world, _id, TileId::RailTunnel)
|
||||
{
|
||||
}
|
||||
37
server/src/board/tile/rail/tunnelrailtile.hpp
Normale Datei
37
server/src/board/tile/rail/tunnelrailtile.hpp
Normale Datei
@ -0,0 +1,37 @@
|
||||
/**
|
||||
* server/src/board/tile/rail/tunnelrailtile.hpp
|
||||
*
|
||||
* This file is part of the traintastic source code.
|
||||
*
|
||||
* Copyright (C) 2021 Reinder Feenstra
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef TRAINTASTIC_SERVER_BOARD_TILE_RAIL_TUNNELRAILTILE_HPP
|
||||
#define TRAINTASTIC_SERVER_BOARD_TILE_RAIL_TUNNELRAILTILE_HPP
|
||||
|
||||
#include "straightrailtile.hpp"
|
||||
|
||||
class TunnelRailTile : public StraightRailTile
|
||||
{
|
||||
CLASS_ID("board_tile.rail.tunnel")
|
||||
CREATE(TunnelRailTile)
|
||||
|
||||
public:
|
||||
TunnelRailTile(const std::weak_ptr<World>& world, std::string_view _id);
|
||||
};
|
||||
|
||||
#endif
|
||||
@ -49,5 +49,6 @@ std::shared_ptr<Tile> Tiles::create(const std::shared_ptr<World>& world, std::st
|
||||
IF_CLASSID_CREATE(BufferStopRailTile)
|
||||
IF_CLASSID_CREATE(SensorRailTile)
|
||||
IF_CLASSID_CREATE(BlockRailTile)
|
||||
IF_CLASSID_CREATE(TunnelRailTile)
|
||||
return std::shared_ptr<Tile>();
|
||||
}
|
||||
|
||||
@ -48,6 +48,7 @@
|
||||
#include "rail/bufferstoprailtile.hpp"
|
||||
#include "rail/sensorrailtile.hpp"
|
||||
#include "rail/blockrailtile.hpp"
|
||||
#include "rail/tunnelrailtile.hpp"
|
||||
|
||||
struct Tiles
|
||||
{
|
||||
@ -76,7 +77,8 @@ struct Tiles
|
||||
Signal3AspectRailTile::classId,
|
||||
BufferStopRailTile::classId,
|
||||
SensorRailTile::classId,
|
||||
BlockRailTile::classId
|
||||
BlockRailTile::classId,
|
||||
TunnelRailTile::classId
|
||||
);
|
||||
|
||||
static std::shared_ptr<Tile> create(const std::shared_ptr<World>& world, std::string_view classId, std::string_view id = {});
|
||||
|
||||
@ -47,6 +47,7 @@
|
||||
#include "../src/board/tile/rail/bufferstoprailtile.hpp"
|
||||
#include "../src/board/tile/rail/sensorrailtile.hpp"
|
||||
#include "../src/board/tile/rail/blockrailtile.hpp"
|
||||
#include "../src/board/tile/rail/tunnelrailtile.hpp"
|
||||
|
||||
TEST_CASE("Board: Add non existing tile", "[board][board-add]")
|
||||
{
|
||||
@ -80,6 +81,7 @@ TEMPLATE_TEST_CASE("Board: Add tile", "[board][board-add]"
|
||||
, BufferStopRailTile
|
||||
, SensorRailTile
|
||||
, BlockRailTile
|
||||
, TunnelRailTile
|
||||
)
|
||||
{
|
||||
auto world = World::create();
|
||||
|
||||
@ -51,6 +51,7 @@ enum class TileId : uint16_t // 10 bit
|
||||
RailBridge45Left = 21,
|
||||
RailBridge45Right = 22,
|
||||
RailBridge90 = 23,
|
||||
RailTunnel = 24,
|
||||
|
||||
ReservedForFutureExpension = 1023
|
||||
};
|
||||
|
||||
@ -46,6 +46,7 @@ class_id:board_tile.rail.signal_2aspect=Signal 2 aspect
|
||||
class_id:board_tile.rail.signal_3_aspect=Signal (3 aspects)
|
||||
class_id:board_tile.rail.signal_3aspect=Signal 3 aspect
|
||||
class_id:board_tile.rail.straight=Straight track
|
||||
class_id:board_tile.rail.tunnel=Tunnel
|
||||
class_id:board_tile.rail.turnout_3way=Turnout 3-way
|
||||
class_id:board_tile.rail.turnout_doubleslip=Double slip
|
||||
class_id:board_tile.rail.turnout_left_45=Turnout left 45°
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren