iThorgrim

Member
  • Content Count

    22
  • Joined

  • Last visited

  • Points

    42 [ Donate ]

Community Reputation

16 Neutre

About iThorgrim

  • Rank
    Moussaillon
  • Birthday November 1

Etat Civil

  • Nationality
    Français
  • Sexe
    Homme

Profil

  • Discord
    Rain_Dash#6250
  • Couleur
      #FFFFFF
  • Nombre
    0

Compétences

  • PHP
  • SQL
  • HTML
  • CSS
  • JavaScript
  • Java
  • LUA
  • Python
  • VB
  • C++
  • C#
  • C

Recent Profile Visitors

362 profile views
  1. Heyio, Si tu es sous TC 3.3.5 tu peux la télécharger ici : [Hidden Content] Si tu es sous TC 7.3.5 tu peux la télécharger ici : [Hidden Content] Et si tu galères un peu trop je suis dispo sur Discord
  2. Présentation de WARLOG : Voilà maintenant 7 ans que je développe sur TrinityCore (C++, LUA, SQL) j'ai un peu tout vue.. En terme de serveur c'est pareil, j'ai assisté à des ascensions mais aussi à des chûtes et tout était toujours sujets à leçon. J'ai passé 7 ans à apprendre comment bien développer et comment mettre mes compétences aux service d'une communauté, d'un projet. Aujourd'hui je vous présente WARLOG et son royaume Lordaeron. WARLOG c'est vieux de 4 ans, en 4 ans mon objectif n'a pas changé. Offrir des serveurs de qualités avec un certains renouveau et surtout la touche du Bâtisseur de Rêves. WARLOG à comme ambition je cite : Mais qu'est ce qu'un serveur avec un contenu jamais vue jusqu'ici ? Lordaeron : Royaume SemiBlizzLike Custom Jotunheim : Serveur compétitif (Arborés de quelques mini jeu (Battle-Royal)) Primal : Serveur Survie (Manger ou se faire manger ..) Projet D : Serveur Custom Zombie (Inspirés des jeux : Dead Island, Dying Light, Dead Rising) WARLOG c'est l'envie de proposer des choses jamais vu actuellement sur la scène des serveurs 3.3.5 principalement. Tout le monde sait/peut ouvrir un serveur BlizzLike WotLK, mais qui sait/peut ouvrir un serveur WotLK sortant de l'ordinaire ? Qui l'a fait ? WARLOG veut être le premier projet, le premier serveur à vouloir proposer enfin un renouveau sur la scène du privé, ne pas faire comme les autres. Ce discours vous l'avez déjà entendu, chez certains ce n'est même plus un discours mais une phrases banales, sauf que ceci oublie que nous servons le joueur. Nous servons un joueur qui veux jouer correctement, jouer à autre chose qu'a la Copie N°1523 de X serveur. WARLOG vous l'avez compris veut et va aller au bout de ses objectifs, cela prendra du temps, mais nous ne sommes pas là pour la notoriété ou pour l'afflux de dons dans notre boutique. Nous sommes ici pour la même choses que vous, jouer à jeux qui nous plaît, offrir un bon moment et vivre un bon moment. Présentation de Lordaeron : Alors non, je ne vais pas vous présenter les chiffres de debug du serveur puisque tout le monde le fait et tout le monde utilise la même base. Je part du principe que lire que les sorts du Guerrier sont debug à 99 % c'est pas une informations relative au serveur ou même qui vous intéresse. Par contre je peux vous dire que Lordaeron possède quelques scripts bien sympas comme : La Transmogrification La Retouche Arcanique Les Niveaux de Maîtrise PvE / PvP Les Niveaux de Guilde Un Système de rates EXP lié au groupe Une Boutique en jeu Et bien d'autres choses encore en développement.. Mais Lordaeron faisant partit de WARLOG on ne s'arrête pas à ces quelques améliorations. WARLOG - Lordaeron veux vous raconter une histoire, nous ne sommes pas écrivain, nous ne sommes pas auteur, mais nous sommes des joueurs qui voulons faire vivre une aventure épique et unique à d'autres joueurs. WARLOG - Lordaeron vous proposeras donc de participer à l'histoire que nous mettrons en place avec les joueurs, pour les joueurs et pour nous! Lordaeron ne peut se permettre de mettre en place beaucoup de nouveaux continents question de taille de Patch, mais ce n'est pas pour autant que le monde n'évolueras pas. Les mentalités vont évoluer et vous même vous évoluerez. Plusieurs conflits en Azeroth se préparent et le pacte brisé entre l'Alliance et la Horde n'arrange rien... Merci d'avoir lu la présentation de ce serveur, beaucoup de points n'ont pas été abordés pour des questions de mystère. Beaucoup de script n'ont même pas été abordés (Bg Interfaction, Marché Noir, Chasseur de prime) J'espère vous voir très bientôt sur WARLOG - Lordaeron ou un des dérivés dans le futur. Inspiration : Fable I/II/III, Mass Effect(I/II/II/Andromeda), Red Dead Redemption, World of Warcraft, Diablo, The Elder Scrolls, Soul Reavers, Kingdoms of Amalur : Reckoning
  3. Merci, c'est un très bon conseil que je commence à appliquer depuis peu, c'est vrais que lire Q0 au bout de 6 mois, baaaah .. t'es perdu tu lis la requêtes et tu perds du temps. Je le met à jour de suite
  4. Stocker des informations avec ELUNA (LUA) Bonjour, aujourd’hui un tutoriel plutôt complexe dans la forme plus que dans le fond .. Comme vous le savez pour les serveurs World of Warcraft il existe 2 langages de développement qui sont les vedettes et les plus utilisés le SQL et le C++. Depuis maintenant quelques années un module à fait sont entrés et à permis à des petits devs de faire de grande choses, je parle de ELUNA, qui permet de développer en LUA pour les émulatateurs compatibles. Alors Eluna est plein de bonne choses, mais disons que pour ce qui est du stockage c’est presque peine perdu. Quand vous voulez stocker une information, vous êtes obligés, de faire une requête SQL et pour pas vous mentir, si vous avez un script de Modificateur de rates EXP et que vous souhaitez vérifier la rate choisis à chaque Kill, ça fait beaucoup de requêtes pour pas grand choses .. J’étais dans ce problème, et j’ai trouvés une solution, j’ai utilisés des Tableaux pour stocker des informations(C'est pas la meilleur mais c'est celle que je préfère). Et aujourd’hui je vous propose un guide plus qu’un tutoriel, car les domaines d’applications sont vraiment vastes et que j’ai pas d’exemple ultra stylés pour vous montrer le p p p p power de cette chose. Pour notre exemple on va dire que l’ont cherche à stocker les informations de notre personnage et plus précisément la Rate d’EXP. Donc dans l'exemple on a fait notre code, la rates d’exp elle est stockés dans une colonne custom de `characters` qui s’appelleras `rates` (je rappelle que ceci est un exemple, ne cherchais pas la colonne `rate` dans `characters` hein ..) Alors ont va juste improviser un bout de code pour avoir un petit exemple « visuel » sous les yeux : local EXP = {}; local PLAYER_EVENT_ON_LOGIN = 3 function EXP.GetRates(event, player) end RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates) Donc pour faire assez simple et concis on utilise l'événement connexion pour aller chercher la Rates d'EXP et la garder en mémoire le temps que le joueur reste connectés! Maintenant on va se créer un tableau et des valeurs par défauts (au cas ou..). local EXP = {}; local PLAYER_EVENT_ON_LOGIN = 3 function EXP.GetRates(event, player) local pGuid = player:GetGUIDLow() if not(EXP[pGuid])then EXP[pGuid] = { rate = 1 } end end RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates) Alors là je vais vous décortiquer ça : local pGuid = player:GetGUIDLow() -- On va chercher le GUID du joueur qui je le rappelle est unique ! (Très important d'avoir une donnée unique comme Index/Identitifant) if not(EXP[pGuid])then -- Si le Tableau EXP[pGUID] n'existe pas, donc si le tableau avec notre GUID n'existe pas alors .. EXP[pGuid] = { rate = 1} -- Tu me créer un tableau avec dedans une "colonne" rate qui a par défaut la valeur 1 Attention je vulgarise la chose, en réalités certains terme ne s'utilise/se dise pas comme ça, c'est pour l'exemple et le guide. Alors du coup maintenant on a notre valeur par défaut et notre tableau il nous faut aller récupérer la rate de notre joueur. local EXP = {}; local PLAYER_EVENT_ON_LOGIN = 3 function EXP.GetRates(event, player) local pGuid = player:GetGUIDLow() if not(EXP[pGuid])then EXP[pGuid] = { rate = 1 } end local Q0 = CharDBQuery('SELECT rate FROM `characters` WHERE guid = '..pGuid..';') if Q0 then EXP[pGuid].rate = Q0:GetUInt32(0) end end RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates) Comme pour tout à l'heure je vais expliquer un peu : local Q0 = CharDBQuery('SELECT rate FROM `characters` WHERE guid = '..pGuid..';') -- La très simple je vais chercher la rate de mon personnage dans la DB -> Table -> Colonne if Q0 then -- Si Q0 aboutis à quelques choses (car il ne peu pas être nul si jamais la rate devrais normalement être à 1) EXP[pGuid].rate = Q0:GetUInt32(0) -- Alors rate dans EXP[pGuid] est égale au résultat de la requête (Donc si le résultat est 28, EXP[pGuid].rate seras maintenant égale à 28) Voilà, je ne sais pas si vous avez compris ou si c'est assez clair, mais ça permet beauuucoup plus de choses et ça rajoute un confort appelés stabilités des serveurs. Si jamais voici quelques petits conseil que je peu vous donner pour l'utilisation des tableaux 'Stockeur' : Arrêtez le stockage en live dans la base de donnée et préférés des stockage directement dans des tableaux, puis stockés seulement dans la DB à la déconnexion du joueur Arrêtez les vérifications systématique dans la base de donnée et stockés l'information une fois dans un tableau J’espère que ceci vous aideras à stocker des informations, et vous pouvez littéralement en abuser. Arrête avec tes 300 requêtes/scd. Allez moi je go manger des bébé phoques, la bise
  5. Ton serveur est dans une VirtualBox ? Si oui : [Hidden Content] Si non : Bah je laisse les collègues de mon collègue t'aider
  6. Créer un téléporteur Hoyé hoyé! Aujourd'hui dans ce tutoriel je vais vous apprendre à créer un téléporteur en SQL donc on va voir : - creature_template - gossip_menu_option - gossip_menu - npc_text - smart_scripts J'ai fait ce tutoriel en vidéos si vous le souhaitez. I /- OUTILS Un Serveur TrinityCore >= Rev.64 Un outil graphique pour SGBDR (j'ai toujours rêvés de direça, en gros un logiciel d'edition de DB quoi) DE L'EAU OU DU CAFÉ ! II /- CREATURE_TEMPLATE (Exécutez bien le code dans l'ordre des chapitres, c'est très important, surtout pour le Chapitre IV) Pour commencer va nous falloir une créature, pas la peine de remplir toutes les colonnes certains sont par défaut à 0 et ça tombe bien on a pas besoin de tout. SET @Entry := (SELECT MAX(entry)+1 FROM creature_template), @Model := , -- A toi de mettre le model de ta créature @Npcflag := 1, @Faction := 35, @UnitClass := 1, @Level := 80, -- A toi de mettre le niveau de ta créature @GossipMenuId := (SELECT MAX(menuid)+1 FROM gossip_menu_options), @Name := ''; -- A toi de mettre ce que tu souhaite comme nom INSERT INTO `creature_template` (entry, modelid1, npcflag, faction, unit_class, minlevel, maxlevel, gossip_menu_id, name) VALUES (@Entry, @Model, @Npcflag, @Faction, @UnitClass, @Level, @Level, @GossipMenuId, @Name); Comme tu peux le voir pour @Entry et @GossipMenuId ont fait une requête SQL pour aller sélectionner le dernier et rajouter +1, plus rapide et moins chiant que de chercher le dernier ID ckdo III /- GOSSIP_MENU_OPTION C'est partit pour le gossip_menu_option, en gros le petit menu quand tu parles a ton PNJ. SET @MenuID = (Select MAX(menuid) FROM gossip_menu_option); -- EXEMPLE DE MENU AVEC AUCUNE SOUS CATEGORIES INSERT INTO `gossip_menu_option` (menuid, optionid, optionicon, optiontext, optiontype, optionnpcflag, actionmenuid) VALUES (@MenuID, 0, 0, 'Emplacement I', 1, 1, @MenuID), (@MenuID, 1, 0, 'Emplacement II', 1, 1, @MenuID), (@MenuID, 2, 0, 'Emplacement III', 1, 1, @MenuID); -- EXEMPLE DE MENU AVEC SOUS CATEGORIES INSERT INTO `gossip_menu_option` (menuid, optionid, optionicon, optiontext, optiontype, optionnpcflag, actionmenuid) VALUES (@MenuID, 0, 0, 'Emplacement I', 1, 1, @MenuID), (@MenuID, 1, 0, 'Emplacement II', 1, 1, @MenuID+1), (@MenuID+1, 0, 0, 'Emplacement I', 1, 1, @MenuID+1), (@MenuID+1, 1, 0, 'Emplacement II', 1, 1, @MenuID+1), (@MenuID+1, 2, 0, 'Emplacement III', 1, 1, @MenuID+1), (@MenuID+1, 50, 0, '{bouton retour}', 1, 1, @MenuID), (@MenuID, 2, 0, 'Emplacement III', 1, 1, @MenuID); Alors un peu d'explication, toujours la même chose que pour l'entry de creature_template, le MenuId va allez cherche le dernier tout seul. Pour ce qui est des sous-catégorie, je pense pas a avoir besoin de vous expliquer juste à lire le code et on comprend directement, c'est presque logique. Pour les lignes sans sous-catégories je met deux fois @MenuID : en gros ce que je fais c'est que si tu clique sur 'Emplacement I' il va te renvoyer vers le menu principal: Menu principal > (affiche) Emplacement I (envoie) > Menu principal IV /- GOSSIP_MENU & NPC_TEXT Bon là on va faire un texte custom à afficher dans le gossip_menu parce que 'Greetings $n' c'est un peu de la m*rde. Donc la on va lui donner un texte custom à afficher et on va lier ce texte à la page en gros. SET @ID := (SELECT MAX(id)+1 FROM creature_template); INSERT INTO `npc_text` (id, text0_0) VALUES (@ID, 'Ton Texte'); -- Si tu souhaite rajouter plusieurs texte pour plusieurs pages tu copie colle la ligne et tu met (@ID+1) oublie pas de remplacer le ";" par un "," faut surtout pas oublier que le ";" signifie "FIN DE CODE" SET @MenuID := (SELECT MAX(menuid) FROM gossip_menu_option); INSERT INTO `gossip_menu` (menuid, textid) VALUES (@ID, @MenuID); -- Si tu as créé plusieurs textes et donc plusieurs "pages/catégorie" alors en gros ça dit "Affiche Texte(@ID) sur la Page(@MenuID)" Donc là tu as ton texte, tu as mis ton texte sur les/la page(s), c'est partit pour la fin IV /- SMART_SCRIPT C'est partit pour le plus chiant, alors là je compte sur toi pour augmenter ta concentration à 687%, j'ai besoin de toutes tes facultés mentale. SET @Entry := (SELECT MAX(entry) FROM creature_template), @GossipMenuId := (SELECT MAX(menuid) FROM gossip_menu_option); UPDATE `creature_template` SET ainame = 'SmartAI' WHERE entry = @ENTRY; INSERT INTO `smart_scripts` (entryorguid, id, event_type, event_chance, event_param1, event_param2, action_type, action_param1, target_type, target_x, target_y, target_z, target_o, COMMENT)VALUES (@Entry, 0, 62, 100, @GossipMenuId, 0, 62, M, 7, X, Y, Z, O, 'TP '); Go go go pour les explications bien relous : @Entry c'est l'entry de ton PNJ 0 c'est l'id faut ajouter +1 à chaque fois que rajoute une ligne 62 c'est l'ID de l'événement pas besoin de le changer 100 c'est le pourcentage de chance de "recevoir" l'event, en gros. @GossipMenuID c'est le numéro de ta page 0 c'est l'id de ton option (OptionID en gros dans gossip_menu_option) 62 c'est l'action donc la Teleport M c'est le numéro de ta map ou tu souhaites TP ton joueur (Faut que tu le change quoi) 7 c'est la target donc la c'est ACTION_INVOKER donc le joueur quoi c'est lui qui clique donc il invoque l'action X, Y, Z, O faut le changer en donnant les positions pour ton TP Et le dernier c'est un commentaire je te conseil d'en mettre un bien complet pour comprendre ce que fais ta ligne. Et voilà Monsieur/Madame ton téléporteur fonctionne enfin à 100%, c'est vrais qu'un tutoriel écris est quand pas mal difficile à comprendre et même à écrire, en tout cas si vous avez des questions, je suis disponible sur Discord et sur ce forum Allez Salut
  7. Faire s'asseoir un PNJ [ < TC Rev.63] Bonjour et bienvenue à SOLSTICE! Pour les biens de ce tutoriel, j'utilise cette petite zone fort sympathique. Depuis la mise à jour de TrinityCore (rev.63 et supérieure) il est devenus compliquer de faire jouer certaines emotes au PNJ (des emotes ressemblant à celle des joueurs). Les faire s'asseoir, dormir ne se gère plus via une émote. (Avant il suffisait de rajouter l'emote 13 dans creature_addon) ATTENTION si vous utilisez un GOBJECT de banc cliquables des emotes sont faites pour ceci! CETTE méthode ne s'applique que pour faire s'asseoir les PNJ comme les joueurs, lorsque le joueur appuie sur "X" Après avoir placer vos PNJ sur des bancs, sélectionnez les et faite un petit .NPC INFO Il nous faut sont GUID. Maintenant que nous avons sont GUID nous nous rendons dans creature_addon Nous souhaitons voir ce pnj s'asseoir, pour cela vous allez créer une ligne avec le GUID précédemment trouvés. Guid Bytes1 Bytes2 Dans Bytes1 vous allez tout simplement mettre "1" qui correspond au "Bytes" pour s'asseoir Dans Bytes2 vous allez remettre "0" ça évite de voir les PNJ avec ses armes de sortis, à utilisez par précaution. SET @GUID := [TONGUID], @Bytes1 := 1, @Bytes2 := 0; DELETE FROM `creature_addon` WHERE (guid = @GUID); INSERT INTO `creature_addon` (`guid`, `bytes1`, `bytes2`) VALUES (@GUID, @Bytes1, @Bytes2); Voilà nos PNJ sont maintenant assis comme des joueurs. Tutoriel très rapide, rien de compliqués, à bientôt j'espère. SOURCE : TrinityCore/src/server/game/Entities/Unit/UnitDefines.h Bytes1 : UNIT_STAND_STATE_STAND = 0, UNIT_STAND_STATE_SIT = 1, UNIT_STAND_STATE_SIT_CHAIR = 2, UNIT_STAND_STATE_SLEEP = 3, UNIT_STAND_STATE_SIT_LOW_CHAIR = 4, UNIT_STAND_STATE_SIT_MEDIUM_CHAIR = 5, UNIT_STAND_STATE_SIT_HIGH_CHAIR = 6, UNIT_STAND_STATE_DEAD = 7, UNIT_STAND_STATE_KNEEL = 8, UNIT_STAND_STATE_SUBMERGED = 9 SOURCE : [Hidden Content] Bytes2 : 0 = STATE_UNARMED (not prepared weapon) 1 = STATE_MELEE (prepared melee weapon) 2 = STATE_RANGED (prepared ranged weapon)
  8. CRÉER UN PNJ QUI MORPH Bonjour, Arrête de relire, tu as bien lu ! Aujourd’hui nous allons voir comment créer un PNJ qui va simplement nous morph ! On va donc créer un PNJ, un Sort et .. un .. Cerveau ! I /- OUTILS Un Éditeur de Base de donnée (Mysql Workbench, SQLyog, Navicat etc.) Une Base de donnée World Du coca ou une boisson parce que là on en a pour longtemps! II /- CREATURE_TEMPLATE ? Bon pour commencer il nous faut créer un PNJ de type POULE (ou autre t'es grand tu fais ce que tu veux)! VARIABLE LOCALE ! SET @ENTRY:= 50001, -- Bah .. l\'entry (Genre son ID quoi pour le faire spawn), @ModelID:= 304, -- Son Model aka son Skin, @Type:= 7, -- Son Type (Genre Humanoïde, Géant, Bête etc.), @NPCFlag:= 1, -- Imagine ça comme des options, mais genre des options bien sympas, @Unit_Class:= 1, -- La classe de ton PNJ il en existe pas beaucoup (1= Guerrier (Barre de vie seulement et beaucoup de Vie) 2= Paladin (Beaucoup de Vie et peu de Mana), 4= Voleur (Barre de Vie seulement et peu de Vie), 8= Mage (Peu de Vie et beaucoup de Mana)) @Unit_Flags:= 2048, -- Encore plus d\'option la normalement c\'est le moment ou tu peu "activer" la regen de vie etc. @Faction:= 35, -- Sa faction nous on va utiliser la faction 35 parce qu\'on a la flemme de cherche une autre faction ;) @Name:= 'Poulet de Fou!', -- Déconne pas .. c\'est son nom @SubName:= 'Il te Morph!', -- Bah son sous nom .. @MinLevel:= 80, -- Son niveau minimum, minimal, son niveau mini! @MaxLevel:= 80, -- T\'as compris le truc .. @AIName:= 'SmartAI', -- Alors l\'AIName c\'est compliqués, tu peux en avoir plusieurs mais nous on s\'en fou on juste utiliser le SmartAI @Gossip_menu_id:= 60005; -- L\'ID du Gossip_Menu_Option, on s\'en sert juste après ^^ DELETE FROM `creature_template` WHERE (entry = @ENTRY); INSERT INTO `creature_template` (`entry`, `name`, `subname`, `modelid1`, `npcflag`, `unit_class`, `unit_flags2`, `AIName`, `faction`, `type`, `minlevel`, `maxlevel`, `gossip_menu_id`) VALUES (@ENTRY, @Name, @SubName, @ModelID, @NPCFlag, @Unit_Class, @Unit_Flags, @AIName, @Faction, @Type, @MinLevel, @MaxLevel, @Gossip_menu_id); Vas y copite, de toute façon je sais que tu lis rien .. Pff méchant va! III /- GOSSIP_MENU_ACTION On est partit pour le GOSSIP_MENU_OPTION! SET @MenuID:= 60005, -- L\'ID du gossip_menu_option là c\'est = 60005 @OptionID:= 0, -- C\'est l\'ordre du gossip, enfin des options @OptionIcon:= 0, -- Tu peu tout simplement mettre une petite icône sympas @OptionText:= 'Morph moi si tu peux!', -- Bah c\'est le texte ex : "Montrez moi ce que vous avez à vendre". Tu comprend là, dans ta tête le PNJ commence à prendre forme @OptionType= 1, -- Simple tu met la même chose que dans OptionNPCFlag (Sauf dans certains cas, moi je te conseil de mettre 1), sinon c\'est des "Flags" des options si tu préfères @OptionNPCFlag:= 1, -- Simple tu met ce que tu as mis dans NPCFLAG de ton creature_template, tu met toujours ce qu\'il y a dans creature_template colonne NPCFLAG ! TOUJOURS! @ActionMenuID:= 60005; -- Bon tu peu en gros liée un Gossip à un autre genre tu clique sur Menu 1 tu arrive sur Page 2 DELETE FROM `gossip_menu_option` WHERE (MenuID = @MenuID); INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionType`, `OptionNPCFlag`, `ActionMenuID`)VALUES (@MenuID, @OptionID, @OptionIcon, @OptionText, @OptionType, @OptionNPCFlag, @ActionMenuID); IV /- GOSSIP_MENU & NPC_TEXT SET @MenuID := 60005, -- Alors c\'est l\'ID du MenuID de ton Gossip_Menu_Option Aka (60005) @TextID := 60005; -- C\'est l\'ID du NPC_Text DELETE FROM `gossip_menu` WHERE (MenuID = @MenuID); INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES(@MenuID,@TextID); Là on passe au NPC_TEXT pour faire quelques chose de propre et pas laisser "Greetings". SET @ID:= 60005, -- C\'est son ID le même que tu as dans Text_ID de Gossip_Menu @Text0_0:= '|Accueil > ? |\r\n\r\n Cot ? Cot cot .. ! COT!'; -- C\'est son Texte que tu vas voir sur la jolie page aka Gossip_Menu_Option DELETE FROM `npc_text` WHERE (ID = @MenuID); INSERT INTO `npc_text` (`ID`, `text0_0`) VALUES(@ID,@Text0_0); V /- SPELL_DBC Alors je suis désolé mais je vais pas t'expliquer chaque colonne, juste 3 colonnes. - Pourquoi ? Parce que cette table c'est SPELL.DBC version SQL et j'en parle dans un prochain tutoriel. Donc pour le moment tu recopie comme un gogole et tu arrêtes DE POSER DES QUESTIONS ! SET @ID:= , -- Spell.DBC de ton DBC de ton serveur qui viens compléter le tout, donc met un ID abuseyy @EFFECTMISCVALUE1:= , -- Long à écrire celui là! Alors la en gros ton joueurs vas se transformer en ce que tu auras mis ici, donc tu met l\'ENTRY du PNJ auquel tu veux que ton joueurs ressemble @Comment:= 'Poulet - Morph joueur > Poulet'; -- Met un commentaire, met le nom de ton sort et son effet DELETE FROM `spell_dbc` WHERE (Id = @ID); INSERT INTO `spell_dbc` (`Id`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `Stances`, `StancesNot`, `Targets`, `CastingTimeIndex`, `AuraInterruptFlags`, `ProcFlags`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `StackAmount`, `EquippedItemClass`,`EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `Effect1`, `Effect2`, `Effect3`, `EffectDieSides1`, `EffectDieSides2`, `EffectDieSides3`, `EffectRealPointsPerLevel1`, `EffectRealPointsPerLevel2`, `EffectRealPointsPerLevel3`, `EffectBasePoints1`, `EffectBasePoints2`, `EffectBasePoints3`, `EffectMechanic1`, `EffectMechanic2`, `EffectMechanic3`, `EffectImplicitTargetA1`, `EffectImplicitTargetA2`, `EffectImplicitTargetA3`, `EffectImplicitTargetB1`, `EffectImplicitTargetB2`, `EffectImplicitTargetB3`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectRadiusIndex3`, `EffectApplyAuraName1`, `EffectApplyAuraName2`, `EffectApplyAuraName3`, `EffectAmplitude1`, `EffectAmplitude2`, `EffectAmplitude3`, `EffectMultipleValue1`, `EffectMultipleValue2`, `EffectMultipleValue3`, `EffectItemType1`, `EffectItemType2`, `EffectItemType3`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectMiscValue3`, `EffectMiscValueB1`, `EffectMiscValueB2`, `EffectMiscValueB3`, `EffectTriggerSpell1`, `EffectTriggerSpell2`, `EffectTriggerSpell3`, `EffectSpellClassMaskA1`, `EffectSpellClassMaskA2`, `EffectSpellClassMaskA3`, `EffectSpellClassMaskB1`, `EffectSpellClassMaskB2`, `EffectSpellClassMaskB3`, `EffectSpellClassMaskC1`, `EffectSpellClassMaskC2`, `EffectSpellClassMaskC3`, `MaxTargetLevel`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `MaxAffectedTargets`, `DmgClass`, `PreventionType`, `DmgMultiplier1`, `DmgMultiplier2`, `DmgMultiplier3`, `AreaGroupId`, `SchoolMask`, `Comment`) VALUES(@ID,'0','0','384','0','0','0','0','0','0','0','0','0','0','1','0','0','101','0','0','0','0','21','1','0','- 1','0','0','6','0','0','0','0','0','0','0','0','0','0','0','0','0','0','1','0','0','0','0','0','0','0','0','56','0','0','0','0','0','0','0','0','0','0','0',@EFFECTMISCVALUE1,'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',@Comment) VI /- Smart_Scripts Bon plus que ça et ... c'est finis ! T'imagine ?! Déjà ! Alors là j'ai fait les VARIABLES LOCALE à ma manière tu peux faire comme tu veux, mais c'est mieux ranger pour ma lecture. SET @ENTRY:= 50001, -- L\'ID du PNJ (Pour lier ça à ta créature!) @ID:= 0, -- Bon la t\'es pas con, t\'as compris @LINK:= 1, -- Sympas ce machin en gros tu peu liéer 1 EVENT_TYPE à 2 ACTION_TYPE (Genre la nous on veux on gossip select > remove item et morph) @ID_1:= 1, -- Pareil que le ID normal quoi .. @EventType_1:= 62, -- Simple c\'est event_type tu as plusieurs type, la nous on utilise l\'event GOSSIP_SELECT @EventType_2:= 61, -- Et ici on utilise le LINK @EVENT_PARAM1:= 60005, -- Donc la on met tout simplement le gossip_menu_option @ACTION_TYPE_1:= 57, -- Comme pour event_type tu as plusieurs Action_type nous on utilise le REMOVE_ITEM @ACTION_TYPE_2:= 75, -- Et la le ADD_AURA @ACTION_PARAM1_1:= 6948, -- Ici l\'ID de l\'ITEMS qu\'il faut pour se faire morph (En gros toi tu as une pierre de foyer, le PNJ te le retire et te morph, si tu as pas pierre de foyer, pas de morph) @ACTION_PARAM2_1:= 1, -- Le nombre d\'items qu\'il faut pour se faire morph (1 Pierre de foyer dans notre exemple) @ACTION_PARAM1_2:= 190000, -- L\'ID du Sort aka de l\'Aura car oui tu as créer un sort mais le PNJ ne va pas lancer le sort il va appliquer le sort au joueurs aka appliquer une AURA @TARGET_TYPE:= 7, -- Le target Type ! Super ce truc, donc la on met le 7 aka Action_Invoker @COMMENT_1:= 'Poulet > 6948 x1 > Link 1', -- Les commentaire, je te conseil la de bien mettre ce qui se passe au plus simple, évite les longue phrases c\'est chiant à lire. @COMMENT_2:= 'Poulet > Link 1 > Morph 50001'; -- Mais oublie pas faut que ça soit compréhensible de tous ou au moins des gars de ton équipe. DELETE FROM `smart_scripts` WHERE (entryorguid = @ENTRY); INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES (@ENTRY, 0, @ID, @LINK, @EventType_1, 0, 100, 0, @EVENT_PARAM1, 0, 0, 0, @ACTION_TYPE_1, @ACTION_PARAM1_1, @ACTION_PARAM2_1, 0, 0, 0, 0, @TARGET_TYPE, 0, 0, 0, 0, 0, 0, 0, @COMMENT_1), (@ENTRY, 0, @ID_1, 0, @EventType_2, 0, 100, 0, 0, 0, 0, 0, @ACTION_TYPE_2, @ACTION_PARAM1_2, 0, 0, 0, 0, 0, @TARGET_TYPE, 0, 0, 0, 0, 0, 0, 0, @COMMENT_2); Oublie pas que les point d'honneur sont aussi comptés comme étant des items simple tu va sur wowhead tu cherche point d'honneur et honnor_points dans ta table item_template et hop t'as plus qu'a changés l'ID de l'items. EXPLICATION : J'aurais plus faire un smart_script avec un morph direct, sans passer par un sort, mais en passant par un sort si le mec se fait buter il devras repayer pour être morph, (ce qui peu être bien si tu fais fonctionner ça avec des points de vote BAAAAM! T'as finis. Sérieux, là tu as appris à créer un sort qui morph directement en SQL, tu as aussi appris à créer un gossip lui liés un petit texte sympas et tout. Bon allez Salut
  9. Soit dans ton dossier "etc" sous linux, soit à côtés de ton WorldServer sur Windows.
  10. Pas de soucis Et merci pour la mise en avant