1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
|
ch_core.open_submod("joinplayer", {chat = true, data = true, events = true, formspecs = true, lib = true, nametag = true, pryc = true})
local F = minetest.formspec_escape
local ifthenelse = ch_core.ifthenelse
ch_core.register_event_type("joinplayer", {
-- ignoruje postavy, které budou odpojeny, a turistické postavy
description = "vstup do hry",
access = "players",
default_text = "Připojila se postava: {PLAYER}",
chat_access = "public",
})
ch_core.register_event_type("joinplayer_new", {
-- jen turistické postavy, kromě těch, které budou odpojeny
description = "vstup do hry (tur.p.)",
access = "players",
default_text = "Připojila se turistická postava: {PLAYER}",
chat_access = "public",
})
ch_core.register_event_type("joinplayer_for_admin", {
-- všechny postavy
description = "vstup do hry*",
access = "admin",
chat_access = "admin",
})
ch_core.register_event_type("leaveplayer", {
-- ignoruje postavy, které budou odpojeny
description = "odchod ze hry",
access = "admin",
default_text = "Odpojila se postava: {PLAYER}",
chat_access = "public",
})
ch_core.register_event_type("leaveplayer_for_admin", {
-- všechny postavy
description = "odchod ze hry*",
access = "admin",
chat_access = "admin",
default_text = "{PLAYER} se odpojil/a ze hry",
})
local function get_invalid_locale_formspec(invalid_locale, protocol_version)
if invalid_locale == nil or invalid_locale == "" then
invalid_locale = "en"
end
local krok1_cs, krok1_sk, krok1_en
local krok2_cs, krok2_sk, krok2_en
if protocol_version < 43 then
krok1_cs = F("1. Odpojte se ze hry a v hlavním menu na kartě Settings (Nastavení) klikněte na All Settings (Všechna nastavení).\n\n")
krok1_sk = F("1. Odpojte sa zo hry a v hlavnom menu na karte Settings (Nastavenia) kliknite na All Settings (Všetky nastavenia).\n\n")
krok1_en = F("1. Disconnect the client and in the main menu on the Settings tab click to \"All Settings\" button.\n\n")
krok2_cs = F("2. Ve skupině „Client and Server“ (Klient a server) nastavite „Language“ („Jazyk“) na hodnotu „cs“ nebo „sk“.\n\n")
krok2_sk = F("2. V skupine „Client and Server“ (Klient a server) nastavte „Language“ („Jazyk“) na hodnotu „sk“ alebo „cs“.\n\n")
krok2_en = F("2. In the group \"Client and Server\" set \"Language\" to one of the values \"cs\" or \"sk\".\n\n")
else
-- Minetest >= 5.8.0
krok1_cs = F("1. Odpojte se ze hry a klikněte na ozubené kolo v pravém horním rohu menu (Nastavení).\n\n")
krok1_sk = F("1. Odpojte sa zo hry a kliknite kliknite na ozubené koleso v pravom hornom rohu rozhrania (Nastavenia).\n\n")
krok1_en = F("1. Disconnect the client and click the gear in the top right corner of the interface (Settings).\n\n")
krok2_cs = F("2. Ve skupině „User Interfaces“ (Užívateľské rozhranie) nebo „Accessibility“ nastavite „Language“ („Jazyk“) na hodnotu „Česky [cs]“ nebo „Slovenčina [sk]“.\n\n")
krok2_sk = F("2. V skupine „User Interfaces“ (Uživatelská rozhraní) lebo „Accessibility“ nastavte „Language“ („Jazyk“) na hodnotu „Slovenčina [sk]“ lebo „Česky [cs]“.\n\n")
krok2_en = F("2. In the group \"User Interfaces\" or \"Accessibility\" set \"Language\" to one of the values \"Česky [cs]\" or \"Slovenčina [sk]\".\n\n")
end
local result = {
"formspec_version[4]",
"size[12,14]",
"label[0.375,0.5;česky:]",
"textarea[0.375,0.7;11,4;cz;;",
F("Připojili jste se na server Český hvozd. Server detekoval, že váš klient je nastaven na lokalizaci „"..invalid_locale.."“, která není na tomto serveru podporována. Abyste mohli pokračovat ve hře, musíte nastavit svého klienta na lokalizaci „cs“ nebo „sk“. Postup je následující:\n\n"),
krok1_cs,
krok2_cs,
F("3. Úplně restartujte klienta (vypněte ho a znovu zapněte).\n\n"),
F("4. Znovu se pokuste připojit na Český hvozd.\n\n"),
F("Pokud se vám tato zpráva zobrazuje, přestože máte uvedené nastavení správně, je to pravděpodobně chyba na straně serveru. Kontakt pro nahlášení takové chyby najdete na stránkách http://ceskyhvozd.svita.cz\n"),
"]",
"label[0.375,5.0;slovensky:]",
"textarea[0.375,5.2;11,4;sk;;",
F("Pripojili ste sa na server Český hvozd. Server detekoval, že váš klient je nastavený na lokalizáciu „"..invalid_locale.."“, ktorá nie je na tomto serveri podporovaná. Aby ste mohli pokračovať v hre, musíte nastaviť svojho klienta na lokalizáciu „sk“ alebo „cs“. Postup je nasledujúci:\n\n"),
krok1_sk,
krok2_sk,
F("3. Úplne reštartujte klienta (vypnite ho a znovu zapnite).\n\n"),
F("4. Znova sa pokúste pripojiť na Český hvozd.\n\n"),
F("Ak sa vám táto správa zobrazuje, hoci máte uvedené nastavenie správne, je to pravdepodobne chyba na strane servera. Kontakt pre nahlásenie takejto chyby nájdete na stránkach http://ceskyhvozd.svita.cz\n"),
"]",
"label[0.375,9.5;English:]",
"textarea[0.375,9.7;11,3;en;;",
F("You have connected to the Český Hvozd Server. The server detected that your client is set to localization \""..invalid_locale.."\" that is not supported on this server. To continue playing you must set up your client to one of the localizations \"cs\" or \"sk\". Please, bear in mind that playing on this server requires at least basic ability to read and write in Czech or Slovak language.\n\n"),
F("The way to set up the client localization is as follows:\n\n"),
krok1_en,
krok2_en,
F("3. Completely restart your client (close it and start it again).\n\n"),
F("4. Try to connect to Český Hvozd again.\n\n"),
F("If you have the Language setting set correctly, but this message still appears, it is probably a server-side bug. The contact information needed to report such bug is available in Czech on the website https://ceskyhvozd.svita.cz\n"),
"]",
"button_exit[1,13;10,0.75;zavrit;Odpojit / Odpojiť / Disconnect]",
}
return table.concat(result)
end
local function invalid_locale_formspec_callback(custom_state, player, formname, fields)
if fields.quit then
minetest.disconnect_player(player:get_player_name(), "Klient je nastavený na jazyk nepodporovaný na straně serveru.")
end
end
local new_player_texts = {
{
title = "Vítejte na serveru Český hvozd!",
formspec_text = F("Český hvozd je dělnicko-kouzelnický server **pro dospělé** s československou tématikou, plně lokalizovaný do češtiny. "..
"V nabídce vlevo si zvol téma, které tě zajímá. Kliknutím na tlačítko „X“ toto okno zavřeš a vstoupíš do herního světa."..
" Později ho můžeš znovu otevřít příkazem „/novinky“ nebo tím, že se odpojíš a znovu připojíš.\n\n"..
"Při objevování světa se ti mohou hodit přemísťovací příkazy „/začátek“, „/doma“ a „/domů“ a možnost běhat rychle "..
"(pokud to neumíš, doporučuji nejdřív navštívit areál „Úvod do Luanti“). "..
"Další informace o serveru, včetně mapy herního světa a instrukcí, jak získat práva potřebná "..
"pro plnohodnotnou hru, najdeš na webu a wiki:\n\nhttps://ceskyhvozd.svita.cz\n\n"..
"Přeji příjemnou a zajímavou hru!\n-- Administrace\n"),
}, {
title = "Hraji na telefonu/tabletu...",
formspec_text = F("Důrazně doporučuji pro připojení k Českému hvozdu používat klienta na počítači (stolním nebo přenosném). "..
"Zařízení s dotykovým ovládáním jako telefony či tablety jsou určena (a vhodná) pro hraní jednoduchých her "..
"s jednoduchým ovládáním a nepropracovanou grafikou. Minetest Game na Českém hvozdu k takovým hrám nepatří.\n\n"..
"Hráči/ky hrající na chytrých telefonech a tabletech již na Českém hvozdu hlásili potíže při zadávání příkazů "..
"v četu a při ovládání dialogových oken."),
}, {
title = "Ještě mi nebylo 18...",
formspec_text = F("Pokud je vám 15 až 17, můžete se po serveru porozhlédnout, a pokud vám připadne, že si již rozumíte "..
"s dospělými a zaměření serveru je vám blízké, můžete usilovat o přijetí na server. V některých případech Administrace "..
"učiní výjimku a přijme i hráče/ku z této věkové skupiny.\n\nJe-li vám 13 nebo 14, poraďte se se svými rodiči, protože "..
"zde můžete narazit na obsah, který pro vás zatím není vhodný. Pokud vám to rodiče dovolí, můžete se na serveru porozhlédnout, "..
"ale nic víc.\n\nJe-li vám méně než 13, tato hra pro vás není vhodná. V takovém případě se, prosím, odpojte, a hledejte jinde."),
}, {
title = "Co je Český hvozd za server?",
formspec_text = F("Český hvozd je dělnicko-kouzelnický server s československou tematikou, plně lokalizovaný do češtiny, "..
"který nabízí pohodové a relativně civilizované prostředí pro dospělé české a slovenské hráče/ky "..
"a spoustu mírových činností, které zde budete moci dělat.\n\nServer spravuje Singularis "..
"prostřednictvím postavy jménem Administrace.\n\n"..
"Český hvozd byl otevřen pro veřejnost 3. prosince 2022 po zruba šesti měsících vývoje. "..
"Nikdy na něm nebylo mnoho hráčů/ek, takže hra zde většinou připomíná spíš "..
"hru v režimu jednoho hráče/ky, jen s občasným setkáním s druhým hráčem/kou.\n\n"..
"Kromě lokalizace (která ti snad umožní cítit se tu jako doma) je hlavní předností "..
"spousta technických vylepšení a úprav implementovaných speciálně pro tento server, s nimiž se během hry setkáš "..
"(např. ovládání herního četu)."),
}, {
title = "Jaká tu platí pravidla?",
formspec_text = F("Nejdůležitější pravidla lze shrnout takto:\n\n"..
"• Snaž se jít ostatním dobrým příkladem.\n\n"..
"• Snaž se, aby sis hru co nejlépe užil jak ty, tak všichni ostatní, kdo tu hrají.\n\n"..
"• Respektuj pokyny Administrace a zaměření serveru.\n\n"..
"Toto jsou nejdůležitější pravidla, která platí pro celý server. "..
"Pro jednotlivá místa a činnosti platí další pravidla, která se ovšem dozvíš postupně, např. na cedulích ve hře."),
}, {
title = "Co mám teď dělat?",
formspec_text = F("Záleží na tom, jak dobře ovládáš Luanti jako takové.\n\nPokud jsi začátečník/ice, "..
"nejlépe uděláš, když nejprve navštívíš výukový areál Úvod do Luanti (hned vedle Začátku), "..
"tam se naučíš ovládání hry a vyzkoušíš si ho, což ti ušetří spoustu potíží později. Přinejmenším by ses měl/a naučit "..
"ovládání herního četu\n\n"..
"Pokud ovládání hry zvládáš, začni průzkumem herního světa — můžeš tu cestovat (pěšky, pomocí cestovní budky, "..
"vlakem, tramvají či na kole), "..
"a pokud potkáš nějakého dalšího hráče/ku, můžeš s ní/m komunikovat. V okně inventáře si prohlédni paletu "..
"předmětů a ostatní karty (zejména Nastavení).\n\n"..
"K návštěvě určitě doporučuji Výstaviště, kde jsou vystaveny různé bloky a tvary, které lze na tomto serveru používat ke stavění. "..
"Velmi hezkým místem je také Rasterdam.\n\n"..
"Stavět, těžit, obchodovat nebo se usadit budeš moci, teprve až si zvolíš dělnický nebo kouzelnický styl hry a až "..
"Administrace tvoji postavu schválí (podrobnější informace na wiki)."),
}, {
title = "Ovládání četu (chatu)",
formspec_text = F("Okno četu otevřeš klávesou T (pro napsání jedné zprávy) nebo klávesou F10 (zůstane otevřeno do dalšího stisku F10).\n\n"..
"Normální zprávy, které do četu zadáš, uvidí převážně jen postavy v okolí 50 metrů kolem vás (a Administrace). "..
"Pokud má tvoje zpráva dojít všem hráčským postavám ve hře, musíš před ni napsat znak „!“, jedná se o takzvaný celoserverový kanál. "..
"Normální zprávy (základní kanál) slouží primárně pro komunikaci na krátkou vzdálenost.\n\n"..
"Soukromou zprávu na jinou postavu ve hře zašleš tak, že před text zprávy vložíš uvozovku a jednoznačnou předponu jména postavy. "..
"Např. zprávu Administraci (pokud je ve hře) můžeš poslat zadáním:\n\n\"Adm ahoj\n\n"..
"Pokud tebou zadaná předpona nebude jednoznačná, systém zprávu neodešle a zobrazí ti varování, takže budeš moci svoji chybu napravit.\n\n"..
"Pokud tebou zadaná zpráva začíná znakem „/“, pochopí ji server jako příkaz a tento příkaz vykoná (nebo ohlásí chybu, pokud takový příkaz nezná). "..
"Příkazy v četu slouží k vyvolání různých akcí ve hře.\n\nChceš-li napsat zprávu na postavu, která není zrovna ve hře, "..
"použij herní poštu (dostupnou příkazem „/pošta“ nebo tlačítkem v inventáři). "..
"Herní pošta má ovládání podobné jednoduchému e-mailovému klientovi."),
}, {
title = "Nefungují mi háčky a čárky, co s tím?",
formspec_text = F("Máš-li problém s psaním diakritiky, piš bez ní. Všechny příkazy, jména postav a většinou i parametry příkazů "..
"lze zadat bez diakritiky a systém si s tím poradí (tzn. např. místo /začátek stačí psát /zacatek)."),
}, {
title = "Jsou dostupné zdrojové kódy módů?",
formspec_text = F("Ano, aktuální a úplný zdrojový kód všech módů je dostupný v repozitáři:\n\nhttps://github.com/singularis-mzf/cesky-hvozd\n\n"..
"Veškerý zdrojový kód je svobodný, takže ho (v případě zájmu) můžeš v mezích svých technických dovedností využít na vlastních serverech.\n\n"..
"Server používá upravené verze módů podléhajících licenci AGPLv3 a jiným svobodným licencím."),
}, {
title = "Co slovenština?",
formspec_text = F("Slovenština je na Českém hvozdu vítána. Do slovenštiny jsou v současnosti lokalizovány pouze některé základní módy, "..
"nemám totiž nikoho, kdo by měl zájem vytvářet slovenskou lokalizaci ostatních módů. Máš-li zájem to dělat, domluv se s Administrací, "..
"je to ale spousta práce, protože na Českém hvozdu je nasazeno přes 200 módů."),
}
}
local function dump_privs(privs)
local names = {}
for k, v in pairs(privs) do
if v then
table.insert(names, k)
end
end
table.sort(names, function(a, b) return a < b end)
return "["..#names.."]("..table.concat(names, ",")..")"
end
local function get_new_player_formspec(custom_state)
local formspec = {
ch_core.formspec_header({formspec_version = 4, size = {18, 10}, auto_background = true}),
"button_exit[16.8,0.25;0.8,0.8;zavrit;X]"..
"tooltip[zavrit;zavřít]"..
"style_type[table;font=italic]"..
"tablecolumns[text]"..
"table[0.5,0.5;8,9.1;volba;",
F(new_player_texts[1].title),
}
local volba = custom_state.volba
local heading_color = minetest.get_color_escape_sequence("#00FF00")
for i = 2, #new_player_texts do
table.insert(formspec, ","..F(new_player_texts[i].title))
end
table.insert(formspec, ";"..volba.."]"..
"label[9,0.75;"..heading_color..F(new_player_texts[volba].title).."]"..
"box[8.9,1.15;8.7,8.45;#00000099]"..
"textarea[9,1.25;8.5,8.25;;;"..new_player_texts[volba].formspec_text.."\n]")
return table.concat(formspec)
end
local function new_player_formspec_callback(custom_state, player, formname, fields)
if fields.quit then return end
if fields.volba then
local event = minetest.explode_table_event(fields.volba)
if event.type == "CHG" or event.type == "DCL" then
custom_state.volba = assert(tonumber(event.row))
return get_new_player_formspec(custom_state)
end
end
end
local function on_newplayer(player)
local player_name = player:get_player_name()
minetest.log("action", "[ch_core] New player '"..player_name.."'");
ch_data.delete_offline_charinfo(player_name)
ch_data.get_joining_online_charinfo(player)
local offline_charinfo = ch_data.get_offline_charinfo(player_name)
offline_charinfo.pending_registration_type = "new"
end
local function after_joinplayer(player_name, join_timestamp)
local online_charinfo = ch_data.online_charinfo[player_name]
local player = minetest.get_player_by_name(player_name)
if player == nil or online_charinfo == nil or online_charinfo.join_timestamp ~= join_timestamp then
return
end
local controls = player:get_player_control()
if not controls.aux1 then
player:set_properties({stepheight = 0.3})
end
player:set_clouds({density = 0}) -- disable clouds
--[[
5.5.x => formspec_version = 5, protocol_version = 40
5.6.x => formspec_version = 6, protocol_version = 41
5.7.x => formspec_version = 6, protocol_version = 42
5.8.0 => formspec_version = 7, protocol_version = 43
5.9.0 => formspec_version = ?, protocol_version = ?
5.10.0 => formspec_version = 8, protocol_version = 46
]]
if online_charinfo.protocol_version < 42 and online_charinfo.protocol_version ~= 0 then
local client_version
if online_charinfo.protocol_version == 40 then
client_version = "5.5.x"
elseif online_charinfo.protocol_version == 41 then
client_version = "5.6.x"
else
client_version = "?.?.?"
end
ch_core.systemovy_kanal(player_name, minetest.get_color_escape_sequence("#cc5257").."VAROVÁNÍ: Váš klient je zastaralý! Zdá se, že používáte klienta Minetest "..client_version..", který nepodporuje některé moderní vlastnosti hry využívané na Českém hvozdu. Hra vám bude fungovat, ale některé bloky se nemusejí zobrazit správně. Pro správné zobrazení doporučujeme přejít na Minetest 5.7.0 nebo novější, máte-li tu možnost.")
end
-- Vypsat posledních 5 přihlášených registrovaných postav:
-- (přeskočit vlastní postavu a předváděcí postavy)
local last_logins = ch_core.get_last_logins(true, {[player_name] = true, Jan_Rimbaba = true, Zofia_Slivka = true})
if #last_logins > 0 then
local output = {
"INFORMACE: Registrované postavy objevivší se ve hře v poslední době: ",
}
-- local last_players = {}
for i, info in ipairs(last_logins) do
local viewname = ch_core.prihlasovaci_na_zobrazovaci(info.player_name, true)
local kdy = info.last_login_before
if kdy < 0 then
kdy = "???"
elseif kdy == 0 then
kdy = "dnes"
elseif kdy == 1 then
kdy = "včera"
else
kdy = "před "..kdy.." dny"
end
table.insert(output, ch_core.colors.light_green..viewname..ch_core.colors.white.." ("..kdy..")")
table.insert(output, ", ")
if i == 5 then break end
end
output[#output] = ""
ch_core.systemovy_kanal(player_name, table.concat(output))
end
minetest.log("action", "Player "..player_name.." after_joinplayer privs = "..dump_privs(minetest.get_player_privs(player_name)))
end
local event_types = {"public_announcement", "announcement", "custom"}
local function after_joinplayer_5min(player_name, join_timestamp)
local online_charinfo = ch_data.online_charinfo[player_name]
local offline_charinfo = ch_data.offline_charinfo[player_name] or {}
if online_charinfo == nil or online_charinfo.join_timestamp ~= join_timestamp or minetest.get_player_by_name(player_name) == nil then
return -- player probably already logged out
end
local cas = ch_time.aktualni_cas()
local dnes = cas:YYYY_MM_DD()
local last_ann_shown_date = offline_charinfo.last_ann_shown_date or "1970-01-01"
if last_ann_shown_date >= dnes then return end
local events = ch_core.get_events_for_player(player_name, event_types, 10, last_ann_shown_date)
if #events > 0 then
local output = {}
local counts_by_description = {}
for _, record in ipairs(events) do
local old_count = counts_by_description[record.description] or 0
counts_by_description[record.description] = old_count + 1
if old_count < 3 then
table.insert(output, 1, minetest.get_color_escape_sequence("#6666FF").."<"..record.description.."> ("..record.time:sub(1, 10)..") "..
minetest.get_color_escape_sequence(record.color)..record.text)
end
end
ch_core.systemovy_kanal(player_name, table.concat(output, "\n"))
end
offline_charinfo.last_ann_shown_date = dnes
ch_data.save_offline_charinfo(player_name)
end
local function on_joinplayer_pomodoro(player, player_name, online_charinfo)
local oc = ch_data.online_charinfo
local now = minetest.get_us_time()
local priv = {ch_registered_player = true}
local prev_leave_timestamp = online_charinfo.prev_leave_timestamp
if prev_leave_timestamp ~= nil and now - prev_leave_timestamp < 3600000000 then
minetest.log("warning", "on_joinplayer_pomodoro() not activated, because the player "..player_name.." has returned after "..math.floor((now - prev_leave_timestamp) / 1000000).." seconds")
return false -- relogin too early
end
if not minetest.check_player_privs(player_name, priv) then
minetest.log("warning", "on_joinplayer_pomodoro() not activated, because the player "..player_name.." is not registered")
return false -- the new player is not registered
end
for k, other_online_charinfo in pairs(oc) do
if k ~= player_name and minetest.check_player_privs(player_name, priv) then
local ap_modify_timestamp = other_online_charinfo.ap_modify_timestamp
if ap_modify_timestamp == nil or now - ap_modify_timestamp < 600000000 then
minetest.log("warning", "on_joinplayer_pomodoro() not activated, because of already online player "..k)
return false -- the new player is not alone
else
minetest.log("warning", "on_joinplayer_pomodoro() not broken, because the online player "..k.." has been inactive for "..math.floor((now - ap_modify_timestamp) / 1000000).."seconds.")
end
end
end
ch_time.herni_cas_nastavit(6, 0, 0)
return true
end
function ch_core.show_new_player_formspec(player_name)
if minetest.get_player_by_name(player_name) == nil then
return false
end
local custom_state = {volba = 1}
ch_core.show_formspec(player_name, "ch_core:uvitani", get_new_player_formspec(custom_state), new_player_formspec_callback, custom_state, {})
end
local function on_joinplayer(player, last_login)
local player_name = player:get_player_name()
local online_charinfo = ch_data.get_joining_online_charinfo(player)
local offline_charinfo = ch_data.get_offline_charinfo(player_name)
local news_role = assert(online_charinfo.news_role)
local lang_code = online_charinfo.lang_code
local protocol_version = online_charinfo.protocol_version
ch_core.add_event("joinplayer_for_admin", "{PLAYER} se připojil/a do hry (NR="..news_role..", PV="..protocol_version..")", player_name)
if news_role == "disconnect" then
minetest.disconnect_player(player_name, "Váš klient je příliš starý. "..
"Pro připojení k tomuto serveru prosím použijte Minetest/Luanti 5.9.0 nebo novější. "..
"Verze 5.7.x a 5.8.x budou fungovat, ale některé bloky nemusejí být zobrazeny správně.")
return true
elseif news_role == "invalid_name" then
minetest.disconnect_player(player_name, "Neplatné přihlašovací jméno '"..player_name.."'. Seznamte se, prosím, s pravidly serveru pro jména, nebo použijte jen písmena anglické abecedy.")
return true
end
if news_role == "invalid_locale" then
if minetest.check_player_privs(player_name, "server") then
minetest.after(0.2, function()
minetest.chat_send_player(player_name, "VAROVÁNÍ: U vašeho klienta byla detekována nepodporovaná lokalizace '"..lang_code.."'!")
end)
else
minetest.after(0.2, function()
ch_core.show_formspec(player_name, "ch_core:invalid_locale", get_invalid_locale_formspec(lang_code, protocol_version), invalid_locale_formspec_callback, {}, {})
end)
return true
end
elseif news_role == "new_player" then
minetest.after(0.2, ch_core.show_new_player_formspec, player_name)
end
player:set_nametag_attributes(ch_core.compute_player_nametag(online_charinfo, offline_charinfo))
player:hud_set_flags({minimap = false, minimap_radar = false})
-- Reset the creative priv (set for the new characters)
local privs = minetest.get_player_privs(player_name)
minetest.log("action", "Player "..player_name.." joined with privs = "..dump_privs(privs))
if privs.ch_registered_player then
if privs.creative then
privs.creative = nil
minetest.set_player_privs(player_name, privs)
minetest.log("action", "creative priv reset on join for "..player_name)
end
elseif not privs.creative then
privs.creative = true
minetest.set_player_privs(player_name, privs)
minetest.log("action", "creative priv set on join for "..player_name)
end
-- Set the inventory size
ch_core.extend_player_inventory(player_name, offline_charinfo.extended_inventory == 1)
-- Pomodoro functionality for single-players:
on_joinplayer_pomodoro(player, player_name, online_charinfo)
--
assert(online_charinfo.join_timestamp)
minetest.after(2, after_joinplayer, player_name, online_charinfo.join_timestamp)
minetest.after(5 * 60, after_joinplayer_5min, player_name, online_charinfo.join_timestamp)
return true
end
core.send_join_message = function(player_name)
local player = core.get_player_by_name(player_name)
if player == nil then
return false
end
local online_charinfo = ch_data.get_joining_online_charinfo(player)
-- local lang_code = assert(online_charinfo.lang_code)
local news_role = assert(online_charinfo.news_role)
-- local protocol_version = assert(online_charinfo.protocol_version)
if news_role ~= "disconnect" and news_role ~= "invalid_name" and news_role ~= "invalid_locale" then
ch_core.add_event(ifthenelse(news_role ~= "new_player", "joinplayer", "joinplayer_new"), nil, player_name)
end
return true
end
local function on_leaveplayer(player)
local player_name = player:get_player_name()
local privs = minetest.get_player_privs(player_name)
ch_core.add_event("leaveplayer_for_admin", nil, player_name)
if privs.ch_registered_player and privs.creative then
privs.creative = nil
minetest.set_player_privs(player_name, privs)
minetest.log("action", "creative priv reset on leave for "..player_name)
privs = minetest.get_player_privs(player_name) -- update variable
end
minetest.log("action", "Player "..player_name.." leaved with privs = "..dump_privs(privs))
end
core.send_leave_message = function(player_name, is_timedout)
local player = core.get_player_by_name(player_name)
if player == nil then
return false
end
local online_charinfo = ch_data.get_leaving_online_charinfo(player)
local news_role = assert(online_charinfo.news_role)
if news_role ~= "disconnect" and news_role ~= "invalid_name" and news_role ~= "invalid_locale" then
ch_core.add_event("leaveplayer", nil, player_name)
end
return true
end
-- AUTH logging:
local function on_authplayer(name, ip, is_success)
core.log("action", "AUTH(<"..tostring(name).."> @ <"..tostring(ip)..">) => "..ifthenelse(is_success, "true", "false"))
end
core.register_on_newplayer(on_newplayer)
core.register_on_joinplayer(on_joinplayer)
core.register_on_leaveplayer(on_leaveplayer)
core.register_on_authplayer(on_authplayer)
ch_core.close_submod("joinplayer")
|