[Py] Advanced Color Engine - Selector Culori Personalizate pentru Metin2 *Descriere:
Advanced Color Engine - Selector Culori Personalizate pentru Metin2
Salut. Las aici gratuit un sistem separat pentru client Metin2: culoripersonalizate.py, un Color Picker avansat gandit pentru cei care s-au saturat sa ghiceasca RGB, ARGB, HEX sau alte coduri de culoare.
Acest sistem nu este dependent de un panel anume. Este gandit ca motor separat si poate fi integrat oriunde: Python root, panel GM, panel admin, editor UI, sisteme pe surse, tag-uri, rank-uri, titluri, nume speciale, badge-uri, shop-uri custom sau orice sistem care are nevoie de o culoare precisa. De ce exista:
Problema e simpla: in multe sisteme vezi doar coduri si trebuie sa ghicesti culoarea. Pentru un developer/admin asta inseamna timp pierdut. Cauti pe net, convertesti, testezi in client, refaci si iar verifici. Advanced Color Engine muta tot procesul direct in client: vezi culoarea, o modifici, primesti codurile si aplici rezultatul. Ce stie sa faca:
- preview live al culorii;
- slidere pentru H / A / S / V;
- conversii intre HEX, CHAT, ARGB, RGB, HSV, HSL, CMYK si DEC;
- input manual pentru mai multe formate;
- copy pentru codul selectat;
- nume semantic pentru culoare;
- callback final cu valoarea ca int ARGB: 0xAARRGGBB;
- mod diferit pentru GM si player;
- integrare usoara in alte sisteme. Despre AI si partea mea:
Sintaxa a fost scrisa cu ajutor AI. Dar conceptul, logica, directia, intrebarile, testarea, limitarile si felul in care trebuia sa functioneze sistemul au fost gandite de mine.
Nu am pornit ca expert de sintaxa. Am pornit de la butoane simple, comenzi banale si UI-uri mici, apoi am inceput sa inteleg cum se leaga un sistem real: stare interna, evenimente, callback-uri, validari, input live, conversii si comportament vizual. AI-ul este o unealta foarte buna daca stii ce vrei si daca verifici ce iti da. Fisiere principale:
Code:
root/culoripersonalizate.py
root/boogieclasses.py
Din boogieclasses.py este necesara clasa:
Code:
BoardNouBoogie
Aceasta este baza vizuala a ferestrei. Clarificare despre slidere:
Sliderele Color Picker-ului sunt definite direct in culoripersonalizate.py:
Code:
class BoogieSlider(ui.Window)
Deci pentru acest release aveti:
- BoardNouBoogie din boogieclasses.py pentru fereastra;
- BoogieSlider din culoripersonalizate.py pentru sliderele de culoare. Foldere si imagini necesare:
1. Color Picker:
import culoripersonalizate
def OpenColorTool(self):
self.colorTool = culoripersonalizate.ColorPickerPopup(
0xFFFFFFFF,
"Test Culoare",
self.OnColorSelected
)
self.colorTool.SetPosition(300, 200)
self.colorTool.SetTop()
self.colorTool.Show()
def OnColorSelected(self, color):
# color este int ARGB: 0xAARRGGBB
pass
Unde poate fi adaptat:
- panel GM/admin;
- titluri si tag-uri;
- rank-uri;
- nume colorate;
- badge-uri;
- shop-uri custom;
- editor UI;
- configuratoare;
- sisteme pe surse;
- orice sistem care primeste o culoare ARGB. Ce poate fi imbunatatit:
Sistemul este functional si bun ca baza, dar nu il prezint ca perfect.
Zone unde se poate lucra:
- input live poate fi sincronizat mai strict;
- unele valori scrise manual pot muta sliderul, dar nu actualizeaza perfect preview-ul/numele/toate output-urile;
- validarile HSV/HSL/CMYK pot fi facute mai stricte;
- clipboard-ul poate fi abstractizat;
- se pot adauga palete favorite;
- se poate face salvare/import/export de culori;
- se poate integra direct in surse.
Am vazut aceste zone. Nu sunt acolo pentru ca nu au fost observate. Sunt lasate si ca punct de lucru pentru cei care vor sa invete si sa duca mai departe arhitectura.
Daca esti developer si vrei sa integrezi sistemul corect, aici este explicatia mai adanca. Nu este doar un UI cu niste poze. Este un mic motor de conversie, sincronizare si state-machine construit peste UI-ul Metin2. 1. Iluzionismul matematic
Code:
Translate_Slider_To_Real
Translate_Real_To_Slider
Problema: daca playerul duce saturatia sau valoarea prea jos, poate ajunge la culori moarte, foarte inchise sau aproape inutile. Daca ii tai sliderul vizual la 80%, arata urat si pare limitare fortata.
Solutia: sliderul poate arata 0%-100%, dar motorul intern poate lucra cu 71%-100%. Cand playerul vede 0%, motorul primeste 0.71. Cand motorul are 0.71, sliderul poate fi afisat inapoi ca 0%. Pentru GM, translatia dispare si valorile sunt brute.
Asta pastreaza UX-ul curat, dar protejeaza rezultatul final. 2. Kernelul matematic multi-space
Aceste functii sunt nucleul conversiilor. Sliderele lucreaza natural in zona HSV/HASV, dar developerul are nevoie de RGB, ARGB, HEX, HSL, CMYK, DEC si cod chat.
Conversiile sunt facute direct in fisier, fara dependinte externe. Asta da control asupra formulelor si evita dependente inutile intr-un client Metin2.
Valorile mici conteaza. In multe convertoare online, 0.699999 devine simplu 0.7. Aici ideea a fost sa pastrez cat mai mult din precizie, mai ales cand lucrezi cu alpha, saturatie si luminozitate. 3. Triple-Sync / State-Machine
Aici este partea sensibila. Sliderul schimba input-ul. Input-ul poate schimba sliderul. Ambele trebuie sa schimbe preview-ul si codurile. Daca nu controlezi fluxul, faci bucla infinita sau UI care se rescrie singur aiurea.
Piesa principala:
Code:
self.sync_lock
sync_lock este paznicul. Cand sistemul actualizeaza ceva programatic, lock-ul opreste update-urile inverse nedorite. Fara el, un slider ar putea declansa input-ul, input-ul ar declansa iar sliderul si tot asa.
Memoria pentru input:
Code:
self.last_manual_text
Aceasta tine ultima valoare cunoscuta. Ajuta la curatarea input-ului si la evitarea rescrierilor agresive cand utilizatorul tasteaza. 4. Input Live si zona ramasa de optimizat
Input Live este partea cea mai interesanta si cea mai sensibila. Daca scrii manual valori, uneori sliderul se misca unde trebuie, dar restul sistemului nu se sincronizeaza perfect: preview-ul, numele culorii sau unele output-uri pot ramane in urma.
Fluxul de verificat:
Cine vrea sa polish-uiasca sistemul trebuie sa faca acest traseu complet atomic: orice input valid trebuie sa actualizeze sliderul, temp_color, preview-ul, numele culorii, toate formatele si callback-ul final. 5. Semantic Mapping Engine
Code:
__GetDynamicColorName(h, s, v, a)
In loc sa folosesc un dictionar urias de HEX -> nume culoare, sistemul genereaza numele algoritmic.
Logica:
- intai verifica alpha;
- apoi verifica negru/alb/gri;
- apoi transforma hue-ul in grade 0-360;
- alege familia de culoare;
- aplica modificatori dupa saturatie si valoare;
- adauga intensitate;
- trateaza cazuri speciale: aur, bronz, cupru, midnight etc.
Rezultatul este un nume descriptiv, de exemplu:
Code:
Turcoaz-Acvatic Fluorescent Orbitor
6. BoogieSlider
Code:
class BoogieSlider(ui.Window)
Nu foloseste sliderul clasic Ymir. Este un slider custom cu:
- bara vizuala;
- DragButton;
- restrictie pe axa X;
- calcul pixel -> procent;
- callback la miscare;
- reparatie pentru hover si release.
Butonul are zona de miscare calculata pe bara de 281px, iar valoarea finala este normalizata intre 0.0 si 1.0. 7. FormatHitBox si selectia formatului
Code:
class FormatHitBox(ui.Window)
TextLine-urile din Metin2 nu sunt gandite ca zone interactive complete. FormatHitBox rezolva asta printr-un strat clickabil peste text. Astfel poti selecta formatul dorit pentru copiere. 8. Clipboard-ul
Code:
__OnClickHeaderCopy
Metin2 nu ofera elegant copy-to-clipboard pentru orice TextLine. Solutia folosita:
Code:
cmd /c <nul set /p "=TEXT" | clip
Se porneste procesul prin:
Code:
_subprocess.CreateProcess
si exista fallback:
Code:
os.popen
Este gandit pentru Windows, adica mediul clasic al clientului Metin2. 9. Structura datelor interne
Acesta este contractul public. Daca vrei sa folosesti sistemul, nu trebuie sa intelegi tot internul din prima. Trebuie doar sa ii dai:
- culoare initiala;
- nume pentru titlu;
- functie callback.
La final primesti:
Code:
color = 0xAARRGGBB
Concluzie pentru developeri
Acest fisier este mai mult decat un Color Picker. Este un exemplu de UI state-machine in client Metin2, cu conversii matematice, input live, protectie la recursion loop, clipboard, hitbox-uri si mapping semantic al culorilor.
Il puteti folosi direct sau il puteti rupe in bucati: motorul matematic separat, sliderul separat, mapping-ul de nume separat, logica de copy separat.
Nu este doar copy-paste
Daca esti incepator, poti invata mult din el. Dar trebuie sa citesti, sa testezi si sa intelegi fluxul. Nu este doar un UI banal. Sunt formule, conversii, stare interna, focus lock, callback, input live, slidere, mapping pentru player si GM, plus generare dinamica de nume pentru culori. *Poze / Video (obligatoriu):
*Link scanare VirusTotal (obligatoriu): Scanare VirusTotal
Pentru scanare: uploadati arhiva finala pe: https://www.virustotal.com/gui/home/upload
Daca modificati arhiva dupa scanare, refaceti scanarea. Credit:
Concept, logica, idee, testare, directie si decizii: Vaduva Liviu Bogdan / Boogie / L3oogie.
Sintaxa Python/UI: realizata cu ajutor AI, dar condusa dupa logica mea si dupa probleme reale vazute in client.