Added modified interaction mod

This commit is contained in:
Vitaliy Olkhin 2024-01-19 20:47:53 +05:00
parent 06b53dfa98
commit 13d39c1ca2
10 changed files with 460 additions and 0 deletions

16
interact/Readme.md Normal file
View File

@ -0,0 +1,16 @@
##Interact: A mod for Minetest.
This mod is designed to automatically grant new players on a server interact. A formspec will be show when the player joins, and there is a command to bring the formspec up later in the game.
There are 3 screens that they go through. The first one is a check if they like griefing (One for really stupid griefers!), the next checks if the player just wants to look round the server, and the final one shows the rules, and asks the player to accept them. Finally, there is a screen which offers the player a quiz, which s/he has to complete successfully to get interact.
Almost everything in the mod can be configured to how you want it.
####Configuring the mod:
You will probably want to replace the default rules with your own in rules.lua. Also, the quiz should be adapted to your rules, thus the quiz questions are found in rules.lua also.
Everything else that you need to configure the mod can be found in config.lua. If you want to, have a look over it before running the mod, to see if everything seems to be as you want it!
####Notes:
1. This mod is based on the (old) [rules](https://github.com/CraigyDavi/Craig-Server_game/blob/df8beb15e6b02ab6dd22f94349453c51819238c4/mods/_misc/rules.lua) on [Craig's Server.](https://forum.minetest.net/viewtopic.php?f=10&t=7010)
2. That mod was, in turn based on this [mod.](https://github.com/ChaosWormz/mt_terms_of_use)
3. I may add randomly selected messages at some point.

92
interact/config.lua Normal file
View File

@ -0,0 +1,92 @@
local S = minetest.get_translator("interact")
interact = {}
interact.configured = true --Change this to true when you've configured the mod!
--Which screens to show.
interact.screen1 = false --The welcome a first question screen.
interact.screen2 = true --The visit or interact screen.
interact.screen4 = false --The quiz screen.
--The first screen--
--The text at the top.
interact.s1_header = S("Hello, welcome to this server!")
--Lines one and two. Make sure each line is less than 70 characters, or they will run off the screen.
interact.s1_l2 = S("Could you please tell me if you like to grief or not?")
interact.s1_l3 = ""
--The buttons. Each can have 15 characters, max.
interact.s1_b1 = S("No, I don't.")
interact.s1_b2 = S("Yes, I do!")
--The message to send kicked griefers.
interact.msg_grief = S("Try out singleplayer if you like griefing, because then you'll only destroy your own stuff!")
--Ban or kick griefers? Default is kick, set to true for ban.
interact.grief_ban = true
--The second screen--
--Lines one and two. Make sure each line is less than 70 characters, or they will run off the screen.
interact.s2_l1 = S("So, do you want interact, or do you just want to look around")
interact.s2_l2 = S("the server?")
--The buttons. These ones can have a maximum of 26 characters.
interact.s2_b1 = S("Yes, I want!")
interact.s2_b2 = S("I just want to look round.")
--The message the player is sent if s/he is just visiting.
interact.visit_msg = S("Have a nice time looking round! If you want interact just type /rules, and you can go through the process again!")
--The third screen--
--The header for the rules box, this can have 60 characters, max.
interact.s3_header = S("Here are the rules:")
--The buttons. Each can have 15 characters, max.
interact.s3_b1 = S("I agree")
interact.s3_b2 = S("I disagree")
--The message to send players who disagree when they are kicked for disagring with the rules.
interact.disagree_msg = S("Bye then! You have to agree to the rules to play on the server.")
--Kick, ban or ignore players who disagree with the rules.
--Options are "kick" "ban" "nothing"
interact.disagree_action = "kick"
--The fouth screen--
--Should there be a back to rules button?
interact.s4_to_rules_button = true
--The back to rules button. 13 characters, max.
interact.s4_to_rules = S("Back to rules")
--The header for screen 4. 60 characters max, although this is a bit of a squash. I recomend 55 as a max.
interact.s4_header = S("Time for a quiz on the rules!")
--Since the questions are intrinsically connected with the rules, they are to be found in rules.lua
--The trues are limited to 24 characters. The falses can have 36 characters.
interact.s4_question1_true = "Yes."
interact.s4_question1_false = "No."
interact.s4_question2_true = "Yes."
interact.s4_question2_false = "No."
interact.s4_question3_true = "Yes."
interact.s4_question3_false = "No."
interact.s4_question4_true = "Yes."
interact.s4_question4_false = "No."
interact.s4_submit = "Submit!"
--What to do on a wrong quiz.
--Options are "kick" "ban" "reshow" "rules" and "nothing"
interact.on_wrong_quiz = "nothing"
--The message to send the player if reshow is the on_wrong_quiz option.
interact.quiz_try_again_msg = S("Have another go.")
--The message sent to the player if rules is the on_wrong_quiz option.
interact.quiz_rules_msg = S("Have another look at the rules:")
--The kick reason if kick is the on_wrong_quiz option.
interact.wrong_quiz_kick_msg = S("Pay more attention next time!")
--The message sent to the player if nothing is the on_wrong_quiz option.
interact.quiz_fail_msg = S("You got that wrong.")
--The messages send to the player after interact is granted.
interact.interact_msg1 = S("Thanks for accepting the rules, you now are able to interact with things.")
interact.interact_msg2 = S("Happy building!")
--The priv required to use the /rules command. If fast is a default priv, I recomend replacing shout with that.
interact.priv = {shout = true}

0
interact/depends.txt Normal file
View File

3
interact/description.txt Normal file
View File

@ -0,0 +1,3 @@
A mod that gives the interact priv to players who want it.
It displays the rules, and then provides a simple quiz on them.
If the player completes the quiz sucsesfully, then s/he is given interact.

259
interact/init.lua Normal file
View File

@ -0,0 +1,259 @@
local S = minetest.get_translator("interact")
dofile(minetest.get_modpath("interact") .. "/config.lua")
dofile(minetest.get_modpath("interact") .. "/rules.lua") --I put the rules in their own file so that they don't get lost/overlooked!
local rule1 = 0
local rule2 = 0
local rule3 = 0
local rule4 = 0
local multi = 0
local function make_formspec(player)
local name = player:get_player_name()
local size = { "size[10,4]" }
table.insert(size, "label[0.5,0.5;" ..interact.s1_header.. "]")
table.insert(size, "label[0.5,1.5;" ..interact.s1_l2.. "]")
table.insert(size, "label[0.5,2;" ..interact.s1_l3.. "]")
table.insert(size, "button_exit[5.5,3.4;2,0.5;no;" ..interact.s1_b1.. "]")
table.insert(size, "button[7.5,3.4;2,0.5;yes;" ..interact.s1_b2.. "]")
return table.concat(size)
end
local function make_formspec2(player)
local name = player:get_player_name()
local size = { "size[10,4]" }
table.insert(size, "label[0.5,0.5;" ..interact.s2_l1.. "]")
table.insert(size, "label[0.5,1;" ..interact.s2_l2.. "]")
table.insert(size, "button_exit[2.5,3.4;3.5,0.5;interact;" ..interact.s2_b1.. "]")
table.insert(size, "button_exit[6.4,3.4;3.6,0.5;visit;" ..interact.s2_b2.. "]")
return table.concat(size)
end
--Форма запроса на interact
local function make_formspec3(player)
local size = { "size[10,8]" }
table.insert(size, "textarea[0.5,0.5;9.5,5.5;TOS;" ..interact.s3_header.. ";" ..interact.rules.. "]")
table.insert(size, "field[0.5,6.4;2,0.5;answer;2+3="..S("answer")..";]")
table.insert(size, "button[5.5,7.4;2,0.5;decline;" ..interact.s3_b2.. "]")
table.insert(size, "button_exit[7.5,7.4;2,0.5;accept;" ..interact.s3_b1.. "]")
return table.concat(size)
end
local function make_formspec4(player)
local name = player:get_player_name()
local size = { "size[10,9]" }
if interact.s4_to_rules_button == true then
table.insert(size, "button_exit[7.75,0.25;2.1,0.1;rules;" ..interact.s4_to_rules.. "]")
end
table.insert(size, "label[0.25,0;" ..interact.s4_header.."]")
table.insert(size, "label[0.5,0.5;" ..interact.s4_question1.."]")
table.insert(size, "checkbox[0.25,1;rule1_true;" ..interact.s4_question1_true.."]")
table.insert(size, "checkbox[4,1;rule1_false;" ..interact.s4_question1_false.. "]")
table.insert(size, "label[0.5,2;" ..interact.s4_question2.. "]")
table.insert(size, "checkbox[0.25,2.5;rule2_true;" ..interact.s4_question2_true.. "]")
table.insert(size, "checkbox[4,2.5;rule2_false;" ..interact.s4_question2_false.. "]")
table.insert(size, "label[0.5,3.5;" ..interact.s4_question3.. "]")
table.insert(size, "checkbox[0.25,4;rule3_true;" ..interact.s4_question3_true.. "]")
table.insert(size, "checkbox[4,4;rule3_false;" ..interact.s4_question3_false.. "]")
table.insert(size, "label[0.5,5;" ..interact.s4_question4.. "]")
table.insert(size, "checkbox[0.25,5.5;rule4_true;" ..interact.s4_question4_true.. "]")
table.insert(size, "checkbox[4,5.5;rule4_false;" ..interact.s4_question4_false.."]")
table.insert(size, "label[0.5,6.5;" ..interact.s4_multi_question.. "]")
table.insert(size, "checkbox[4.75,6.25;multi_choice1;" ..interact.s4_multi1.. "]")
table.insert(size, "checkbox[0.25,7;multi_choice2;" ..interact.s4_multi2.. "]")
table.insert(size, "checkbox[4.75,7;multi_choice3;" ..interact.s4_multi3.."]")
table.insert(size, "button_exit[3,8.4;3.5,0.5;submit;" ..interact.s4_submit.."]")
return table.concat(size)
end
local server_formspec = "size[10,4]" ..
"label[0.5,0.5;Hey, you! Yes, you, the admin! What do you think you're doing]" ..
"label[0.5,0.9;ignoring warnings in the terminal? You should watch it carefully!]" ..
"label[0.5,1.5;Before you do anything else, open rules.lua in the interact mod]" ..
"label[0.5,1.9;and put your rules there. Then, open config.lua, and look at the]" ..
"label[0.5,2.3;settings. Configure them so that they match up with your rules.]" ..
"label[0.5,2.7;Then, set interact.configured to true, and this message will go away]" ..
"label[0.5,3.1;once you've restarted the server.]" ..
"label[0.5,3.6;Thank you!]"
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "interact_welcome" then return end
local name = player:get_player_name()
if fields.no then
if interact.screen2 == false then
minetest.after(1, function()
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end)
else
minetest.after(1, function()
minetest.show_formspec(name, "interact_visit", make_formspec2(player))
end)
end
return
elseif fields.yes then
if interact.grief_ban ~= true then
minetest.kick_player(name, interact.msg_grief)
else
minetest.ban_player(name)
end
return
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "interact_visit" then return end
local name = player:get_player_name()
if fields.interact then
minetest.after(1, function()
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end)
return
elseif fields.visit then
minetest.chat_send_player(name, interact.visit_msg)
minetest.log("action", name.. " is just visiting.")
return
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "interact_rules" then return end
local name = player:get_player_name()
if fields.accept then
if interact.screen4 == false then
if minetest.check_player_privs(name, interact.priv) and fields.answer == "5" then
minetest.chat_send_player(name, interact.interact_msg1)
minetest.chat_send_player(name, interact.interact_msg2)
local privs = minetest.get_player_privs(name)
privs.interact = true
minetest.set_player_privs(name, privs)
minetest.log("action", "Granted " ..name.. " interact.")
else
if interact.disagree_action == "kick" then
minetest.kick_player(name, interact.disagree_msg)
elseif interact.disagree_action == "ban" then
minetest.ban_player(name)
else
minetest.chat_send_player(name, interact.disagree_msg)
end
end
else
minetest.after(1, function()
minetest.show_formspec(name, "interact_quiz", make_formspec4(player))
end)
end
return
elseif fields.decline then
if interact.disagree_action == "kick" then
minetest.kick_player(name, interact.disagree_msg)
elseif interact.disagree_action == "ban" then
minetest.ban_player(name)
else
minetest.chat_send_player(name, interact.disagree_msg)
end
return
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "interact_quiz" then return end
local name = player:get_player_name()
if fields.rules then
minetest.after(1, function()
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end)
return
end
if fields.rule1_true then rule1 = true
elseif fields.rule1_false then rule1 = false
elseif fields.rule2_true then rule2 = true
elseif fields.rule2_false then rule2 = false
elseif fields.rule3_true then rule3 = true
elseif fields.rule3_false then rule3 = false
elseif fields.rule4_true then rule4 = true
elseif fields.rule4_false then rule4 = false
elseif fields.multi_choice1 then multi = 1
elseif fields.multi_choice2 then multi = 2
elseif fields.multi_choice3 then multi = 3 end
if fields.submit and rule1 == interact.quiz1 and rule2 == interact.quiz2 and
rule3 == interact.quiz3 and rule4 == interact.quiz4 and multi == interact.quiz_multi then
rule1 = 0
rule2 = 0
rule3 = 0
rule4 = 0
multi = 0
if minetest.check_player_privs(name, interact.priv) then
minetest.chat_send_player(name, interact.interact_msg1)
minetest.chat_send_player(name, interact.interact_msg2)
local privs = minetest.get_player_privs(name)
privs.interact = true
minetest.set_player_privs(name, privs)
minetest.log("action", "Granted " ..name.. " interact.")
end
elseif fields.submit then
rule1 = 0
rule2 = 0
rule3 = 0
rule4 = 0
multi = 0
if interact.on_wrong_quiz == "kick" then
minetest.kick_player(name, interact.wrong_quiz_kick_msg)
elseif interact.on_wrong_quiz == "ban" then
minetest.ban_player(name)
elseif interact.on_wrong_quiz == "reshow" then
minetest.chat_send_player(name, interact.quiz_try_again_msg)
minetest.after(1, function()
minetest.show_formspec(name, "interact_quiz", make_formspec4(player))
end)
elseif interact.on_wrong_quiz == "rules" then
minetest.chat_send_player(name, interact.quiz_rules_msg)
minetest.after(1, function()
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end)
else
minetest.chat_send_player(name, interact.quiz_fail_msg)
end
end
end)
minetest.register_chatcommand("rules",{
params = "",
description = "Shows the server rules",
privs = interact.priv,
func = function (name,params)
local player = minetest.get_player_by_name(name)
if interact.screen1 ~= false then
minetest.after(1, function()
minetest.show_formspec(name, "interact_welcome", make_formspec(player))
end)
elseif interact.screen2 ~= false then
minetest.after(1, function()
minetest.show_formspec(name, "interact_visit", make_formspec2(player))
end)
else
minetest.after(1, function()
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end)
end
end
})
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
if not minetest.get_player_privs(name).interact then
if interact.screen1 ~= false then
minetest.show_formspec(name, "interact_welcome", make_formspec(player))
elseif interact.screen2 ~= false then
minetest.show_formspec(name, "interact_visit", make_formspec2(player))
else
minetest.show_formspec(name, "interact_rules", make_formspec3(player))
end
elseif minetest.get_player_privs(name).server and interact.configured == false then
minetest.show_formspec(name, "interact_no_changes_made", server_formspec)
end
end)
if not interact.configured then
minetest.log("warning", "Mod \"Interact\" has not been configured! Please open config.lua in its folder and configure it. See the readme of the mod for more details.")
end

21
interact/license.txt Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015 Amaz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,25 @@
# textdomain: interact
So, do you want interact, or do you just want to look around=Итак, вы хотите пообщаться или просто хотите осмотреться
the server?=на сервере?
Yes, I want!=Да, я хочу!
I just want to look round.=Я просто хочу осмотреться.
Have a nice time looking round! If you want interact just type /rules, and you can go through the process again!=Приятной прогулки! Если вы хотите взаимодействовать в игре, просто введите в чат /rules, и вы сможете повторить процесс снова!
I agree=Я согласен
I disagree=Я не согласен
answer=ответ
Hello, welcome to this server!=Здравствуйте, добро пожаловать на этот сервер!
Could you please tell me if you like to grief or not?=Скажите, пожалуйста, любите ли вы горевать или нет?
No, I don't.=Нет, я не знаю.
Yes, I do!=Да!
Try out singleplayer if you like griefing, because then you'll only destroy your own stuff!=Если вам нравится грифинг, попробуйте одиночную игру, потому что тогда вы уничтожите только свои собственные имущество!
Here are the rules:=Вот правила:
Bye then! You have to agree to the rules to play on the server.=Ну тогда пока! Чтобы играть на сервере, вам необходимо согласиться с правилами.
Back to rules=Вернуться к правилам
Time for a quiz on the rules!=Пришло время викторины по правилам!
Have another go.=Попробуйте еще раз.
Have another look at the rules:=Еще раз взгляните на правила:
Pay more attention next time!=В следующий раз уделите больше внимания!
You got that wrong.=Вы поняли это неправильно.
Thanks for accepting the rules, you now are able to interact with things.=Спасибо за согласие с правилами, теперь вы можете взаимодействовать с вещами.
Happy building!=Приятного строительства!

7
interact/mod.conf Normal file
View File

@ -0,0 +1,7 @@
name = interact
title = Interact
author = Amaz
description = A mod that gives the interact priv to players who want it and who have agreed to the rules.
license = MIT
forum = https://forum.minetest.net/viewtopic.php?f=11&t=11200
version = 1.0

37
interact/rules.lua Normal file
View File

@ -0,0 +1,37 @@
--The actual rules.
interact.rules = [[
Rules:
1. No griefing.
2. No hacked clients.
3. No swearing or insults towards other players.
4. No family roleplay.
5. No dating.
6. Do not ask for more privs, or to be an admin. Also do not ask for items.
7. PVP is not allowed.
]]
--The questions on the rules, if the quiz is used.
--The checkboxes for the first 4 questions are in config.lua
interact.s4_question1 = "Is PVP is allowed?"
interact.s4_question2 = "Is family roleplay allowed?"
interact.s4_question3 = "Should you be nice to all players?"
interact.s4_question4 = "Should you ask for all the privs you can?"
interact.s4_multi_question = "Which of these is a rule?"
--The answers to the multiple choice questions. Only one of these should be true.
interact.s4_multi1 = "No griefing!"
interact.s4_multi2 = "PVP is allowed."
interact.s4_multi3 = "Be rude to other players."
--Which answer is needed for the quiz questions. interact.quiz1-4 takes true or false.
--True is left, false is right.
--Please, please spell true and false right!!! If you spell it wrong it won't work!
--interact.quiz can be 1, 2 or 3.
--1 is the top one by the question, 2 is the bottom left one, 3 is the bottom right one.
--Make sure these agree with your answers!
interact.quiz1 = false
interact.quiz2 = false
interact.quiz3 = true
interact.quiz4 = false
interact.quiz_multi = 1

BIN
interact/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB