Guild icon
DDraceNetwork
Development / developer
Development discussion. Logged to https://ddnet.org/irclogs/ Connected with DDNet's IRC channel, Matrix room and GitHub repositories — IRC: #ddnet on Quakenet | Matrix: #ddnet-developer:matrix.org GitHub: https://github.com/ddnet
Between 2024-04-18 00:00:00Z and 2024-04-19 00:00:00Z
Avatar
ws-client BOT 2024-04-18 00:56:47Z
<ChillerDragon> @Patiga not sure if i asked you already. But any plans on adding python type hints to the twmap bindings? My IDE is panicing.
Avatar
3ef00d4 Fix assertion on Windows when redirecting console output to nul - Robyt3 da5a466 Disallow enabling practice while save and load is in progress - Zwelf 25f85af Improve messaging to players why /save command does nothing - Zwelf f6f5629 Disallow /load when practice mode is enabled - Zwelf e1355dc Improve messaging to players why /load command does nothing - Zwelf 998d692 Merge pull request #8226 from Robyt3/Windows-Console-Nul - def- da09087 Merge pull request #8227 from Zwelf/pr-disable-practice-while-saving - def-
Avatar
gcc -o whatever.c -lm has anyone else been trolled by this before? trollet (edited)
Avatar
Avatar
meloƞ
macro_rules! foo { ($x:expr, $y:expr) => { println!("foo: {}, bar: {}", $x, $y); }; } fn main() { foo!(69, 72); } output: foo: 69, bar: 72 or do you want smth like: fn main() { let result = format!( "{foo} {x} {bar} {y} {baz}", foo = "foo", x = 69, bar = "bar", y = 72, baz = "baz" ); println!("{}", result); } ouput: foo 69 bar 72 baz (edited)
2nd one
Avatar
Avatar
zhn
he wants to concat asm lines without using r# for whatever reason
Because it looks ugly
Avatar
i found a perfect macro i was looking for 🥹 fn main() { let foo = 0x45; let bar = indoc::formatdoc!( " foo {foo} baz " ); println!("{}", bar); } foo 69 baz
Avatar
woah is that actually how string literal indentation works in rust
Avatar
it would usually indent like 3x (edited)
07:20
but this formatdoc thingy indents everything related to first line
Avatar
so fucking cool
07:21
need that
Avatar
im so glad i don't have to go to macros land to write it myself 😬
Avatar
Avatar
MilkeeyCat
i found a perfect macro i was looking for 🥹 fn main() { let foo = 0x45; let bar = indoc::formatdoc!( " foo {foo} baz " ); println!("{}", bar); } foo 69 baz
Oh wow thats cool
Avatar
ws-client BOT 2024-04-18 07:45:20Z
<ChillerDragon> @Peter0x44 lol the error message of that is horrible :D but no i have not been trolled by that because i only manually linked a C lib 3 times in my life :D
Avatar
ws-client BOT 2024-04-18 09:10:38Z
<ChillerDragon> @MilkeeyCat nice rust is catching up to bash
Avatar
chillerdragon wanna try to make a compiler in bash? 😬
Avatar
ws-client BOT 2024-04-18 09:12:38Z
<ChillerDragon> im too lazy to read up on compiler theory
Avatar
Ah gg
Avatar
ws-client BOT 2024-04-18 09:13:17Z
<ChillerDragon> also im busy debugging ddnet 0.7 demos since a week omg
Avatar
Avatar
ws-client
<ChillerDragon> also im busy debugging ddnet 0.7 demos since a week omg
Lmao
Avatar
chillerdragon: troll
Avatar
@Robyt3 question about this, its been a while so i don't quite remember. But with the new chunktype did you mean to add the info required for different tickrates to work with demos pr in question: https://github.com/ddnet/ddnet/pull/7555
I want to make it clear that my intent is not for offical DDRace servers to change with this pr. Without recompiling with a different tickrate nothing in the gameplay will change. DDNet is the clie...
Avatar
Avatar
ws-client
<ChillerDragon> @Patiga not sure if i asked you already. But any plans on adding python type hints to the twmap bindings? My IDE is panicing.
that is not on my to-do list. it seems like the type-hint file would need to be created manually. I'd ofc happily accept a pull request for that ^^
Avatar
i was reading about rust's impl Trait and dyn Trait. How the hell did I end up with ((∃ x. P(x)) → Q) ⇔ (∀ x. (P(x) → Q)) pepeW
Avatar
send link
Avatar
Huuh?
Avatar
Existential types are a hot topic in Rust at the moment. In Rust 1.26, a feature was stabilised known as impl Trait. This addition was declared a long-awaited syntax for existential types, but its inclusion was not without some controversy. There seems to be a lot of confusion as to just what impl Trait really means from a type theoretic (viz. p...
Avatar
Type theoretic pepeW
17:29
Computer Science people need to be stopped
Avatar
i understand stuff only when i can see an example xD
17:30
few lines of code > 10 pages of docs (edited)
Avatar
It also depends on the depth of the docs and the depth you want to understand something on
17:32
You don't need a type theoretical discussion of impl Trait to understand what it does and how to use it
Avatar
what about dyn Trait
17:35
@Learath2
Avatar
Avatar
Ewan
what about dyn Trait
I'm sure there is documentation out there that explains it without invoking intuitionist logic principles and the Curry-Howard correspondence
Avatar
but is it scholarly
17:40
not a big enough flex to read
Avatar
Avatar
JSaurusRex
@Robyt3 question about this, its been a while so i don't quite remember. But with the new chunktype did you mean to add the info required for different tickrates to work with demos pr in question: https://github.com/ddnet/ddnet/pull/7555
I meant that the demo format is already hacky enough as it is and we should first add something like UUID support to make future extensions of the format less hacky. But I see now that just adding another chunk type to demos is likely impossible, since the demo format only supports 3 chunk types. Adding a ghost chunk type for the tick rate is definitely cleaner than the current solution for demos and it's also more feasible since the maximum number of ghost chunk types is 255, but I think we should also consider UUID support for ghost items first. Thinking about it again, why do you need to update the demo format at all? Can't you simply add the new Sv_TickRate message at the beginning of each demo recording so it works like when you connect to a server? That being said, I'll repeat my other comment again, "I'd prefer not to merge this unless another maintainer wants it. Seems too risky for me for little gain for DDNet." Even if all the ghost and demo problems are solved, I do not like the prospect of potentially changing physics with this.
Avatar
If you are interested in theory, it is a nice read. If you just want to learn what impl and dyn do in different places it is far too deep
Avatar
I do admit it is a cute way to look at it though. I wouldn't have ever considered to look at it like that
Avatar
Avatar
Learath2
I do admit it is a cute way to look at it though. I wouldn't have ever considered to look at it like that
that mumbo jumbo makes sense to you? justatest
Avatar
Avatar
Robyt3
I meant that the demo format is already hacky enough as it is and we should first add something like UUID support to make future extensions of the format less hacky. But I see now that just adding another chunk type to demos is likely impossible, since the demo format only supports 3 chunk types. Adding a ghost chunk type for the tick rate is definitely cleaner than the current solution for demos and it's also more feasible since the maximum number of ghost chunk types is 255, but I think we should also consider UUID support for ghost items first. Thinking about it again, why do you need to update the demo format at all? Can't you simply add the new Sv_TickRate message at the beginning of each demo recording so it works like when you connect to a server? That being said, I'll repeat my other comment again, "I'd prefer not to merge this unless another maintainer wants it. Seems too risky for me for little gain for DDNet." Even if all the ghost and demo problems are solved, I do not like the prospect of potentially changing physics with this.
my intent with this pr has always been to add this as a nice feature, not something that replaces 50hz in any way something that completely doesn't change 50hz servers/gameplay and if it ever doesn't work can just be disabled
Avatar
ddnet-next will have support for > 50 ticks
17:46
out of the box
17:46
just wait 20 years
Avatar
it should be pretty easy to check if it has any effect on 50hz physics by simply checking if there are any desyncs when using a normal client with a higher tickrate server and opposite
justatest 1
Avatar
Avatar
Jupstar ✪
ddnet-next will have support for > 50 ticks
ddnet-next ?
Avatar
Avatar
JSaurusRex
my intent with this pr has always been to add this as a nice feature, not something that replaces 50hz in any way something that completely doesn't change 50hz servers/gameplay and if it ever doesn't work can just be disabled
I suppose it's not easy to guarantee that this doesn't change physics even if the tick rate is set to the default 50.
Avatar
Avatar
JSaurusRex
ddnet-next ?
yeah, ddnet rust version
Avatar
Avatar
MilkeeyCat
that mumbo jumbo makes sense to you? justatest
It makes sense to me because I already know both sides of it. I have a decent understanding of how impl and dyn work and I know the logic argument they invoke there to explain the confusion. So I'm in essence kinda cheating
Avatar
Avatar
Robyt3
I meant that the demo format is already hacky enough as it is and we should first add something like UUID support to make future extensions of the format less hacky. But I see now that just adding another chunk type to demos is likely impossible, since the demo format only supports 3 chunk types. Adding a ghost chunk type for the tick rate is definitely cleaner than the current solution for demos and it's also more feasible since the maximum number of ghost chunk types is 255, but I think we should also consider UUID support for ghost items first. Thinking about it again, why do you need to update the demo format at all? Can't you simply add the new Sv_TickRate message at the beginning of each demo recording so it works like when you connect to a server? That being said, I'll repeat my other comment again, "I'd prefer not to merge this unless another maintainer wants it. Seems too risky for me for little gain for DDNet." Even if all the ghost and demo problems are solved, I do not like the prospect of potentially changing physics with this.
also i don't quite get the message, im not really familiar with how demos or ghosts work besides the little i needed to get my change to work
Avatar
I can imagine being completely lost if I had no idea what the logic argument was because it's not one that is immediately obvious, especially in that notation
Avatar
Avatar
Robyt3
I suppose it's not easy to guarantee that this doesn't change physics even if the tick rate is set to the default 50.
the few physics functions i had to genuinely change i made copies of which get used when its not 50hz the rest should all be a bunch of math changes canceling each other out in case of floating point precision limitations i can add special logic to make sure it always just returns the original 50hz value when at 50hz
Avatar
Avatar
Jupstar ✪
yeah, ddnet rust version
ahh the classic rewrite xd
Avatar
Avatar
Robyt3
I suppose it's not easy to guarantee that this doesn't change physics even if the tick rate is set to the default 50.
like i said in an earlier message it should be checkable with desyncs in player position with a mix of clients, i already noticed this when i intentionally fucked something up and realised this was a way to check (edited)
Avatar
Avatar
JSaurusRex
ahh the classic rewrite xd
but a serious attempt 😉
Avatar
Avatar
JSaurusRex
the few physics functions i had to genuinely change i made copies of which get used when its not 50hz the rest should all be a bunch of math changes canceling each other out in case of floating point precision limitations i can add special logic to make sure it always just returns the original 50hz value when at 50hz
I don't think arguments can convince me on this, this would need a solid test suite to ensure no behavior is changed
Avatar
a friend of mine suggested a demo like format which just records a set of inputs (might be doable with normal demos) to ensure no change in physics
17:52
only thing to do then is note down a bunch of tricks and test them out
17:53
would be easily testable and repreducable in that case
Avatar
Zwelf is working on comprehensive physics tests so maybe I'll be more inclined for this change once we have that (edited)
Avatar
Avatar
JSaurusRex
a friend of mine suggested a demo like format which just records a set of inputs (might be doable with normal demos) to ensure no change in physics
this would also be a nice to have regardless of this change, considering somebody might accidentally change physics for other reasons
17:55
is there a pr or something for zwelfs work?
Avatar
this is the rewrite? (edited)
Avatar
this is the ddnet physics rewrite
Avatar
how do you test for these cases?
17:56
just by hand
Avatar
as for what i don't have a name for and just call ddnet-next it has it's own implementation of physics that is allowed to break ddnet physics
Avatar
ah, so not meant to be a perfect reimplementation
Avatar
Avatar
JSaurusRex
how do you test for these cases?
he did it by recording real ddnet game play and checking positions after input is handled with his physics
Avatar
makes sense
Avatar
Avatar
JSaurusRex
ah, so not meant to be a perfect reimplementation
i'd say it's better 😏 but it will very likely use the above twgame to be ddnet compatible
17:58
so it will have two physics
17:58
and that's also the sense of the project
17:58
you can do client side prediction without touching the client
17:59
and it has >50 tick because of this too
Avatar
honestly the fact that there is just a copy of the physics specifically for the client really is something
Avatar
Avatar
JSaurusRex
honestly the fact that there is just a copy of the physics specifically for the client really is something
yeah it's a bad design
17:59
"ddnet-next" can predict everything laser doors teleporters
17:59
sounds
17:59
it's simply a server doing the prediction basically 😄
Avatar
a server doing the prediction?
Avatar
well server & client share the exact same code
18:00
so what the server calculates, the client predicts too
Avatar
for the most part, other players inputs won't be the same
18:01
since those will be extra delayed on the clients side vs server
Avatar
but that is the casee now too
18:01
ofc it can't predict the future 😄
Avatar
Avatar
Jupstar ✪
but that is the casee now too
true, to the annoyance of any pvp gamemode
Avatar
if u have a good ping it's okish i'd say 😄
18:03
in theory the server could broadcast all player's input to all clients, if the ping is around 10ms then it would almost feel like there is no delay
18:03
so inside same country it would work
Avatar
if you delay all the inputs locally by 1 you might get it to sync up until somebody has a slight ping jump
18:05
which happens so annoyingly often
Avatar
yeah but delaying local input wont work xD
18:05
that feels like shit then
Avatar
i mean it already is delayed for 20ms
Avatar
Avatar
MilkeeyCat
Because it looks ugly
making it multiline is uglier tho
Avatar
well, up to (edited)
Avatar
yes and no
Avatar
yo jsaurus!
Avatar
the prediction makes it feel smooth
Avatar
hello o/
Avatar
Avatar
Jupstar ✪
the prediction makes it feel smooth
true, but your inputs will not get processed until at least 20ms
Avatar
also the input could be sent just before the server tick happens
Avatar
yeah, average would be 10ms
Avatar
yes
Avatar
Avatar
zhn
yo jsaurus!
wazzup man, u still alive
Avatar
yoo jupjopjapsti
Avatar
Avatar
zhn
making it multiline is uglier tho
that's my final way of doing it, maybe it's not the best but it's good enough for me
Avatar
Avatar
JSaurusRex
yeah, average would be 10ms
funnily enough i could actually notice the decreased input latency at 200hz (or just anything about 50)
Avatar
i did a little website by the way, took me like 2 day to mess up with tide and askama xd
18:08
still ugly
18:08
inspired by https://j3s.sh (edited)
Avatar
Avatar
JSaurusRex
funnily enough i could actually notice the decreased input latency at 200hz (or just anything about 50)
yeah
Avatar
very minor tho
Avatar
Avatar
MilkeeyCat
that's my final way of doing it, maybe it's not the best but it's good enough for me
huh
Avatar
even tho that macro removes tabs it still has to be tabbed xDDDD
Avatar
Avatar
Robyt3
Zwelf is working on comprehensive physics tests so maybe I'll be more inclined for this change once we have that (edited)
anyway i can contribute to this? or check upon its progress
Avatar
Avatar
JSaurusRex
anyway i can contribute to this? or check upon its progress
Ask Zwelf if he is looking for contributions
Avatar
@Zwelf yo i heard you were working on some physics tests
18:18
I just love everything about this era of computing. I really wish I was born just a little earlier
Avatar
same ^
Avatar
sa ^ me
Avatar
sam x² e
Avatar
Avatar
Learath2
I just love everything about this era of computing. I really wish I was born just a little earlier
how is that different from today?
Avatar
Have you seen a modern capsule based collision algorithm?
Avatar
Avatar
Learath2
Have you seen a modern capsule based collision algorithm?
i dunno what u want to imply by that
18:57
that modern games do that?
Avatar
They are much much more complicated than what quake does
18:58
Sure they are better and more performant, but you need to be able to read basically a math paper to understand and implement them
18:59
They lack the elegance of earlier solutions (IMO)
Avatar
so for you it's just about collision detection itself
Avatar
it's just one example
Avatar
no i mean like, BSP trees is a data structure
19:00
but bounding boxes are basically the math
Avatar
Fix game times and prediction not being updated when only exactly two snapshots have been received, due to the conditions m_aReceivedSnapshots[...] >= 3. These specific condition are not necessary and replaced with simpler checks whether the current snapshot is set. Some duplicate nested conditions are also removed. Pump the network first in CClient::Update before updating anything else, to ensure that snapshots are received from the network client before the game times and prediction ...
Avatar
from what he shows in the video alone it also looks like a kd-tree specialization of BSP
19:02
at least the boxes move axis aligned (edited)
19:02
mh ok later he also shows different terrain
19:05
https://en.wikipedia.org/wiki/Bounding_volume_hierarchy this is what ray tracing usually uses afaik
A bounding volume hierarchy (BVH) is a tree structure on a set of geometric objects. All geometric objects, which form the leaf nodes of the tree, are wrapped in bounding volumes. These nodes are then grouped as small sets and enclosed within larger bounding volumes. These, in turn, are also grouped and enclosed within other larger bounding volu...
19:06
@Learath2 if i waste 200MB, but have O(1) instead of O(log(n)) would you say worth it?
19:06
xdd
19:07
(also for physics)
Avatar
Avatar
Jupstar ✪
@Learath2 if i waste 200MB, but have O(1) instead of O(log(n)) would you say worth it?
Sure, I'd also say it's less elegant of a solution
19:10
you wouldn't understand, you view it from a completely different angle than I do
Avatar
i know
Avatar
why do this kind of video have shitty music background??
19:10
i hate it
Avatar
it's old, it's gold
Avatar
it has nothing to do with being old
19:12
as I said no point discussing this with you in particular
19:15
(that's ok btw, not everyone needs to appreciate the same things)
Avatar
Avatar
Learath2
Sure, I'd also say it's less elegant of a solution
the irony is. I agree with you that electron is shit, and i also hate slow shit but IMHO RAM is much easier to scale than e.g. single core performance. and writing multi threaded apps is much harder than single threaded. the industry could EASILY scale RAM as we see in m1 macbooks
19:15
so IMO it's a problem of the industry
19:16
so i dont hate electron purely bcs it uses much RAM, but because it doesn't use it to gain reasonable enough speed from using so much ram
19:16
it feels kinda wasted
Avatar
I hate electron on two separate levels at the same time, it's both inelegant AND performs like shit
Avatar
can someone explain why i have 230 ping\
Avatar
Avatar
Savage
can someone explain why i have 230 ping\
do you live in brazil?
Avatar
Avatar
Jupstar ✪
do you live in brazil?
no
19:26
on ger10 i usually get 60 ms
19:26
now i got 220
19:26
its not my internet
Avatar
what else? xd
Avatar
it's the connection between you and the server
19:27
is there like a link or smth?
19:27
link to make game fast
Avatar
it's maybe because some routing that normally happens is curerntly under ddos
19:27
or a routing is completely dead rn
Avatar
what kind of internet do u have savage
Avatar
Avatar
Ewan
link to make game fast
no, there's a link to verify my internet to the server
Avatar
only thing u can do is:
  • restart router
  • restart client
  • call internet provider and ask them
  • come back tomorrow
Avatar
Avatar
Savage
no, there's a link to verify my internet to the server
what are u talking about
Avatar
i did restart my router
19:28
And client
19:28
and every other game works fine
19:28
its ddnet
Avatar
do u live in a rural area
Avatar
rural area?
Avatar
what does that mean
Avatar
an area that's rural
19:29
what
19:29
away from city
19:29
i said its not my internet
19:29
i usually get 60-70 ms
Avatar
that's not really how it works
19:30
the only thing it can be is your internet
19:30
every time you sign up for internet you are playing the lottery as it comes to the routes your ISP will use
Avatar
so my internet is only lagging in ddnet? xd
Avatar
ger10 must be a particularly unlucky/out of the way server for your ISP's grid
19:30
did you switch ISPs
19:31
or change your plan, or move houses, etc..
Avatar
i switched MTU if that makes any difference
Avatar
through 192.168.1.1
19:32
uh
19:32
ok nvm
19:32
it was a problem in a client
Avatar
"a client" (edited)
Avatar
i switched to a different DDnet client and its fixed
19:33
not cheating right
Avatar
its cactus client
19:33
justatest
Avatar
that dude has a client
19:33
??
Avatar
it has no cheats
19:33
so idk
Avatar
fair enough
19:33
tho idk why i see all these ppl using some rando's client
Avatar
it has the "!war" and "!team" feature for block
Avatar
what so it like highlights players or smth
Avatar
its hard to tell who you're fighting and who you dont in the middle of 15 people FFA
Avatar
Avatar
Ewan
what so it like highlights players or smth
it makes the player's name red for war and green for team
Avatar
ya i guess thing about that is
19:35
the features custom clients have that ppl use them for
19:35
for whatever reason are not wanted in ddnet
Avatar
i guess admins are not trying to cater to niches
Avatar
"not wanted" as of hated or not needed?
Avatar
i guess just seen as unnecessary
19:35
by those who would be responsible for adding them to ddnet
Avatar
they're really helpful tho
Avatar
except when your ping goes crazy for no reason
Avatar
well yeah xd
19:36
i restarted it and it worked just fine
19:36
so thats a W
Avatar
had to restart it for the 5th time tho
Avatar
that is kinda sus honestly
19:37
client shouldn't just arbitrarily become stupid
Avatar
it is indeed
19:37
definitely not a crypto mining app justatest
nouis 1
Avatar
seems cactus client is not by cactus
Avatar
Avatar
Savage
definitely not a crypto mining app justatest
yeah i mean
19:39
there's no saying it isn't
19:39
because it's closed source
19:40
there is no good explanation for your ping hitting 220 as a result of the client
19:40
i would guess something unsavory is happening
Avatar
ok now im worried
19:41
tater client works too brownbear
Avatar
yes because tater client is awesome and open source
19:41
that's not actually why
19:41
but he'd probably have a hard time sticking a crypto miner in there if it was closed source
19:42
tbh i think the block feature should be added to tclient
Avatar
yeah but i dont think tater is into block xd
Avatar
he plays gores
19:43
he doesn't play much of anything anymore tho
19:43
haven't seen him in a few months
19:45
every time i see u in my server browser i get hard baited
19:45
there's a south american savage that i used to play with a lot
19:45
went by keun
19:45
so u guys share points or what xD
Avatar
Avatar
Ewan
there's a south american savage that i used to play with a lot
the chile savage?
Avatar
no mine has a dot
19:46
its "Savage."
Avatar
there must be a third savage then
19:46
19:48
if its multeasy then its a faker
Avatar
Avatar
JSaurusRex
@Zwelf yo i heard you were working on some physics tests
Not sure how good you are with Rust/C++, but writing Rust bindings for the C++ DDNet physics would help you the most. That way DDNet could be tested against all the test cases that I've recorded. I'm interested in doing that project at some point, but didn't have the time for it yet. This would be the interface that needs to implemented: https://gitlab.com/ddnet-rs/twgame/-/blob/fff836cb209497a022abeb7c431560cddb0ccc6e/twgame/src/lib.rs#L127
Avatar
ty ^^
Avatar
Avatar
Zwelf
Not sure how good you are with Rust/C++, but writing Rust bindings for the C++ DDNet physics would help you the most. That way DDNet could be tested against all the test cases that I've recorded. I'm interested in doing that project at some point, but didn't have the time for it yet. This would be the interface that needs to implemented: https://gitlab.com/ddnet-rs/twgame/-/blob/fff836cb209497a022abeb7c431560cddb0ccc6e/twgame/src/lib.rs#L127
mostly a C programmer, how have you recorded ddnet physics? (edited)
Avatar
I usually plan to record physics test for specific features (I currently am doing switch layer). For each specific thing I want to test, I start a server and do that specific thing, shutdown the server and move the teehistorian file (server side demo that records all player inputs + tee positions after each tick) into https://gitlab.com/ddnet-rs/twgame/-/tree/a0a685b6058fd8afb138302e321c89e1db5965be/validator/res where it then gets run on each commit. Tests that currently fail are listed in https://gitlab.com/ddnet-rs/twgame/-/blob/a0a685b6058fd8afb138302e321c89e1db5965be/validator/tests/validator.rs#L29
Avatar
so the idea is to load the teehistorian file and tee position every tick?
Avatar
roughly. to load the player inputs & tee positions from the teehistorian file. Then feed the inputs into the physics implementation and check if the player positions match for each tick.
23:47
so i had process monitor running on my computer like an hour ago
23:47
apparently League won't let you play if process monitor was even running at any point in your machine's uptime
23:48
so i queued up and then went to get into the game then i get this error https://2143.christmas/f/WCWr.png
23:48
and by the time i was able to get everything saved, closed, my computer restarted, and back into league, i get a leaverbuster warning
23:49
23:50
i can't believe this game is actually scolding me over something IT did
23:50
the people at riot need to get their head checked
Exported 301 message(s)