ПЕРЕД УЧАСТИЕМ В ОПРОСЕ ПРОЧТИТЕ ТЕМУ!
Я хочу вам поведать о проблемах, которые явно есть на этом проекте.
И я лишь хочу предложить возможные решения.
Применять их, или придумать свои - на усмотрение администрации. Первая проблема - предвзятое отношение модераторов к игрокам. Часто, когда ещё модератор был игроком - у него могли быть разногласия с другими игроками.
Из-за этого он может к ним плохо относиться, потому - может выдавать мут предвзято: "Союзнику" могут дать 1 час за 1.9, за 1 мат в сообщении.
"Врагу" могут дать 12 часов за 1.9, также за 1 мат в сообщении.
Как же это можно решить?
Моя идея такова:
Необходимо выдавать точные муты, точно по нарушению, без "человеческого" фактора.
К примеру - использование формул:
F(x) = T * c^x
Где T - фиксированное время мута,
c - множитель, указанный в правиле,
x - кол-во предыдущих нарушений этого правила, его можно сбивать раз в неделю, или даже месяц.
ВНИМАНИЕ, МОДЕРАТОРЫ! Легко можно написать плагин, который будет считать это вместо вас!
Вообще, от вас не будет нужды выбирать время мута. За вас это сделает плагин, Вам лишь необходимо указать номер правила. Нарушитель будет с каждым нарушением будет получать все больший и больший мут. Как это будет работать(в конце статьи есть пример реализации):
/mute Nickname rule
Во времени нет необходимости, т.к. его будет рассчитывать плагин, исходя из правила. НО! В ситуациях, когда множитель c большой, например, 2.
При 6 нарушениях и T в правиле, равном 10 результат F(6) будет равен 640 часам. Если для вас это является неприемлемым, можно установить максимальное число мута M. Примечание:
Хотя, если он уже 6 раз нарушил - пусть получает то, что заслужил
В чём идея, спросите вы.
А всё просто. Если F(x) > M, выдаём человеку мут в размере M. Попробуем протестировать: Возьмём, к примеру, 1.0
Допустим, T будет 1 час, c - 1.5, m = 12 часов.
22.09, 21:30. Нарушение 1.0 - мут на 4 часа. // F(0) = 4 * 1.5^0 = 4
23.09, 20:30. Нарушение 1.0 - мут на 6 часов. // F(1) = 4 * 1.5^1 = 6
24.09, 18:30. Нарушение 1.0 - мут на 9 часов. // F(2) = 4 * 1.5^2 = 9
25.09, 10:30. Нарушение 1.0 - мут на 12 часов. // F(3) = 4 * 1.5^3 = 13.5. Но 13.5 > 12, поэтому мут равен 12-ти часам.
26.09, 14:30. Нарушение 1.0 - мут на 12 часов. // F(4) = 4 * 1.5^4 = 20.25. Но 20.25 > 12, поэтому мут равен 12-ти часам
27.09, 20:30. Стёрли всем игрокам их нарушения.
28.09, 10:30. Нарушение 1.0 - мут на 4 часа. // F(0) = 4 * 1.5^0 = 4
Давайте попробуем увеличить c, установив, например, двойку. M равен 24.
22.09, 21:30. Нарушение 1.0 - мут на 4 часа. // F(0) = 4 * 2^0 = 4
29.09, 20:30. Нарушение 1.0 - мут на 8 часов. // F(1) = 4 * 2^1 = 8
01.10, 18:30. Нарушение 1.0 - мут на 16 часов. // F(2) = 4 * 2^2 = 16
11.10, 10:30. Нарушение 1.0 - мут на 24 часа. // F(3) = 4 * 2^3 = 32. Но 32 > 24, поэтому мут равен 24-м часам.
14.10, 14:30. Нарушение 1.0 - мут на 24 часа. // F(4) = 4 * 2^4 = 64. Но 64 > 24, поэтому мут равен 24-м часам.
17.10, 15:00. Стёрли всем игрокам их нарушения.
19.10, 10:30. Нарушение 1.0 - мут на 4 часа. // F(0) = 4 * 2^0 = 4
Если брать в качестве множителя C большие числа - это легко может отучить игроков нарушать правила. Например, если взять 9, а максимального времени мута не будет:
1) 1 * 9^0 = 1
2) 1 * 9^1 = 9
3) 1 * 9^2 = 81 ( 3 суток )
4) 1 * 9^3 = 729 ( 1 месяц )
Зачем нужны такие большие муты? Всё просто. Если человек не понимает, что нужно прекратить нарушать - не нужен хедмодер, чтобы дать мут на неделю или даже месяц.
За него это сделает плагин.
И "друг", и "враг" получат большое и правильное наказание. Разве это не идеальное решение, которое не только решит проблему, но и упростит всем жизнь? Вторая проблема - нарушения в чате, пока нет модераторов. Как же это можно решить?
Исходя из https://f.simpleminecraft.ru/index.php?/forum/14-жалобы-на-игроков/ - чаще всего нарушаются вне модера правила, связанные со флудом, оскорблениями или матом, которые может предотвратить ChatGuard.
К тому же, он разгружает модераторов, занимаясь "примитивом". В чём идея? Допустим, человек пишет сообщение:
Пошли вы все в %брань%.
ChatGuard поймёт, что "%брань%" - плохое слово, и превратит сообщение в это:
Пошли вы все в #######
ChatGuard может выдать предупреждение игроку, при достижении определенного числа которых он будет получать мут. Моё предложение - 5 предупреждений и 2 дня мута при нарушении, что вполне справедливо, когда человек 5 раз не может понять, что материться не стоит.
Хотя администрация может выбрать любые другие числа. Вообще, странно, что люди, которые пишут, что они поддерживают культурное общение - голосуют против ChatGuard.
ChatGuard как раз поддерживает культурное общение, блокируя сообщения, содержащие запрещённые слова. Лицемерие какое-то. Третья проблема. Мут за нарушения в собственном доме. Я не имею ввиду мат/оскорбления. За это НУЖНО мутить, с чем справится ChatGuard, упомянутый выше. Я имею в виду, например, обсуждение со своим другом тем "18+", например.
Эти темы ни на кого не влияют, игроки этого не видят, но модератор, который телепортировался - может увидеть и дать мут.
Так что сие действо является бессмысленным. Какие могут быть решения?
Первое - простой запрет выдавания мута на территории игрока. Второе - если так не нравится идея с пробегающим мимо региона ребёнком - установка плагина, создающего каналы. К примеру, вы можете создать свой канал, куда можете отправлять сообщения.
ТОЛЬКО ТЕ и ТОЛЬКО ТЕ, кто находится в этом канале будут их получать.
Подробнее:
Четвёртая и последняя проблема. Неточность правил.
1.0
Запрещено развязывать межнациональные конфликты в чате.
Как же можно уточнить этот "розжиг межнационального конфликта"?
Можно вообще переписать этот пункт, указав запрет обсуждения инициатора - политики.
1.2
Запрещено писать одинаковые сообщения в чат (флудить).
Флудом считаются сообщения, не имеющие смысловой нагрузки, от двух идентичных сообщений подряд (или с одинаковым смыслом),
повторяющиеся символы / буквы (более 4-х) Так же запрещена организация массового флуда. Банальные опросы: “Кто щас в игре?”.
Исключения: Викторины с ответами, если это было согласовано с модерацией сервера.
Наказание: блокировка чата от 30 минут до 2 часов.
Забавно, что повторяющиеся символы/буквы можно понимать двояко. ВСЕ начинающие игроки воспринимают это как повторяющиеся символы/буквы подряд, но не как не в целом.
Может стоило бы указать:
1.3
Запрещена дискриминация игроков, дезинформирование, насмешки, угрозы, а также отправлять в чат провокационные сообщения и мешать общению других игроков.
Погодите, а как можно понять это "дискриминация игроков, дезинформирование, насмешки, угрозы"?
Как вообще их можно было уместить в одно правило?
Я считаю, что необходимо разделить правило на подпункты:
1.3.1 - дискриминация.
Как же можно понять эту "дискриминацию"?
Если модератор считает, что это - дискриминация - пусть не забудет спросить у самого игрока, обижает ли его это.*
В случае согласия игрока и модератора - выдаем мут. * - В разумных рамках, естественно.
1.3.2 - дезинформирование.
Если это "дезинформирование" могло навредить игроку - модератор выдает мут.
Когда же дезинформация не вредит?
Чаще всего в случаях, если этот вопрос вообще не связан с игрой.
В таких ситуациях мут не нужен.
1.3.3 - насмешка.
Почему в отдельный пункт? - Исходя из первой проблемы.
Дискриминация и насмешка - весьма различающиеся понятия.
Поэтому и мут должен рассчитываться по другому.
1.3.4 - угроза.
Почему в отдельный пункт? - Исходя из первой проблемы.
Дискриминация и насмешка - весьма различающиеся понятия.
Поэтому и мут должен рассчитываться по другому.
1.6
Запрещено отправлять сообщения сексуального характера.
Переписать правило.
Сейчас указано, что нельзя отправлять сообщения "сексуального" характера.
В этой теме я подробно разобрал, что же значит "сексуальный" характер.
Упоминание гениталий в него не входит.
Вот, что стоило бы в него добавить:
1.6
Запрещено разговаривать на большинству неприятные темы и темы "18+".
Обращение к людям, которые будут говорить, что реализация очень сложная/затратная: Нет. Вообще нет. Существует множество реализаций ChatGuard, идеи которых можно скопировать.
На счёт рассчёта формул - это просто смехотворно(язык - C++):
#include <vector>
#include <string>
#include <cmath>
class ViolationsDB {
private: // structs
struct Violation {
// Violation name. 1.0, 1.1, etc.
std::string name;
long double T, c, m;
};
struct UserViolations{
Violation* V;
size_t times = 0;
};
struct User {
std::string name;
std::vector<UserViolations> violations;
};
private: // Variables
std::vector<Violation> ptrs;
std::vector<User> Users;
private: // Functions
void Load(){
// here must be db load code
}
void Save(){
// here must be db save code
}
public: // Functions
// -1 means wrong violName
long double AddViolationToUser(std::string name, std::string violName) {
for(size_t i=0;i<ptrs.size();i++){
if(ptrs[i].name == violName) {
UserViolations uv;
uv.V = &ptrs[i];
Users[i].violations.push_back(uv);
return ptrs[i].T;
}
}
}
long double getTime(std::string name, std::string violName) {
for(size_t i = 0; i < Users.size();i++) {
// If we finded this user.
if(Users[i].name == name) {
for(size_t j=0;j<Users[i].violations.size();j++) {
if((*Users[i].violations[j].V).name == violName) {
long double time = (*Users[i].violations[j].V).T * std::pow((*Users[i].violations[j].V).c, Users[i].violations[j].times);
Users[i].violations[j].times++;
if(time > (*Users[i].violations[j].V).m) {
return (*Users[i].violations[j].V).m;
}
return time;
}
}
// If violation doesn't finded. Add.
return AddViolationToUser(name, violName);
return -1;
}
// If user doesn't exists in database.
User NewUser;
NewUser.name = name;
Users.push_back(NewUser);
return AddViolationToUser(name, violName);
}
}
ViolationsDB() {
Load();
}
~ViolationsDB() {
Save();
}
};
Протестировать можно на repl.it: https://repl.it/@Alleksh_/DefenselessTransparentBlogware