Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

FrancH

 Funkiest
  • Compteur de contenus

    248
  • Inscription

  • Dernière visite

  • Jours gagnés

    5

Tout ce qui a été posté par FrancH

  1. Bonjour, Le sujet étant inactif depuis un moment, je déplace dans le forum "Résolu ou sans réponse".
  2. Bonjour, Si le problème est [Résolu], n'oublie pas de le marquer Cordialement :
  3. Centre de Téléchargement Télécharger ( Interne ) Bonjour à toutes et à tous ! J'ai fais quelques recherches sur ce forum mais je n'ai rien trouvé à ce sujet donc je vais vous expliquer comment mettre en place une GUI (Graphical User Interface) montrant les statistiques sans passer par une quête. Bien sûr, il y a possibilité de désactiver ou réactiver l'affichage de cette interface à tout moment à l'aide d'une petite quête. Bref, au travail ! Pour commencer vous aurez besoin de dépack le fichier "root" afin d'avoir accès au fichier "game.py" puis ouvrez le. Petite précision: le copier-coller c'est pas terrible vu que le python n'aime pas les espaces. Donc si vous avez des problèmes à la fin du tuto, remplacez les espaces par des tabulations. /!\La quête est nécessaire pour afficher l'interface/!\ Cherchez la ligne: self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) Puis faites un copier/coller de ceci: #START_KILLGUI KillGuiBg = ui.AniImageBox() KillGuiBg.AppendImage("d:/ymir work/ui/blue_killgui_interface.tga") self.KillGuiBg = KillGuiBg self.KillGuiBg.SetPosition(wndMgr.GetScreenWidth()-235,185) self.KillBlauReich = ui.TextLine() self.KillBlauReich.SetDefaultFontName() self.KillBlauReich.SetPosition((wndMgr.GetScreenWidth()-285)+120, 412) self.KillBlauReich.SetText("Royaume bleu: NaN") self.KillBlauReich.SetOutline() self.KillGelbReich = ui.TextLine() self.KillGelbReich.SetDefaultFontName() self.KillGelbReich.SetPosition((wndMgr.GetScreenWidth()-289)+120, 332) self.KillGelbReich.SetText("Royaume jaune: NaN") self.KillGelbReich.SetOutline() self.KillRotReich = ui.TextLine() self.KillRotReich.SetDefaultFontName() self.KillRotReich.SetPosition((wndMgr.GetScreenWidth()-289)+120, 255) self.KillRotReich.SetText("Royaume Rouge: NaN") self.KillRotReich.SetOutline() self.KillMob = ui.TextLine() self.KillMob.SetDefaultFontName() self.KillMob.SetPosition((wndMgr.GetScreenWidth()-268)+120, 490) self.KillMob.SetText("Monstre: NaN") self.KillMob.SetOutline() ##END_KILLGUI Cherchez maintenant la ligne: serverCommandList={ Puis faites un copier/coller de ceci: ##KILLGUI "ShowKillGui" : self.__showkillgui, "HideKillGui" : self.__hidekillgui, "KillBlauReich" : self.__KillBlauReich, "KillGelbReich" : self.__KillGelbReich, "KillRotReich" : self.__KillRotReich, "KillMob" : self.__KillMob, ##END_KILLGUI Maintenant, allez à la fin de votre fichier game.py, personnellement je l'ai mis au dessus de cette ligne: def __ProcessPreservedServerCommand(self): Lorsque vous avez repéré cette ligne, faites un copier/coller de ceci: def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __showkillgui(self): self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() def __KillBlauReich(self, KillBlauReich): self.KillBlauReich.SetText("Royaume bleu " + KillBlauReich) def __KillGelbReich(self, KillGelbReich): self.KillGelbReich.SetText("Royaume jaune " + KillGelbReich) def __KillRotReich(self, KillRotReich): self.KillRotReich.SetText("Royaume rouge " + KillRotReich) def __KillMob(self, KillMob): self.KillMob.SetText("Monstre " + KillMob) Repackez votre fichier root. Vous devez maintenant extraire "etc" pour avoir accès à votre dossier "ui" Téléchargez ce fichier: [Hidden Content] Placez le dans le dossier "ui" d:/ymir work/ui/blue_killgui_interface.tga Ouvrez le fichier "etc_repack.xml" et ajoutez cette ligne: depack\ymir work\ui\blue_killgui_interface.tga Sauvegardez et repackez "etc" Le côté client est terminé ! maintenant il faut implanter la quête permettant de cacher ou afficher l'interface. Allez dans le dossier "quest" via winscp ou filezilla. Créez un fichier nommé: kill_gui.quest Puis ajoutez la quête au fichier: quest killgui begin state start begin when kill begin if npc.is_pc() then local new_point = pc.getqf("empire"..npc.get_empire())+1 pc.setqf("empire"..npc.get_empire(), new_point) cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) else local new_point = pc.getqf("mob")+1 pc.setqf("mob", new_point) cmdchat("KillMob "..pc.getqf("mob")) end end when login begin if pc.getqf("showkillgui") == 1 then cmdchat("ShowKillGui") cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) cmdchat("KillMob "..pc.getqf("mob")) else cmdchat("HideKillGui") end end when letter begin send_letter("Statistiques") end when info or button begin say_title("Statistiques") say("Voulez-vous désactiver l'affichage de vos") say("statistiques ?") say("Les personnes ou mobs tués seront tout de même") say("comptabilisés. Vous pourrez réactiver à tout moment") say("l'affichage des statistiques.") local janein = select("Afficher", "Cacher") if janein == 2 then pc.setqf("showkillgui", 0) cmdchat("HideKillGui") else pc.setqf("showkillgui", 1) cmdchat("ShowKillGui") cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) cmdchat("KillMob "..pc.getqf("mob")) end end end end Ajoutez le fichier à filezilla ou winscp puis ouvrez le fichier: locale_list et ajoutez cette ligne: kill_gui.quest (N'oubliez pas de laisser une ligne vide en dessous de la dernière ligne ajoutée) Sauvegardez puis recompilez la quête. Dans la liste des quêtes vous verrez la quête "Statistiques" cliquez dessus puis activez l'affichage de la GUI, le tour est joué ! Petit plus ! Il y a en tout 5 interfaces (en comptant celle-ci) j'ai choisis de vous partager cette interface car je trouve que c'est la plus belle, mais après chacun ses goûts. Téléchargement: [Hidden Content] Téléchargement: [Hidden Content] Pour changer d'interface, renommez le fichier téléchargé en "blue_killgui_interface.tga" puis déplacez le ici en remplaçant l'ancienne interface si besoin est: d:/ymir work/ui/blue_killgui_interface.tga Changer l'emplacement de l'écriture Si vous changez d'interface, vous aurez sans doute besoin de régler la position du texte. Ouvrez le fichier "game.py" puis cherchez la ligne: self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) Vous verrez donc les coordonnées de chaque ligne: Si vous souhaitez changer le texte, c'est simple. Cherchez la ligne: def __hidekillgui(self): Laisser la GUI affichée après chaque téléportation: Merci à Spark pour la modification du python et de la quête ! Pour commencer, remplacez la quête implantée précédemment par celle-ci: quest killgui begin state start begin when kill begin if npc.is_pc() then local new_point = pc.getqf("empire"..npc.get_empire())+1 local tab = {"KillRotReich", "KillGelbReich", "KillBlauReich"} pc.setqf("empire"..npc.get_empire(), new_point) cmdchat(tab[npc.get_empire()].." "..new_point) else local new_point = pc.getqf("mob")+1 pc.setqf("mob", new_point) cmdchat("KillMob "..new_point) end end when login begin cmdchat("ShowKillGui") cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) cmdchat("KillMob "..pc.getqf("mob")) end end end Allez dans vitre game.py puis remplacez: "ShowKillGui" : self.__showkillgui, Par: "ShowKillGui" : self.__showkillgui2, Remplacez ensuite: def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() Par: def __showkillgui2(self): constInfo.killgui = 1 self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() Repackez votre root puis testez ! Merci à Spark ! Afficher/cacher l'interface à l'aide d'un raccourcis (F5)Passer par une quête à chaque fois pour afficher ou cacher l'interface peut être assez chiant, voilà la solution: un raccourcis sur la touche F5 ! Ouvrez le fichier game.py de votre root puis allez à la fin de votre fichier pour trouver ces lignes: Remplacez donc: def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __showkillgui(self): self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() Par ceci: def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __showkillgui(self): if constInfo.killgui == 0: constInfo.killgui = 1 self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() elif constInfo.killgui == 1: constInfo.killgui = 0 self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() Cherchez la ligne: onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7) Puis ajoutez en dessous: onPressKeyDict[app.DIK_F5] = lambda : self.__showkillgui() (ne rien ajouter dans la parenthèse en fin de ligne) Sauvegardez puis quittez le fichier game.py. Toujours dans root ouvre le fichier "constinfo.py" Cherchez la ligne: PVPMODE_PROTECTED_LEVEL = 30 (la valeur à la fin de cette ligne peut changer) Puis en dessous ajoutez cette ligne: killgui = 0 Sauvegardez, repackez et en jeu, appuyez sur F5 ! Après ça on a toujours besoin de la quête, donc ne la supprimez pas ! Optimisé pour l'interface V4 (avec raccourcis) Je me suis intéressé à la version 4 de l'interface, voilà donc les emplacements que je trouve optimaux pour cet interface: /!\Vous devez avoir installé le raccourcis de la partie juste au dessus/!\ En dessous de la ligne: self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) Mettre ceci: ##START_KILLGUI KillGuiBg = ui.AniImageBox() KillGuiBg.AppendImage("d:/ymir work/ui/blue_killgui_interface.tga") self.KillGuiBg = KillGuiBg self.KillGuiBg.SetPosition(wndMgr.GetScreenWidth()-245,171) self.KillBlauReich = ui.TextLine() self.KillBlauReich.SetDefaultFontName() self.KillBlauReich.SetPosition((wndMgr.GetScreenWidth()-285)+120, 445) self.KillBlauReich.SetText("Royaume bleu: NaN") self.KillBlauReich.SetOutline() self.KillGelbReich = ui.TextLine() self.KillGelbReich.SetDefaultFontName() self.KillGelbReich.SetPosition((wndMgr.GetScreenWidth()-289)+120, 340) self.KillGelbReich.SetText("Royaume jaune: NaN") self.KillGelbReich.SetOutline() self.KillRotReich = ui.TextLine() self.KillRotReich.SetDefaultFontName() self.KillRotReich.SetPosition((wndMgr.GetScreenWidth()-289)+120, 231) self.KillRotReich.SetText("Royaume Rouge: NaN") self.KillRotReich.SetOutline() self.KillMob = ui.TextLine() self.KillMob.SetDefaultFontName() self.KillMob.SetPosition((wndMgr.GetScreenWidth()-268)+120, 557) self.KillMob.SetText("Monstre: NaN") self.KillMob.SetOutline() ##END_KILLGUI Puis au dessus de la ligne: def __ProcessPreservedServerCommand(self): Ceci: def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __showkillgui(self): if constInfo.killgui == 0: constInfo.killgui = 1 self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() elif constInfo.killgui == 1: constInfo.killgui = 0 self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __KillBlauReich(self, KillBlauReich): self.KillBlauReich.SetText(" " + KillBlauReich) def __KillGelbReich(self, KillGelbReich): self.KillGelbReich.SetText(" " + KillGelbReich) def __KillRotReich(self, KillRotReich): self.KillRotReich.SetText(" " + KillRotReich) def __KillMob(self, KillMob): self.KillMob.SetText(" " + KillMob) Repackez votre fichier root et c'est bon. Optimisé pour l'interface V5 (avec raccourcis) Par LordGune Nul besoin de faire tout un pitch pour expliquer comment mettre ce changement: #START_KILLGUI KillGuiBg = ui.AniImageBox() KillGuiBg.AppendImage("d:/ymir work/ui/blue_killgui_interface.tga") self.KillGuiBg = KillGuiBg self.KillGuiBg.SetPosition(wndMgr.GetScreenWidth()-235,185) self.KillBlauReich = ui.TextLine() self.KillBlauReich.SetDefaultFontName() self.KillBlauReich.SetPosition((wndMgr.GetScreenWidth()-207)+120, 458) self.KillBlauReich.SetText("Bleue Tuer: NaN") self.KillBlauReich.SetOutline() self.KillGelbReich = ui.TextLine() self.KillGelbReich.SetDefaultFontName() self.KillGelbReich.SetPosition((wndMgr.GetScreenWidth()-209)+120, 354) self.KillGelbReich.SetText("Jaune Tuer: NaN") self.KillGelbReich.SetOutline() self.KillRotReich = ui.TextLine() self.KillRotReich.SetDefaultFontName() self.KillRotReich.SetPosition((wndMgr.GetScreenWidth()-209)+120, 246) self.KillRotReich.SetText("Rouge Tuer: NaN") self.KillRotReich.SetOutline() self.KillMob = ui.TextLine() self.KillMob.SetDefaultFontName() self.KillMob.SetPosition((wndMgr.GetScreenWidth()-215)+120, 572) self.KillMob.SetText("Monstre: NaN") self.KillMob.SetOutline() ##END_KILLGUI Merci à LordGune pour avoir partagé cette version optimisée ! Sources: Tuto, screens, adaptation de l'interface/écriture, (petite) traduction de la quête entièrement par moi. Le reste est de ©ChaoSS sur epvp. L'option "raccourcis" provient de "ToBii™" sur epvp. GUI v5 par .ωєιя∂ sur epvp. J'espère ne rien avoir oublié. Bon jeu à tous et bonne chance ! Source : Craven
  4. Centre de Téléchargement Télécharger ( Interne ) Bonjour, pour protéger son client, il va falloir pour contrer le plus de cheat/hack utiliser plusieurs méthodes, seule ou toutes à la fois comme: gnorer certains fichier Protéger ses packs Fermer le client en cas de fichier d'un certain type etc... Je vais donc vous apprendre ça durant ce tutoriel. Depacker votre root : Si vous ne savez pas comment faire je vous renvoie ici : /topic/21353-depack-repack-avec-eternexus/ Ouvrer le fichier intrologin.py : Vous cherchez ensuite : self.__LoadLoginInfo(" Il est possible que vous ayez par exemple : self.__LoadLoginInfo("logininfo.xml") Peut importe, suivez le tutoriel : Remplacez, ou enlevez le texte entre les (), mais ne supprimez pas toute la ligne, sinon, va falloir faire d'autres modifications : self.__LoadLoginInfo("RandomFile.py") Ou bien : self.__LoadLoginInfo() 3.Repackez le pack, et déplacez le dans votre dossier pack client. 2)La protection des packs. Alors, pour la protection des packs, je vous propose d'enlever les fichiers eix (fichier index) de votre client, ce qui fait que les dépackeurs classiques ne pourront plus les dépacks. Je ne vous pas vous citez 7000 méthodes, je n'en connais qu'une... !!!!!!!!!!!Avant toute chose, faites une copie obligatoire de votre client !!!!!!!!!!! Pour ça, télécharger : [Hidden Content] Ouvez le .exe puis : Faites : "Next >" Cochez la case "I accept the agreement" puis, faites : "Next >" Ce qui est sélectionné, c'est le dossier d'installation, remplir ou vous voulez le mettre, puis faites "Next >". Ce qui est sélectionné, c'est le nom dans votre menu démarrer de Enigma, sinon faites : "Next >". Cochez la case si vous voulez créer un icon du logiciel sur votre programme sinon, faites "Next >". Faites : "Install" Laissez la case "Launch Enigma Virtual Box" si vous voulez que le programme se lance juste après avoir cliquez sur "Finish", sinon décochez et appuyez sur "Finish". Pour une plus grosse facilité, je vous invite à trier vos .EIX dans un autre fichier que vos epk. Allez ensuite dans enigma : Cliquez sur le bouton "Brownse..." et sélectionner votre client : ça donne : J'insiste encore une fois sur la "COPIE". Le champs "Enter Output File Name:" va se remplir automatique tout seul. Faites ensuite un clique droit sur : "Virtual box Files" : Faites : New Folder : Cliquez sur "OK", puis : Nommez le "pack" et appuyez sur entrée. Faites ensuite un clique droit sur le dossier "pack" que vous venez de créer, puis faites : "Add File(s)". Allez maintenant selectionner tous vos fichiers EIX de votre client (1 par 1 en maintenant le touche ctrl, ou tous les fichiers entres vos deux cliques en maintenant la touche MAJ) Vous obtiendrez quelque chose qui ressemble à ça : Appuyez ensuite sur : "Process" : Ceci va apparaitre : Cliquez sur "Run", si vous voulez démarrer votre nouveau client. Ou close pour fermer cette fenetre. Vous pouvez constater que dans votre client, un nouveau .exe est apparue : Vous pouvez remarquer que le boxed est plus gros ! Pourquoi ? Car il contient en lui les EIX !! Et voilà, vous pouvez maintenant utiliser votre client avec le metin2client_boxed.exe sans vos eix ! 3)Bloquer certains types de fichier. Le but ici est de bloquer les fichiers : asi ; m3d ; flt ; mix ; py qui pourrait se trouver en dehors de vos packs . 1.Depacker votre root : Allez dans votre fichier prototype.py Cherchez : import stringCommander Ajoutez : import antihack Téléchargez : [Hidden Content] Déplacez directement ce fichier dans votre pack root, puis repackez. Maintenant pour un seul type de fichier... Télécharger toujours cette archive : [Hidden Content] Vous aurez pour deux types de fichier : def RunCheckUp(): Ordner = os.listdir('.') Ordner.sort() for Datei in Ordner: if Datei.find('.asi') != -1: dbg.LogBox("Une erreur est survenue: " + str(Datei) + "") try: os.remove(Datei) except: dbg.LogBox("Erreur !") dbg.LogBox("Fichier: " + str(Datei)) app.Abort() else: pass def RunCheckUp1(): Ordner = os.listdir('.') Ordner.sort() for Datei in Ordner: if Datei.find('.py') != -1: dbg.LogBox("Une erreur est survenue: " + str(Datei) + "") try: os.remove(Datei) except: dbg.LogBox("Erreur !") dbg.LogBox("Fichier: " + str(Datei)) app.Abort() else: pass Par exemple, je vérifie ici les fichier .asi dans mon : RunCheckUp(): Puis, dans mon RunCkeckUp1() je vérifie les fichier .py Il vous suffit de supprimer toute une paragraphe, par exemple si je veux que les fichiers .asi et .m3d (qui sont à l'opposer du fichier, j'aurais : def RunCheckUp(): Ordner = os.listdir('.') Ordner.sort() for Datei in Ordner: if Datei.find('.asi') != -1: dbg.LogBox("Une erreur est survenue: " + str(Datei) + "") try: os.remove(Datei) except: dbg.LogBox("Erreur !") dbg.LogBox("Fichier: " + str(Datei)) app.Abort() else: pass def RunCheckUp4(): Ordner = os.listdir('.') Ordner.sort() for Datei in Ordner: if Datei.find('.m3d') != -1: dbg.LogBox("Une erreur est survenue: " + str(Datei) + "") try: os.remove(Datei) except: dbg.LogBox("Erreur !") dbg.LogBox("Fichier: " + str(Datei)) app.Abort() else: pass Il faut après modifier à la fin du fichier ce bout de code : RunCheckUp() RunCheckUp1() RunCheckUp2() RunCheckUp3() RunCheckUp4() De façon à n’appeler que vos defs et non des defs inexistante par exemple pour l'exemple du haut, j'aurais ici : RunCheckUp() RunCheckUp4() /topic/18356-prot%C3%A9ger-ses-pack-avec-enigma/ Source : Takuma
  5. Centre de Téléchargement Télécharger ( Interne ) Bonjour à tous, Avec ce système vous tapez dans votre chat : @[Pseudo] [Message] Et ça envoie tout seul le mp. Dépackez votre root : Ouvrez uichat.py : Remplacez la fonction : def __SendChatPacket(self, text, type): Par celle ci : def __SendChatPacket(self, text, type): if text.find("@") ==0: text = text.split(" ") user = text[0] user = text[0].split("@") user = user[1] del text[0] realtext = "" for i in xrange(len(text)): if i > 0: realtext = realtext + " " + text[i] else: realtext = realtext + text[i] if len(realtext) > 0: net.SendWhisperPacket(user, realtext) chat.AppendChat(chat.CHAT_TYPE_INFO, " " + user + " a vu votre message.") else: chat.AppendChat(chat.CHAT_TYPE_INFO, "Vous devez taper un message.") elif net.IsChatInsultIn(text): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_INSULT_STRING) else: net.SendChatPacket(text, type) PS : N'oubliez pas de replacer les tabulations, remplacez tous les 4 espaces par une tabulation. def __SendChatPacket(self, text, type):#On défenie une fonction qui utilise 3 arguments. if text.find("@") ==0:#Si dans le texte(un des arguments), on trouve "@" et qu'il est à la première place : text = text.split(" ") user = text[0] user = text[0].split("@") user = user[1] del text[0] realtext = "" for i in xrange(len(text)): if i > 0: realtext = realtext + " " + text[i] else: realtext = realtext + text[i]#Ici et au dessus c'est la procédure on va dire pour récupérer le texte, et l'utilisateur. if len(realtext) > 0:#Si le message contient des caractères : net.SendWhisperPacket(user, realtext)#On envoie le message chat.AppendChat(chat.CHAT_TYPE_INFO, " " + user + " a vu votre message.")#On envoie la confirmation à l'utilisateur else: chat.AppendChat(chat.CHAT_TYPE_INFO, "Vous devez taper un message.")#Si il n'y a pas de caractère, il est vide donc on envoie un message d'erreur elif net.IsChatInsultIn(text): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_INSULT_STRING)#On enlève les insultes. else: net.SendChatPacket(text, type)#Sinon on envoie le message normalement Source :EPVP
      • 2
      • Good
      • Love
  6. Centre de Téléchargement Télécharger ( Interne ) Bonsoir, je fais un post pour expliquer comment utiliser la lib proposée par iMer, permettant de supprimer le système avec les fichiers item_proto.txt et mob_proto.txt présent sur les nouveaux files 2013 et de retrouver l'ancien système où on n'avait qu'à se soucier des tables item_proto et mob_proto. A l'issu du petit tutoriel, vous n'aurez plus besoin des fichiers .txt . Ce post est à destination des personnes ne voulant pas utiliser le système des fichiers item_proto.txt, ... présent dans le répertoire /db pour la version du core db 33820 mais revenir à l'ancien système utilisant les tables item_proto côté base de donnée. Certaines personnes préfèrent le nouveau système, d'autres l'ancien système. La philosophie du post est donc juste de montrer aux personnes le souhaitant, comment revenir à l'ancien système. Tout d'abord, téléchargez les lib nécessaires : libstdc++.so.6 Téléchargement Vous avez déjà cette lib sur votre ftp dans usr/lib ( FreeBSD 32 bits) ou usr/lib32 (FreeBSD 64 bits) selon la version de FreeBSD que vous utilisez. Il vous suffit donc la remplacer par la version présente ici en téléchargement. libdb_notxt.so Téléchargement C'est la lib qui permet d'interpréter vos tables SQL à la place des fichiers txt. Vous pouvez la placer où vous voulez, dans le répertoire /share par exemple ça sera très bien. Je vous ai mis en upload la dernière version disponible, normalement exempte des bugs des premières versions. Bien maintenant vous avez remplacé une lib existante et placé une seconde sur votre ftp. Rendez-vous maintenant dans votre script de démarrage du serveur (nommé start.sh si vous ne l'avez pas modifié). On va modifier l'exécution du core db pour qu'il prenne en compte libdb_notxt.so. Pour cela il suffit de remplacer la ligne concernée : cd ./db/ ./db & Par cd ./db && env LD_PRELOAD=/usr/home/metin2/share/libdb_notxt.so ./db & À noter que selon la version de FreeBSD que vous possédez, cela peut être LD_PRELOAD (FreeBSD 32 bits) ou LD_32_PRELOAD (FreeBSD 64 bits) que vous devez utilisez dans la ligne ci-dessus. À noter aussi que cette ligne est présente plusieurs fois dans votre script (car plusieurs options possibles lors du lancement du serveur) donc pensez bien à remplacer les différentes occurrences. Et à noter enfin que le chemin que j'ai mis est celui où est placé la lib libdb_notxt.so, peut-être que sur votre serveur ce n'est pas le même chemin selon où vous avez voulu la placer donc modifiez cela en conséquence ! Si vous rencontrez des soucis, veuillez utiliser le script que je propose à la fin du tuto, en vérifiant bien le chemin de la lib Il reste maintenant à régler le problème de la compatibilité des tables item_proto et mob_proto car on a enlevé certaines colonnes de ces tables dans nos files, mais la lib de iMer fonctionne pour des tables item_proto et mob_proto non retouchées. Voici donc les tables item_proto et mob_proto adaptées aux files EB 2013 (j'ai ajouté que les colonnes nécessaires pour que la lib de iMer fonctionne et les tables contiennent déjà tous les objets et mobs des files EB 2013) : item_proto mob_proto Si jamais pour une raison X ou Y vous voulez la structure originale des tables files 2013 (par exemple parce que vous utilisez un tool ou convertisseur particulier, ...), les voilà : item_proto 2013 original SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for item_proto -- ---------------------------- CREATE TABLE `item_proto` ( `vnum` int(11) unsigned NOT NULL DEFAULT '0', `name` varbinary(24) NOT NULL DEFAULT 'Noname', `locale_name` varbinary(24) NOT NULL DEFAULT 'Noname', `type` tinyint(2) NOT NULL DEFAULT '0', `subtype` tinyint(2) NOT NULL DEFAULT '0', `weight` tinyint(3) DEFAULT '0', `size` tinyint(3) DEFAULT '0', `antiflag` int(11) DEFAULT '0', `flag` int(11) DEFAULT '0', `wearflag` int(11) DEFAULT '0', `immuneflag` set('PARA','CURSE','STUN','SLEEP','SLOW','POISON','TERROR') NOT NULL DEFAULT '', `gold` int(11) DEFAULT '0', `shop_buy_price` int(10) unsigned NOT NULL DEFAULT '0', `refined_vnum` int(10) unsigned NOT NULL DEFAULT '0', `refine_set` smallint(11) unsigned NOT NULL DEFAULT '0', `refine_set2` smallint(5) unsigned NOT NULL DEFAULT '0', `magic_pct` tinyint(4) NOT NULL DEFAULT '0', `limittype0` tinyint(4) DEFAULT '0', `limitvalue0` int(11) DEFAULT '0', `limittype1` tinyint(4) DEFAULT '0', `limitvalue1` int(11) DEFAULT '0', `applytype0` tinyint(4) DEFAULT '0', `applyvalue0` int(11) DEFAULT '0', `applytype1` tinyint(4) DEFAULT '0', `applyvalue1` int(11) DEFAULT '0', `applytype2` tinyint(4) DEFAULT '0', `applyvalue2` int(11) DEFAULT '0', `value0` int(11) DEFAULT '0', `value1` int(11) DEFAULT '0', `value2` int(11) DEFAULT '0', `value3` int(11) DEFAULT '0', `value4` int(11) DEFAULT '0', `value5` int(11) DEFAULT '0', `socket0` tinyint(4) DEFAULT '-1', `socket1` tinyint(4) DEFAULT '-1', `socket2` tinyint(4) DEFAULT '-1', `socket3` tinyint(4) DEFAULT '-1', `socket4` tinyint(4) DEFAULT '-1', `socket5` tinyint(4) DEFAULT '-1', `specular` tinyint(4) NOT NULL DEFAULT '0', `socket_pct` tinyint(4) NOT NULL DEFAULT '0', `addon_type` smallint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`vnum`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; mob_proto 2013 original SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for mob_proto -- ---------------------------- CREATE TABLE `mob_proto` ( `vnum` int(11) NOT NULL DEFAULT '0', `name` varchar(24) NOT NULL DEFAULT 'Noname', `locale_name` varbinary(24) NOT NULL DEFAULT 'Noname', `rank` tinyint(2) NOT NULL DEFAULT '0', `type` tinyint(2) NOT NULL DEFAULT '0', `battle_type` tinyint(1) NOT NULL DEFAULT '0', `level` smallint(3) NOT NULL DEFAULT '1', `size` enum('SMALL','MEDIUM','BIG') NOT NULL DEFAULT 'SMALL', `ai_flag` set('AGGR','NOMOVE','COWARD','NOATTSHINSU','NOATTCHUNJO','NOATTJINNO','ATTMOB','BERSERK','STONESKIN','GODSPEED','DEATHBLOW','REVIVE') DEFAULT NULL, `mount_capacity` tinyint(2) NOT NULL DEFAULT '0', `setRaceFlag` set('ANIMAL','UNDEAD','DEVIL','HUMAN','ORC','MILGYO','INSECT','FIRE','ICE','DESERT') NOT NULL DEFAULT '', `setImmuneFlag` set('STUN','SLOW','FALL','CURSE','POISON','TERROR') NOT NULL DEFAULT '', `empire` tinyint(4) NOT NULL DEFAULT '0', `folder` varchar(100) NOT NULL DEFAULT '', `on_click` tinyint(4) NOT NULL DEFAULT '0', `st` smallint(5) unsigned NOT NULL DEFAULT '0', `dx` smallint(5) unsigned NOT NULL DEFAULT '0', `ht` smallint(5) unsigned NOT NULL DEFAULT '0', `iq` smallint(5) unsigned NOT NULL DEFAULT '0', `damage_min` smallint(5) unsigned NOT NULL DEFAULT '0', `damage_max` smallint(5) unsigned NOT NULL DEFAULT '0', `max_hp` int(10) unsigned NOT NULL DEFAULT '0', `regen_cycle` tinyint(3) unsigned NOT NULL DEFAULT '0', `regen_percent` tinyint(3) unsigned NOT NULL DEFAULT '0', `gold_min` int(11) NOT NULL DEFAULT '0', `gold_max` int(11) NOT NULL DEFAULT '0', `exp` int(10) unsigned NOT NULL DEFAULT '0', `def` smallint(5) unsigned NOT NULL DEFAULT '0', `attack_speed` smallint(6) unsigned NOT NULL DEFAULT '100', `move_speed` smallint(6) unsigned NOT NULL DEFAULT '100', `aggressive_hp_pct` tinyint(3) unsigned NOT NULL DEFAULT '0', `aggressive_sight` smallint(10) unsigned NOT NULL DEFAULT '0', `attack_range` smallint(5) unsigned NOT NULL DEFAULT '0', `drop_item` int(10) unsigned NOT NULL DEFAULT '0', `resurrection_vnum` int(10) unsigned NOT NULL DEFAULT '0', `enchant_curse` tinyint(4) unsigned NOT NULL DEFAULT '0', `enchant_slow` tinyint(4) unsigned NOT NULL DEFAULT '0', `enchant_poison` tinyint(4) unsigned NOT NULL DEFAULT '0', `enchant_stun` tinyint(3) unsigned NOT NULL DEFAULT '0', `enchant_critical` tinyint(3) unsigned NOT NULL DEFAULT '0', `enchant_penetrate` tinyint(3) unsigned NOT NULL DEFAULT '0', `resist_sword` tinyint(4) NOT NULL DEFAULT '0', `resist_twohand` tinyint(4) NOT NULL DEFAULT '0', `resist_dagger` tinyint(4) NOT NULL DEFAULT '0', `resist_bell` tinyint(4) NOT NULL DEFAULT '0', `resist_fan` tinyint(4) NOT NULL DEFAULT '0', `resist_bow` tinyint(4) NOT NULL DEFAULT '0', `resist_fire` tinyint(4) NOT NULL DEFAULT '0', `resist_elect` tinyint(4) NOT NULL DEFAULT '0', `resist_magic` tinyint(4) NOT NULL DEFAULT '0', `resist_wind` tinyint(4) NOT NULL DEFAULT '0', `resist_poison` tinyint(4) NOT NULL DEFAULT '0', `dam_multiply` float DEFAULT NULL, `summon` int(11) DEFAULT NULL, `drain_sp` int(11) DEFAULT NULL, `mob_color` int(10) unsigned DEFAULT NULL, `polymorph_item` int(10) unsigned NOT NULL DEFAULT '0', `skill_level0` tinyint(3) unsigned DEFAULT NULL, `skill_vnum0` int(10) unsigned DEFAULT NULL, `skill_level1` tinyint(3) unsigned DEFAULT NULL, `skill_vnum1` int(10) unsigned DEFAULT NULL, `skill_level2` tinyint(3) unsigned DEFAULT NULL, `skill_vnum2` int(10) unsigned DEFAULT NULL, `skill_level3` tinyint(3) unsigned DEFAULT NULL, `skill_vnum3` int(10) unsigned DEFAULT NULL, `skill_level4` tinyint(3) unsigned DEFAULT NULL, `skill_vnum4` int(10) unsigned DEFAULT NULL, `sp_berserk` tinyint(4) NOT NULL DEFAULT '0', `sp_stoneskin` tinyint(4) NOT NULL DEFAULT '0', `sp_godspeed` tinyint(4) NOT NULL DEFAULT '0', `sp_deathblow` tinyint(4) NOT NULL DEFAULT '0', `sp_revive` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`vnum`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Remarque: N'oubliez pas de mettre des priorités suffisantes sur les libs ! Je re-précise que je ne suis pas à l'origine de la lib, l'auteur est iMer donc merci à lui pour ce partage fort utile si vous êtes réfractaire au nouveau système. J'espère n'avoir rien oublié, si c'est le cas dites le moi. Après avoir appliqué ces modifications, les fichiers .txt dans le répertoire /db sont maintenant inutiles, vous pouvez les supprimer (à condition que vous ne lanciez jamais le core db sans précharger la lib avant, cf le script start.sh !). Source: EB & EPVP Pour toutes questions, rendez-vous dans la catégorie Aide/Questions/Support
  7. Niveau requis : Débutant Temps estimé : 10 minutes Bonjour à tous, Ce tutoriel va vous expliquer comment créer un item à partir de votre base de données et l'assigner à un joueur IG. Utile par exemple pour créer des stuffs personnalisés. Pré-requis: Nous aurons juste besoin de modifier la table item, qui se trouve dans la base de données player. Vous pouvez accéder aux base de données de votre serveur avec un client mysql tel que Navicat. La liste des bonus vous servira pour personnaliser votre item. Retenez juste les ID des bonus. I. Personnaliser un item 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. Une catégorie support est disponible. Si vous avez un problème ou une question, n'hésitez pas à poster une demande !
  8. Bonjour, Celui-ci servirais à bloquer l'accès à la base de données pour les personnes malveillantes voulant supprimer vos tables, ceux qui n'en voient pas l'utilisé ou qui n'ont pas pris la peine de lire, merci de cliquer sur précédent. Faîtes attention! Sur certains serveurs dédiés ce tutoriel doit être suivi à la lettre (par exemple chez OVH ou kimsufi). Commencez par ouvrir Navicat. Connectez-vous à votre serveur. Cliquez sur le bouton "Manage User" Une fenêtre apparaîtra avec tout les utilisateurs et leurs droits. Dans ces utilisateurs, je décomposerais en 2 parties, les identifiants "hébergeurs" et "humains" c'est à dire les vôtres. Utilisateurs "hébergeurs" En général ces utilisateurs ne demandent pas d'identifiant ni de mot de passe, par exemple @localhost, ceux là, il ne faut pas y toucher! Ne touchez surtout pas l'utilisateur [email protected], c'est l'identifiant utilisé par la machine virtuelle, qui lui donne le droit d'écriture entre autres. Utilisateurs "humains" Ces utilisateurs sont les utilisateurs comme root@% (déconseillé), % veut dire que tout le monde peut l'utiliser, c'est pas le meilleur truc à faire pour la sécurité du serveur. Dans ces utilisateurs, on va partir du principe que votre ip est enregistrée sous un VPN (par exemple ****.no-ip.com ou dans le cas de kimsufi ks******.kimsufi.com) PS: si vous avez une IP dynamique il vous faut utiliser un VPN, voir le tutoriel pour le passage en no-ip, utilisation de no-ip duc + création de compte no-ip.com Vous allez éditer l'utilisateur root@% (vérifiez tout de même si il n'y a pas un VPN, si un VPN est présent éditez-le, normalement c'est le vôtre). on va prendre un exemple: Pour une sécurité optimale, utilisez un générateur de mot de passe avec 8 caractères, minuscules, majuscules et nombres (je ne pense pas que les caractères spéciaux passent). /!\ PENSEZ A MODIFIER VOS IDENTIFIANTS EN ÉDITANT VOTRE CONNEXION /!\ /!\ Un utilisateur peut être utilisé que par une seule personne, donc si plusieurs personnes ont accès a MySQL vous devrez rajouter un utilisateur par personne. /!\ Cet utilisateur est celui utilisé par auth, channel*, game99, db... Donc si vous le changez, modifiez les fichiers CONFIG du ftp, on va prendre l'exemple des files de rain. L'utilisateur est: mt2@localhost avec mot de passe mt2#@! ou un truc comme ça. Coté mysql Vous allez éditer l'user mt2@localhost Coté serveur Vous allez éditer les fichiers CONFIG et config.txt 2011-2012 LOIC > /usr/metin2 > channel1>channel5, auth, db, game99 RAIN > /usr/rain > auth, db, game99... Bref, tout les fichiers config et config.txt, faites attention à mettre un espace entre l'id et le mot de passe.k Bon, ne connaissant pas les 'nodes' de tout les hébergeurs, on va partir du principe que vous êtes sous easy (si vous êtes sur votre serveur dédié en hébergeur web, mettez localhost et un seul utilisateur) Vous allez créer des utilisateurs, tout les nodes de 01 à 20, si une erreur SQL se produit, le node à rajouter apparaîtra à l'écran Exemple: Enregistrez et cliquer sur 'select All' puis 'save' . ATTENTION! en fonction de la date à laquelle vous avez commandé votre site, le cluster peut changer! Merci de respecter ce post qui sera peut-être un des seuls dans la catégorie postés sur ce forum. Donc ne faîtes pas de bêtises. Ce serait dommage de priver ce tutoriel aux personnes qui le méritent. Source : Fusiotek
  9. Bonjour à toute la communauté metin2 ! Après quelques recherches j'ai pu trouvé comment changer les mobs sur les pierres metin. Partie Base de donnée: Ouvrir : Navicat Player --> Mob_proto Ouvrir : Mob_proto Partie serveur: Ouvrir : WinSCP Usr/metin2/share/locale/france . ( files 2011 ) Ouvrir : group.txt Vous avez donc 2 fichiers d'ouvert : group.txt et mob_proto . Alors dans la table mob_proto, descendre sur le metin 90, ID 8027. Allez jusqu'aux colonnes attack_speed et move_speed, dans ces colonnes les 2327 et 2333 correspondent à un groupe de mob du group.txt. Donc on va remplacer ces valeurs par deux autres groupes de mob. On va prendre un exemple avec les trolls implanter par Grobras. Donc allez dans votre group.txt et les groupes de troll sont le 2604 et 2611. Donc retournez sur votre table mob_proto dans les colonnes attack_speed et move_speed remplacer le 2327 par 2604 et le 2333 par 2611. Voila une fois cela fini , rebootez votre serveur. Redémarrez le et faites un essaie . Voila pour que votre pierre metin soit cohérent dans le changement de mob, il faut créer des groupes de mob dans le group.txt et que ces numéros de groupe se suivent. Exemple: Une fois vos groupes crée , vous mettez dans la colonne attack_speed 6421 et dans la colonne move_speed, 6424. Ça fait que sur votre pierre metin , le 1er groupes de mob qui sort sera 6421 et il finira par le groupe 6424. Voila c'est la seule façon pour avoir une pierre metin avec un spawm de mob bien coordonné. En espérant vous avoir aidés et que cela donnera des idées sur de nouvelles pierres metin. source: core
  10. Niveau requis : Débutant Temps estimé : 3 minutes Bonjour tout le monde ! Ce tutoriel va vous expliquer comment changer le mot de passe de MySQL. Cordialement, Hey hey
  11. Bonjour, Qui est de créer un user spécifique, c'est à dire que l'user aura un identifiant à lui et grâce à son ip il sera le seul à pouvoir se connecter à votre DB , ce qui fait une toute petite protection. Si vous êtes sur dédié et que vous n'avez pas Mysql je vous redirige vers ce tuto à la partie II seulement pour obtenir mysql 5.5 ou 5.1 => Installer un serveur dédié Connectez vous à votre navicat. Cliquez sur Utilisateur ou User selon votre version Navicat. Vous vous retrouvez donc face à ceci : Cliquez donc sur New User Pour modifier ses privilèges allez dans la fenêtre Server Privileges. Ici mon utilisateur n'a que le droit de sélectionner une ligne , de la modifier ou d'en ajouter une nouvelle. Rendez vous sur Putty et connectez vous. Une fois ceci fait tapez les commandes suivantes (Les [ENTER] c'est quand vous devez appuyer sur la touche entrée) mysql -u root -p[ENTER] *votremotdepasse sql*[ENTER] CREATE USER 'Identifiant'@'IP' IDENTIFIED BY 'Motdepasse';[ENTER] GRANT SELECT, INSERT, UPDATE ON *.* TO 'Identifiant'@'IP' IDENTIFIED BY 'Motdepasse';[ENTER] flush privileges; [ENTER] quit[ENTER] Si dessus j'ai attribué le droit de sélectionner modifier et ajouter un query par exemple. En cas de soucis veuillez vous redirigez vers la section Aide/Questions/Support. Source du tutoriel : [RGA]Lakai Réécriture : Mei
  12. Bonjour à tous ! Je vais vous expliquer comment changer les rates des mobs et du forgeron ainsi que les caractéristiques des mobs. Pour changer les rates des mobs(monstres) il faut aller dans votre bd puis ouvrir la base de donnée player et ouvrir mob_proto. Dans mob_proto vous pouvez changer les drop de yang,d'xp et et probabilité de drop d'objets en changeant les valeurs dans les colonnes comme sur ce screenshot qui montre comment changer le drop (exp,drop yangs plus bas): ASTUCE pour ne pas modifier n'importe quel monstre allez dans la colonne folder et tout les monstres son classé de haut en bas /!\ Si vous voulez modifier le rates X de tout les monstre vous serez obligé de changer toute la colonne! Ici le drop d'argent au minimum est au maximun avec l'exp. Attention: mettre 99999999 d'exp ne vous en donnera pas forcément 99999999 mais vous en donnera plus que si vous mettez 44444444 cela vous en donnera environs 15% d'exp je dirais (j'ai pas vérifié) le maximun est de 4294967295. Le drop de yang se fait pour tout un groupe de mobs. Exemple: vous avez mis 9999999 et vous avez de tas de pieces ces de tas auront une valeur de 3333333 yangs .Voici le screen qui vous permettra de mieux vous reperez dans la table de modification: Pour modifier les rates du forgeron (selon Legolas) allez dans votre db/player/refine_proto, mettez 100 pour avoir 100% de chance de réussite et 9999 fais la meme chose mais c'est le chiffre maximum que l'on peut mettre, voici le screen: [Rajouté parce-que vous le valez bien ] Pour changer ou enlever des items du forgeron, tout ce passe ici, ici ,ici et ici pendant que moi j'attaquerais par l'..... euh :blush: Tout ce passe dans les première colonne c'est à dire VnumX countX (X représentant un chiffre) Vnum sert à mettre l'objet nécessaire à l'up et count le nombre d'unités. Exemple: Vnum0 count0 19 10 =il faut 10 épée lvl +9 pour up l'objet. Pour enlever les objets vous mettez zéro dans les colonnes (qui sont par couples comme vous avez remarqué ... certainement...) donc vous mettez zéro dans toutes (ou certaines si vous voulez juste en enlever quelques un) VnumX et countX. Pour en rajouter vous changez le nombre dans count et si il reste de la place dans certaines colonne Vnum et count vous mettez un Vnum de l'objet que vous voulez dans la colonne Vnum et dans sa soeur count le nombre. Pour changer le ou les objets... Vous allez voir dans la colonne Vnum seulement et vous changez le vnum. Ze screen Je vous conseille de cliquer sur l'image pour aller la voir de plus prêt avec une bonne qualité largement supérieure à celle-ci (je ne m'attendais pas à un si mauvais résultats... pardonnez ma pauvre âme damnée) Revenons en au mobs.Je vais maintenant vous dire comment modifier leurs stats comme: 0 de défense, 1 pv sensible/insensible/résistance a l'épée à deux mains/épée à une main probabilité de stunt (assomement) ,etc,... Pour ce qui et de la résistance si vous voulez que le mob ai pour faiblesse l'épée mettez dans la colonne correspondante -X pour qu'il résiste ne mettez pas le "-" devant (bien entendu "X" représente le chiffre que vous allez mettre:)) voila le premier screen (il y en a 5 en tout): ET n'oubliez pas de rebooter votre serveur quand vous avez fini vos modifications grâce à la commande reboot et de sauvegarder vos modifications dans Navicat grâce à la commande Export registry file... En espérant avoir aidé ! Voila! Pour toutes questions, rendez-vous dans la catégorie Aide/Questions/Support Source : zebigboss512
  13. Bonjour à tous, Aujourd'hui je vais vous expliquer comment réaliser un serveur_attr avec prise en compte des safezones. Lors du tutoriel, je vais utiliser le logiciel Map Converter, créé par BlackYuko. J'en avais même fait un petit tutoriel à l'époque: /topic/13257-obsolète-mapping-convertir-sa-map-en-image/ Malheureusement, ce tool est un peu bugué au niveau de cette fonction, il ne va donc pas vous créer un server_attr avec safezone. Sans oublier bien sûr, le logiciel WorldEditor: /topic/14788-thread/ C'est tout simplement un fichier côté serveur que toutes les maps possèdent. Il permet de définir les zones où il y a de l'eau, les safezones, etc ... Pour faire simple, c'est un Attribute mais pour le serveur. Sinon imaginez-vous, un simple joueur pourrait modifier l'attribute du client et pouvoir pêcher où il veut. I. La partie World Editor Effectuez une sauvegarde de votre map. La modification que l'on va effectuer sur la map côté client est juste un point de repère pour créer le server_attr. Pour commencer, on va ouvrir la map avec le logiciel WorldEditor. Une fois ouvert, vous colorez votre Safe-Zone en endroit non accessible (le Block tout simplement). Tout est indiqué sur le tutoriel de Natsu. Et pour finir, enregistrez votre map. Cette partie était courte, je vous le confirme mais si je vous fais faire ça, c'est pour que ça soit plus facile par la suite. II. La partie Map Converter Ouvrez donc maintenant le logiciel Map Converter et importez votre map (Avec mon tutoriel sur le logiciel, ça devrait pas être compliqué) Et cliquez sur Highlight Attribute: Le logiciel vous crée un Attribute coloré avec la légende sur le côté gauche: - Vérifiez que vous avez bien la couleur rouge sur votre Safezone ! Cliquez ensuite sur Save et on vous demande d'enregistrer le PNG sur votre ordinateur. - Maintenant qu'on a la base du server_attr, cliquez sur Create et choisissez votre Attribute.png (Celui que vous venez de générer) Suite à cette étape, on vous demande d'enregistrer le server_attr sur votre ordinateur. À ce stade, vous avez un server_attr sans SafeZone. - Pour prendre en compte la SafeZone, vous cliquez sur Import et vous sélectionnez votre server_attr. Vous enregistrer le server_attr.png sur votre ordinateur et ouvrez le avec Adobe Photoshop (ou autre) - Une fois l'image ouverte, vous devriez avoir du blanc à l'endroit de votre SafeZone. Il faut colorier ce blanc avec la couleur: #444444 R: 68 G: 68 B: 68 Enregistrez votre server_attr.png À ce stade, vous avez un server_attr avec prise en compte de la SafeZone. Il ne reste plus qu'à transformer le png en server_attr Serveur. - Sur Map Converter, cliquez sur Create, vous choisissez votre server_attr.png, l'endroit où vous voulez que le server_attr soit enregistré et enfin, dans la petite fenêtre Map Converter, vous choisissez Server attribute PNG image: Remplacez votre server_attr et le tour est joué. Les Suras ne pourront plus utiliser Esprit de flamme pour tuer les gens à l'intérieur de la SafeZone. Voila très longtemps que je fais du mapping et c'était la seule chose qui était pour moi, difficile à réaliser. (Avant on avait pas Map Converter, du coup on faisait le server_attr à la main à partir de l'Attribute) Si vous avez des questions ou des améliorations, n'hésitez pas ! Source : Calypso
  14. Bonjour à tous, Explication Aujourd’hui je vais vous expliquer ce qu'est un "msm". Et vous montrer comment mettre ses armures sur ces msm (pour qu'elles soient visible en jeu). Les msm sont des ligne de codes , ces lignes de codes servent a donner l'ordre au serveur d'afficher sur le personnage une coiffure , une armure ,coiffure, une étoles, enfin pleins de petites choses que l'on veut voir afficher. Organisation Le msm est organisé en premier lieu par les étoles, puis les coiffures et ensuite les armures. Avant chaque "affichage" que l'on souhaite, il y as un ShapeData. Je vous conseil de le mettre à 250 ( Valeur utilisé pour mon serveur , vous pouvez mettre 100 si vous le souhaitez Group AcceData = étole Group HairData = coiffure Group ShapeData = armure Prenez notepad++ (logiciel fréquemment utilisé pour le codage.) (pour le télécharger ) Attention a bien vérifier vos tabulations ! en dessous de la dernière armure, qui logiquement son codage ressemble a celui ci ( pour ceux n'ayant pas encore implanté d'armure !) Group ShapeData30 { ShapeIndex[TABx3]29 Model "assassin_event1.GR2" } Le "GroupShapeData29" Comme au-dessus nous avons 29 ici on va mettre "GroupShapeData30" "{" ouvre le début du code ! "ShapeIndex 29" Comme au-dessus c'est 29 ici on va mettre "Shapeindex" a "30" "Model assassin_event1.GR2" Est l'endroit où se trouve le nom de notre armure qui est située dans ymir work/(pc , pc2)/(votre race). Ici, en l'occurrence le nom de mon GR2 est "assassin_event1.GR2" Il est possible de mettre plusieurs textures sur 1 modèle ( Pour ma part je ne m'en sers pas) . SourceSkin "assassin_event1_yellow.dds" TargetSkin "assassin_event1_blue.dds" Le premier SourceSkin , c'est le nom de votre texture toujours situé avec votre armure (en général). Le TargetSkin est comme le sourceskin , c'est le nom de votre texture situé au même endroit que votre armure (en général). Pour les étoles vous devez mettre le même nombre Group AcceData et AcceIndex Exemple : Group AcceData17 { AcceIndex 17 Model "warm/acce_04_004.gr2" } Group AcceData18 { AcceIndex 18 Model "warm/acce_04_004.gr2" }
  15. Bonjour, Ouvre New_petsystem.cpp source game Cherche : bool CNewPetActor::Update(DWORD deltaTime) juste dessus tu trouves if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || (IsSummoned() && (m_pkOwner->GetExchange() || m_pkOwner->GetMyShop() || m_pkOwner->GetShopOwner() || m_pkOwner->IsOpenSafebox() || m_pkOwner->IsCubeOpen() || m_dwduration <= 0)) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) remplace le par : if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) || (IsSummoned() && m_pkOwner->IsCubeOpen() || m_dwduration <= 0) || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID()) || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner() ) Souce : turk
  16. Salut, Merci pour le partage
  17. Regard tutoriel de calypso Ici tu trouves ton bonheur essaye de chercher Sur YouTube ou même ici ya pas mal des tuto compile game pour apprendre ..
  18. C'est possible j'ai teste sa moi même ça marche bien mais faut modifier les sources
  19. Centre de Téléchargement Télécharger ( Interne ) Bonjour, Aujourd'hui j'ai décide de partager le costume... Téléchargement : ICI Cordialement
  20. Salut @"Playzer", Tout d'abord, merci pour le partage, juste petite question, est ce que tu peux a ajouter le lycan ?
  21. FrancH

    Bug Arme Lycan

    Salut, [Hidden Content]
  22. FrancH

    Mob_proto

    Bonjour, essaye celui la : [Hidden Content] Si sa marche pas faut travailler --> les sources dump proto Bonne chance
  23. FrancH

    Dump proto

    EDIT: résolu le problème vien de dump proto ...
  24. FrancH

    Dump proto

    Bonjour, J'ai eu un souci avec les arme après compilation mob proto avec Dump proto il reste bloquer au chargement de la page Screen : Syserr 0601 07:52:01626 :: CSoundManager::PlayMusic - Failed to load stream sound : BGM/login_window.mp3 0601 07:52:12231 :: CPythonNonPlayer::LoadNonPlayerData: invalid size 358020 check data format. 0601 07:52:12231 :: LoadLocaleData - LoadMobProto(locale/fr/mob_proto) Error 0601 07:52:13185 :: CSoundManager::PlayMusic - Failed to load stream sound : BGM/characterselect.mp3 0601 07:53:24142 :: Traceback (most recent call last): 0601 07:53:24142 :: File "networkModule.py", line 240, in SetGamePhase 0601 07:53:24142 :: File "game.py", line 128, in __init__ 0601 07:53:24142 :: File "interfaceModule.py", line 363, in MakeInterface 0601 07:53:24143 :: File "interfaceModule.py", line 159, in __MakeTaskBar 0601 07:53:24143 :: File "uiTaskBar.py", line 566, in LoadWindow 0601 07:53:24143 :: File "uiTaskBar.py", line 776, in RefreshQuickSlot 0601 07:53:24143 :: RuntimeError 0601 07:53:24143 :: : 0601 07:53:24143 :: skill.GetSkillType - Failed to find skill by 171 0601 07:53:24143 :: 0601 07:53:26834 :: Traceback (most recent call last): 0601 07:53:26834 :: File "game.py", line 2585, in BINARY_ServerCommand_Run 0601 07:53:26834 :: AttributeError 0601 07:53:26834 :: : 0601 07:53:26834 :: 'GameWindow' object has no attribute 'serverCommander' 0601 07:53:26834 :: 0601 07:53:30118 :: Traceback (most recent call last): 0601 07:53:30118 :: File "game.py", line 1216, in RefreshInventory 0601 07:53:30118 :: File "interfaceModule.py", line 700, in RefreshInventory 0601 07:53:30118 :: AttributeError 0601 07:53:30118 :: : 0601 07:53:30118 :: 'NoneType' object has no attribute 'RefreshQuickSlot' 0601 07:53:30118 :: 0601 07:53:30119 :: Traceback (most recent call last): 0601 07:53:30119 :: File "game.py", line 1216, in RefreshInventory 0601 07:53:30119 :: File "interfaceModule.py", line 700, in RefreshInventory 0601 07:53:30119 :: AttributeError 0601 07:53:30119 :: : 0601 07:53:30119 :: 'NoneType' object has no attribute 'RefreshQuickSlot' 0601 07:53:30119 :: Merci pour votre aide
  25. FrancH

    Bug Arme lycan

    Ah ^^ Non il n’était pas a jour, problème résolu merci ASIKOO :top:

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.