Jump to content

Search the Community

Showing results for tags 'intermédiaire'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Espace Communautaire
    • Funky Emulation
    • Services
    • Bureau de la Communauté
    • Espace Premium
  • Emulation & Co
    • Suggest a Release / Tutorial
    • M2 Project
  • Emulation de jeux
    • Metin2
    • Metin2 Dev
    • Minecraft
    • Dofus
    • World of Warcraft
    • Voir plus...
  • Espace Divers
  • PassionDev's Forum
  • EmuTarkov's Liens importants
  • EmuTarkov's Discussions

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Nationality


Sexe


Discord


Skype


Site


Steam ID


Minecraft


Dofus


Metin2


RaiderZ


X


World of Warcraft


Aion


Habbo


GTA


Roblox


Wakfu


PHP


SQL


HTML


CSS


JavaScript


Java


LUA


Python


VisualBasic


C++


c#


C


3D


2D


Mapper


PHP

Found 7 results

  1. Niveau requis Débutant Temps estimé : 5 minutes Bonjour, Bonsoir Je vous partage un petit système qui peut faire plaisir à beaucoup de personnes. Ce système peut être modifié, vous pouvez ajouter les bonus que vous souhaitez, mais ceci nécessite quelque connaissance en C++ & Python. Tout est expliqué dans le dossier à télécharger. Pré-requis Source Serveur Client N’hésitez pas à me contacter sur Discord si vous avez des erreurs concernant ce système.
  2. DOWNLOAD J'ai ça dans mes archives, j'ai pas testé à vous de voir
  3. Mr Spell Heyio, Aujourd'hui je vous propose un tutoriel pour l'un des scripts les plus connus du monde des serveurs privés UltraFun. On va apprendre à faire un Mr.Spell Avant de commencer mes blagues super sympas, je tiens tout de même à vous signaler que ce tutoriel est le sujet d'une de mes vidéos Youtube. Alors le Mr Spell cé kwa ? Le Mr. Spell ou appelés "Misteur Spaile" par les non Anglophones est un PNJ qui vous permet d'apprendre un sort qui n'est pas de votre classe. Il est très utilisés sur les serveurs UltraFun afin de .. de .. - Le Mr Spell il sert à quoi Bob ? - C'est pour que le jeux soit plus Fun. - Ah. Donc il est très utilisés sur les serveurs en manque d'imagination et qui ont du mal à chier du contenu. (Oui je prend partit durant mes tutoriels écris, je n'aime pas les serveurs ultraFun poubelle). Bref .. trêve de grivoiserie, il est tant d'entrer dans le vif du sujet. Le Code, le pur, le dure! Pour commencer on va déclerer nos tableaux qui vont nous êtres utile. local MrSpell = {}; MrSpell.Locale = { [1] = 'Guerrier', }; MrSpell.spellList = { [1] = {}, }; MrSpell.spellCost = { }; Alors comme vous pouvez le voir j'ai déjà mis quelques informations, c'est tout simplement pour vous aider pour la suite. Il reste tout de même 2 tableaux qui sont vide : MrSpell.spellList = { [1] = {}, }; MrSpell.spellCost = { }; MrSpell.spellList : nous serviras à stocker les sorts triés par classe. MrSpell.spellCost : nous serviras à stocker les prix des sorts. Voici un exemple un peu plus valide. local MrSpell = {}; MrSpell.Locale = { [1] = 'Guerrier', }; MrSpell.spellList = { [1] = { [12550] = 'Frappe mortelle', [69] = 'Frappe héroïque', }, }; MrSpell.spellCost = { [12550] = 50, [69] = 100, }; Ici je dis donc que le sort 12550 se nomme 'Frappe mortelle' et que ce même sort couteras 50 de notre monnaie. function MrSpell.onHello(event, player, object) local pClass = player:GetClass(); for k, v in pairs(MrSpell.Locale) do if (pClass ~= k) then player:GossipMenuAddItem(0, v, 0, k) end end player:GossipSendMenu(1, object); end Ici c'est très simple quand notre joueur parleras au PNJ on lui demande d'afficher la liste des classes et de ne pas afficher la classe qui correspond au joueur. Par exemple un Guerrier ne peu pas voir la catégorie Guerrier et acheter un sort de guerrier. Si vous vouhaitez permettre ceci il vous suffiras simplement de retirer le : if (pClass ~= k) then ... end Et ainsi les Guerriers pourrons acheter les sorts de Guerriers. Je n'ai pas spécialement besoin d'expliquer ce qu'il ce passe durant ce morceau de code vue .. qu'il ne passe pas grand choses, j'ai fait une boucle "for" pour parcourir mon tableau et afficher des informations dans un menu Gossip. D'ailleurs si vous souhaitez en savoir plus sur les gossip Kazuma a fait un tutoriel là dessus. Maintenant il nous faut faire le GossipSelect qui vas d'ailleurs contenir les 3/4 de notre code. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do end end Ont commence par faire une boucle des sorts de notre list complète. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do end end end end Ici ont vérifie que si notre intid est égale à la classId. Cela va servir à afficher les sorts qui ne concerne que la classe que nous avons séléctionnés dans le menu principal. Après quoi ont fait une boucle "for" du sous tableau de MrSpell.spellList. (Je m'explique): MrSpell.spellList = { }; Ca c'est le tableau "principal" un tableau simple, sauf que nous lui demandons de stocker les sorts pour une certains classe. MrSpell.spellList = { [1] = { [12550] = 'Frappe mortelle', [69] = 'Frappe héroïque', }, }; Ce qui fait que dans notre tableau, nous avons un tableau. On dis que MrSpell.spellList est un tableau multidimensionnel. Et comme nous avons besoin d'afficher les noms des sorts nous allons donc faire une boucle "for" pour afficher ceux-ci. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end end end Donc ici on peu voir que j'ai ajoutés un variable local (pSpell) qui va avoir comme mission de vérifier si nous connaissons ou non le sort. Celon si nous connaissons le sort ou pas, la variable local "msg" va stocker l'informations "Déjà appris" ou "Non appris". Ce qui va nous servir à le mettre à côté du nom du sort pour que le joueur soit au courant du fait qu'il ai appris le sort ou non. A la suite de quoi nous faisons simplement le listing des sorts de la catégorie choisis en ajoutant la petite variable locale "msg" pour informer le joueur. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end for spellId, _ in pairs(classSubArray) do if (intid == spellId) then end end end end Ici on va récupérer une manière de faire que l'ont utilise un peu plus haut sauf que l'ont vas inverser la technique. On va d'abord va un listing des sorts qui sont pour notre catégorie et ont vérifie si l'intid envoyés correspond à un sort de notre catégorie. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end for spellId, _ in pairs(classSubArray) do if (intid == spellId) then for spellCostId, Cost in pairs(MrSpell.spellCost) do if (spellId == spellCostId) then local pMoney = player:GetItemCount(40752); end end end end end end Alors là on lui demande de nous faire le listing de tout les prix des sorts. Puis ont va lui demander de vérifier que le sort que l'ont a choisis correspond à un sort qui a un prix (cela va nous servir juste après). A la suite de quoi je demande à enregistrer le nombre d'exemplaire de l'object 40752 que je posséde. A savoir que vous pouvez modifier ici l'entry de l'objet pour mettre celui de votre choix. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end for spellId, _ in pairs(classSubArray) do if (intid == spellId) then for spellCostId, Cost in pairs(MrSpell.spellCost) do if (spellId == spellCostId) then local pMoney = player:GetItemCount(40752); if (pMoney >= Cost)then local pSpell = player:HasSpell(spellId); else player:SendNotification('Vous n\'avez pas assez de point pour effectuer cette action.'); MrSpell.onHello(event, player, object); end end end end end end end Le PNJ vérifie que je posséde le nombre de points ou que je posséde plus de points que le prix, sinon quoi, je recevrais un message d'erreur et je serais re-envoyés au menu principal. Si je posséde le bon nombre de points je lui demande de vérifier si je posséde le sort. function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end for spellId, _ in pairs(classSubArray) do if (intid == spellId) then for spellCostId, Cost in pairs(MrSpell.spellCost) do if (spellId == spellCostId) then local pMoney = player:GetItemCount(40752); if (pMoney >= Cost)then local pSpell = player:HasSpell(spellId); if (not(pSpell)) then player:RemoveItem(40752, Cost); player:LearnSpell(spellId); player:GossipComplete(); player:SendNotification('Merci pour votre achat.'); else player:SendNotification('Vous connaissez déjà ce sort.'); MrSpell.onHello(event, player, object); end else player:SendNotification('Vous n\'avez pas assez de point pour effectuer cette action.'); MrSpell.onHello(event, player, object); end end end end end end end Et là c'est la fin, je lui dis que si je ne posséde pas le sort alors : Tu me retires le coût du sort. Tu m'apprends le sort. Tu ferme le menu. Tu m'envoies un message. Sinon il m'envoie un message d'erreur et me re-envoie vers le menu principal. Il ne reste qu'a ajouter les Events qui vont régire mon code. RegisterCreatureGossipEvent(197, 1, MrSpell.onHello) RegisterCreatureGossipEvent(197, 2, MrSpell.onSelect) - 197 étant l'entry de votre PNJ Voilà j'espère que ce tutoriel vous auras plût, j'ai essayer d'être le plus clair possible, si vous avez des questions hésitez pas! Le code complet lui ressemble à ceci : local MrSpell = {}; MrSpell.Locale = { [1] = 'Guerrier', }; MrSpell.spellList = { [1] = { [12550] = 'Frappe mortelle', [69] = 'Frappe héroïque', }, }; MrSpell.spellCost = { [12550] = 50, [69] = 100, }; function MrSpell.onHello(event, player, object) local pClass = player:GetClass(); for k, v in pairs(MrSpell.Locale) do if (pClass ~= k) then player:GossipMenuAddItem(0, v, 0, k) end end player:GossipSendMenu(1, object); end function MrSpell.onSelect(event, player, object, sender, intid) for classId, classSubArray in pairs(MrSpell.spellList) do if (intid == classId) then for spellId, spellName in pairs(classSubArray) do local pSpell = player:HasSpell(spellId); local msg = ''; if (pSpell) then msg = '|CFF009D09Déjà Appris|r'; else msg = '|CFF9D1C00Non appris|r'; end player:GossipMenuAddItem(0, spellName..' '..msg, 0, spellId) player:GossipSendMenu(1, object); end end for spellId, _ in pairs(classSubArray) do if (intid == spellId) then for spellCostId, Cost in pairs(MrSpell.spellCost) do if (spellId == spellCostId) then local pMoney = player:GetItemCount(40752); if (pMoney >= Cost)then local pSpell = player:HasSpell(spellId); if (not(pSpell)) then player:RemoveItem(40752, Cost); player:LearnSpell(spellId); player:GossipComplete(); player:SendNotification('Merci pour votre achat.'); else player:SendNotification('Vous connaissez déjà ce sort.'); MrSpell.onHello(event, player, object); end else player:SendNotification('Vous n\'avez pas assez de point pour effectuer cette action.'); MrSpell.onHello(event, player, object); end end end end end end end RegisterCreatureGossipEvent(197, 1, MrSpell.onHello) RegisterCreatureGossipEvent(197, 2, MrSpell.onSelect)
  4. F Download Center Télécharger ( Dernière Version ) ( GitHub ) Télécharger Vous souhaitez intégrer votre activité sur votre serveur sur Discord ? Eh bien vous êtes au bon endroit ! Je vais vous montrer pas a pas comment procéder ! Cordialement,
  5. F Download Center Télécharger ( Dernière Version ) UTILISATION DÉCONSEILLÉ Salut tout le monde j'ai trouvé ces fichiers Multilingue de Vegas je ne les ai pas testé par contre j'ai simplement télécharger et sa a l'air complet a vérifié pour la suite Lien de téléchargement : [Hidden Content]
  6. Dans root/introcreate.py Chercher : DESCRIPTION_FILE_NAME = ( uiScriptLocale.JOBDESC_WARRIOR_PATH, uiScriptLocale.JOBDESC_ASSASSIN_PATH, Ajouter ça avant : HAIR_DATA = ( [ 1, 2, 3, 4, 5, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, ], ## Warrior [ 1, 2, 3, 4, 5, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, ], ## Assassin [ 1, 2, 3, 4, 5, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, ], ## Sura [ 1, 2, 3, 4, 5, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, ], ## Shaman ) Chercher : ########################################################### if -1 != self.reservingRaceIndex: if app.GetTime() - self.reservingStartTime >= 1.5: chrSlot=self.stream.GetCharacterSlot() textName = self.editCharacterName.GetText() raceIndex = self.reservingRaceIndex shapeIndex = self.reservingShapeIndex startStat = self.START_STAT[self.reservingRaceIndex] statCon = self.stat[0] - startStat[0] statInt = self.stat[1] - startStat[1] statStr = self.stat[2] - startStat[2] statDex = self.stat[3] - startStat[3] net.SendCreateCharacterPacket(chrSlot, textName, raceIndex, shapeIndex, statCon, statInt, statStr, statDex) self.reservingRaceIndex = -1 ########################################################### Replacer par : ########################################################### if -1 != self.reservingRaceIndex: if app.GetTime() - self.reservingStartTime >= 1.5: chrSlot=self.stream.GetCharacterSlot() textName = self.editCharacterName.GetText() raceIndex = self.reservingRaceIndex shapeIndex = self.reservingShapeIndex hairIndex = self.HAIR_DATA[chr.RaceToJob(self.reservingRaceIndex)][self.hairIndex]#New hair startStat = self.START_STAT[self.reservingRaceIndex] statCon = self.stat[0] - startStat[0] statInt = self.stat[1] - startStat[1] statStr = self.stat[2] - startStat[2] statDex = self.stat[3] - startStat[3] net.SendCreateCharacterPacket(chrSlot, textName, raceIndex, shapeIndex, hairIndex, statCon, statInt, statStr, statDex) #New hair self.reservingRaceIndex = -1 ########################################################### Chercher : def OverOutStatButton(self): self.toolTip.Hide() Ajouter ça après : def IncreaseHair(self): chr_id = self.__GetSlotChrID(self.gender, self.slot) chr.SelectInstance(chr_id) if(self.hairIndex >= len(self.HAIR_DATA[chr.RaceToJob(chr.GetRace())]) - 1): return self.hairIndex += 1 chr.SetHair(self.HAIR_DATA[chr.RaceToJob(chr.GetRace())][self.hairIndex]) self.hairNumber.SetText(str(self.hairIndex)) chr.SetMotionMode(chr.MOTION_MODE_GENERAL) chr.SetLoopMotion(chr.MOTION_INTRO_WAIT) def DecreaseHair(self): chr_id = self.__GetSlotChrID(self.gender, self.slot) chr.SelectInstance(chr_id) if(self.hairIndex == 0): return self.hairIndex -= 1 self.hairNumber.SetText(str(self.hairIndex)) chr.SetHair(self.HAIR_DATA[chr.RaceToJob(chr.GetRace())][self.hairIndex]) chr.SetMotionMode(chr.MOTION_MODE_GENERAL) chr.SetLoopMotion(chr.MOTION_INTRO_WAIT) Chercher : self.btnCreate = getChild("create_button") self.btnCancel = getChild("cancel_button") self.btnPrev = getChild("prev_button") self.btnNext = getChild("next_button") self.btnLeft = getChild("left_button") self.btnRight = getChild("right_button") self.textBoard = getChild("text_board") Ajouter ça après : self.btnIncreaseHair = getChild("increase_hair") self.hairNumber = getChild("hair_number") self.btnDecreaseHair = getChild("decrease_hair") Chercher : getChild("hth_button").ShowToolTip = lambda arg=self.STAT_CON: self.OverInStatButton(arg) getChild("hth_button").HideToolTip = lambda arg=self.STAT_CON: self.OverOutStatButton() getChild("int_button").ShowToolTip = lambda arg=self.STAT_INT: self.OverInStatButton(arg) getChild("int_button").HideToolTip = lambda arg=self.STAT_INT: self.OverOutStatButton() getChild("str_button").ShowToolTip = lambda arg=self.STAT_STR: self.OverInStatButton(arg) getChild("str_button").HideToolTip = lambda arg=self.STAT_STR: self.OverOutStatButton() getChild("dex_button").ShowToolTip = lambda arg=self.STAT_DEX: self.OverInStatButton(arg) getChild("dex_button").HideToolTip = lambda arg=self.STAT_DEX: self.OverOutStatButton() Ajouter ça après : self.btnIncreaseHair.SetEvent(ui.__mem_func__(self.IncreaseHair)) self.btnDecreaseHair.SetEvent(ui.__mem_func__(self.DecreaseHair)) Chercher : def Open(self): print "OPEN CREATE WINDOW ----------------------------------------------------------------------------" playerSettingModule.LoadGameData("INIT") self.reservingRaceIndex = -1 self.reservingShapeIndex = -1 Ajouter ça après : self.hairIndex = 0 Chercher : def __DecreaseSlotIndex(self): Ajouter ça en dessous : if(self.hairIndex > 0): for i in xrange(SLOT_COUNT): chr.SelectInstance(self.__GetSlotChrID(0, i)) chr.SetHair(0) self.hairIndex = 0 self.hairNumber.SetText(str(self.hairIndex)) for i in xrange(SLOT_COUNT): chr.SelectInstance(self.__GetSlotChrID(1, i)) chr.SetHair(0) self.hairIndex = 0 self.hairNumber.SetText(str(self.hairIndex)) Chercher : def __IncreaseSlotIndex(self): Ajouter ça en dessous : if(self.hairIndex > 0): for i in xrange(SLOT_COUNT): chr.SelectInstance(self.__GetSlotChrID(0, i)) chr.SetHair(0) self.hairIndex = 0 self.hairNumber.SetText(self.hairIndex) for i in xrange(SLOT_COUNT): chr.SelectInstance(self.__GetSlotChrID(1, i)) chr.SetHair(0) self.hairIndex = 0 self.hairNumber.SetText(self.hairIndex) Dans locale/xx/ui/createcharacterwindow.py Chercher : { "name" : "shape_button_02", "type" : "radio_button", "x" : 139, "y" : 239 + TEMPORARY_HEIGHT, "text" : "2", "default_image" : ROOT_PATH + "Middle_Button_01.sub", "over_image" : ROOT_PATH + "Middle_Button_02.sub", "down_image" : ROOT_PATH + "Middle_Button_03.sub", }, Ajouter après : { "name" : "increase_hair", "type" : "button", "x" : 81, "y" : 239 + TEMPORARY_HEIGHT + 25, "default_image" : "d:/ymir work/ui/game/windows/btn_plus_up.sub", "over_image" : "d:/ymir work/ui/game/windows/btn_plus_over.sub", "down_image" : "d:/ymir work/ui/game/windows/btn_plus_down.sub", }, { "name" : "hair_number", "type" : "text", "x" : 110, "y" : 239 + TEMPORARY_HEIGHT + 25, "text" : "0", }, { "name" : "character_hairstyle", "type" : "text", "x" : 43, "y" : 293, "text" : "HairStyle", "text_horizontal_align" : "center", }, { "name" : "decrease_hair", "type" : "button", "x" : 139, "y" : 239 + TEMPORARY_HEIGHT + 25, "default_image" : "d:/ymir work/ui/game/windows/btn_minus_up.sub", "over_image" : "d:/ymir work/ui/game/windows/btn_minus_over.sub", "down_image" : "d:/ymir work/ui/game/windows/btn_minus_down.sub", }, Sur ces 2 fonctions: "name" : "create_button", "name" : "cancel_button", Chercher : "y" : 265 + TEMPORARY_HEIGHT, Changer par : "y" : 285 + TEMPORARY_HEIGHT, Dans UserInterface/Packet.h Chercher : typedef struct command_player_create { BYTE header; BYTE index; char name[CHARACTER_NAME_MAX_LEN + 1]; WORD job; BYTE shape; BYTE CON; BYTE INT; BYTE STR; BYTE DEX; } TPacketCGCreateCharacter; Replacer par : typedef struct command_player_create { BYTE header; BYTE index; char name[CHARACTER_NAME_MAX_LEN + 1]; WORD job; BYTE shape; WORD hair; BYTE CON; BYTE INT; BYTE STR; BYTE DEX; } TPacketCGCreateCharacter; Dans UserInterface/PythonNetworkStreamPhaseSelect.cpp Chercher : bool CPythonNetworkStream::SendCreateCharacterPacket (BYTE index, const char *name, BYTE job, BYTE shape, BYTE byCON, BYTE byINT, BYTE bySTR, BYTE byDEX) { TPacketCGCreateCharacter createCharacterPacket; createCharacterPacket.header = HEADER_CG_PLAYER_CREATE; createCharacterPacket.index = index; strncpy (createCharacterPacket.name, name, CHARACTER_NAME_MAX_LEN); createCharacterPacket.job = job; createCharacterPacket.shape = shape; createCharacterPacket.CON = byCON; createCharacterPacket.INT = byINT; createCharacterPacket.STR = bySTR; createCharacterPacket.DEX = byDEX; Replacer par : bool CPythonNetworkStream::SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape,WORD wHair, BYTE byCON, BYTE byINT, BYTE bySTR, BYTE byDEX) { TPacketCGCreateCharacter createCharacterPacket; createCharacterPacket.header = HEADER_CG_PLAYER_CREATE; createCharacterPacket.index = index; strncpy(createCharacterPacket.name, name, CHARACTER_NAME_MAX_LEN); createCharacterPacket.job = job; createCharacterPacket.shape = shape; createCharacterPacket.hair = wHair; createCharacterPacket.CON = byCON; createCharacterPacket.INT = byINT; createCharacterPacket.STR = bySTR; createCharacterPacket.DEX = byDEX; Dans UserInterface/PythonNetworkStream.h Chercher : bool SendCreateCharacterPacket (BYTE index, const char *name, BYTE job, BYTE shape, BYTE byStat1, BYTE byStat2, BYTE byStat3, BYTE byStat4); Replacer par : bool SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape, WORD wHair, BYTE byStat1, BYTE byStat2, BYTE byStat3, BYTE byStat4); Dans UserInterface/PythonNetworkStreamModule.cpp Chercher : PyObject *netSendCreateCharacterPacket (PyObject *poSelf, PyObject *poArgs) { int index; if (!PyTuple_GetInteger (poArgs, 0, &index)) { return Py_BuildException(); } char *name; if (!PyTuple_GetString (poArgs, 1, &name)) { return Py_BuildException(); } int job; if (!PyTuple_GetInteger (poArgs, 2, &job)) { return Py_BuildException(); } int shape; if (!PyTuple_GetInteger (poArgs, 3, &shape)) { return Py_BuildException(); } int stat1; if (!PyTuple_GetInteger (poArgs, 4, &stat1)) { return Py_BuildException(); } int stat2; if (!PyTuple_GetInteger (poArgs, 5, &stat2)) { return Py_BuildException(); } int stat3; if (!PyTuple_GetInteger (poArgs, 6, &stat3)) { return Py_BuildException(); } int stat4; if (!PyTuple_GetInteger (poArgs, 7, &stat4)) { return Py_BuildException(); } if (index < 0 && index > 3) { return Py_BuildException(); } CPythonNetworkStream &rkNetStream = CPythonNetworkStream::Instance(); rkNetStream.SendCreateCharacterPacket ((BYTE) index, name, (BYTE) job, (BYTE) shape, stat1, stat2, stat3, stat4); return Py_BuildNone(); } Replacer par : PyObject* netSendCreateCharacterPacket(PyObject* poSelf, PyObject* poArgs) { int index; if (!PyTuple_GetInteger(poArgs, 0, &index)) return Py_BuildException(); char* name; if (!PyTuple_GetString(poArgs, 1, &name)) return Py_BuildException(); int job; if (!PyTuple_GetInteger(poArgs, 2, &job)) return Py_BuildException(); int shape; if (!PyTuple_GetInteger(poArgs, 3, &shape)) return Py_BuildException(); int hair; if (!PyTuple_GetInteger(poArgs, 4, &hair)) return Py_BuildException(); int stat1; if (!PyTuple_GetInteger(poArgs, 5, &stat1)) return Py_BuildException(); int stat2; if (!PyTuple_GetInteger(poArgs, 6, &stat2)) return Py_BuildException(); int stat3; if (!PyTuple_GetInteger(poArgs, 7, &stat3)) return Py_BuildException(); int stat4; if (!PyTuple_GetInteger(poArgs, 8, &stat4)) return Py_BuildException(); if (index<0 && index>3) return Py_BuildException(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); rkNetStream.SendCreateCharacterPacket((BYTE)index, name, (BYTE)job, (BYTE)shape, (WORD)hair, stat1, stat2, stat3, stat4); return Py_BuildNone(); } Dans game/src/Packet.h Chercher: typedef struct command_player_create { BYTE header; BYTE index; char name[CHARACTER_NAME_MAX_LEN + 1]; WORD job; BYTE shape; BYTE Con; BYTE Int; BYTE Str; BYTE Dex; } TPacketCGPlayerCreate; Replacer par : typedef struct command_player_create { BYTE header; BYTE index; char name[CHARACTER_NAME_MAX_LEN + 1]; WORD job; BYTE shape; WORD hair; BYTE Con; BYTE Int; BYTE Str; BYTE Dex; } TPacketCGPlayerCreate; Go to db/src/ClientManagerPlayer.cpp Dans : void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerCreatePacket* packet) This is default query. Please check your query of your source and adjust according. Chercher : queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); Replace par : queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, %d, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.parts[PART_HAIR], packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d hair %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job, packet->player_table.parts[PART_HAIR]); Chercher : pack.player.wMainPart = packet->player_table.part_base; Ajouter après: pack.player.wHairPart = packet->player_table.parts[PART_HAIR]; Dans game/src/input_login.cpp Chercher: bool NewPlayerTable2(TPlayerTable * table, const char * name, BYTE race, BYTE shape, BYTE bEmpire) Replacer par: bool NewPlayerTable2(TPlayerTable * table, const char * name, BYTE race, BYTE shape, WORD hair, BYTE bEmpire) Chercher : table->part_base = shape; Ajouter après : table->parts[PART_HAIR] = hair; Chercher : void CInputLogin::CharacterCreate(LPDESC d, const char * data) { struct command_player_create * pinfo = (struct command_player_create *) data; TPlayerCreatePacket player_create_packet; sys_log(0, "PlayerCreate: name %s pos %d job %d shape %d", pinfo->name, pinfo->index, pinfo->job, pinfo->shape); Remplacer par : void CInputLogin::CharacterCreate(LPDESC d, const char * data) { struct command_player_create * pinfo = (struct command_player_create *) data; TPlayerCreatePacket player_create_packet; sys_log(0, "PlayerCreate: name %s pos %d job %d shape %d hair %d", pinfo->name, pinfo->index, pinfo->job, pinfo->shape, pinfo->hair); Chercher : if (!NewPlayerTable2(&player_create_packet.player_table, pinfo->name, pinfo->job, pinfo->shape, d->GetEmpire())) Replace par : if (!NewPlayerTable2(&player_create_packet.player_table, pinfo->name, pinfo->job, pinfo->shape, pinfo->hair, d->GetEmpire()))
  7. Files turc New-School 0 - 120 Je mets les liens de téléchargement de ces files, car ils peuvent être utile pour extraire des bouts de code mais déconseillé à l'utilisation. Download All ine One : F-Download Serveur Source - Lien de téléchargement Client Source - Lien de téléchargement Full Client - Lien de téléchargement Game MYSQL - Lien de téléchargement Depackeur - Lien de téléchargement
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.