Breslele țin jucătorii pe server: au prieteni, au un scop, au rivali. E firesc să vrei să le răsplătești activitatea, de exemplu războaiele câștigate sau un clasament săptămânal. Problema e că orice premiu automat poate fi „fabricat”: doi prieteni fac două bresle, se luptă între ele de 50 de ori și iau premiul de 50 de ori. În această lecție înveți ce oferă serverul din start, ce limite pui și cum dai un premiu săptămânal o singură dată pe breaslă.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Breaslă (guild) | Un grup permanent de jucători, cu un lider (maestru). |
| Război de breaslă (GvG) | O luptă organizată între două bresle. |
| Ladder points | Punctele breslei în clasament, schimbate de războaie. |
| Breaslă falsă (alt) | O breaslă creată doar ca să piardă intenționat. |
| Event flag | O valoare globală a serverului, setată cu game.set_event_flag. |
Pasul 1: Ce oferă serverul din start
În pachetul verificat există deja câteva lucruri:
- Războaie de breaslă cu puncte de clasament (ladder). În sursa verificată, o breaslă poate porni un război doar dacă are ladder points peste 0 și cel puțin 8 membri.
- Pariuri pe războaie, prin
guild_war_bet.quest, la NPC-urile observatoare. - Questuri de administrare: creare, nivel, schimbarea maestrului (
guild_create.quest,guild_manage.quest,change_guild_master.quest), plus clădirile breslei.
Un detaliu important găsit în sursă: pe serverul de test sau dacă event flag-ul guild_war_test e diferit de 0, verificarea de 8 membri nu se mai face. E util la teste, dar dacă îl lași activ pe serverul real, oricine poate porni războaie cu bresle de 1–2 membri. Verifică-l înainte de lansare.
Pasul 2: Unde apar abuzurile
| Abuzul | Cum arată | Cum îl limitezi |
|---|---|---|
| Războaie aranjate | Aceleași două bresle se luptă de zeci de ori | Premiu doar pentru primul război cu același adversar pe zi |
| Bresle false | O breaslă cu 1–2 membri creată ca să piardă | Număr minim de membri și nivel minim al breslei |
| Schimbarea maestrului | Premiul „pe maestru” se ia din nou după schimbare | Limita se ține pe breaslă, nu pe maestru |
| Yang nelimitat | Fiecare victorie dă yang | Premii mici, limitate pe săptămână, de preferat nevandabile |
| Membri mutați | Jucătorii trec dintr-o breaslă în alta după premiu | Condiții de vechime sau premii pe breaslă, nu pe jucător |
Regula de bază, ca la toate premiile: un premiu trebuie să coste mai mult efort decât valorează la vânzare. Altfel cineva găsește o cale să-l fabrice.
Pasul 3: Un premiu săptămânal, o dată pe breaslă
Exemplul de mai jos permite maestrului breslei să ia un premiu o dată pe săptămână, dacă breasla are un nivel minim. Limita se ține pe breaslă, nu pe personaj, așa că nici schimbarea maestrului nu o ocolește.
when NPC_BRESLE.chat."Premiul saptamanal al breslei" with pc.has_guild() and pc.is_guild_master() begin
local id = pc.get_guild()
local sapt = math.floor(get_global_time() / 604800)
local cheie = "gpremiu_" .. id
if guild.level(id) < 5 then
say("Breasla ta trebuie sa aiba cel putin nivelul 5.")
return
end
if game.get_event_flag(cheie) == sapt then
say("Breasla ta si-a luat deja premiul in aceasta saptamana.")
return
end
if not pc.enough_inventory(PREMIU) then
say("Fa loc in inventar si revino.")
return
end
game.set_event_flag(cheie, sapt)
pc.give_item2(PREMIU, 1)
say("Premiul breslei " .. guild.name(id) .. " a fost acordat.")
end| Bucată | Ce face, pe românește |
|---|---|
with pc.has_guild() and pc.is_guild_master() | Opțiunea apare doar pentru maeștrii de breaslă. |
pc.get_guild() | Numărul unic al breslei. |
math.floor(get_global_time() / 604800) | Numărul săptămânii (o săptămână are 604800 de secunde). |
"gpremiu_" .. id | O cheie separată pentru fiecare breaslă, de exemplu gpremiu_12. |
guild.level(id) < 5 | Breslele foarte mici sau noi nu primesc premiul. |
game.get_event_flag(cheie) == sapt | Breasla a luat deja în această săptămână? |
game.set_event_flag(cheie, sapt) | Notăm înainte să dăm premiul. |
guild.name(id) | Numele breslei, pentru mesaj. |
Toate funcțiile de mai sus există în quest_functions din pachetul verificat și sunt folosite și de questurile de breaslă originale.
Două lucruri de știut despre event flag-uri
- Se salvează global și ajung cu o mică întârziere. Valoarea scrisă cu
game.set_event_flagtrece prin procesuldbși ajunge la toate core-urile după o clipă. Două cereri făcute exact în același moment, pe core-uri diferite, ar putea trece amândouă. Pentru un premiu săptămânal mic, riscul e mic; pentru premii mari, păstrează NPC-ul pe un singur core și verifică logurile. - Fiecare breaslă adaugă un event flag. La câteva sute de bresle e în regulă. Nu folosi modelul acesta pentru lucruri care se repetă la fiecare jucător.
Pentru limite pe jucător (de exemplu „fiecare membru ia o dată pe săptămână”), folosește pc.setqf, ca în lecția despre cooldown. Nu scrie semne în when login: există un bug cunoscut al motorului care poate strica datele questurilor.
Pasul 4: Premii pentru războaie
Un premiu automat la fiecare victorie e greu de făcut sigur doar din quest. Variante mai sigure pentru început:
- Clasament săptămânal pe ladder points, cu premii date manual de echipă, după verificarea logurilor.
- Turnee anunțate, cu reguli scrise: număr minim de membri, adversari diferiți, ore fixe.
- Premii de prestigiu (titluri, costume, anunțuri) în loc de yang sau materiale vandabile.
Dacă vrei totuși premii automate pe victorie, limita trebuie să țină cont de adversar și de numărul de victorii pe zi. Asta înseamnă de obicei modificări în sursa C++, testate serios. Vezi intrările și ieșirile de yang ca să nu creezi o sursă nouă de inflație.
Ce ar trebui să vezi: maestrul ia premiul o dată pe săptămână; după schimbarea maestrului, noul maestru vede mesajul „deja luat”; o breaslă sub nivelul cerut primește refuz.
Cum testezi
Pe serverul de test:
- Creează două bresle cu personaje de test și ia premiul cu maestrul primei bresle.
- Încearcă din nou: trebuie să primești refuz.
- Schimbă maestrul și încearcă cu noul maestru: tot refuz.
- Încearcă cu o breaslă sub nivelul 5.
- Pentru teste de săptămână nouă, schimbă temporar
604800cu o valoare mică (de exemplu300), apoi revino. - Verifică event flag-ul
guild_war_testînainte de lansare.
Greșeli des întâlnite
- Premiu pe maestru, nu pe breaslă. Se ia din nou după schimbarea maestrului.
- Yang pentru fiecare victorie. Războaie aranjate și inflație.
- Fără număr minim de membri sau nivel. Breslele false iau premii.
guild_war_testlăsat activ. Războaie cu bresle foarte mici.- Reguli nescrise. Jucătorii nu știu ce e permis, iar tu nu poți sancționa corect.
Întrebări frecvente
Pot da premiul tuturor membrilor breslei deodată?
Din quest, în pachetul verificat, nu există o funcție simplă care să parcurgă toți membrii breslei. Mai simplu: fiecare membru își ia singur premiul de la NPC, cu limită pe personaj și condiția să fie în breaslă.
Ce premiu e potrivit pentru bresle?
Lucruri de prestigiu sau utile breslei, nu bani. Un premiu mic, constant și greu de vândut ține breslele active fără să strice economia.
Cum aflu numele unei bresle după ID?
Cu guild.name(id), ca în exemplu.
Ce urmează
Ai terminat capitolul despre dungeon-uri, world boss și bresle. În capitolul următor, despre operarea zilnică, începi cu restaurarea unui backup pe serverul de test.
Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.