This commit is contained in:
lifestorm
2024-08-04 23:12:27 +03:00
parent 0e770b2b49
commit ba1fc01b16
7084 changed files with 2173495 additions and 14 deletions

View File

@@ -0,0 +1,242 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
PLUGIN.quizlist = PLUGIN.quizlist or {}
function PLUGIN:DatabaseConnected()
local query = mysql:Create("ix_storedquiz")
query:Create("quiz_id", "INT(11) UNSIGNED NOT NULL AUTO_INCREMENT")
query:Create("quiz_question", "TEXT")
query:Create("quiz_answers", "TEXT")
query:Create("quiz_permanent", "TEXT")
query:PrimaryKey("quiz_id")
query:Callback(function()
local quizQuery = mysql:Select("ix_storedquiz")
quizQuery:Callback(function(quizResult)
if (!istable(quizResult) or #quizResult == 0) then
return
end
for _, v in ipairs(quizResult) do
self.quizlist[tonumber(v["quiz_id"])] = {v["quiz_question"], util.JSONToTable(v["quiz_answers"]), v["quiz_permanent"]}
end
end)
quizQuery:Execute()
end)
query:Execute()
end
function PLUGIN:RandomQuizzes(client, newQuizList)
-- Thanks Gr4Ss
client.sentQuizIDs = {}
local keys = {}
local quiz = {}
for k, v in pairs(newQuizList) do
if (v[3] == true) then
quiz[#quiz + 1] = v
client.sentQuizIDs[#quiz] = k
else
keys[#keys + 1] = k
end
end
while (#quiz < 6 and #keys > 0) do
local winner = math.random(#keys)
quiz[#quiz + 1] = newQuizList[keys[winner]]
client.sentQuizIDs[#quiz] = keys[winner]
table.remove(keys, winner)
end
netstream.Start(client, "SyncQuiz", quiz)
end
function PLUGIN:ReplyQuizzes(client, bAdmin)
if (bAdmin) then
if (client:IsAdmin()) then
self:SyncFullQuizList(client)
else
ix.log.Add(client, "luaHack", "access the full quizlist without admin")
client:Kick("You're not an admin ruski.")
end
return false
end
local newQuizList = {}
for oldKey, tQuestion in pairs(self.quizlist) do
newQuizList[oldKey] = {tQuestion[1], {}, tQuestion[3]}
for answer, _ in pairs(tQuestion[2]) do
newQuizList[oldKey][2][#newQuizList[oldKey][2] + 1] = answer
end
end
self:RandomQuizzes(client, newQuizList)
end
function PLUGIN:SyncFullQuizList(client)
netstream.Start(client, "SyncQuiz", self.quizlist)
end
netstream.Hook("RequestQuizzes", function(client, bAdmin)
PLUGIN:ReplyQuizzes(client, bAdmin)
end)
function PLUGIN:AddQuiz(client, question, answers, bPermanent)
if (!client:IsAdmin()) then
ix.log.Add(client, "luaHack", "access QuizAdd")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[#PLUGIN.quizlist + 1] = {question, answers, bPermanent}
local queryAdd = mysql:Insert("ix_storedquiz")
queryAdd:Insert("quiz_question", question)
queryAdd:Insert("quiz_answers", util.TableToJSON(answers))
queryAdd:Insert("quiz_permanent", bPermanent)
queryAdd:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:RemoveQuiz(client, id)
if (!client:IsAdmin()) then
ix.log.Add(client, "luaHack", "access QuizRemove")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[id] = nil
local queryDelete = mysql:Delete("ix_storedquiz")
queryDelete:Where("quiz_id", id)
queryDelete:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:EditQuiz(client, id, question, answers, bPermanent)
if !client:IsAdmin() then
ix.log.Add(client, "luaHack", "access QuizEdit")
client:Kick("You're not an admin ruski.")
return false
end
PLUGIN.quizlist[id] = {question, answers, bPermanent}
local queryEdit = mysql:Update("ix_storedquiz")
queryEdit:Where("quiz_id", id)
queryEdit:Update("quiz_question", question)
queryEdit:Update("quiz_answers", util.TableToJSON(answers))
queryEdit:Update("quiz_permanent", bPermanent)
queryEdit:Execute()
self:SyncFullQuizList(client)
end
function PLUGIN:CheckIfAnswersAreRight(client, answers)
if !client.sentQuizIDs then return false end
for sendID, actualAnswer in pairs(answers) do
local realID = client.sentQuizIDs[sendID]
if (!realID) then
ix.log.Add(client, "luaHack", "change what quiz questions are being asked")
return false
end
local question = self.quizlist[realID]
local bAnswerFound = false
if question then
for answer, bRightAnswer in pairs(question[2]) do
if (answer == actualAnswer) then
if (bRightAnswer != true) then
return false
else
bAnswerFound = true
break
end
end
end
end
if (!bAnswerFound) then return false end
end
return true
end
function PLUGIN:AnswersMissing(client, answers)
if (!client.sentQuizIDs) then
return true
end
if (table.Count(answers) != #client.sentQuizIDs) then
return true
end
return false
end
function PLUGIN:CanPlayerCreateCharacter(client)
if (!client:GetData("QuizCompleted", false)) then
ix.log.Add(client, "luaHack", "bypass character creation quiz check")
return false, "Nice try ruski"
end
end
function PLUGIN:CompleteQuiz(client, answers)
if (self:AnswersMissing(client, answers)) then
netstream.Start(client, "SendCharacterPanelNotify", "You are still missing answering some questions!")
return false
end
if (!self:CheckIfAnswersAreRight(client, answers)) then
local quizAttempts = client:GetNetVar("quizAttempts", 3)
if (quizAttempts > 1) then
local remainingAttempts = quizAttempts - 1
local notification = string.format("One or more of your answers were incorrect. Please read the rules and guidelines and try again. You have %d attempt%s left.", remainingAttempts, remainingAttempts > 1 and "s" or "")
netstream.Start(client, "SendCharacterPanelNotify", notification)
client:SetNetVar("quizAttempts", remainingAttempts)
else
client:Kick("Unfortunately you did not answer correctly. Please read the rules and guidelines at https://willard.network/forums/ and try again")
end
return false
end
client:SetData("QuizCompleted", true)
client.sentQuizIDs = nil
netstream.Start(client, "SendCharacterPanelNotify", "Success, you've answered correctly and can now create a character!")
netstream.Start(client, "RemoveQuizUI")
end
-- Hooks
netstream.Hook("AddQuiz", function(client, question, answers, bPermanent)
PLUGIN:AddQuiz(client, question, answers, bPermanent)
end)
netstream.Hook("RemoveQuiz", function(client, id)
PLUGIN:RemoveQuiz(client, id)
end)
netstream.Hook("EditQuiz", function(client, id, question, answers, bPermanent)
PLUGIN:EditQuiz(client, id, question, answers, bPermanent)
end)
netstream.Hook("CompleteQuiz", function(client, answers)
PLUGIN:CompleteQuiz(client, answers)
end)