[GDRCD 5.3] Limite PX giornalieri
31/03/2017 14:33:25
Hai anche provato a correggere aggiungendo i ; a fine riga qui:
$exp_bonus = 1
dove me li sono dimenticati?
31/03/2017 16:00:57
dyrr ha scritto: Hai anche provato a correggere aggiungendo i ; a fine riga qui:
$exp_bonus = 1
dove me li sono dimenticati?
Sisi....non fa :(
01/04/2017 04:22:46 e modificato da irenes il 03/04/2017 11:24:08
Allora, ho risolto il primo problema.
con questo codice:
if($msg_length >= $char_needed) {
$exp_bonus = 1; } else { $exp_bonus = 0; }
il sistema fa sì che ad un pg si aggiunga 1 px ad ogni azione che raggiunga i caratteri richiesti in config.
Ora però, con questa modifica, non mi funziona il codice di dyrr per il tetto massimo dell'exp.
Ho il forte sospetto che il problema sia qui
$exp_giornaliera = $exp_giornaliera + ($row['msg_lenght']/$char_needed);
e nello specifico nella parte in grassetto, considerato che io, quella formula, non ce l'ho più nel codice. Postando il codice di dyrr mi aggiunge un solo px e poi... basta (il cap è più alto, ovviamente)
03/04/2017 10:52:19 e modificato da rematore il 03/04/2017 10:54:25
Ciao,
per il problema della max_exp io ho pensato di risolverlo attraverso l'uso di una query da eseguire prima dell'invio dei messaggi che richiedono l'upgrade dell'exp.
Più precisamente, stabilisci il numero minimo di caratteri, il tetto massimo di exp assegnabile ad ogni intervallo (nell'esempio considero giorni) quindi una volta eseguita la query verifichi il valore del campo limite_superato.
--
Funzionamento
Prima di tutto verifico se ho raggiunto il numero minimo di caratteri per attivare il sistema,
se non l'ho raggiunto allora non considero la query sotto ed eseguo direttamente le logiche per inviare l'azione senza considerare altro.
Nell'altro caso eseguo la query cercando tutti i record nel giro di un giorno che hanno il mittente specificato, quindi faccio la somma dell'exp guadagnata per i messaggi inviati prima di questo considerando ovviamente il numero di caratteri che attiva il flag (clausola WHERE). Se il valore risultate della query è true allora invio l'azione senza considerare l'aumento dell'exp, altrimenti invio e aumento.
$numero_minimo_char = 1000;
$max_exp_per_day = 1;
#considero azione in name dell'input, ovviamente va cambiato se chiami l'input in maniera diversa
$char_azione = strlen(gdrcd_filter('in', $_POST['azione']));
if ($char_azione >= $numero_minimo_char) {
$query = "SELECT IF(SUM((CHAR_LENGTH(testo) / " . $numero_minimo_char . ")) > " . $max_exp_per_day . ", true, false) as is_limite_superato";
$query .= " FROM chat";
$query .= " WHERE mittente = '" . gdrcd_filter('in', $_SESSION['login']) . "'";
$query .= " AND (tipo = 'P' OR tipo = 'A' OR tipo = 'M')";
$query .= " AND DATE_ADD( ora, INTERVAL 1 DAY ) >= NOW()";
$query .= " AND CHAR_LENGTH(testo) >= ". $numero_minimo_char ." ";
$result = gdrcd_query($query, 'result');
$fetch = gdrcd_query($result, 'fetch');
if ($fetch['is_limite_superato'] === true) {
#invio l'azione senza aumentare l'exp
} else {
#logiche per l'invio dell'azione con l'aumento dell'exp
}
}else{
#invio l'azione senza aumentare l'exp perché non raggiungo il numero minimo di caratteri
}
Non ho testato la soluzione però penso possa andare
03/04/2017 11:31:34
Grazie Rematore!
Però non capisco. Questo pezzo:
$query = "SELECT IF(SUM((CHAR_LENGTH(testo) / " . $numero_minimo_char . ")) > " . $max_exp_per_day . ", true, false) as is_limite_superato";
pone utilizza sempre il rapporto testo azione/numero minimo caratteri che io vorrei evitare, in quanto mi piacerebbe che ogni azione desse 1 px (raggiunti, per esempio, i 500 caratteri. Poi se l'azione è di 10k caratteri sempre 1 px da), con però un numero massimo di px raggiungibili pari a (mettiamo) 20.
altra cosa, visto che ci sono: ma è fattbile, dato il codicillo che ho postato prima, mettere un valore per azione inferiore a 1? ho provato a mettere sia il "." (es. : 0.5) che la "," (es.: 0,5) ma il sistema spara errore <.<
03/04/2017 13:09:09
(ho aggiornato il codice, ora include anche l'aumento di exp con valori in virgola)
irenes ha scritto: pone utilizza sempre il rapporto testo azione/numero minimo caratteri che io vorrei evitare, in quanto mi piacerebbe che ogni azione desse 1 px (raggiunti, per esempio, i 500 caratteri. Poi se l'azione è di 10k caratteri sempre 1 px da), con però un numero massimo di px raggiungibili pari a (mettiamo) 20.
Se ho capito bene, tu vuoi assegnare un valore finito di exp se supera un certo quantitativo di caratteri. Per farlo quindi non hai bisogno della divisione come avevo scritto. La logica che segue è simile alla precedente cambia solo nella parte di gestione della clausola SELECT.
Prima calcolavo l'exp assegnata in base al numero di caratteri, quindi facevo la somma dell'exp totale per ogni messaggio inviato e salvavo il valore nel campo is_limite_superato.
Adesso faccio più o meno la stessa cosa però questa volta mi porto dietro la somma di un flag che mi specifica se è stata assegnata l'esperienza, così facendo non considero più il calcolo dei px.
Quindi facendo uso dei tuoi dati il codice diventa così
$px_assegnati = 0.5;
$numero_minimo_char = 500;
$max_exp_per_day = 20.0;
#considero azione in name dell'input, ovviamente va cambiato se chiami l'input in maniera diversa
$char_azione = strlen(gdrcd_filter('in', $_POST['azione']));
if ($char_azione >= $numero_minimo_char) {
$query = "SUM(CASE WHEN CHAR_LENGTH(testo) >= ". $numero_minimo_char ." THEN ". $px_assegnati ." ELSE 0 END) AS flag"
$query .= " FROM chat";
$query .= " WHERE mittente = '" . gdrcd_filter('in', $_SESSION['login']) . "'";
$query .= " AND (tipo = 'P' OR tipo = 'A' OR tipo = 'M')";
$query .= " AND DATE_ADD( ora, INTERVAL 1 DAY ) >= NOW()";
$query .= " AND CHAR_LENGTH(testo) >= ". $numero_minimo_char ." ";
$result = gdrcd_query($query, 'result');
$fetch = gdrcd_query($result, 'fetch');
if ($fetch['flag'] >= $max_exp_per_day) {
#invio l'azione senza aumentare l'exp
} else {
#logiche invio messaggio
#update exp
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ". $px_assegnati ." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
}
}else{
#invio l'azione senza aumentare l'exp perché non raggiungo il numero minimo di caratteri
}
04/04/2017 19:04:18 e modificato da total fantasy il 04/04/2017 19:19:18
Scusate se mi intrometto, ma se ad esempio è impostato
$PARAMETERS['settings']['exp_by_chat']['number'] = '500';
// Numero di caratteri necessari al fine di aggiungere 1 punto esperienza.
adesso se una persona (parlo di numeri interi e non decimali) scrive un'azione da 3000 caratteri, prende 6px.
Per far in modo che questo non succeda, in che parte di questo codice scritto da Dyrr bisogna intervenire?
Per intenderci: un giocatore per prendere 1 px deve scrivere almeno 500 caratteri. Se ne scrive di più (anche 3000) COMUNQUE sempre 1 px resta (e non diventano 6px).
if($PARAMETERS['mode']['exp_by_chat']=='ON')
{
//definisce $exp_giornaliera per evitare notice nel while
$exp_giornaliera = 0;
//Query che recupera il numero di caratteri per messaggi del pg delle ultime 24 ore che hanno generato px;
$query = "SELECT CHAR_LENGTH(testo) AS msg_lenght";
$query .= " FROM chat";
$query .= " WHERE"; //CONDIZIONI
$query .= " mittente = '".gdrcd_filter_in($_SESSION['login'])."'"; //il mittente è il pg loggato
$query .= " AND (tipo = 'P' OR tipo = 'A' OR tipo = 'M')"; //il messaggio è del tipo di quelli che danno px
$query .= " AND DATE_ADD( ora, INTERVAL 1 DAY ) >= NOW()"; //è meno vecchio di 24h
$query .= " AND CHAR_LENGTH(testo) > ".gdrcd_filter('num',$PARAMETERS['settings']['exp_by_chat']['number']); //è della lunghezza minima per generare px
//echo $query;
$result = gdrcd_query($query,'result');
//clalcola l'esperienza accumulata nelle ultime 24h
while($row = gdrcd_query($result,'fetch'))
{
$exp_giornaliera = $exp_giornaliera + ($row['msg_lenght']/$char_needed);
}
if($exp_giornaliera < $PARAMETERS['settings']['exp_by_chat']['max_exp'])
{
if ($m_type == 'A' || $m_type == 'P' || $m_type == 'M')
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus." WHERE nome = '".$_SESSION['login']."' LIMIT 1");
}
}
Poi ho fatto un'altra prova: se di fatto il numero minimo di caratteri per salire di 1px è impostato a:
$PARAMETERS['settings']['exp_by_chat']['number'] = '500';
// Numero di caratteri necessari al fine di aggiungere 1 punto esperienza.
di fatto facendo adesso le prove, il px (1) lo si prende anche se si scrivono ESATTAMENTE ALMENO dai 245 caratteri in sù.
Qualcosa non va... >.<
19/03/2018 22:44:58
Ciao a tutti, scusate se riesumo questa discussione, ma per caso qualcuno ha risolto il discorso di mettere un tetto massimo di px ottenibili tramite le azioni in chat? Sarei interessato a inserirlo nel PbC che sto programmando, ma non funzionano i codici che ho preso da questo post.
26/01/2020 12:43:17
[GDRCD 5.4.1 - MySQL: 5.6 - Hosting Altervista]
Buongiorno, io ci riprovo.
Prendendo spunto da questo codice e dalla logica del limite giornaliero degli stipendi, sono riuscito a ottenere una mezza soluzione; ottengo un px quando un'azione ha lo stesso numero di caratteri richiesto dal config, poi non ne assegna più fino al giorno successivo. Però se come prima azione scrivo un ammontare di caratteri inferiore ai 4mila, conteggia il valore decimale relativo che si aggiunge all'esperienza (dato da $msg_length/$char_needed - come desidero accada), ma non assegna più px nemmeno se dopo ne faccio una della lunghezza giusta (perché ormai ha aggiornato il campo del db da me aggiunto "ultimo_bonus"). Qualcuno per favore può consigliarmi come fare per far sì che il campo ultimo_bonus si aggiorni soltanto al raggiungimento di un px intero? Oppure qualche soluzione alternativa per risolvere sempre lo stesso problema, ovvero: ottenere un px bonus al giorno al raggiungimento totale (ovvero dato dalla somma di più azioni ) di X caratteri e poi stop? Posto il codice come l'ho impostato io e ringrazio in anticipo.
In config ho impostato come segue:
$PARAMETERS['mode']['exp_by_chat'] = 'ON';
//ON: abilita l'incremento dei punti esperienza tramite i caratteri scritti in chat.
//OFF: disabilita l'incremento dei punti esperienza tramite i caratteri scritti in chat.
$PARAMETERS['settings']['exp_by_chat']['number'] = '4000';
// Numero di caratteri necessari al fine di aggiungere 1 punto esperienza.
$PARAMETERS['settings']['exp_by_chat']['max_exp'] = '1';
///< Esperienza massima giornaliera;
in ref_header.inc.php, intorno alla riga 121:
if($PARAMETERS['mode']['exp_by_chat']=='ON')
{
$msg_length = strlen($chat_message);
$char_needed = gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number']);
$exp_bonus = $msg_length/$char_needed;
$ultimo = gdrcd_query("SELECT ultimo_bonus FROM personaggio WHERE nome = '".$_SESSION['login']."'");
}
e nei paraggi di riga 245 (c'è qualche differenza dall'originale, ma di base ho seguito le istruzioni di Dyrr sostituendo il codice base con il seguente):
if($PARAMETERS['mode']['exp_by_chat']=='ON')
{
//definisce $exp_giornaliera per evitare notice nel while
$exp_giornaliera = 0;
$row=gdrcd_query("SELECT ultimo_bonus FROM personaggio WHERE nome = '".$_SESSION['login']."' LIMIT 1");
$ultimo=$row['ultimo_bonus'];
$date_px = date('Y-m-d') . '00:00:00';
$query = "SELECT CHAR_LENGTH(testo) AS msg_length";
$query .= " FROM chat";
$query .= " WHERE"; //CONDIZIONI
$query .= " mittente = '".gdrcd_filter_in($_SESSION['login'])."'"; //il mittente è il pg loggato
$query .= " AND (tipo = 'P' OR tipo = 'A' OR tipo = 'M')"; //il messaggio è del tipo di quelli che danno px
$query .= " AND ora >= '".gdrcd_filter_in($date_px)."' ";
$result=gdrcd_query($query, 'result');
while($row=gdrcd_query($result, 'fetch'))
{
$exp_giornaliera = $exp_giornaliera + ($row['msg_lenght']/$char_needed);
}
if($ultimo != strftime("%Y-%m-%d"))
{
if($exp_giornaliera < $PARAMETERS['settings']['exp_by_chat']['max_exp']) //se l'esperienza giornaliera è inferiore a 1
{
if ($m_type == 'A' || $m_type == 'P' || $m_type == 'M') //carica 1 exp sull'esperienza in attesa
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".$exp_bonus.", ultimo_bonus = NOW() WHERE nome = '".$_SESSION['login']."' AND ultimo_bonus < NOW() LIMIT 1");
}
}
}
31/05/2020 21:18:11
Salve ragazzi, riprendo questa discussione avendo fatto mille prove ma nella mia ignoranza aver fallito miseramente e ho bisogno di risolvere la cosa in modo ESTREMO ç_ç
Vado per gradi dunque.
in config.inc ho questi valori
$PARAMETERS['settings']['exp_by_chat']['number'] = '500';
// Numero di caratteri necessari al fine di aggiungere X punti esperienza.
$PARAMETERS['settings']['exp_by_chat']['max24h'] = '20';
// Imposta il massimo dei punti esperienza che si possono ottenere nell´arco di 24ore di gioco. Questo per scoraggiare web forcing.
In ref_header ho questa parte di codice:
/*Inserisco il messaggio*/
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '".gdrcd_capital_letter(gdrcd_filter('in', $tag_n_beyond))."', NOW(), '".$m_type."', '".$chat_message."')");
if($PARAMETERS['mode']['exp_by_chat']=='ON')
{
if (($m_type == 'A' || $m_type == 'P' || $m_type == 'M') && ($msg_length>=$char_needed))
{
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + 10 WHERE nome = '".$_SESSION['login']."' LIMIT 1"); /*$PARAMETERS['settings']['exp_by_chat']['number_increment_xp'] /// gdrcd_filter('num', $PARAMETERS['settings']['exp_by_chat']['number'])*/
}
}
VI PREGO VI SUPPLICO come devo inserire bene l'if affinchè mi imposti che il limite massimo di esperienza ogni 24 h non deve superare il valor eimpsotato in $PARAMETERS['settings']['exp_by_chat']['max24h']? Vi prego ne ho un bisogno miciadiale pensavo di esserci riuscito ma non era così e ho riportato il codice a livello "pulito" ç_ç
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
State of Survival ↗
World of Tanks ↗
War Thunder ↗
Sea of Conquest ↗
RAID Shadow Legends ↗
Imperion ↗
Crossout ↗
CRSED: F.O.A.D. ↗