Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'tutoriel'.



Plus d’options de recherche

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Inscription & Connexion
    • Inscription
    • Connexion
  • Espace Communautaire
    • Funky-Emulation
    • Présentations
    • Discussions Générales
    • Bureau de la Communauté
    • Espace Gaming
    • Espace Premium
  • Emulation & Co
    • Réécrire un Partage / Tutoriel
    • Proposer un Partage / Tutoriel
    • La Boite à Idées
  • Emulation de jeux
    • RaiderZ
    • Aura Kingdom
    • Metin2
    • Dofus
    • Minecraft
    • World of Warcraft
    • Aion
    • Habbo
    • Wakfu
    • GTA San Andreas
    • Jeux .IO
    • Divers
  • Espace Divers
    • Logiciels
    • Programmation
    • Administration de Systèmes
    • Arts
    • Discord
    • Mobile
    • Divers
  • Internationnal Forum
    • Community
    • Games Emulation
    • Others
  • Corbeille & Archives
    • Archives (FR...)
    • Archives (INT...)
  • Forum de PassionDev

Rechercher les résultats dans…

Rechercher les résultats qui contiennent…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


Discord


Skype


Biographie


Nationalité


Sexe

53 résultats trouvés

  1. 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
  2. Niveau requis : Débutant Temps estimé : 30 minutes Salut à toi ! Tu n'as jamais fait de serveur Metin2 ? Ce tutoriel est fait pour toi ! Je vais t'expliquer comment créer un serveur de A à Z ! Tu pourras ensuite le modifier à ta guise et le mettre à ton image. Information. Lors de ce tutoriel, vous allez apprendre à créer un serveur en local. Vous serez le seul à pouvoir vous y connecter. Information. Les fichiers utilisés sont les files 2014. Vous pourrez à l'avenir les changer sans aucun problème Pré-requis: Virtual Box, qui nous permettra de virtualiser un système d'exploitation. En effet, un serveur Metin2 fonctionne sous FreeBSD, il sera plus simple pour vous de virtualiser ce système sur votre Windows que de faire une deuxième installation sur votre ordinateur. Navicat, un client Mysql. Il vous permettra de vous connecter à la base de données de votre serveur Metin2. On y retrouveras toutes les informations liées aux joueurs, aux items, aux comptes des utilisateurs, etc ... WinSCP, un client SFTP. Similaire au FTP, il vous permettra de naviguer sur les différents fichiers de votre serveur (maps, configurations, etc ..) Le serveur VDI tout prêt pour vous qui possède déjà tous les fichiers du serveur avec FreeBSD d'installé. Il ne nous manquera plus qu'à le lancer avec Virtual Box. Le client metin2 qui vous permettra de vous connecter en jeu à votre serveur. I. La machine virtuelle II. Lancement du serveur Metin2 III. Se connecter In Game IV. Accéder aux fichiers du serveur V. Accéder à la base de données Succès ! Vous venez de créer un serveur Metin2 en local. Vous pouvez maintenant vous amuser sur votre serveur ou tout simplement y rajouter des fonctionnalités sympas. Pour continuer: Vous trouverez de nombreux partages et de tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Vous pouvez créer un compte GM en suivant ce tutoriel Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Bon courage à vous et bienvenue dans le monde des serveurs privés Metin2 !
  3. Bonjour, Bien que ce ne soit pas compliquer pour tout le monde, ceci peut en aider certains. Je vous propose donc de voir comment modifier le texte lorsqu'un MJ fait les commandes .announce, .nameannounce, .gmannounce et .gmnameannounce. C'est parti... Donc pour faire ceci, vous n'aurez qu'à vous rendre dans votre table trinity_string dans votre db world. Pour le .nameannounce Entry : 787 (recherchez l'entry via le filtre > entry contient 787) content_default : |cffffff00[|c1f40af20Message de|r |cffff0000%s|cffffff00]:|r %s|r (copiez et collez) Pour le .announce Entry : 3 (recherchez l'entry via le filtre > entry contient 3) content_default : |cffff0000[Message du serveur]|r : %s (copiez et collez) Pour le .gmannounce Entry : 6613 (recherchez l'entry via le filtre > entry contient 6613) content_default : |cfff00000[sTAFF]|r[|c1f40af20Message|r]: %s (copiez et collez) Pour le .gmnameannounce Entry : 6615 (recherchez l'entry via le filtre > entry contient 6615) content_default : |cfff00000[sTAFF]|r|cffffff00[|c1f40af20Message de|r |cffff0000%s|cffffff00]:|r %s|r (copiez et collez) Si ce tutoriel permet d'en aider certains, alors tant mieux.
  4. 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
  5. 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 : [Contenu Masqué] Bytes2 : 0 = STATE_UNARMED (not prepared weapon) 1 = STATE_MELEE (prepared melee weapon) 2 = STATE_RANGED (prepared ranged weapon)
  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. Niveau requis : Intermédiaire Temps estimé : 30 minutes Bonjour à tous, Ce tutoriel va vous expliquer comment installer un environnement FreeBSD complet pour Metin2 une machine complètement vierge en installant FreeBSD par vous même. Ce tutoriel fonctionne aussi pour installer un environnement sur un serveur dédié. Pré-requis: Virtual Box qui vous permet de virtualiser le système d'exploitation FreeBSD FreeBSD. Téléchargez l'ISO de la version souhaité. Dans ce tutoriel, j'utiliserai la version 9.3 Les sources de Metin2 Les libs, nécessaires au bon fonctionnement de votre environnement Avoir Internet I. Configurer sa Virtual Machine (VM) II. Configuration de MySQL III. Installer des files IV. Mettre en place les sources de Metin2 Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Pour configurer votre client pour connecter à votre serveur, suivez ce tutoriel Vous pouvez apprendre à sauvegarder vos fichiers durablement Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  8. Niveau requis : Intermédiaire Temps estimé : Entre 5 et 10 minutes Le nécessaire : Pour réaliser ce tutoriel et l'expérimenter vous même, vous allez avoir besoin de sources serveur (game) compilables et utilisables. Pour la compréhension du tutoriel, vous aurez juste besoin de votre cerveau, et pour ceux qui n'en ont pas sous la main, essayez quand même ! Nous allons ensemble créer la fonction metin (utilisable grâce à un joueur qui enverrait dans le chat "/metin") qui aura pour rôle de nous renvoyer un message contenant notre pseudo, par exemple. I. Déclarer notre fonction : Pour commencer, nous allons devoir déclarer notre fonction, c'est à dire le protocole qui sera exécuté lorsque notre commande sera envoyée par le joueur. Pour cela, rendez-vous dans le fichier cmd.cpp, vous y trouverez dès le début du fichier quelques lignes comme celle-ci : ACMD(do_[...]); Nous allons suivre cette syntaxe, et déclarer notre fonction pour la commande, tapons : ACMD(do_metin); Notes : N'oubliez pas le point virgule pour marquer la fin de notre déclaration; Ne vous souciez pas des arguments que prendra notre fonction. II. Définir notre fonction : Maintenant que notre fonction est déclarée, il nous faut maintenant la définir. Pour cela, le fichier n'est pas fixe, selon la commande, vous utiliserez un fichier différent parmi : cmd_general.cpp; cmd_emotions.cpp; etc... Ici, notre commande sera accessible à tous et n'est pas relative à certaines conditions, nous allons donc la placer dans le fichier cmd_general.cpp. Nous allons comme toute définition reprendre la déclaration et l'étendre : ACMD(do_metin) { // Content } Maintenant, pour savoir quoi mettre, nous allons revenir à notre objectif principal : envoyer un message. Pour cela, nous allons utiliser la fonction ChatPacket. Elle prend deux paramètres, la type de message, puis le message en lui même. Pour cela une seule ligne suffit : ch->ChatPacket(); (ch, abréviation de character, sert à désigner le joueur qui envoie la commande) Nous utiliserons le canal habituel pour les retour de commande : CHAT_TYPE_INFO. Un problème persiste encore : Comment récupérer le pseudo du joueur ? Vous vous souvenez de notre ch ? Il va nous servir, grâce à la fonction getName(), qui n'attend pas d'argument. Nous utiliserons ensuite le format habituel pour la concaténation en C++, et notre ChatPacket(), pour obtenir cette fonction : ACMD(do_metin) { ch->ChatPacket(CHAT_TYPE_INFO, "Votre nom est %s", ch->Getname()); } Notez que vous pouvez très bien utiliser la fonction LC_TEXT(), qui vous permettra d'obtenir le texte correspondant dans votre locale_string.txt ! III. Déclarer notre commande : Il reste une toute dernière étape : déclarer notre fonction. Il suffit d'ajouter une ligne à notre fichier cmd.cpp : Visitez un peu le fichier, et vous trouverez une liste avec tout un tas de ligne comme celle que nous allons ajouter : { "metin", do_metin, 0, POS_DEAD, GM_PLAYER }, Notez que : La première information est le nom de la commande en jeu; La deuxième est la fonction à laquelle la commande est liée; La dernière est le grade minimum pour avoir accès à cette fonction. Vous pouvez maintenant compiler vos sources et admirer votre magnifique commande. Pour continuer: Pour compléter ce tutoriel et ne pas laisser cette ligne vide, je vous propose de changer notre fonction pour que je vous apprendre à utiliser des commandes à arguments. Nous allons par exemple demande à l'utilisateur de renseigner son nom, et nous n'utiliserons plus le ch->GetName(). Les changements s'effectueront exclusivement dans la définition de la fonction. Créons pour commencer une variable pour stocker l'argument : char arg1[256]; Nous allons devoir stocker notre argument de dans, nous utiliserons la fonction : one_argument() : one_argument(argument, arg1, sizeof(arg1)); Cependant, cela ne suffit pas, cette ligne ne vérifie pas l'existence de l'argument. Nous allons donc ajouter après une condition vérifiant son intégrité ou non : if (!*arg1) { ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /metin <name>"); return; } Si l'argument n'existe pas, nous renvoyons directement à l'utilisateur l'usage de la commande. Nous allons maintenant pouvoir retaper notre fonction pour envoyer un message, mais ne plus utiliser notre ch->GetName(), mais notre arg1. ACMD(do_metin) { char arg1[256]; one_argument(argument, arg1, sizeof(arg1)); if (!*arg1) { ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /metin <name>"); return; } ch->ChatPacket(CHAT_TYPE_INFO, "Votre nom est %s", arg1); } Vous pouvez de nouveau compiler vos sources et tester. Notez que la fonction change en fonction du nombre d'argument, par exemple : two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); Merci de m'avoir lu, en espérant que ce modeste tutoriel puisse être utile à quelques personnes. Drei.
  9. Niveau requis : Débutant Temps estimé : 5 minutes Salut à toi ! Le client est composé d'un dossier pack, comportant plusieurs fichiers qui sont cryptés. Dans ces fichiers, on y retrouve toutes sortes de ressources comme les fichiers python du client, les maps, les modèles 3D, les textures, etc ... Information. Le dossier pack contient tous les fichiers cryptés et compressés. Ils sont compressés car cela permet de réduire considérablement leur taille. Ce qui est très utile pour quelqu'un qui télécharge le client ou même en ce qui concerne la lecture des packs par le client. Des logiciels ont été créé afin de permettre de décompresser / décrypter ces fichiers (pour obtenir leur contenu en clair) et de pouvoir ensuite les recompresser / recrypter. Ce tutoriel vous expliquera comment depack un fichier, modifier le contenu et comment repack celui-ci pour que cela prenne effet sur votre client. Pré-requis: Il vous faut un client Metin2. C'est ce que vous utilisez pour vous connecter à votre serveur. Eternexus qui est un logiciel de repack / depack simple conçu pour les fichiers de Metin2 I. Depack un fichier II. Repack un fichier Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  10. Salut à toi ! Tu n'as jamais fait de serveur Metin2 ? Ce tutoriel est fait pour toi ! Je vais t'expliquer comment créer un serveur de A à Z ! Tu pourras ensuite le modifier à ta guise et créer un serveur à ton image ! Lors de ce tutoriel, vous allez apprendre à créer un serveur avec HAMACHI ! Vous pourrez ainsi vous connecter avec vos amis via le réseau Hamachi ! Prêt ? Alors commençons ! Attention !! Ce tutoriel ne fonctionnera seulement avec des files Metin2 <= 2012 (ce sont les files 2014 installés sur cette VM). Il faut donc installer les filles 2012 une fois le serveur configuré. Aujourd'hui, aucune solution n'a été trouvé pour faire fonctionner un serveur Hamachi avec des files 2014+. Problème rencontré: Quand une personne externe choisi un personnage lors de la sélection, il se fait instantanément déconnecté par le serveur. I. Téléchargement VirtualBox - [Contenu Masqué] Navicat - [Contenu Masqué] WinSCP - [Contenu Masqué] Le serveur (le VDI) - [Contenu Masqué] Le client - [Contenu Masqué] Hamachi - [Contenu Masqué] Port (Le fichier #138) - [Contenu Masqué] II. La machine virtuelle 1. Avant de se lancer dans la création de la machine, installez Hamachi et lancez le. Vérifiez que Hamachi est bien actif. Vous devriez avoir cela (avec votre propre IP Hamachi). Dans mon cas, mon IP Hamachi est: 25.73.148.152 (Notez bien votre IP Hamachi, nous en aurons besoin ! 2. Installez VirtualBox. Il nous permettra de virtualiser le système d'exploitation FreeBSD. 3. Lancez le logiciel VirtualBox 4. Cliquez sur le bouton Nouvelle, en haut à gauche 5. Choisissez un nom pour votre machine virtuelle. Dans Type, choisissez BSD et dans Version, FreeBSD (32bit ou 64bit en fonction de votre ordinateur). Et cliquez sur Suivant 6. Allouez la mémoire vive à votre machine virtuelle en fonction de votre ordinateur. Le minimum conseillé est 1go (1024Mo). N'hésitez pas à en donner plus le temps que le curseur est dans la barre verte. Cliquez sur Suivant. 7. Cochez la case " Utiliser un fichier de disque dur virtuel existant " et choisissez le fichier VDI (.vdi) que vous avez téléchargé. Cliquez ensuite sur Créer. 8. Votre machine virtuelle est crée. Configurons la carte réseau. Clique droit sur votre VM (virtual machine) puis Configuration 9. Dans le menu Réseau, mettez " Accès par pont " dans mode d'accès réseau et dans nom, mettez la carte réseau Hamachi !). Cliquez ensuite sur OK. 10. Votre machine virtuelle est maintenant créée ! III. Configuration de la machine virtuelle 1. Pour lancer votre machine virtuelle, il suffit de cliquer deux fois sur votre machine. Une fenêtre s'ouvre et votre système d'exploitation démarre. Patientez. On vous demande ensuite de vous connecter à un utilisateur. 2. Dans login, entrez: root pour login et dans Password, mettez mcncc.com. Vous êtes maintenant connecté et vous avez accès à tout le système d'exploitation. Tapez la commande sysinstall dans le terminal. Vous tomberez sur: 3. Vous pouvez naviguer dans ce menu avec les flèches du haut et du bas puis la touche Entrée pour sélectionner le choix. 4. Dans l'ordre, allez sur Configure, puis Networking puis Interfaces. Vous tombez sur: 5. Choisissez em0. Une petite fenêtre s'ouvre. Répondez No. Une autre s'ouvre, répondez No aussi. Vous tombez sur la configuration de l'interface réseau. 6. Configurez comme sur le screen ci-dessous. Remplacez VOTRE_IP_HAMACHI par l'IP que vous avons vu tout à l'heure sur le logiciel Hamachi, dans mon cas 25.73.148.152. (le petit 1 u I)). Et remplacez IP_HAMACHI_100 par votre IP Hamachi .100. L'IP .100 est tout simplement votre IP Hamachi mais avec le nombre 100 à la fin. Par exemple dans mon cas, l'IP Hamachi est: 25.73.148.152, alors mon IP .100 sera: 25.73.148.100. 7. Une fois la configuration terminé, validez avec le bouton OK. Vous tomberez sur le screen ci-dessous. Répondez Yes à la question. 8. Appuyez sur la touche Echap (ou le bouton Cancel) jusqu'à quitter cette interface. 9. Tapez la commande /etc/rc.d/netif restart pour prendre en compte le changement. Les informations de votre interface réseau s'affichent: 10. L'adresse IP devrait s'afficher. Je l'ai entouré en rouge. C'est celle qui se termine par .100. Pensez à bien noter votre adresse IP (celle qui s'affiche sur votre machine et non celle du screen). Nous en aurons besoin. IV. Configuration de portmap 1. Commencez par ouvrir le logiciel portmap.exe. Vous avez une liste de port, il va falloir tous les configurer sur votre IP .100 2. Pour chaque ports (un port = une ligne), répétez les étapes 2 et 3. Sélectionnez la ligne souhaité puis cliquez sur l'icône en haut à gauche. 3. Une petite fenêtre s'ouvre. Mettez votre IP .100 dans le champ indiqué (voir screen ci-dessous) et valider en cliquant sur le bouton (entouré en rouge): 4.Une fois tous les ports configuré, vous devriez voir votre adresse IP .100 configuré sur tous les ports dans la colonne indiqué ci-dessous. (Dans le cas du screen, c'est mon IP .100) 5. Pour chaque ligne (les sélectionner une par une), cliquez sur le bouton vert qui se trouve en haut pour les activer (le cercle vert avec l'icône blanche dedans). Vous devriez avoir toutes les pastilles de couleur verte ! 6. La configuration de portmap est terminé ! Laissez la fenêtre ouverte, sinon cela ne fonctionnera plus ! V. Lancement du serveur Metin2 1. Retournons sur la machine virtuelle (VirtualBox). Tapez la commande: cd /usr/metin2 (voir screen ci-dessous). 2. Vous voila dans le dossier de votre serveur metin2. Pour démarrer le serveur il suffit de taper: sh start.sh (et sh stop.sh pour l'arrêter). Entrez ensuite le nombre de channel que vous voulez ouvrir. Pour commencer, un seul suffit. 3. Votre serveur Metin2 est lancé ! Il ne vous reste plus qu'à configurer votre client ! Bien entendu, laissez votre fenêtre Virtual Box ouverte pour que votre serveur reste ouvert. VI. Créer son réseau Hamachi ! 1. Afin que vous puissiez vous connecter tous ensemble sur le serveur, il faut créer un réseau Hamachi. Pour cela, sur Hamachi, cliquez sur Réseau puis Créer un réseau. 2. Dans ID Réseau, mettez le nom du réseau (ce que vous souhaitez). Et dans Mot de passe, le mot de passe d'accès à votre réseau. Cliquez ensuite sur Créer. Votre réseau Hamachi est créé. 3. Attention ! Pour que les joueurs puissent se connecter à votre serveur, il faut qu'ils rejoignent votre réseau. Pour cela, au lieu de cliquer sur Créer un réseau (dans le menu Réseau), cliquez sur Rejoindre un réseau. Ensuite il suffit juste de rentrer le nom du réseau puis de cliquer sur Rejoindre. 4. Par exemple sur mon réseau asikoojtm, j'ai un joueur qui la rejoint. (je l'ai caché pour ne pas voir son nom mais c'est Asikoo). VI. Se connecter In Game ! 1. Commencez par extraire le client de Client 2014.rar sur votre bureau. 2. Il faut configurer le client de sorte à ce qu'il se connecte sur l'adresse IP de votre serveur. Il existe un tutoriel pour vous apprendre à le faire: [Contenu Masqué] 3. Dans le tutoriel, on vous demande de mettre une adresse IP. Pour votre client Metin2, il faut configurer votre client sur l'adresse IP .100. Par contre, pour ceux qui veulent se connecter sur votre serveur Hamachi, il faut configurer le client sur l'IP Hamachi normale (Celle qui ne termine pas par 100). Donc un client pour vous et un client pour vos joueurs. 4. Dans mon cas, 25.73.148.100 pour mon client à moi et 25.73.148.152 pour mes joueurs. 5. Une fois la configuration terminée, lancez metin2client.exe qui se trouve à la racine de votre client. 6. Connectez vous avec ces identifiants. User: admin Mot de passe: test 7. Choisissez votre personnage et ça y est, vous voila sur votre premier serveur privé Metin2 ! VII. Accéder aux fichiers du serveur 1. Pour accéder aux fichiers du serveur, il faut installer le logiciel WinSCP. Une fois installé, lancez le. 2. Cliquez sur nouveau site et remplissez comme l'image ci dessous 3. Vous voici connecté à WinSCP. Vous avez tout simplement un accès à votre système d'exploitation FreeBSD mais cette fois avec un explorateur de fichier, et non en ligne de commande. 4. Déplacez-vous dans l’arborescence. Cliquez sur .. pour revenir à la racine du serveur, cliquez sur le dossier usr puis metin2. Vous tombez sur: 5. Ceci sont les fichiers serveur de votre serveur Metin2 ! VIII. Accéder à la base de données du serveur 1. La base de données contient toutes les données de votre serveur (comptes, joueurs, etc ..). Pour y accéder, installez Navicat et lancez-le. 2. Cliquez sur le bouton Connection puis MySQL 3. Remplissez comme l'image ci-dessous puis cliquez sur Ok: 4. La connexion s'est créé dans le volet de gauche. Il suffit juste de cliquer 2 fois dessus pour s'y connecter. 5. Ceci est la base de donnée de votre serveur Metin2 ! IX. Fin du tutoriel C'est tout bon, vous avez tous les outils pour créer un serveur Metin2 à votre image FAQ des débutants à voir absolument: [Contenu Masqué] Si tu as besoin d'aide, n'hésite pas à aller créer un topic dans la catégorie Aide / Question / Support de la section Metin2. La communauté sera là pour vous aider. Bon courage, jeune apprenti !
  11. Niveau requis : Intermédiaire Temps estimé : 30 à 45 minutes Bonjour/Bonsoir! Si vous souhaitez créer un serveur Metin2 sous Windows, ce tutoriel est fait pour vous! Pourquoi faire un serveur sous Windows? Quelle différence par rapport à FreeBSD? Pré-requis: I. Installation des files II. Installation de la base de donnée III. Configuration des files Vous venez de terminer ce tutoriel! Votre serveur est prêt à être lancé pour une utilisation en local ! Si vous voulez que votre serveur soit accessible de l'extérieur, n'oubliez pas d'ouvrir les ports correspondant à Metin2 sur votre box (1) Définition issue du site MicroZoom
  12. Les Interfaces (suite logique des classes abstraites) Une interface est un type, au même titre qu’une classe, mais abstrait et qui donc ne peut être instancié (par appel à 'new' plus 'constructeur'). Une interface décrit un ensemble de signatures de méthodes, sans implémentation, qui doivent être implémentées dans toutes les classes qui implémentent l’interface. L’utilité du concept d’interface réside dans le regroupement de plusieurs classes (les interfaces sont très utilisées même à haut un niveau!) , tel que chacune implémente un ensemble commun de méthodes, sous un même type. Une interface possède les caractéristiques suivantes : ● elle contient des signatures de méthodes; ● elle ne peut pas contenir de variables; ● une interface peut hériter d’une autre interface (avec le mot-clé extends); ● une classe (abstraite ou non) peut implémenter plusieurs interfaces. La liste des interfaces implémentées doit alors figurer après le mot-clé 'implements' placé dans la déclaration de classe, en séparant chaque interface par une virgule. Dans notre exemple précédent (du premier cours), Forme peut être une interface décrivant les méthodes qui doivent être implémentées par les classes Rectangle et Cercle, ainsi que par la classe Carre (non explicitée précédemment, même si celle-ci peut profiter de son héritage de Rectangle). L’interface Forme s’écrit alors de la manière suivante : public interface Forme { public int surface(); public void affiche(); } Pour obliger les classes Rectangle, Cercle et Carre à implémenter les méthodes surface() et affiche(), il faut modifier l’héritage de ce qui était la classe Forme en une implémentation de l’interface définie ci-dessus : public class Rectangle implements Forme { ... } et public class Cercle implements Forme { ... } Note assez importante : En déclarant un tableau constitué d’objets implémentant l’interface Forme, on peut appeler la méthode affiche() qui existe et est implémentée par chaque objet. Si une classe implémente une interface mais que le programmeur n’a pas écrit l’implémentation de toutes les méthodes de l’interface, une erreur de compilation se produira sauf si la classe est une classe abstraite ! Les classes abstraites et les interfaces sont des notions très abstraite, la compréhension des ces notions est très compliquée mais son utilité est redoutable. Elles permettent de décomposer les travaux et une optimisation du code certaine. En vous souhaitant une bonne compréhension, Homéo'
  13. Niveau requis : Débutant Temps estimé : 15 minutes Bonjour à tous, Ce tutoriel a pour but de vous permettre de remplir manuellement les fichiers regen de vos maps ou de les comprendre afin de les peaufiner. C'est-à-dire choisir ou corriger l'emplacement de vos monstres, metins, boss et pnj ainsi que leur temps de repop. Ce tutoriel présente le logiciel Regen Maker, qui permet de remplir ces fichiers beaucoup plus rapidement mais avec moins de précision. Information. Le tutoriel présente les 4 fichiers (regen/boss/stone/pnj) en même temps car ils fonctionnent exactement de la même façon. Ces fichiers se trouvent dans : /usr/metin2/share/locale/france/map/nom_de_la_map/ Pré-requis: Avoir un serveur Metin2 avec un accès WinSCP à votre serveur Une map sur laquelle vous allez appliquer ce tutoriel. I. Gérer les spawns Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  14. Niveau requis Débutant Temps estimé : Entre 15 et 30 minutes Bonjour à tous, Tu souhaites installer un serveur Metin2 sur un serveur dédié ? Alors ce tutoriel est fait pour toi ! Information. Ce tutoriel vous permettra de mettre un serveur privé Metin2 sur un serveur dédié. Cela veut dire que votre serveur pourra être ouvert 24/24H car il se trouve sur une machine externe que vous avez loué (ou acheté Pré-requis: Un dédié que vous avez loué (chez Kimsufi ou SoYouStart par exemple). Vous pouvez aussi utiliser ce tutoriel pour installer un serveur sur une machine virtuelle FreeBSD. Un système d'exploitation FreeBSD récent installé sur votre machine dédié. Dans ce tutoriel, nous utiliserons la version 11.2 PuTTY, qui vous permettra de vous connecter en SSH à votre machine. Téléchargez putty.exe I. Se connecter à votre machine II. Installation de MySQL III. Configurez MySQL pour Metin2 Votre dédié est maintenant complètement installé. Il ne vous reste plus qu'à y installer vos fichiers Metin2 pour pouvoir l'utiliser. Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Tutoriel ré-écrit par Calypso
  15. Niveau requis : Débutant Temps estimé : Entre 5 et 10 minutes Salut à tous ! Ce tutoriel va vous expliquer comment modifier certaines descriptions de votre serveur Metin2 (description des royaumes, des skills, etc ...) Pré-requis: Il vous faut un serveur Metin2 avec un client. Savoir depack / repack les fichiers de votre client. Voici un tutoriel explicatif Avoir un éditeur de fichier pratique. Je vous conseille vivement Sublime Text I. Modifier la description des royaumes II. Modifier la description des races III. Modifier la description des objets IV. Modifier la description des compétences Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  16. Niveau requis : Débutant Temps estimé : Entre 15 et 20 minutes Salut à tous ! Ce tutoriel va vous expliquer comment créer un magasin via un PNJ. Il existe deux types de magasins : Le simple : Quand on clique sur un pnj, une fenêtre de magasin s'ouvre. La première partie vous suffira pour créer un magasin simple Le multi : Qui consiste a attribuer plusieurs magasins à un PNJ via un menu. Pré-requis: Posséder un serveur Metin2 avec un accès à la base de données. J'utiliserai Navicat dans ce tutoriel Avoir un PNJ de dispo. Vous pouvez implanter un PNJ en utilisant ce tutoriel et gérer le spawn de celui-ci avec ce tutoriel. Pour assigner plusieurs magasins à un PNJ, il vous faut savoir implanter une quête I. Créer des magasins II. Attribuer plusieurs shops à un PNJ Pour continuer : Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  17. Niveau requis : Débutant Temps estimé : Entre 5 et 10 minutes Bonjour à tous, La configuration de votre client est une étape cruciale à la création d'un serveur privé Metin2, en effet, il permet de connecter votre client Metin2 à votre serveur. Pré-requis: Sublime Text, un éditeur de code puissant qui vous permettra de modifier les fichiers pythons (.py) de votre client de manière simple. Vous devez savoir comment depack / repack les fichiers de votre client avec EterNexus. Un tutoriel complet est disponible ici I. Configurer son client Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  18. Bonjour à tous ! Dans ce tutoriel, vous allez apprendre à créer un serveur WoW (Trinity) sous Linux peu importe la version. On commencera par compiler Trinity sous Linux de sorte que l'on puisse l'utiliser directement sur la machine. N'ayez pas peur, c'est relativement simple et moins casse bonbon que sur Windows ... Je vous propose de lire l'introduction très intéressante de ce topic. Il vous permettra de comprendre un minimum les actions que vous allez effectuer: [Contenu Masqué] Je rappelle tout de même que vous avez la possibilité de créer votre serveur WoW sous dédié avec ce tutoriel (un dédié OVH par exemple). Bien qu'il en soit de même avec le tutoriel sous Windows, je vous conseille tout de même de le faire tourner sur une machine linux pour être fidèle à sa stabilité et sa simplicité. Les lignes de commandes vous font peur ? C'est normal, c'est juste que vous n'avez pas l'habitude de l'utiliser .. INSTALLER LE PRE-REQUIS SUR SA MACHINE Tout d'abord, qu'est ce qu'une ligne de commande ? Une commande est une instruction qu'un utilisateur envoie au système d'exploitation de son ordinateur pour lui faire exécuter une tâche. Il peut s'agir de manipuler des fichiers, d'accéder à des répertoires, de modifier des droits d'accès, etc (cf: unbuntu-fr). Si vous êtes curieux, je vous invite à lire le cours de Mathieu ici: [Contenu Masqué] Il vous permettra de comprendre plus facilement ce qui va suivre. Commençons par exécuter ces deux commandes: sudo apt-get update sudo apt-get upgrade On installe en fait une liste de programme. Maintenant que nous avons le pré-requis, exécutons ces commandes: sudo apt-get install build-essential autoconf libtool gcc g++ make cmake git-core patch wget links zip unzip sudo apt-get install mysql-server sudo apt-get install libreadline6-dev zlib1g-dev libbz2-dev libncurses5-dev sudo apt-get install libboost-dev libboost-thread-dev libboost-system-dev sudo apt-get install libboost-program-options-dev Vous avez tout ce qu'il faut pour la compilation de Trinity (lib, mysql, openssl, etc ...) Il vous est facultatif mais vous pouvez très bien créer un utilisateur spécial pour le serveur. COMPILER LE CORE TRINITY Téléchargeons les sources de Trinity. Entrez: cd /usr Puis: git clone git://github.com/TrinityCore/TrinityCore.git Attention ! C'est les sources pour Trinity 3.3.5 Si vous voulez y mettre d'autres sources et qu'il n'existe pas de git, prenez le contenue de l'archive et mettez y dans le dossier usr de votre machine. Vous pourrez y accéder avec un client SFTP tel que WinSCP par exemple. Passons maintenant à la compilation. Faites: cd TrinityCore (pour accéder au dossier Trinity. cd /usr/TrinityCore sinon) Créons un dossier build et rentrons-y: mkdir build cd build Puis lançons la compilation: cmake ../ -DPREFIX=/usr/coreTrinity usr/core correspond à l'endroit où je souhaite que Trinity soit compilé. Vous avez le choix. Ensuite: make install Votre core compile. Une fois terminé, il se trouvera dans le dossier que vous avez précisé plus haut. C'était aussi compliqué alors ? CONFIGURER LA BASE DE DONNÉES Voici une partie très importante. Nous allons mettre en place la base de données pour le bon fonctionnement du serveur. Connectez vous avec l'utilisateur root à MySQL: mysql -u root -p Il va vous être demandé un mot de passe, entrez celui que vous avez marqué à l'installation de MySQL. Créons un user MySQL spécial pour le serveur: GRANT ALL PRIVILEGES ON *.* TO 'wow'@'localhost' IDENTIFIED BY 'wow123' WITH GRANT OPTION; Créons les databases nécessaires pour le serveur: CREATE DATABASE world; CREATE DATABASE auth; CREATE DATABASE characters; Bon, à partir de là, je vous conseille vivement d’exécuter vos SQL via un logiciel tel que Navicat. Dans tous les cas, vous en aurez besoin. Téléchargez donc Navicat: [Contenu Masqué] Une fois téléchargé, connectez vous à votre base de donnée tel que: Faites un cliques droit sur vos databases puis Execute SQL File Sélectionnez le fichier SQL correspondant, cocher les deux premières cases puis cliquez sur Start. (les fichiers SQL se trouvent principalement dans le dossier SQL de Trinity) Les querys se lancent et une fois terminé, vous avez vos databases qui sont prêtent ! Pensez à modifier vos fichiers conf (worldserver.conf, etc ...) pour que le serveur puisse se connecter à votre base de donnée. Pour lancer votre serveur, il suffit de vous rendre dans le dossier bin de Trinity puis d'exécuter ces commandes: ./authserver ./worldserver Ou vous pouvez même utiliser screen (pour lancer un processus dans un autre terminal): screen ./authserver screen ./worldserver Ainsi, vous pouvez dès à présent vous connecter à votre serveur sans problème ! Linux reste tout de même plus " mystérieux ", n'hésitez donc pas à poser des questions si vous ne comprenez pas une partie du tutoriel ou si vous souhaitez juste une précision.
  19. Niveau requis : Intermédiaire Temps estimé : 10 minutes Bonjour à tous, BugFix: 2014+: Grace à ce bugfix, vous aurez la possibilité de vous connecter à votre serveur en local avec vos joueurs ! Toutes les modifications se font sur les sources serveur ! Game Metin2 compilé avec la correction ( Files 2016 ) : ICI Apprendre à compiler son game : [Contenu Masqué] CONFIG.CPP Cherchez char g_szInternalIP[16] = "0"; Ajoutez char g_szExternalIP[16] = "0"; Cherchez TOKEN("bind_ip") { strlcpy(g_szPublicIP, value_string, sizeof(g_szPublicIP)); } Ajoutez TOKEN("bind_external_ip") { strlcpy(g_szExternalIP, value_string, sizeof(g_szExternalIP)); } CONFIG.H Cherchez extern char g_szInternalIP[16]; Ajoutez extern char g_szExternalIP[16]; DESC_CLIENT.CPP Cherchez if (!bSentBoot) { bSentBoot = true; TPacketGDBoot p; p.dwItemIDRange[0] = 0; p.dwItemIDRange[1] = 0; memcpy(p.szIP, g_szPublicIP, 16); DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p)); } } TEMP_BUFFER buf; TPacketGDSetup p; memset(&p, 0, sizeof(p)); strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP)); Remplacez if (!bSentBoot) { bSentBoot = true; TPacketGDBoot p; p.dwItemIDRange[0] = 0; p.dwItemIDRange[1] = 0; memcpy(p.szIP, g_szExternalIP, 16); DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p)); } } TEMP_BUFFER buf; TPacketGDSetup p; memset(&p, 0, sizeof(p)); strlcpy(p.szPublicIP, g_szExternalIP, sizeof(p.szPublicIP)); Finalisation : compiler et remplacer le game et ouvrir les fichiers CONFIG (Auth, Channel(X)/Core(X) et Game99) et ajoutez : BIND_EXTERNAL_IP: TON_IP_EXTERNE Source : M2D & Gurgarath Cordialement, ASIKOO
  20. Niveau requis : Débutant Temps estimé : 2 minutes Salut à toi ! Dans ce tutoriel, je vais vous expliquer comment modifier le level maximum sur votre serveur Metin2. Ici, nous abaisserons le level maximum à 80. Pré-requis: Un serveur Metin2 avec un accès SFTP (WinSCP ou FileZilla) I. Modifier le level maximum Pour continuer : Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  21. Niveau requis : Débutant Temps estimé : 5 minutes Salut à toi ! Aujourd'hui je vais vous expliquer comment créer ou modifier le contenu d'une boite sur Metin2. Pré-requis: Un accès SFTP (avec WinSCP par exemple) à votre serveur Metin2 I. Gestion des boites Pour continuer : Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  22. Niveau requis : Débutant Temps estimé : 30 minutes Salut à toi ! Tu n'as jamais fait de serveur Metin2 ? Ce tutoriel est fait pour toi ! Je vais t'expliquer comment créer un serveur de A à Z ! Tu pourras ensuite le modifier à ta guise et le mettre à ton image. Information. Lors de ce tutoriel, vous allez apprendre à créer un serveur en No-IP. Vos amis pourront donc rejoindre le serveur pour jouer avec vous ! Attention ! Les files utilisés pendant ce tutoriel sont les 2014. Cependant, sur les 2014+, un bug survient à la sélection du personnage quand un ami souhaite se connecter quand le serveur est sur une machine virtuelle. Il faudra appliquer ce patch pour corriger ce problème. Pré-requis: Virtual Box, qui nous permettra de virtualiser un système d'exploitation. En effet, un serveur Metin2 fonctionne sous FreeBSD, il sera plus simple pour vous de virtualiser ce système sur votre Windows que de faire une deuxième installation sur votre ordinateur. Navicat, un client Mysql. Il vous permettra de vous connecter à la base de données de votre serveur Metin2. On y retrouveras toutes les informations liées aux joueurs, aux items, aux comptes des utilisateurs, etc ... WinSCP, un client SFTP. Similaire au FTP, il vous permettra de naviguer sur les différents fichiers de votre serveur (maps, configurations, etc ..) Le serveur VDI tout prêt pour vous qui possède déjà tous les fichiers du serveur avec FreeBSD d'installé. Il ne nous manquera plus qu'à le lancer avec Virtual Box. Le client metin2 qui vous permettra de vous connecter en jeu à votre serveur. No-IP, un outil qui va vous permettre d'avoir une IP fixe si votre fournisseur d'accès vous donne une IP dynamique. Sinon, les joueurs devront changer l'IP du client à chaque fois que la votre change. Pas très pratique, non ? I. La machine virtuelle II. Configuration de la machine virtuelle III. Installation de No-IP IV. Configuration des ports sur la box V. Lancement du serveur Metin2 VI. Se connecter In Game VII. Accéder aux fichiers du serveur VIII. Accéder à la base de données Vous pouvez maintenant vous amuser sur votre serveur ou tout simplement y rajouter des fonctionnalités sympas. Pour continuer: Vous trouverez de nombreux partages et de tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Vous pouvez créer un compte GM en suivant ce tutoriel Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande ! Bon courage à vous et bienvenue dans le monde des serveurs privés Metin2 !
  23. Niveau requis Débutant Temps estimé : 5 minutes Bonjour à vous, Vous avez installé des Files Metin2 mais vous êtes perdu au niveau de la gestion de MySQL ? Alors ce tutoriel est fait pour vous ! Pré-requis: Il vous faut seulement une machine (un dédié ou une machine virtuelle par exemple) sous FreeBSD avec MySQL d'installé. Généralement, il est déjà installé. Si ce n'est pas le cas, suivez ce tutoriel I. MySQL, j'y comprends vraiment rien ... II. Créer un utilisateur MySQL pour Metin2 Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  24. Niveau requis Débutant Temps estimé : Entre 15 et 30 minutes Bonjour à toi, Tu souhaites installer des files Metin2 sur ta machine ? Ou tout simplement les changer ? Alors ce tutoriel est fait pour toi ! Pré-requis: Il vous faut des Files Metin2 que vous avez trouvez je ne sais où. Vous pouvez en trouver dans la section File WinSCP, un client SFTP qui vous permettra de vous connecter en SFTP à votre serveur pour pouvoir modifier les fichiers du serveur. Navicat pour vous connecter à votre base de données de votre serveur. Une machine FreeBSD prête à l'emploi Attention ! Pour réaliser ce tutoriel, il vous faut une machine avec FreeBSD et MySQL. Si ce n'est pas le cas, je vous invite à suivre l'un de ces tutoriels si vous êtes débutant: - Créer un serveur Metin2 - Créer un serveur Metin2 avec No-IP - Créer un serveur Metin2 avec Hamachi - Créer un serveur Metin2 sous Windows - Installer un serveur dédié Metin2 I. Installer les fichiers serveurs II. Installation de la base de données MySQL III. Connecter le serveur à la base données Pour continuer: Vous trouverez de nombreux partages et tutoriels sur Funky-Emu dans la section Metin2. Pour configurer votre client pour connecter à votre serveur, suivez ce tutoriel Cette FAQ pourra répondre à la plupart de vos questions. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  25. Classes abstraites Nota Bene : pour ce cours je prend comme hypothèse que vous avez déjà des bases de Java, le cas échéant, allez lire les cours présents dans la section 'tutoriels'. Le concept de classe abstraite se situe entre celui de classe et celui d’interface (notion que j'introduirai plus tard, selon moi c'est plus simple de commencer par les classes abstraites). C’est donc une classe qu’on ne peut pas directement instancier car certaines de ses méthodes ne sont pas implémentées. Une classe abstraite peut donc contenir des variables (de n'importe quel type, primitif ou non), des méthodes implémentées et des signatures de méthode à implémenter. Une classe abstraite peut donc implémenter (partiellement ou totalement, même s'il est rare que ce le soit totalement) des interfaces et peut hériter d’une classe ou d’une classe abstraite. La création d'une classe abstraite se fait de la sorte : public abstract class { … }. Imaginons que l’on souhaite attribuer deux variables, origine_x et origine_y, à tout objet représentant une forme nous avons donc la classe suivante avec les 'Getter' et les 'Setter' : comme suit : public abstract class Forme { private int origine_x; private int origine_y; // Constructeur dit 'par défaut' public Forme() { this.origine_x = 0; this.origine_y = 0; } // Getter public int getOrigineX() { return this.origine_x; } public int getOrigineY() { return this.origine_y; } // Setter public void setOrigineX(int x) { this.origine_x = x; } public void setOrigineY(int y) { this.origine_y = y; } // Méthodes abstraites public abstract int surface(); public abstract void affiche();} - Classes et méthodes génériques : De plus, il faut rétablir l’héritage des classes Rectangle et Cercle vers Forme (car les rectangles et les cercles sont des formes , et si vous avez bien suivi votre cours sur l'héritage, on utilise le mot-clé 'extends' (toutefois il en existe un autre qui pour les interfaces appelées 'implements' qui fait strictement la même chose, j'en parlerai dans un prochain cours!) : // Classe Rectangle qui étend forme public class Rectangle extends Forme { ... } // Classe Cercle qui étend forme public class Cercle extends Forme { ... } Lorsqu’une classe hérite d’une classe abstraite, elle doit : - soit implémenter les méthodes abstraites de sa super-classe en les dotant d’un corps ; - soit être elle-même abstraite si au moins une des méthodes abstraites de sa super-classe reste abstraite. Fin de ce premier cours. Cordialement, Homéo
×

Information importante

By using this site, you agree to our Conditions d’utilisation.