[RISOLTO][GDRCD 5.6] Px settimanali al login + Tetto massimo a update
[RISOLTO][GDRCD 5.6] Px settimanali al login + Tetto massimo a update postato il 04/03/2023 10:55:01 nel forum programmazione, open source e hosting e modificato da backwaters il 23/04/2023 14:56:15
Ciao a tutti
Sto cercando di implementare un sistema di assegnazione dell'esperienza automatico slegato dall'accumulo di px in chat in base ai caratteri/azioni: il risultato che vorrei è che ogni settimana i personaggi che hanno fatto almeno una role (4 azioni registrate in db) si vedono assegnato 1 px.
Ho inserito il codice in login.php (rifacendomi all'assegnazione dello stipendio) ed aggiunto un campo data ultima_exp nella tabella personaggio. Ora... se l'assegnazione fosse giornaliera il sistema funziona senza problemi, ma aggiungendo i controlli sulla data per fare l'update di sette giorni in sette giorni, non va.
Questo è il mio codice:
if($PARAMETERS['settings']['week_exp'] = 'ON') {
/*ESPERIENZA SETT*/
$row = gdrcd_query("SELECT esperienza, ultima_exp FROM personaggio WHERE nome = '".$_SESSION['login']."' LIMIT 1");
$ultimaexp = gdrcd_filter('out', $row['ultima_exp']);
$data = strftime("%Y-%m-%d");
$newdata = strtotime($ultimaexp ."+1 week");
if($newdata == $data){
$chat = gdrcd_query("SELECT COUNT(mittente) AS azione FROM chat WHERE DATE_SUB(NOW(),INTERVAL 1 WEEK) <= ora AND tipo = 'P' AND mittente = '".$_SESSION['login']."'");
if($chat['azione'] >= 4) {
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + 1, ultima_exp = NOW() WHERE nome = '".$_SESSION['login']."'");
} else {
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + 0, ultima_exp = NOW() WHERE nome = '".$_SESSION['login']."'");
}
}
}
Qualcuno può darmi una mano a capire dov'è l'errore, o se ho proprio sbagliato la logica dell'automatismo?
2) Altra domanda: c'è un modo semplice per impostare un limite massimo ad un UPDATE?
Nel senso, ho un automatismo che calcola i danni in combattimento e selezionando il personaggio attaccato, gli assegna i punti salute. Il mio problema è che continua ad assegnarli anche oltre il valore di max_hp: se un personaggio è a 36 punti salute e il massimo è 40, se gli arrivano 8 danni, nel db registra che i punti sono 44, invece di impostare 40.
Pagine → 1
04/03/2023 19:21:11
Ciao!
così, a prima vista c'è un errore nell IF statment
if($PARAMETERS['settings']['week_exp'] = 'ON')
questo va cambiato così
if($PARAMETERS['settings']['week_exp'] == 'ON')
Poi, credo che ce ne sia uno possibile pure più sotto
if($chat['azione'] >= 4
secondo me, andrebbe fatto un cast implicito per sicurezza
if( (int) $chat['azione'] >= 4
Vedi che succede! e fammi sapere
06/03/2023 15:21:41
@cbr89: ho inserito le correzioni, appena vedo se funzionano ti do conferma. Intanto grazie :)
bunnyboo ha scritto: Questo controllo non comporta che se il giocatore non logga nel giorno preciso dato dall'ultima exp + 1 settimana, salti tutto per com'è fatto il codice?
Esatto. Tra l'altro, se per qualsiasi motivo x non assegna nulla una settimana, non assegna più nulla nella nelle settimane a seguire e il sistema salta. Ho aggiunto l'else per aggiornare comunque la data di ultima_exp per ovviare il problema, ma non sono sicura sia sufficiente.
Ho fatto varie prove modificando il controllo con le comparazioni, ma a quel punto mi assegna i px giornalmente. Onestamente, non ho idea di come impostarlo.
07/03/2023 15:48:45 e modificato da cbr89 il 07/03/2023 15:49:48
Ciao Backwaters,
ho dato uno sguardo allo script che hai fatto.
Secondo me ci sono un paio di errori logici dentro, io ho provato a farti uno script che dovrebbe darti il risultato che speri.
dato che non ricordo bene la sintassi della funzione PHP diff su un oggetto date, ti chiedo di verificare quella roba.
if($PARAMETERS['settings']['week_exp'] == 'ON') {
/*ESPERIENZA SETT*/
$row = gdrcd_query("SELECT esperienza, ultima_exp FROM personaggio WHERE nome = '".$_SESSION['login']."' LIMIT 1");
$ultimaexp = new Date(gdrcd_filter('out', $row['ultima_exp']));
$oggi = new Date("now");
/*se dall'ultimo aggiornamento sono passati da 7 a più giorni*/
if( $oggi->diff($ultimaexp)->days >= 7 ){
/*questa query era potenzialmente sbagliata.
Nel senso che, se uno va in 4 chat qualunque, manda un messaggio tu gli aumenti gli exp. L'ho modificata per estrarre il numero di azioni per stanza nell'ultima settimana da ora. */
$chat = gdrcd_query("SELECT COUNT(mittente) AS azione FROM chat WHERE DATE_SUB(NOW(), INTERVAL 1 WEEK) >= ora AND tipo = 'P' AND mittente = '".$_SESSION['login']."' GROUP BY stanza HAVING COUNT(*) > 4", 'result');
if(gdrcd_query($chat, 'num_rows') > 0 ) {
/*Se è stato tornato un numero di righe, vuol dire che il pg ha fatto almeno 4 azioni nella stessa chat nella settimana */
gdrcd_query("UPDATE personaggio SET esperienza = esperienza + 1, ultima_exp = NOW() WHERE nome = '".$_SESSION['login']."'");
}
}
}
Nota che, quando e se creerai questa colonna ti consiglio di mettere come data_ultimo_exp oggi o il giorno in cui inserirai questa modifica, in modo che più o meno tutti, partano dalla stessa situazione.
per i test, come chiaro, dovrai forzare a mano un valore minore di una settimana nella data ultimo exp, e anche in almeno 4 azioni della stessa stanza!
Non uccidermi se ci sono errori di sintassi, non ho proprio avuto tempo di verificare su un IDE decente
Fammi sapere!
13/03/2023 11:34:41
Scusa se rispondo solo ora, ma sono riuscita a mettermi sul codice solo in questi giorni.
Dai primi test mi sembra funzionare tutto, ho solo modificato new Date in new Datetime perché mi dava Uncaught Error e... grazie, di nuovo!
18/01/2024 16:36:40 e modificato da zepam il 21/01/2024 01:38:24
backwaters ha scritto: Scusa se rispondo solo ora, ma sono riuscita a mettermi sul codice solo in questi giorni.
Dai primi test mi sembra funzionare tutto, ho solo modificato new Date in new Datetime perché mi dava Uncaught Error e... grazie, di nuovo!
Salve! Scusate se riesumo questo thread ma... ho provato a fare la stessa cosa, utilizzando il codice paro paro, e anche a me dà Uncaught Error con il New Date. Il New Datetime tuttavia, pur non dando errori, non funziona nemmeno (e so che questa osservazione lascia il tempo che trova, ma su notepad++ manco me lo colora in azzurro). Qualcuno mi sa dare una manina a sistemare? O per lo meno capire come funziona!
E grazie in anticipo <3
EDIT: con un aiuto esterno ne sono venuta a capo: il problema non era il DateTime ma la query che contava le azioni... il segno va invertito! Quindi al posto di:
$chat = gdrcd_query("SELECT COUNT(mittente) AS azione FROM chat WHERE DATE_SUB(NOW(), INTERVAL 1 WEEK) >= ora AND tipo = 'P' AND mittente = '".$_SESSION['login']."' GROUP BY stanza HAVING COUNT(*) > 4", 'result');
a me funziona con
$chat = gdrcd_query("SELECT COUNT(mittente) AS azione FROM chat WHERE DATE_SUB(NOW(), INTERVAL 1 WEEK) <= ora AND tipo = 'P' AND mittente = '".$_SESSION['login']."' GROUP BY stanza HAVING COUNT(*) > 4", 'result');
PS: con > 4 servono almeno 5 azioni per poter ottenere l'aumento di esperienza. Ho messo >= 4 perché ne bastino già solo 4!
04/03/2024 09:18:08
sunai ha scritto:
Solo che così temo non sia a cadenza mensile ma se uno gioca il 15 del mese, riceverebbe 10 px il 15 del mese successivo, credo?
Circa si: conteggia 30 giorni esatti dall'ultima data. Se invece ti interessa verificare soltanto che la data di oggi sia in un mese differente dalla data di ultima esperienza penso che la cosa più semplice da fare sia usare il metodo format degli oggetti DateTime per farsi ritornare il valore del mese e verificare che siano diversi:
if( $oggi->format('m') !== $ultimaexp->format('m') ){
Fai qualche prova e verifica come va, puoi cambiare a mano la data di ultima esperienza dell'account nel database per impostarlo al mese scorso e poi provare la procedura ;)
04/03/2024 22:53:01 e modificato da blancks il 04/03/2024 23:20:35
sunai ha scritto:
Inoltre, per provare ho settato come ultima_exp il 3 Febbraio e poi sono andato in una chat a fare 5 azioni (random testo). Però non mi ha accreditato i punti, forse sbaglio qualcosa?
Ci sono due problemi da quel che vedo, si:
1) Bisogna considerare che quando si fa login, con questo sistema dei mesi, vanno accreditati i px per le azioni svolte nel mese scorso. Quindi è normale che 5 azioni svolte adesso non diano punti esperienza, ma ne daranno per l'accredito del mese dopo. (Per provare oltre alla data di ultima esperienza bisogna portare al mese scorso anche le date delle azioni in chat)
2) La query che conteggia le azioni necessita di una correzione. Attualmente impone che le azioni in chat vengono conteggiate solo se più vecchie di 1 mese a causa di questa condizione:
DATE_SUB(NOW(), INTERVAL 1 MONTH) >= ora
Personalmente ti suggerirei di inserire come range di riferimento data l'inizio del mese della data di ultima esperienza fino a prima dell'inizio del mese della data odierna.
Ovvero:
ora >= '". $ultimaexp->format('Y-m-01 00:00:00') ."' AND ora < '". $oggi->format('Y-m-01 00:00:00') ."'
backwaters e zepam Il fix che ho suggerito può essere valido anche per voi, nel vostro caso basta modificare la condizione a questo modo:
ora >= '". $ultimaexp->format('Y-m-d H:i:s') ."' AND ora < '". $oggi->format('Y-m-d H:i:s') ."'
Il motivo principale è che la condizione originaria considera tutte le azioni del giocatore svolte da sempre, a patto che siano state svolte oltre il periodo indicato. Quindi una volta che il giocatore ha fatto 5 azioni potrà prendere punti esperienza nel periodo valido semplicemente loggando e senza bisogno di farne di nuove finché quelle vecchie azioni persisteranno nel database.
L'altro motivo è un vantaggio pratico e prevede che il periodo valido per l'assegnazione dei punti esperienza non risulti scritto due volte (uno nella condizione php e l'altro nella query) ma venga tutto gestito unicamente dal controllo in php. Che è qualcosa da ricordarsi in meno nel caso in cui un domani abbiate bisogno di cambiare il periodo di assegnazione dei px
05/03/2024 20:00:38 e modificato da blancks il 05/03/2024 20:01:01
sunai ha scritto:
Forse ho implementato sbagliato, ho capito giusto che andava così?
Perdona la scarsa chiarezza, il precedente controllo andava rimosso del tutto:
$chat = gdrcd_query("SELECT COUNT(mittente) AS azione FROM chat WHERE ora >= '". $ultimaexp->format('Y-m-01 00:00:00') ."' AND ora < '". $oggi->format('Y-m-01 00:00:00') ."' AND tipo = 'P' AND mittente = '".$_SESSION['login']."' GROUP BY stanza HAVING COUNT(*) >= 4", 'result');
Prova così
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
State of Survival ↗
Storie di Agarthi ↗
War Thunder ↗
Exclusive Villa GdR ↗
Cafuné ↗
World of Tanks ↗