Negativity - AntiCheat

banniere_negativity

For a long time ago, I learn that player cheat. So, I have create an anticheat, but available only for Spigot.
Now, this is the same anticheat, but for sponge !

Now, this plugin is on Ore !

Detected cheat (1.1.2) :

  • AntiPotion | Zoot
  • AutoRegen | Regen
  • AutoClick
  • AutoEat
  • AntiKnockback | NoVelocity
  • Blink
  • FastBow | RapidBowShot
  • Fly
  • ForceField | KillAura
  • Jesus | WaterWalk
  • Spider
  • Speed
  • Scaffold
  • Sneak
  • FastPlace
  • Edited Client

There is also a lot of commands:

  • /negativity : get some informations about the player
  • /negativity verif [(optional) cheats, by default it’s all] : start detection manually
  • /mod : mod part (be invisible …)
  • /ban <def(true/false) | time (ex: 2h5m)> : to ban people
  • /unban : to unbun the player
  • /report : to report a player
  • /suspect

And, when an image is better than a long text:
tableau_negativity%20%203

You’re a developper ?
There an API.

API Informations

Class utils:
Cheat (Enum: com.elikill58.negativity.sponge.utils)
Methods:

String getName()
boolean isActive()
boolean setActive(boolean active)
boolean needPacket()
ItemTypes getMaterial()
Class<?> getProtocolClass()
int getReliabilityAlert()
boolean isSetBack()
boolean setBack(boolean back)
int getAlertToKick()
boolean allowKick()
boolean setAllowKick(boolean allowKick)
boolean isAutoVerif()
boolean setAutoVerif(boolean auto)

static Optional<Cheat> getCheatFromString(String name)

For events:

PlayerCheatEvent (AbstractEvent, TargetPlayerEvent)

Cause getCause() // With: The plugin, and the player
Player getTargetEntity()
Cheat getCheat()
int getReliability()

////////////////////////////////////

PlayerCheatEvent.Alert (PlayerCheatEvent, Cancellable)

boolean isCancelled()
void setCancelled(boolean cancel)
boolean isAlert()
void setAlert(boolean alert)
boolean hasManyReliability()
boolean hasPermToBypass()

(+ all PlayerCheatEvent method)

////////////////////////////////////////

PlayerCheatEvent.Kick (PlayerCheatEvent, Cancellable)

boolean isCancelled()
void setCancelled(boolean cancel)

(+ all PlayerCheatEvent method)

////////////////////////////////////////

PlayerPacketsClearEvent

Player getPlayer();
SpongeNegativityPlayer getNegativityPlayer();

IMPORTANT: You need PacketGate !
Addons:

  • Precogs

Credits:

  • RedNesto for the help with English translation and development
  • jheyson for the help with Portuguese translation
  • SuchHero for the help with Norwegian translation
  • you for translation too ? (Contact me)​

Contact:

Download:

(I send update here so, if you want to get notification when i make an update, watch my spigot ressource. Why do it ? I forget sometimes to edit all thread about Negativity.)

3 Likes

Hello,

New update !
Release ! Fix and suspection

New features :

  • Sponge Forge
  • /suspect : suspect of cheating a player.
  • A player can be suspected thanks to chat message (you can disable it)
    Bug fix :
  • some Sponge bug
  • SpeedHack
  • FastLadders
  • Forcefield
    Some informations :
  • If there is detection problem, contact me here or on Discord @Elikill58#0743 or on Twitter…
  • All version before 1.0 will be revomed soon

Very good work. It doesn’t false detect creative gamemode and IC2 quantum armor as cheats.
I think, your plugin deserve more attention. Can you please move it to ore?

Thanks for your opinion !
I will did it for the next version (1.1 which is coming soon) if i don’t forget

1 Like

New version !

Good game :slight_smile:

1 Like

Thanks, I was struggling with sneak players !

Edit : I got some errors using spongevanilla-1.12.2-7.1.4, LuckPerms-Sponge-4.2.32 and negativity 1.1.1.

It looks like that even if database use is set to false, plugin is still trying to connect.

First part of error log : https://pastebin.com/aTdNnXvN
Second part : [23:44:56] [Server thread/ERROR] [Sponge]: Could not pass GameStartingServerEven - Pastebin.com

(Tried with and without packetgate)

Hello,
Sorry for the response time and for the issue. I haven’t receive any mail for your message.
So, have you tried to restart the plugin ? Then, where have you take the plugin ?

@Elikill58 I’m getting the exact same errors as keuterio. I am using the latest versions of sponge vanilla and Negativity.

[09:00:33 ERROR] [STDERR]: java.io.IOException: com.typesafe.config.ConfigException$Parse: Reader: 45: Key 'fly' may not be followed by token: '}' (if you intended '}' to be part of a key or string value, try enclosing the key or value in double quotes)
[09:00:33 ERROR] [STDERR]:      at ninja.leaping.configurate.loader.AbstractConfigurationLoader.load(AbstractConfigurationLoader.java:145)
[09:00:33 ERROR] [STDERR]:      at ninja.leaping.configurate.loader.ConfigurationLoader.load(ConfigurationLoader.java:58)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.sponge.SpongeNegativity.loadConfig(SpongeNegativity.java:300)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.sponge.SpongeNegativity.onPreInit(SpongeNegativity.java:101)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.listener.GamePreInitializationEventListener_SpongeNegativity_onPreInit80.handle(Unknown Source)
[09:00:33 WARN] [negativity]: Unknow default string value: Translation.no_active_file_name
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:433)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:478)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:248)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:256)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.server.SpongeVanilla.preInitialize(SpongeVanilla.java:122)
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.handler$onServerLoad$bbj000(SourceFile:1234)
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:117)
[09:00:33 WARN] [negativity]: Unknow default string value: Translation.default
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.MinecraftServer.run(SourceFile:434)
[09:00:33 WARN] [negativity]: Unknow default string value: Database.column_lang
[09:00:33 ERROR] [STDERR]:      at java.lang.Thread.run(Unknown Source)
[09:00:33 WARN] [negativity]: Unknow default boolean value: Translation.active
[09:00:33 ERROR] [STDERR]: Caused by: com.typesafe.config.ConfigException$Parse: Reader: 45: Key 'fly' may not be followed by token: '}' (if you intended '}' to be part of a key or string value, try enclosing the key or value in double quotes)
[09:00:33 WARN] [negativity]: Unknow default boolean value: Translation.use_db
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseError(ConfigDocumentParser.java:201)
[09:00:33 WARN] [negativity]: Unknow default string value: Database.column_perm
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseError(ConfigDocumentParser.java:197)
[09:00:33 WARN] [negativity]: Unknow default string value: Database.column_lang
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseObject(ConfigDocumentParser.java:459)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseValue(ConfigDocumentParser.java:247)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseObject(ConfigDocumentParser.java:456)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseValue(ConfigDocumentParser.java:247)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseObject(ConfigDocumentParser.java:456)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parse(ConfigDocumentParser.java:646)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.ConfigDocumentParser.parse(ConfigDocumentParser.java:14)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.Parseable.rawParseValue(Parseable.java:260)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.Parseable.rawParseValue(Parseable.java:248)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:180)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:174)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.impl.Parseable.parse(Parseable.java:299)
[09:00:33 ERROR] [STDERR]:      at com.typesafe.config.ConfigFactory.parseReader(ConfigFactory.java:622)
[09:00:33 ERROR] [STDERR]:      at ninja.leaping.configurate.hocon.HoconConfigurationLoader.loadInternal(HoconConfigurationLoader.java:174)
[09:00:33 ERROR] [STDERR]:      at ninja.leaping.configurate.hocon.HoconConfigurationLoader.loadInternal(HoconConfigurationLoader.java:55)
[09:00:33 ERROR] [STDERR]:      at ninja.leaping.configurate.loader.AbstractConfigurationLoader.load(AbstractConfigurationLoader.java:136)
[09:00:33 ERROR] [STDERR]:      ... 14 more
[09:00:33 ERROR] [STDERR]: java.lang.NullPointerException
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.SpongeAdapter.getFinalNode(SpongeAdapter.java:69)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.SpongeAdapter.getStringListInConfig(SpongeAdapter.java:137)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.universal.TranslatedMessages.<clinit>(TranslatedMessages.java:14)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.SpongeAdapter.loadLang(SpongeAdapter.java:200)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.Adapter.setAdapter(Adapter.java:22)
[09:00:33 ERROR] [STDERR]:      at com.elikill58.negativity.sponge.SpongeNegativity.onPreInit(SpongeNegativity.java:102)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.listener.GamePreInitializationEventListener_SpongeNegativity_onPreInit80.handle(Unknown Source)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:433)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:478)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:248)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:256)
[09:00:33 ERROR] [STDERR]:      at org.spongepowered.server.SpongeVanilla.preInitialize(SpongeVanilla.java:122)
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.handler$onServerLoad$bbj000(SourceFile:1234)
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:117)
[09:00:33 ERROR] [STDERR]:      at net.minecraft.server.MinecraftServer.run(SourceFile:434)
[09:00:33 ERROR] [STDERR]:      at java.lang.Thread.run(Unknown Source)
[09:00:34 INFO] [STDOUT]: [Negativity] Error while connection to the database.
[09:00:34 ERROR] [STDERR]: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=127.0.0.1)(port=3306)(type=master) : Connection refused: connect
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:156)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.throwException(ExceptionMapper.java:92)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.Driver.connect(Driver.java:111)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.enabled
[09:00:34 ERROR] [STDERR]:      at java.sql.DriverManager.getConnection(Unknown Source)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect_command
[09:00:34 ERROR] [STDERR]:      at java.sql.DriverManager.getConnection(Unknown Source)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.chat
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.Database.connect(Database.java:21)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.with_report_cmd
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.Database.init(Database.java:56)
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.UniversalUtils.init(UniversalUtils.java:115)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.enabled
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.sponge.SpongeNegativity.onPreInit(SpongeNegativity.java:103)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect_command
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.listener.GamePreInitializationEventListener_SpongeNegativity_onPreInit80.handle(Unknown Source)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.chat
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95)
[09:00:34 WARN] [negativity]: Unknow default boolean value: suspect.with_report_cmd
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:433)
[09:00:34 WARN] [negativity]: Unknow default string value: Database.column_lang
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:478)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:248)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:256)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.server.SpongeVanilla.preInitialize(SpongeVanilla.java:122)
[09:00:34 ERROR] [Sponge]: Could not pass GamePreInitializationEvent$Impl to Plugin{id=negativity, name=Negativity, version=1.1.1, description=It's an Advanced AntiCheat Detection, authors=[Elikill58, RedNesto], source=mods\Negativity.jar}
java.lang.ExceptionInInitializerError: null
        at com.elikill58.negativity.sponge.SpongeNegativity.onPreInit(SpongeNegativity.java:105) ~[SpongeNegativity.class:?]
        at org.spongepowered.common.event.listener.GamePreInitializationEventListener_SpongeNegativity_onPreInit80.handle(Unknown Source) ~[?:?]
        at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95) ~[RegisteredListener.class:1.12.2-7.1.5]
        at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:433) ~[SpongeEventManager.class:1.12.2-7.1.5]
        at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:478) ~[SpongeEventManager.class:1.12.2-7.1.5]
        at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:248) ~[SpongeImpl.class:1.12.2-7.1.5]
        at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:256) ~[SpongeImpl.class:1.12.2-7.1.5]
        at org.spongepowered.server.SpongeVanilla.preInitialize(SpongeVanilla.java:122) ~[SpongeVanilla.class:1.12.2-7.1.5]
        at net.minecraft.server.dedicated.DedicatedServer.handler$onServerLoad$bbj000(SourceFile:1234) ~[nz.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:117) ~[nz.class:?]
        at net.minecraft.server.MinecraftServer.run(SourceFile:434) ~[MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_201]
Caused by: java.lang.NullPointerException
        at com.elikill58.negativity.sponge.utils.Cheat.<init>(Cheat.java:63) ~[Cheat.class:?]
        at com.elikill58.negativity.sponge.utils.Cheat.<clinit>(Cheat.java:18) ~[Cheat.class:?]
        ... 12 more
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.handler$onServerLoad$bbj000(SourceFile:1234)
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:117)
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.MinecraftServer.run(SourceFile:434)
[09:00:34 ERROR] [STDERR]:      at java.lang.Thread.run(Unknown Source)
[09:00:34 ERROR] [STDERR]: Caused by: java.sql.SQLException: Could not connect to address=(host=127.0.0.1)(port=3306)(type=master) : Connection refused: connect
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1036)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:483)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.Driver.connect(Driver.java:106)
[09:00:34 ERROR] [STDERR]:      ... 17 more
[09:00:34 ERROR] [STDERR]: Caused by: java.net.ConnectException: Connection refused: connect
[09:00:34 ERROR] [STDERR]:      at java.net.DualStackPlainSocketImpl.connect0(Native Method)
[09:00:34 ERROR] [STDERR]:      at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.PlainSocketImpl.connect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.SocksSocketImpl.connect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.Socket.connect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at java.net.Socket.connect(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:401)
[09:00:34 ERROR] [STDERR]:      at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1029)
[09:00:34 ERROR] [STDERR]:      ... 19 more
[09:00:34 ERROR] [STDERR]: java.lang.NullPointerException
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.SpongeAdapter.getFinalNode(SpongeAdapter.java:69)
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.adapter.SpongeAdapter.getStringListInConfig(SpongeAdapter.java:137)
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.TranslatedMessages.init(TranslatedMessages.java:23)
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.universal.UniversalUtils.init(UniversalUtils.java:119)
[09:00:34 ERROR] [STDERR]:      at com.elikill58.negativity.sponge.SpongeNegativity.onPreInit(SpongeNegativity.java:103)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.listener.GamePreInitializationEventListener_SpongeNegativity_onPreInit80.handle(Unknown Source)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:433)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.event.SpongeEventManager.post(SpongeEventManager.java:478)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:248)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.common.SpongeImpl.postState(SpongeImpl.java:256)
[09:00:34 ERROR] [STDERR]:      at org.spongepowered.server.SpongeVanilla.preInitialize(SpongeVanilla.java:122)
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.handler$onServerLoad$bbj000(SourceFile:1234)
[09:00:34 INFO]: Configuration file loaded.
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(SourceFile:117)
[09:00:34 INFO]: THE CONFIG FILE CONTAINS UNSET VALUES - YOU MUST FIX THEM BEFORE THE PLUGIN WILL WORK !!!
[09:00:34 INFO] [skyclaims]: SkyClaims 0.27.2-S7.0-BETA is initializing...
[09:00:34 ERROR] [STDERR]:      at net.minecraft.server.MinecraftServer.run(SourceFile:434)
[09:00:34 ERROR] [STDERR]:      at java.lang.Thread.run(Unknown Source)

Hello,

For all people: i find the problem thanks to @SykoUSS :
There is a “}” too much in line 46 in the file “ru_RU.yml”.
If you cannot edit this file because it have not been copied, try to remove the “ru_RU” in main config line 208.
Else, you can download a beta version of the plugin here: https://cdn.discordapp.com/attachments/361214674076827650/549229717002125312/Negativity.jar

Finally, my plugin is also on Ore ! I will edit the first message to make it up to date.
(link: Elikill58 / Negativity)

1 Like