GDRCD - Equip: Limite Oggetti Bonus
GDRCD - Equip: Limite Oggetti Bonus postato il 04/03/2017 10:01:21 nel forum programmazione, open source e hosting
Salve a tutti, adopero Gdrcd 5.2 modificato, mi chiedevo se qualcuno potesse darmi qualche consiglio o suggerimento per apportare una modifica all'attuale impostazione oggetti nell'equipaggiamento dei personaggi o eventualmente indicarmi qualche sito da cui prendere spunto per poter attuare tale modifica.
Attualmente nel sistema sorgente di gdrcd è possibile equipaggiare più oggetti diversi con lo stesso bonus che va sommandosi.
Esempio: Guanti forza Bonus +2 / Anello forza Bonus +1 = 3 Bonus Totale in Forza.
La modifica che vorrei provare a realizzare è la seguente:
- Stabilire un massimo di oggetti equipaggiabili con lo stesso bonus.
Esempio: Possiedo 3 oggetti da poter equipaggiare che mi garantiscono bonus alla forza ma posso equipaggiarne solo 2 che mi garantiscano un bonus di quel tipo.
Mi rendo conto che probabilmente è una richiesta azzardata e che forse non troverà risposta ma ringrazio preventivamente coloro che potranno interessarsi all'argomento e sarò ben lieta di mettere a disposizione la soluzione qualora riuscissi nell'intento =)
Pagine → 1 2
04/03/2017 23:20:11 e modificato da rematore il 04/03/2017 23:25:08
Ciao, se ho capito bene ti basta fare un controllo quando viene richiesto l'equipaggiamento di un oggetto. Più precisamente qui
(riga 27 circa, file scheda_equi.inc.php)
/*Indossatura un oggetto*/
if ((gdrcd_filter('get',$_POST['op'])=="indossa") && (($_SESSION['login']==$_REQUEST['pg'])||($_SESSION['permessi']>=GAMEMASTER))){
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = ".gdrcd_filter('num',$_POST['posizione'])." WHERE id_oggetto = ".$_POST['id_oggetto']." AND nome = '".gdrcd_filter('get',$_REQUEST['pg'])."' LIMIT 1 ");
echo '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['done']).'</div>';
}
prima della query di update esegui un'altra query che preleva il numero degli oggetti che hanno il bonus specifico maggiore di 0
SELECT count(bonus_car0) as oggetti FROM clgpersonaggiooggetto
JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto
WHERE oggetto.bonus_car0 > 0
quindi
if($row['oggetti'] >= 2){
//non puoi equipaggiare un'altro oggetto con questo bonus caratteristica
}else{
//procedi
}
05/03/2017 10:37:42
Ti ringrazio molto per la risposta :D
Ho provato a fare quanto indicato in questo modo:
/*Indossatura un oggetto*/
if ((gdrcd_filter('get',$_POST['op'])=="indossa") && (($_SESSION['login']==$_REQUEST['pg'])||($_SESSION['permessi']>=MODERATOR))){
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
if($row['oggetti'] >= 2){
//non puoi equipaggiare un'altro oggetto con questo bonus caratteristica
}else{
//procedi
}
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = ".gdrcd_filter('num',$_POST['posizione'])." WHERE id_oggetto = ".$_POST['id_oggetto']." AND nome = '".gdrcd_filter('get',$_REQUEST['pg'])."' LIMIT 1 ");
echo '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['done']).'</div>';
}
ma non funziona(non so se ho sbagliato qualcosa ma non mi rimanda alcun errore).
05/03/2017 11:44:25
Dovrebbe essere così:
/*Indossatura un oggetto*/
if ((gdrcd_filter('get',$_POST['op'])=="indossa") && (($_SESSION['login']==$_REQUEST['pg'])||($_SESSION['permessi']>=MODERATOR))){
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
if($row['oggetti'] >= 2){
//non puoi equipaggiare un'altro oggetto con questo bonus caratteristica
}else{
//equipaggia
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = ".gdrcd_filter('num',$_POST['posizione'])." WHERE id_oggetto = ".$_POST['id_oggetto']." AND nome = '".gdrcd_filter('get',$_REQUEST['pg'])."' LIMIT 1 ");
echo '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['done']).'</div>';
}
}
la modifica dentro l'else.
05/03/2017 11:49:49
Esattamente come ha scritto yhaerrd
oppure se non ti interessa il caso in errore fai direttamente così
/*Indossatura un oggetto*/
if ((gdrcd_filter('get', $_POST['op']) == "indossa") && (($_SESSION['login'] == $_REQUEST['pg']) || ($_SESSION['permessi'] >= MODERATOR))) {
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
if ($row['oggetti'] <= 2) {
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = " . gdrcd_filter('num', $_POST['posizione']) . " WHERE id_oggetto = " . $_POST['id_oggetto'] . " AND nome = '" . gdrcd_filter('get', $_REQUEST['pg']) . "' LIMIT 1 ");
echo '<div class="warning">' . gdrcd_filter('out', $MESSAGE['warning']['done']) . '</div>';
}
}
05/03/2017 15:26:01
Grazie ad entrambi.
Ho provato ad effettuare le modifiche con i vostri suggerimenti ma purtroppo il sistema continua a consentirmi di equipaggiare tutti i tipi di oggetto con lo stesso bonus senza alcuna limitazione.
05/03/2017 23:12:00 e modificato da rematore il 05/03/2017 23:14:07
Mi specifichi la logica che permette di capire quale oggetto ha un determinato bonus? perché il mio ragionamento si applica alla seguente logica.
Ho n oggetti. Ogni oggetto ha disponibili x caratteristiche (car0...car5). Per ogni oggetti vale solo una caratteristica le altre sono a zero.
oggetto A attribuisce valore forza
oggetto B attribuisce valore mente
oggetto C attribuisce valore forza
oggetto D attribuisce valore astuzia
In questa maniera io faccio il conteggio in base agli oggetti che hanno il valore specifico della categoria maggiore di zero.
06/03/2017 09:02:22
Funziona esattamente come da te descritto e difatti non capisco perchè il richiamo non venga eseguito per la limitazione equip con la stessa caratteristica.
06/03/2017 11:55:30
Ci sono alcune cose in questo codice:
/*Indossatura un oggetto*/
if ((gdrcd_filter('get', $_POST['op']) == "indossa") && (($_SESSION['login'] == $_REQUEST['pg']) || ($_SESSION['permessi'] >= MODERATOR))) {
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
if ($row['oggetti'] <= 2) {
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = " . gdrcd_filter('num', $_POST['posizione']) . " WHERE id_oggetto = " . $_POST['id_oggetto'] . " AND nome = '" . gdrcd_filter('get', $_REQUEST['pg']) . "' LIMIT 1 ");
echo '<div class="warning">' . gdrcd_filter('out', $MESSAGE['warning']['done']) . '</div>';
}
}
che non vanno specialmente in questa query:
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
che:
- controlla gli oggetti tra quelli posseduti, non solo tra quelli indossati
- controlla gli oggetti tra quelli di tutti i pg non solo tra quelli del pg che tenta di indossare un oggetto
- controlla se l'oggetto ha un bonus solo su una specifica statistica.
- non tiene conto del fatto che il gdrcd raggruppa oggetti uguali non come record diversi ma come un unico record segnando il numero di oggetti di quel tipo
Questi errori nella queri sicuramente non fanno funzionare la query come dovrebbe e quindi si richia che faccia equipaggiare oggetti quando no deve o viceversa.
Basandomi sul come lavora il gdrcd io farei un controllo del genere:
<?php
/*Indossatura un oggetto*/
if ((gdrcd_filter('get', $_POST['op']) == "indossa") && (($_SESSION['login'] == $_REQUEST['pg']) || ($_SESSION['permessi'] >= MODERATOR))) {
//imposta il controllo dell'oggetto indossabile a positivo
$indossabile = true;
//imposta il numero massimo di oggetti indossabili
$max_oggetti = 2;
//recupera i bonus dell'oggetto attuale
$query = "SELECT
o.bonus_car1,
o.bonus_car2,
o.bonus_car3,
o.bonus_car4,
o.bonus_car5
FROM clgpersonaggiooggetto
AS po
ON po.id_oggetto = o.id_oggetto
WHERE
po.id_oggetto = " . gdrcd_filter_num($_POST['id_oggetto']) . "
AND po.nome = '" . gdrcd_filter_in($_REQUEST['pg']) . "'
LIMIT 0,1";
$bonus = gdrcd_query($query);
//CICLA I BONUS DELL'OGGETTO
//questo per controllare anche eventuali oggetti che abbiano bonus a più di una statistica tipo +1 FO, +2 DE
for ($i = 0; $i <= 5; $i++) {
//SE L'OGGETTO HA UN BONUS O MALUS SULLA STATISTICA
if($bonus['bonus_car' . $i] != 0) {
//recupera i dati degli oggetti indossati dal pg con bonus a quella statistica
$query = "SELECT
po.id_oggetto,
po.numero
FROM clgpersonaggiooggetto
AS po
ON po.id_oggetto = o.id_oggetto
WHERE
o.bonus_car" . $i . " <> 0
AND po.posizione > 0
AND po.nome = '" . gdrcd_filter_in($_REQUEST['pg']) . "' ";
$result = gdrcd_query($query'result');
//SE IL PG INDOSSA GIA DUE OGGETTI DIVERSI CON BONUS SU QUELLA STAT
if(gdrcd_query($result,'num_rows') >= $max_oggetti) {
//imposta come non indossabile l'oggetto
$indossabile = false;
//SE IL PG NON INDOSSA GIA DUE OGGETTI DIVERSI CON BONUS SU QUELLA STAT
} else {
//RECUPERA I DATI DELLUNICO OGGETTO EVENTUALMENTE INDOSSATO
//ho usato un while per rendere facilmente modificabile il codice se si vuole cambiare sli oggetti
//massimi da due a un altro numero
while ($row = gdrcd_query($result,'fetch') {
//SE IL PG EQUIPAGGIA GIA PIÙ DI UN OGGETTO UGUALE CON BONUS AD UNA STATISTICA
if($row['numero'] >= $max_oggetti) {
//imposta come non indossabile l'oggetto
$indossabile = false;
}
}
}
}
}
//SE L'OGGETTO RISULTA INDOSSABILE
if ($indossabile === true) {
//LO FA INDOSSARE
$query = "UPDATE clgpersonaggiooggetto
SET
posizione = " . gdrcd_filter_num($_POST['posizione']) . "
WHERE
id_oggetto = " . gdrcd_filter_num($_POST['id_oggetto']) . "
AND nome = '" . gdrcd_filter_get($_REQUEST['pg']) . "'
LIMIT 1";
gdrcd_query($query);
echo '<div class="warning">' . gdrcd_filter_out($MESSAGE['warning']['done']) . '</div>';
}
}
Non ho avuto tempo di testarlo , per cui potrebbe esserci qualche errore di sintassi, prendetelo più come una linea guida indicativa su come gestire il controllo che come un codice da copiaincollare, anche se prometto di provarlo appena posso.
06/03/2017 12:27:51
dyrr ha scritto: Ci sono alcune cose in questo codice:
/*Indossatura un oggetto*/
if ((gdrcd_filter('get', $_POST['op']) == "indossa") && (($_SESSION['login'] == $_REQUEST['pg']) || ($_SESSION['permessi'] >= MODERATOR))) {
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
if ($row['oggetti'] <= 2) {
gdrcd_query("UPDATE clgpersonaggiooggetto SET posizione = " . gdrcd_filter('num', $_POST['posizione']) . " WHERE id_oggetto = " . $_POST['id_oggetto'] . " AND nome = '" . gdrcd_filter('get', $_REQUEST['pg']) . "' LIMIT 1 ");
echo '<div class="warning">' . gdrcd_filter('out', $MESSAGE['warning']['done']) . '</div>';
}
}
che non vanno specialmente in questa query:
gdrcd_query("SELECT count(bonus_car5) as oggetti FROM clgpersonaggiooggetto JOIN oggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto WHERE oggetto.bonus_car5 > 0");
Concordo con te, infatti non ha senso quello che ho scritto...
Comunque, la soluzione di dyrr sicuramente è più completa di questa che è una semplice query che verifica il tipo dell'oggetto da equipaggiare quindi verifica quanti oggetti per quel tipo l'utente ha già equipaggiato
SELECT
(CASE WHEN 'bonus_car0' > 0 THEN 1 ELSE 0 END) AS want_equi_car0,
(CASE WHEN 'bonus_car1' > 0 THEN 1 ELSE 0 END) AS want_equi_car1,
(CASE WHEN 'bonus_car2' > 0 THEN 1 ELSE 0 END) AS want_equi_car2,
(CASE WHEN 'bonus_car3' > 0 THEN 1 ELSE 0 END) AS want_equi_car3,
(CASE WHEN 'bonus_car4' > 0 THEN 1 ELSE 0 END) AS want_equi_car4,
(CASE WHEN 'bonus_car5' > 0 THEN 1 ELSE 0 END) AS want_equi_car5,
N.*
FROM 'oggetto'
JOIN (
SELECT
SUM(CASE WHEN 'bonus_car0' > 0 THEN 1 ELSE 0 END) AS equi_car0,
SUM(CASE WHEN 'bonus_car1' > 0 THEN 1 ELSE 0 END) AS equi_car1,
SUM(CASE WHEN 'bonus_car2' > 0 THEN 1 ELSE 0 END) AS equi_car2,
SUM(CASE WHEN 'bonus_car3' > 0 THEN 1 ELSE 0 END) AS equi_car3,
SUM(CASE WHEN 'bonus_car4' > 0 THEN 1 ELSE 0 END) AS equi_car4,
SUM(CASE WHEN 'bonus_car5' > 0 THEN 1 ELSE 0 END) AS equi_car5
FROM 'oggetto'
JOIN clgpersonaggiooggetto ON clgpersonaggiooggetto.id_oggetto = oggetto.id_oggetto
WHERE clgpersonaggiooggetto.nome = NOME_UTENTE_ATTUALMENTE_CONNESSO
) AS N
WHERE id_oggetto = ID_OGGETTO_DA_EQUIPAGGIARE
Più precisamente want_equi_car(0...5) ritorna 1 sull'attributo specifico che vale il bonus per l'oggetto da equipaggiare, mentre equi_car(0..5) ritorna il numero totale degli oggetti equipaggiati dall'utente per il bonus specifico.
--
Esempio

In questa situazione l'utente sta per equipaggiare un oggetto che conferisce il bonus alla caratteristica0 ed ha già equipaggiati 2 oggetti che conferiscono bonus alla caratteristica0 e 1 alla caratteristica 4.
Per evitare di inserire più oggetti basta fare il controllo sul ritorno della query
if( ($row['want_equi_car0'] + $row['equi_car0']) <= 2 ){
//posso equipaggiare un oggetto che conferisce bonus alla caratteristica0
}
ovviamente la condizione dovrà essere gestita anche per i casi con le altre caratteristiche
08/03/2017 10:23:18
Grazie mille per le direttive, appena riesco a concentrarmi come si deve sul codice proverò a mettere in pratica quanto detto. In ogni caso vi informerò su eventuali progressi nel caso in cui questa modifica dovesse essere utile anche ad altri =)
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!
AlterEgo ↗
Project Entropy ↗
Hero Wars ↗
Imperion ↗
Cafuné ↗
Tibia ↗
Foundation Galactic Frontier ↗