Auteur Sujet: retour sur la révision 89  (Lu 6851 fois)

Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
Malheureusement, je ne pense pas que ce soit les positions qui sont en doubles mais les NPCs
Le cerveau est l'organe le moins utilisé par l'être humain...

Hors ligne franck77

  • Développeurs
  • Legendaire Member
  • ****
  • Messages: 2043
eux j'ai quand même essayer :) ...

Voilà un patch pour delete tout le double spawn
spawn au même coordonnées x y z

Je ne certifie que ça marche donc à tester ... mais d'après ce que j ai vu ça devrais être bon coté patch  ;D

-- Id :2427 (2) double :2432

Les commentaires c'est pour la vérification
Id, c'est id de l'entrée
(x), nombre de spawn à ces coordonnées
double, c'est l'id du double ...

@Randdrick : s'ils sont spawnés au même endroit ce sont des npc double non !?!

Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
Citer
Randdrick : s'ils sont spawnés au même endroit ce sont des npc double non !?!

Oui, c'est entièrement exact. Merci beaucoup pour ton patch.

Attention il y a quand même un risque dans le cas ou certains on par exemple rajouter des spawns. Les entrées effacées ne seront pas les bonnes.

Ton patch devrait plutôt ressembler à ceci :

DELETE FROM creature_spawns WHERE entry = iddunpc LIMIT 1 ;
Dans le cas ou le npc est spawné plus deux de fois a des position différentes ( bien entendu ) ton patch devrait ressembler à ceci

DELETE FROM creature_spawns WHERE entry = iddunpc AND position_x BETWEEN valeura valeurb ;

J'utilise une intervalle car pour des raisons obscures la requête ne s'execute pas correctement lorsque la valeur exacte de la position est entrés
Le cerveau est l'organe le moins utilisé par l'être humain...

Hors ligne franck77

  • Développeurs
  • Legendaire Member
  • ****
  • Messages: 2043
J'explique le fonctionnement du script qui a crée mon patch ...

Il lis la table spawns ... a chaque entrée il verifie s'il existe un double (voir même plusieurs) avec le même x y et z. Ensuite il garde l'entrée avec l'id le plus petit et efface les autres ...

J'ai eu le même problème pour les floats (C'est du à un truc de calcul des procs qui restitue mal la partie décimal ... 0.1 peut être lu 0.100...001 dans certain cas), ce qui fait merdé des fois les requêtes car il ne trouve pas la bonne valeur

Pis non j'efface pas par entry ... car tu peut avoir 3 même npc mais pas au même endroit donc

DELETE FROM creature_spawns WHERE entry = iddunpc LIMIT 1 ;

et

DELETE FROM creature_spawns WHERE entry = iddunpc AND position_x BETWEEN valeura valeurb ;

est très mauvais pour la DB  ;)


Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
Pis non j'efface pas par entry ... car tu peut avoir 3 même npc mais pas au même endroit [/quote]

D'ou justement l'utilisation de l'option LIMIT qui efface le nombre d'enregistrement que tu désires. Exemple LIMIT 1 effacera un seul enregistrement.

Et si justement tu as plus de 2 entrées, tu utilises justement la deuxième requête c'est a dire :

DELETE FROM creature_spawns WHERE entry = iddunpc AND position_x BETWEEN valeura valeurb ; -> cette requête s'applique que pour les NPCs devant être spawné qu'une seule fois sur toute la map. C'est le cas de beuacoup de vendeurs par exemple.

Cependant, et la tu as raison, il faut au moins laisser une entrée, et ceux dans tout les cas. Comme tu ne sais pas par avance, le nombre d'enregistrement en doublons, il te faut utiliser une variable incrémentielle. Le principe est simple. A chaque qu'un enregistrement, si un doublon est trouvé, la valeur 1 est ajouté à la variable qu'on appellera i, et dont sa valeur est égal à 1 par défaut. Ainsi, si il trouve trois enregistrements sur la même position, la valeur de i sera égale à 3.

Pour effacer les enregistrement en doublon, il te suffira d'appliquer la requête suivante

DELETE FROM creature_spawns WHERE entry = iddunpc LIMIT i-1 ;
Le même principe est a utilisé pour la deuxième requête.

En conclusion,
Effacer par entry est le seul moyen pour que ton patch soit universel.  ;D
Le cerveau est l'organe le moins utilisé par l'être humain...

Hors ligne franck77

  • Développeurs
  • Legendaire Member
  • ****
  • Messages: 2043
Ben le mien passe par un petit bout de code php :)

un select pour toutes les entrées (pour lister la table) ... puis une recherche de doublon sur x y et z et pour finir la création d'une ligne delete :p

Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
Ben le mien passe par un petit bout de code php :)

un select pour toutes les entrées (pour lister la table) ... puis une recherche de doublon sur x y et z et pour finir la création d'une ligne delete :p

Que cela soit par du php, c++, SQl .etc, cela ne change pas le principe  ;D Si tu prends les id ( qui sont en auto-increment ) tu es sûr d'une chose : c'est que le résultat que tu obtiens s'applique bien à ta propre base de données, mais tu ne peux pas affirmer avec certitude que cela pourra s'appliquer à tout le monde car tout les serveurs personnalisent la base de données de WAAD. Cela n'enlève nullement à la qualité de ton script, bien entendu. Mais si tu arrives à le modifier pour creer deux lignes DELETE tel que suggérées précédemment, cela me permettrait d'appliquer le patch sans aucun danger.

L'autre solution, c'est que je te fasse passer le fichier creature_spawns avant que je sorte la révision  ;D A ce moment, le patch qui en sortira sera à 100 % adapté pour WAAD.
Le cerveau est l'organe le moins utilisé par l'être humain...

Hors ligne franck77

  • Développeurs
  • Legendaire Member
  • ****
  • Messages: 2043
ou que je te passe la page php comme ca tu la laisse appliqué directement sur ta table (en pensant toujours a la sauvegarde)  ;)

mais moi je l'ai laissé tournée une nuit un peu long comme processus

Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
Oh oui, la sauvegarde va être faite !

Ok pour la page php et merci. Là je viens de faire un contrôle par rapport au patch que tu as fais, et les entrés a effacer ne sont pas en doublons dans la table creature_spawns de WAAD.
Le cerveau est l'organe le moins utilisé par l'être humain...

Hors ligne dareo

  • Hero Member
  • *****
  • Messages: 815
  • wowterredexil.forumactif.com
    • Terre d'exil
Je me permet une petite remarque ^^
Citer
Il lis la table spawns ... a chaque entrée il verifie s'il existe un double (voir même plusieurs) avec le même x y et z. Ensuite il garde l'entrée avec l'id le plus petit et efface les autres ...

Certaines balises utiles pour activer des spells sont considérées comme des creatures dans la db et sont spawnées sur la meme position que d'autre pnj.

Attention a ne pas effacer ces balises

Hors ligne franck77

  • Développeurs
  • Legendaire Member
  • ****
  • Messages: 2043
j'ai pris la table creature_spawns de waad rev 95 y a marqué si je me trompe pas ...

@dareo merci de cette info ...

donc si quelqu'un est motivé il peut aller voir les ids du patch pour vérifier s'il ce sont de vrai double  ::)

@Randdrick ? ben les ids que j'ai delete sont au même coordonnées x y z, doit en avoir qui sont balises comme le dis dareo

Hors ligne Randdrick

  • Administrator
  • Connetable
  • *****
  • Messages: 6568
  • Grand Calif
    • W.A.A.D - WoW Ascent Arbonne DB
J'ai pas appliqué ton patch, puisque je n'ai pas trouver les doublons par rapport aux ids relevés dans ton patch. Mais l'idée reste bonne, quoiqu'il en soit.
Le cerveau est l'organe le moins utilisé par l'être humain...