Guida [RELEASE] Settare Drop via Mysql Table (invece degli odiosi txt bugganti)

Ikarus_

Utente Emerald
8 Settembre 2012
1,050
23
584
446
Ultima modifica:
Il titolo penso dica già tutto.
Il System permette di settare il drop dei mob dal database invece di usare mob_drop_item.txt, common_drop_item.txt, drop_item_group.txt che se sbagli di uno spazio ti legge solo mezzo file e non ti da nemmeno una traccia di errore per farti sapere che non è stato settato il drop come intendevi fare tu (ymir fail).

WARNING : Il System non disattiva i file txt, potete usare quindi mezzo e mezzo, o solo txt o solo tabelle.

Per tutti coloro i quali hanno ancora dubbi sull'utilità di avere un database invece dei txt, vi voglio far notare qualche vantaggio:
- Possibilità di eseguire queries per vedere cosa un mob droppa/gruppo droppa chiaramente e in pochi instanti.
- Possibilità di sfruttare le tabelle da un sito ad esempio per visualizzare (ad esempio in una wiki) cosa un mob droppa o da che mob puoi droppare un item.
- Possibilità di eseguire il backup del drop insieme ai backup del database.
- Oltre a vantaggi, una cosa da considerare è che non ha svantaggi.



Ho inserito per comodità il comando "/reload d" che vi permette di ricaricare le tabelle drop senza riavviare il gioco.
Le tabelle sono organizzate cosi:

-drop_common : semplice assegnazione di drop al rank del mob con startlevel e endlevel di drop dell'item (come il common_drop.txt)
-drop_default : semplice assegnazione di drop al vnum del mob con drop_pct (possibilità di drop) e item count.

-drop_mob_group_kill : in questa tabella vanno specificati i "group" di item droppabili da un mob (la struttura è "group_id(key) | mob_vnum | kill_per_drop")
come succede per il mob_drop_item.txt la chance di drop è calcolata in modo inversamente proporzionale al kill_per_drop (aumentare questo numero riduce il drop)
e in caso di drop con successo verrà estratto solo 1 item dal gruppo di item (la % di estrazione di un item rispetto a un altro è spiegata in seguito)

-drop_mob_item_kill : in questa tabella vanno specificati gli item da aggiungere ai group creati nella precedente tabella (la struttura è `group_id`, `item_vnum` , `count`, `part_prob`)
il group id dovrà essere stato dichiarato nella precedente tabella e part_prob invece è un numero che incide sull'estrazioni dell item dal group in caso di drop con successo.
supponiamo di avere due item in questa tabella con lo stesso group id (appartenenti allo stesso gruppo quindi) e con part_prob rispettivamente 100 e 200
l'item con part prob 100 ha 1/3 di chance di essere estratto, mentre l'altro ha 2/3 di chance.


-drop_mob_group_level: in questa tabella vanno specificati i "group" di item droppabili da un mob se il player appartiene a un certo range di livello (struttura : `group_id` , `mob_vnum` , `level_start` , `level_end`)
se il player killerà un mob avete un group in questa tabella e il range sarà rispettato dal livello del player allora inizierà un sorteggio per ogni item del group ( ogni item ha la sua chance di drop per tanto, non è estratto solo uno dal group come per le kill)

-drop_mob_item_level: in questa tabella vanno specificati i gli item che appartengono ai group specificati nella precedente tabella (struttura : `group_id`, `item_vnum` , `count`, `prob` FROM `drop_mob_item_level`)
ogni item ha quindi qui specificato il suo "prob" che a differenza delle tabelle kill, verranno checkati per ogni item del group (quindi questo gruppo può droppare più item per kill)




Per chi ha già un mob_drop_item.txt settato e un common_drop_item.txt settato ho in scrittura un tool che li converte in tabelle (si può anche scegliere di lasciarli in txt anyway)
Nei prossimi giorni lo aggiungerò alla release aggiornando il post.

Ultima cosa da sapere è che nelle tabelle quando si parla di prob si intende chance 1/1000. (la chance di drop viene però aumentata o diminuita in base alla differenza di livello tra player e mob nell'algoritmo di drop di ymir quindi non è fissa come voi la inserite in tabella)

questa scala si può cambiare (passando ad esempio a una scala di 1/10000 o 1/100) dal lenght.h cambiando il valore di DROP_SCALE_TABLE
Di default quindi usando 1000 in tabella si ha la chance base (poi variata nell algoritmo come precedentemente detto) di 100% di drop


SVILUPPI FUTURI:
- Ho in mente di fare un drop.bin da mettere in root, ricavato dalle tabelle che potrà essere utile a fare ad esempio una wiki sul drop in game (senza pesare sul server visto che cosi le info saranno front-end)
- Ho in mente di fare un target drop info basato su queste tabelle, che userà il file drop.bin di cui sopra per indicare nel target del mob i suoi drop.
- Ho in mente di fare un tool che facilità l'aggiunta di group di item nelle tabelle kill/level



Il System è stato testato ma in caso di bug vi prego di segnalarle sotto la discussione e non in privato, cosi che tutti gli utenti possano venire a conoscenza del bug.

Ecco qui il LINK alla repository su gitlab.
MySkype : live:ikarus.developer


update:
Added a small part to install only if you are using __SEND_TARGET_INFO__ to show the drop in the target board
 
Il titolo penso dica già tutto.
Il System permette di settare il drop dei mob dal database invece di usare mob_drop_item.txt, common_drop_item.txt, drop_item_group.txt che se sbagli di uno spazio ti legge solo mezzo file e non ti da nemmeno una traccia di errore per farti sapere che non è stato settato il drop come intendevi fare tu (ymir fail).

WARNING : Il System non disattiva i file txt, potete usare quindi mezzo e mezzo, o solo txt o solo tabelle.

Per tutti coloro i quali hanno ancora dubbi sull'utilità di avere un database invece dei txt, vi voglio far notare qualche vantaggio:
- Possibilità di eseguire queries per vedere cosa un mob droppa/gruppo droppa chiaramente e in pochi instanti.
- Possibilità di sfruttare le tabelle da un sito ad esempio per visualizzare (ad esempio in una wiki) cosa un mob droppa o da che mob puoi droppare un item.
- Possibilità di eseguire il backup del drop insieme ai backup del database.
- Oltre a vantaggi, una cosa da considerare è che non ha svantaggi.



Ho inserito per comodità il comando "/reload d" che vi permette di ricaricare le tabelle drop senza riavviare il gioco.
Le tabelle sono organizzate cosi:

-drop_common : semplice assegnazione di drop al rank del mob con startlevel e endlevel di drop dell'item (come il common_drop.txt)
-drop_default : semplice assegnazione di drop al vnum del mob con drop_pct (possibilità di drop) e item count.

-drop_mob_group_kill : in questa tabella vanno specificati i "group" di item droppabili da un mob (la struttura è "group_id(key) | mob_vnum | kill_per_drop")
come succede per il mob_drop_item.txt la chance di drop è calcolata in modo inversamente proporzionale al kill_per_drop (aumentare questo numero riduce il drop)
e in caso di drop con successo verrà estratto solo 1 item dal gruppo di item (la % di estrazione di un item rispetto a un altro è spiegata in seguito)

-drop_mob_item_kill : in questa tabella vanno specificati gli item da aggiungere ai group creati nella precedente tabella (la struttura è `group_id`, `item_vnum` , `count`, `part_prob`)
il group id dovrà essere stato dichiarato nella precedente tabella e part_prob invece è un numero che incide sull'estrazioni dell item dal group in caso di drop con successo.
supponiamo di avere due item in questa tabella con lo stesso group id (appartenenti allo stesso gruppo quindi) e con part_prob rispettivamente 100 e 200
l'item con part prob 100 ha 1/3 di chance di essere estratto, mentre l'altro ha 2/3 di chance.


-drop_mob_group_level: in questa tabella vanno specificati i "group" di item droppabili da un mob se il player appartiene a un certo range di livello (struttura : `group_id` , `mob_vnum` , `level_start` , `level_end`)
se il player killerà un mob avete un group in questa tabella e il range sarà rispettato dal livello del player allora inizierà un sorteggio per ogni item del group ( ogni item ha la sua chance di drop per tanto, non è estratto solo uno dal group come per le kill)

-drop_mob_item_level: in questa tabella vanno specificati i gli item che appartengono ai group specificati nella precedente tabella (struttura : `group_id`, `item_vnum` , `count`, `prob` FROM `drop_mob_item_level`)
ogni item ha quindi qui specificato il suo "prob" che a differenza delle tabelle kill, verranno checkati per ogni item del group (quindi questo gruppo può droppare più item per kill)




Per chi ha già un mob_drop_item.txt settato e un common_drop_item.txt settato ho in scrittura un tool che li converte in tabelle (si può anche scegliere di lasciarli in txt anyway)
Nei prossimi giorni lo aggiungerò alla release aggiornando il post.

Ultima cosa da sapere è che nelle tabelle quando si parla di prob si intende chance 1/1000. (la chance di drop viene però aumentata o diminuita in base alla differenza di livello tra player e mob nell'algoritmo di drop di ymir quindi non è fissa come voi la inserite in tabella)

questa scala si può cambiare (passando ad esempio a una scala di 1/10000 o 1/100) dal lenght.h cambiando il valore di DROP_SCALE_TABLE
Di default quindi usando 1000 in tabella si ha la chance base (poi variata nell algoritmo come precedentemente detto) di 100% di drop


SVILUPPI FUTURI:
- Ho in mente di fare un drop.bin da mettere in root, ricavato dalle tabelle che potrà essere utile a fare ad esempio una wiki sul drop in game (senza pesare sul server visto che cosi le info saranno front-end)
- Ho in mente di fare un target drop info basato su queste tabelle, che userà il file drop.bin di cui sopra per indicare nel target del mob i suoi drop.
- Ho in mente di fare un tool che facilità l'aggiunta di group di item nelle tabelle kill/level



Il System è stato testato ma in caso di bug vi prego di segnalarle sotto la discussione e non in privato, cosi che tutti gli utenti possano venire a conoscenza del bug.

Ecco qui il LINK alla repository su gitlab.
Messaggio unito automaticamente:



MySkype : live:ikarus.developer


Top sempre sempre, Grazie Ikarus
 
Visto che in molti si sono lamentati dell'incompatibilità con il system "__SEND_TARGET_INFO__" che vi mostra il drop del mob nella target board
ho scritto il codice per renderlo compatibile, ora anche il drop delle tabelle viene visualizzato nella targetboard.
Come scritto nel post principale, farò una versione del __SEND_TARGET_INFO__ basato sulle tabelle che sarà decisamente meno schifosa di quella che usate tutti attualmente che fi frizza il gioco quando vi manda 50 pacchetti tutti contenenti ogni volta info di troppo ahah
La mia versione inserirà le info in root cosi che non dobbiate affatto richiedere info al game server.
Per ora accontentatevi dell'adeguamento

Trovate il codice da installare nella cartella Send Target Info
Si tratta solo di aggiungere e non di modificare.
 
Per chi non avesse dimestichezza con i classici files di drop questo è un ottimo sistema che velocizza di gran lunga il lavoro.
Non l'ho testato, ma leggendo il codice della cartella dell'adattamento del SendTarget credo tu abbia dimenticato di inserire il file per la dichiarazione della funzione MakeDropInfoItems.

Per il resto sembra ottimo
 
  • Mi piace
Reazioni: Saybe2 e Aioriax
Per chi non avesse dimestichezza con i classici files di drop questo è un ottimo sistema che velocizza di gran lunga il lavoro.
Non l'ho testato, ma leggendo il codice della cartella dell'adattamento del SendTarget credo tu abbia dimenticato di inserire il file per la dichiarazione della funzione MakeDropInfoItems.

Per il resto sembra ottimo
Controlleró e eventualmente aggiungeró l header.
Devo anche correggere un bug riguardo al reload che avviene solo nel core in cui si lancia il comando ma più tardi pusho il fix (che sarà di poche righe)

Inviato dal mio LG-H870 utilizzando Tapatalk
 
  • Mi piace
Reazioni: Aioriax
Riguardo al bug del reload, falso allarme, chi mi ha riportato il bug si sbagliava.
Quindi al momento il system ha 0 bugs e nulla da correggere.

Inviato dal mio LG-H870 utilizzando Tapatalk
 
  • Mi piace
Reazioni: Aioriax
Riguardo al converter, la conversione del common_drop_item.txt è già coddata (il tool è già nella repository)
Se qualcuno trova problemi con la conversione, è importante sapere che il tool non supporta il nome dell'item al posto del vnum, e che se ci sono errori di sintassi (nel senso che avete sbagliato a mettere i tab) il tool si ferma (ovviamente segnala l'errore) e probabilmente l'errore provocava nella lettura del common_drop_item.txt lo skip del file da quel punto in poi (senza alcuna segnalazione, perchè a ymir piace cosi)
 
WARNING:
Siccome in altre piattaforme qualcuno ha provato a dire fesserie su come il system funziona, meglio chiarire qualche concetto.
Il system carica le tabelle in cache (db core) sul booting (senza più interagire con le tabelle) e quando un nuovo core esegue a sua volta il booting il db gli manda ad esso stesso le informazioni prendendole appunto dalla sua cache.
Il game core a questo punto a sua volta fa una sua cache, ottimizzata ovviamente per la ricerca dei vari drop tramite il vnum dei mob e il rank, a seconda del tipo di drop e ne conserva le informazioni.
Ne db core ne game cores toccano più la tabella.
Tranne ovviamente se non si lancia il reload d , in quel caso le vecchie cache vengono eliminate dalla memoria e la cache viene ricostruita in tutti i cores cosi come fatto sul boot (usa anche le stesse funzioni identiche del boot che sono costruite in un ottica di un possibile reload appunto).
 
Aggiunto nella repository di gitlab anche il codice sorgente del tool converter, per convertire common_drop e mob_drop_item in tabella
(se convertite i file in tabella, dopo averli backuppati dovete svuotarli visto che il system non disabilita i txt e in questo modo avreste il drop settato sia in tabella che nei txt)
 
  • Mi piace
Reazioni: FuffyMiao
Ciao Ikarus.

Ho installato il system avendo avuto un po' di tempo, sembrava essere tutto funzionante... Il tutto compilato senza problemi.

Ho avuto un problemino solamente all'inserimento della Tabella(e) 'drop.mysql' sul mio Database, un piccolo errore legato alla codifica dei caratteri che, oltretutto, non escludo possa essere padre del problema che tra poco ti dirò. Anche se non sono molto sicuro di questo, ho dovuto cambiare il tipo di codifica e non essendo esperto di MySql ecc.. ho cercato un po' sul web, insomma alla fine ho messo 'latin1' eliminando tutto ciò che segue la stringa ""ENGINE = InnoDB CHARACTER SET = latin1;" ..


Ora il System funziona. Mi sono assicurato d'aver cancellato i contenuti dei varie file .txt di drop predefiniti.
Quando metto per esempio in 'Defoult_Drop' ' 591 30086 1 1000' mi aspetto che il 'Comandante Brutale' droppi al 100% il Ricordo del Demone+.
Ciò non accade, ma non solo su un solo mob... Ho provato a killarne veramente tanti, cambiando i livelli del personaggio ecc. per esser sicuro di aver provato un po' tutto
anche se -a rigor di logica- non era necessario.

Non so come funziona bene il sistema della cache...
Se io appunto come dicevo ho inserito il value '30086' e poi lo modifico (sulla stessa stringa oppure eliminandolo) in per esempio value '189',
il comandante brutale tramite l'info drop system (ho seguito i passaggi dentro la cartella apposita per il system) segna sia il 'Ricordo del Demone+' che 'Spada Velenosa+9'.
Se riavvio il server, ciò persiste, se riavvio il client il drop si aggiorna. Ora non so bene come tu volessi far funzionare questo sistema di cache, vorrei esser certo solamente
del fatto che almeno fin qui, tutto vada come deve andare.

Il punto critico rimane che non c'è modo di droppare item.
Ho provato la percentuale svariando tra i valori 100>1000>10000(inutile in quanto ho letto che la scala di drop era appunto 1K)



Io credo che il problema possa nascere anche dal Database, e di quelle maledette tabelle che ho dovuto modificare io.
Non ho capito perché Navicat non me le importasse.
Ps: Ho tentato anche con HeidiSql pensando fosse un problema di compatibilità caratteri del Software, ovviamente non ho risolto.

Se vuoi contattarmi in privato, in modo da risolvere più in fretta, ovviamente pubblicherò qui la soluzione.

Skype: nexus96ita
Discord: NeXuS0248#3368
 
Riguardo a quello che vedi nel info target, non dipende da me.
È quel system che è un pó patacca.
Tuttavia non credo che il drop sia molto modificato quindi il fatto che bisogna riavviare il client per vederlo aggiornato di per se non è un grosso problema.
Tuttavia specifico che il fatto di vederlo non aggiornato avviene anche con i txt normali perché l infodrop funziona cosi.
Riguardo al drop che non va l utente aveva sbagliato ad installare la parte item_manager.cpp confondendo le due funzioni molto simili ( quella di ymir normale e quella del send target system)
 
Intanto grazie per la condivisione, System utilissimo.

Tempo fa' su Metin2dev c'era una guida per risolvere alcuni problemi riguardanti la stabilità e l'impiego di risorse da parte del SEND_TARGET_INFO. Ti chiedo se questa estensione, è compatibile con quelle modifiche e\o sono già presenti, visto che hai esteso il sistema all'utilizzo del suddetto.

Grazie!
 
Intanto grazie per la condivisione, System utilissimo.

Tempo fa' su Metin2dev c'era una guida per risolvere alcuni problemi riguardanti la stabilità e l'impiego di risorse da parte del SEND_TARGET_INFO. Ti chiedo se questa estensione, è compatibile con quelle modifiche e\o sono già presenti, visto che hai esteso il sistema all'utilizzo del suddetto.

Grazie!
Dovrebbe essere compatibile