[RISOLTO] GDRCD 5.4 log acquisti mercato e bug
[RISOLTO] GDRCD 5.4 log acquisti mercato e bug postato il 25/06/2021 17:03:22 nel forum programmazione, open source e hosting e modificato da animeanddragons il 26/09/2021 11:18:27
Buonasera!
Se un pg ha in scheda 5 pozioni (oggetto ad uso singolo) e le usa in chat, scompaiono tutte e 5 invece di 1 sola!
LOG MERCATO
Visto il problema precedente, esiste un modo per creare un qualcosa che mi crei una lista eventi degli acquisti fatti al mercato dei pg?
E anche una lista che mostri quando un pg utilizza un oggetto in chat?
Come neofita di PHP e autodidatta, come Gestore praticamente ora mezza land usa questo sistema per farsi rimborsare cose che dice di aver speso ma che io non ho modo di controllare, e sta accadendo un casino. Potete aiutarmi? ç_ç
Pagine → 1 2
25/06/2021 18:17:14 e modificato da haruka il 14/07/2021 15:48:32
Per quanto riguarda i log.
Allora, step by step.
in includes/constant_values.inc.php
aggiungi un nuovo codice di log dopo l'ultimo.
Sarà una cosa del tipo
define('ACQUISTO', 16);
metti il numero progressivo seguente all'ultimo che hai indicato da te.
In /vocabulary/IT-it.vocabulary.php
Dove hai
/********** Eventi **********/
metti
$MESSAGE['event'][ACQUISTO] = 'Acquisti';
Poi, in pages/servizi_mercato.inc.php:
Dove c'è
/*Controllo se ha la grana*/
$costo = gdrcd_query("SELECT cariche, costo FROM oggetto WHERE id_oggetto = ".gdrcd_filter('num', $_POST['id_oggetto'])."");
subito sotto aggiungi
$nome = gdrcd_query("SELECT nome FROM oggetto WHERE id_oggetto = ".gdrcd_filter('num', $_POST['id_oggetto'])."");
dove c'è
$query = "UPDATE clgpersonaggiooggetto SET numero = numero + 1 WHERE id_oggetto = ".gdrcd_filter('num', $_POST['id_oggetto'])." AND nome = '".$_SESSION['login']."'";
subito sotto aggiungi:
gdrcd_query("INSERT INTO log (nome_interessato, autore, data_evento, codice_evento, descrizione_evento) VALUES ('".$_SESSION['login']."','".$_SESSION['login']."', NOW(), ".ACQUISTO.", 'Ha acquistato ".gdrcd_filter('in', $nome['nome'])."')");
dove c'è
$query = "INSERT INTO clgpersonaggiooggetto (nome, id_oggetto, cariche, numero, posizione) VALUES ('".$_SESSION['login']."',".gdrcd_filter('num', $_POST['id_oggetto']).", ".$costo['cariche'].", 1, 0)";
subito sotto aggiungi:
gdrcd_query("INSERT INTO log (nome_interessato, autore, data_evento, codice_evento, descrizione_evento) VALUES ('".$_SESSION['login']."','".$_SESSION['login']."', NOW(), ".ACQUISTO.", 'Ha acquistato ".gdrcd_filter('in', $nome['nome'])."')");
26/06/2021 09:37:42 e modificato da betsutamashi il 26/06/2021 09:38:32
animeanddragons ha scritto: Buonasera!
[center]BUG
Se un pg ha in scheda 5 pozioni (oggetto ad uso singolo) e le usa in chat, scompaiono tutte e 5 invece di 1 sola!
Anche noi ci siamo scontrati con questo problema senza venirne a capo, se qualcuno avesse la soluzione, sarebbe davvero molto utile!
Grazie!
26/06/2021 12:14:05
In ref_header.inc.php ci dovrebbero essere una porzione di codice che inizia con:
} elseif(gdrcd_filter('get', $_POST['id_item']) != 'no_item') {
Riuscireste a riportare cosa avete dopo? Mi basta da parentesi a parentesi.
Kasa.
27/06/2021 03:09:51 e modificato da animeanddragons il 27/06/2021 03:18:14
@HARUKA grazie funziona benissimo!!! Non volendo assolutamente prendermi il merito penso che sarebbe utile se lo mettessi in un pacchetto patch per gdrcd <3
@KASA TI conviene scaricarti il file originale dal pacchetto fai molto prima! Perché ognuno è facile che ci abbia fatto delle modifiche
L'inghippo sta sicuramente qui, ma non riesco a capire come fare per far si che l'oggetto venga cancellato ESCLUSIVAMENTE quando le sue cariche sono pari a 1, mentre di per se quando sono di più già le scala.
/** * Tiro su caratteristica
* @author Blancks
*/
}
else if (gdrcd_filter('get', $_POST['id_stats']) != 'no_stats' && gdrcd_filter('get',$_POST['dice']) != 'no_dice')
{
mt_srand((double)microtime()*1000000);
$die=mt_rand(1,gdrcd_filter('num', (int)$_POST['dice']));
$id_stats = explode('_', $_POST['id_stats']);
$car = gdrcd_query("SELECT car".gdrcd_filter('num',$id_stats[1])." AS car_now FROM personaggio WHERE nome = '".$_SESSION['login']."' LIMIT 1");
$racial_bonus = gdrcd_query("SELECT bonus_car".gdrcd_filter('num',$id_stats[1])." AS racial_bonus FROM razza WHERE id_razza IN (SELECT id_razza FROM personaggio WHERE nome='".$_SESSION['login']."')");
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, motivazione, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), '".gdrcd_capital_letter(gdrcd_filter('in', $motivazione))."', 'C', '".$_SESSION['login'].' '.gdrcd_filter('in',$MESSAGE['chat']['commands']['use_skills']['uses']).' '.gdrcd_filter('in',$PARAMETERS['names']['stats']['car'.$id_stats[1]]).': '.gdrcd_filter('in',$PARAMETERS['names']['stats']['car'.$id_stats[1].'']).' '.gdrcd_filter('num',$car['car_now']+$racial_bonus['racial_bonus']).', '.gdrcd_filter('in', $MESSAGE['chat']['commands']['use_skills']['die']).' '.gdrcd_filter('num',$die).', '.gdrcd_filter('in',$MESSAGE['chat']['commands']['use_skills']['sum']).' '.(gdrcd_filter('num',$car['car_now']+$racial_bonus['racial_bonus'])+gdrcd_filter('num',$die)+gdrcd_filter('num',$rank['grado'])+gdrcd_filter('in',$bonus['bonus']))."')");
}
else if (gdrcd_filter('get',$_POST['dice'])!='no_dice')
{
mt_srand((double)microtime()*1000000);
$die=mt_rand(1,gdrcd_filter('num',$_POST['dice']));
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'D', '".$_SESSION['login'].' '.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['cast']).gdrcd_filter('num',$_POST['dice']).': '.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['sum']).' '.gdrcd_filter('num',$die)."')");
}
else if (gdrcd_filter('get',$_POST['id_item'])!='no_item')
{
$item=explode('-', gdrcd_filter('in',$_POST['id_item']));
if ($item[1]==1)
{
$query="DELETE FROM clgpersonaggiooggetto WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".gdrcd_filter('num',$item[0])."' LIMIT 1";
}
elseif ($item[1]>1)
{
$query="UPDATE clgpersonaggiooggetto SET cariche = cariche -1 WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".gdrcd_filter('num',$item[0])."' LIMIT 1";
}
gdrcd_query($query);
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (".$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'O', '".$_SESSION['login'].' '.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['item']).': '.gdrcd_filter('in',$item[2])."')");
}
}
27/06/2021 13:23:51
Non saprei come svilupparlo in modalità pacchetto ^^'
Più che altro la mia risposta è una rapida guida alla creazione di nuove funzioni di log, non è una patch o un pacchetto vero e proprio :P
Però sono contenta che funzioni :)
27/06/2021 20:42:59
Ho fatto alcune verifiche sia con GDRCD#5.5.1 che con la tua porzione di codice e non ho trovato errori. Sei sicuro che le cariche vengono salvate correttamente in DB?
Kasa.
28/06/2021 21:57:14
@HARUKA Credimi, anche solo inserire questa "guida" in un file e unzipparlo tra gli open source aiuta tantissimo secondo me. <3
@KASA Si, mette NUMERO 2 e CARICHE 1. A rigor di logica quando usa l'ultima carica cancella tutto invece di scalare di -1 nella tabella del NUMERO, così che l'oggetto rimanga
29/06/2021 10:48:21 e modificato da kasa il 29/06/2021 10:54:31
animeanddragons ha scritto:
@KASA Si, mette NUMERO 2 e CARICHE 1. A rigor di logica quando usa l'ultima carica cancella tutto invece di scalare di -1 nella tabella del NUMERO, così che l'oggetto rimanga
Confrontandomi con @Dyrr, che ha ben più esperienza di me per quanto riguarda GDRCD, abbiamo individuato il problema proprio nella logica degli oggetti.
Di fatto, GDRCD raggruppa gli oggetti del Personaggio per id dell'oggetto, senza alcuna identificazione puntuale della singola stringa a DB. Per farti un esempio concreto:
***
Un Personaggio può avere n oggetti identici nel suo inventario
Esempio tabella clgpersonaggiooggetto:
nome - id_oggetto - numero - cariche - commento - posizione
Super - 1 - 1 - 5 - Prova - 1
Super - 1 - 1 - 5 - Prova - 1
Dove id_oggetto è sempre "Oggetto1" nel mercato. Questi due oggetti, però, non vengono trattati singolarmente (ossia Riga 1 e Riga 2 ), ma 2 volte id_oggetto = 1. Per essere ancora più semplici, tu non hai a disposizione 10 cariche dell'Oggetto1, ma due oggetti con comunque SOLO 5 cariche.
***
GDRCD, pertanto, li raggruppa in modo sbagliato.
Quando viene utilizzato un oggetto, GDRCD controlla le cariche dell'oggetto e se son presenti più di 1 una carica allora sottrae 1, altrimenti elimina proprio l'oggetto.
Se io ho 2 oggetti da 5 cariche l'uno, dato che vengono raggruppati male, viene rimossa una carica a tutti e due gli oggetti, quindi ne avrai due da 4 cariche.
Se io ho due oggetti con una sola carica, li elimina tutti e due. Se io ho due oggetti, uno con una carica e l'altro con 3 PUÒ CAPITARE, in base all'ordine di inserimento, che vengono cancellati COMUNQUE tutti e due.
Se hai, citando testualmente @Dyrr, "8 pozioni monouso e ne usi una te le toglie tutte".
Quindi questo è il vostro ERRORE.
Il modo più ovvio per risolvere una cosa del genere è quello di distinguere ogni singola riga (mettendo un id_oggetto_personaggio, ad esempio, incrementale e si basa tutto su di quello) oppure di dare una validità, ad esempio, alla posizione. Ma richiede necessariamente un refactor di GDRCD e della sua gestione oggetti.
Kasa.
29/06/2021 19:57:42
Salve! io avevo lo stesso prolema ed ho risolto senza andare a cambiare il database (mi pare), non ho aggiunto nulla al funzionamento degli oggetti.
Ovviamente, come più volte consigliato sopra, cambiare totalmente il sistema di "funzionamento" degli oggetti è la soluzione più efficiente
Essenzialmente la logica è la seguente
- Consumo l'oggetto in chat (se ha cariche maggiori di 0)
- Controllo gli oggetti posseduti dal personaggio
- Se ha finito le Cariche, ma possiede più di una copia dello stesso oggetto, allora toglie un oggetto e "ripristina" le cariche
- Se ha finito le Cariche, ma non ha più copie dello stesso oggetto, allora semplicemente toglie l'oggetto
___________________________________________________________
Nel file frame_chat.inc.php ho inserito un menù a tendina con tutti gli oggetti "consumabili" che possono essere indossati dal personaggio
<form action="pages/chat.inc.php?ref=30&chat=yes" method="post" target="chat_frame" id="chat_form_oggetti">
<?php $result = gdrcd_query("SELECT clgpersonaggiooggetto.id_oggetto, oggetto.nome, oggetto.ubicabile, clgpersonaggiooggetto.cariche FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE clgpersonaggiooggetto.nome = '".$_SESSION['login']."' AND posizione > 0 AND clgpersonaggiooggetto.cariche > 0 ORDER BY oggetto.nome", 'result'); ?>
<select name="item" id="item" style="width: 90%;" class="hack">
<option value="no_item" selected> </option>
<?php while($row=gdrcd_query($result, 'fetch')){ ?>
<option value="<?php echo gdrcd_filter('out',$row['id_oggetto']); ?>">
<?php echo $row['nome']; ?> </option>
<?php }//while ?>
</select>
<br>
<input type="submit" value=" Usa" style="90%"/>
<input type="hidden" name="op" value="take_action_consumables">
</td>
</form>
Successivamente dentro ref_header.inc.php ho inserito:
if ((gdrcd_filter('get',$_POST['op'])=='take_action_consumables'))
{$actual_healt = gdrcd_query("SELECT salute FROM personaggio WHERE nome = '".$_SESSION['login']."'");
if ($actual_healt['salute']>0)
{$id_oggetto = $_POST['item'];
//Appena esegue il comando deve scaricare un USO dall'oggetto
$query=gdrcd_query("UPDATE clgpersonaggiooggetto SET cariche = cariche -1 WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".$id_oggetto."' LIMIT 1");
$numero_posseduto = gdrcd_query("SELECT numero FROM clgpersonaggiooggetto WHERE id_oggetto = '".$id_oggetto."' AND nome = '".$_SESSION['login']."' LIMIT 1");
$cariche_rimaste = gdrcd_query("SELECT cariche FROM clgpersonaggiooggetto WHERE id_oggetto = '".$id_oggetto."' AND nome = '".$_SESSION['login']."' LIMIT 1");
$cariche_originali = gdrcd_query("SELECT cariche FROM oggetto WHERE id_oggetto = '".$id_oggetto."' LIMIT 1");
$nome_oggetto = gdrcd_query("SELECT nome FROM oggetto WHERE id_oggetto = '".$id_oggetto."' LIMIT 1");
//Inizia il controllo per vedere se ci sono cariche rimaste oppure si hanno copie multiple
if ($cariche_rimaste[0] > 0){
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (" .$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'O', '".$_SESSION['login'].
' utilizza ' .$nome_oggetto[0]. "')");
}
else if ($cariche_rimaste[0] == 0 && $numero_posseduto[0] > 1) {
$query=gdrcd_query("UPDATE clgpersonaggiooggetto SET numero = numero -1 WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".$id_oggetto."' LIMIT 1");
$query=gdrcd_query("UPDATE clgpersonaggiooggetto SET cariche ='".$cariche_originali[0]."' WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".$id_oggetto."' LIMIT 1");
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (" .$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'O', '".$_SESSION['login'].
' utilizza ' .$nome_oggetto[0]. "')"); }
else if ($cariche_rimaste[0] == 0 && $numero_posseduto[0] < 2) {
$query=gdrcd_query("DELETE FROM clgpersonaggiooggetto WHERE id_oggetto = ".$id_oggetto." AND nome = '".$_SESSION['login']."' LIMIT 1 ");
$query=gdrcd_query("UPDATE clgpersonaggiooggetto SET cariche ='".$cariche_originali[0]."' WHERE nome ='".$_SESSION['login']."' AND id_oggetto='".$id_oggetto."' LIMIT 1");
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (" .$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'O', '".$_SESSION['login'].
' utilizza ' .$nome_oggetto[0]. "')"); }
else if ($cariche_rimaste[0] < 0 && $numero_posseduto[0] < 2) {
$query=gdrcd_query("DELETE FROM clgpersonaggiooggetto WHERE id_oggetto = ".$id_oggetto." AND nome = '".$_SESSION['login']."' LIMIT 1 ");
gdrcd_query("INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo ) VALUES (" .$_SESSION['luogo'].", '".$_SESSION['sesso'].";".$_SESSION['img_razza']."', '".$_SESSION['login']."', '', NOW(), 'O', '".$_SESSION['login'].
' non ha rimasto abbastanza utilizzi di ' .$nome_oggetto[0]. "')"); }
} else {/* else per il controllo se la salute è maggiore di 0*/
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', $_SESSION['login']))."', NOW(), 'S', '".
gdrcd_filter('in',$MESSAGE['status_pg']['exausted'])."')");}
} // TAKE ACTION OGGETTI CONSUMABILI
Ovviamente....ci sono vari riferimenti al tipo di piattaforma che utilizzo, però alla fin fine la logica è abbastanza simile a quella base
14/07/2021 15:47:17
Per il codice che registra l'operazione in log, mi sono accorta che c'è un piccolo errore che causa bug se nel titolo dell'oggetto c'è l'apostrofo.
Ho sistemato. Modifico la mia precedente risposta in modo da sistemare il codice qui in forum.
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
World of Warship ↗
Sea of Conquest ↗
RAID Shadow Legends ↗
Storie di Agarthi ↗
Cafuné ↗
Tiles Survive ↗
Fallen Gods ↗
Seconda Era ↗
Wuthering Waves ↗
War Thunder ↗