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

Veltor88

 Funkiest
  • Compteur de contenus

    178
  • Inscription

  • Dernière visite

  • Jours gagnés

    86

Tout ce qui a été posté par Veltor88

  1. Veltor88

    CMS Demera2

    F Download Center Télécharger ( Dernière Version ) Bonjour, Partage d'un CMS en roumain et anglais Pas de PSD inclus pour le logo Preview Download
  2. F Download Center Télécharger ( Interne ) ( Version X / Lien Externe ) Télécharger Bonjour, Partage d'un système pour mettre les quêtes dans des catégories comme l'officiel
  3. Centre de Téléchargement Télécharger ( Interne ) 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()))
  4. Veltor88

    CMS Mijaru

    F Download Center Télécharger ( Dernière Version ) Texte Ici... Partage d'un CMS Roumain, PSD inclus Preview Download
  5. Veltor88

    Pack Pet

    F Download Center Télécharger ( Dernière Version ) Bonjour, Petit partage d'un pack de pet Preview
  6. F Download Center Télécharger ( Dernière Version ) Bonjour, Un autre CMS : Preview Download
  7. Veltor88

    CMS Rubinum

    F Download Center Télécharger ( Dernière Version ) Bonjour, Petit partage du CMS basé sur le site de Rubinum Preview Download
  8. Veltor88

    CMS Mileniun2

    F Download Center Télécharger ( Dernière Version ) Bonjour, Petit partage d'un CMS en anglais et espagnol Preview Download
  9. Veltor88

    Arnaque By Eunji

    Im spotted Saejin be like
  10. Veltor88

    Arnaque By Eunji

    Étrangement il est portugais sur les 2 profils
  11. Tu refais bien un nouveau personnage à chaque fois ? Si tu déco/reco ça ne corrige pas le soucis Pour les items du commencement ils font modifier la quête comme donné plus haut
  12. Pour le texte qui ne s'efface pas après la première quête, une solution a été donné ici
  13. giveitem.quest ? give_basic_weapon.quest plutot ? quest give_basic_weapon begin state start begin when login begin if pc.getqf("basic_weapon") == 0 then pc.setqf("basic_weapon", 1) --Equipement pour Guerrier local arme = 19 --Epée+9 local arme2 = 3009 --Glaive+9 local armure = 11209 --Armure du singe+9 local casque = 12209 --Heaume traditionnel+9 --Equipement pour Ninja if pc.job == 1 then arme = 19 --Epée+9 arme2 = 1009 --Dague+9 armure = 11409 --Costume azur+9 casque = 12349 --Capuchon en cuir+9 --Equipement pour Sura elseif pc.job == 2 then arme = 19 --Epée+9 arme2 = 0 --Rien armure = 11609 --Armure de réquiem+9 casque = 12489 --Heaume sanglant+9 --Equipement pour Chamane elseif pc.job == 3 then arme = 7009 --Eventail+9 arme2 = 0 --Rien armure = 11809 --Robe Pourpre+9 casque = 12629 --Chapeau de moine+9 end if pc.countitem(arme) == 0 and pc.countitem(arme2) == 0 and pc.countitem(armure) == 0 and pc.countitem(casque) == 0 and pc.weapon != arme then pc.give_gold(10000000) --10 000 000 Yangs pc.give_item2(50052, 1) --Livre cheval de combat pc.give_item2(50187, 1) -- Coffre d'apprenti I pc.set_skill_level(131, 1) repeat horse . advance () until horse . get_level () >= 11 horse.summon() horse.ride() end local empire={"Shinsoo", "Chunjo", "Jinno"} notice_all("Le personnage ".. pc.get_name() .." du royaume "..empire[pc.getempire()].." a été crée.") --- l say_title("Bienvenue "..pc.name.." :") say("Les grands sages ont décidé de vous aidez pour") say("le début de l'aventure et vous on fait grâce de") say("plusieurs présents. Ils vous ont donné une") say("monture niveau 11 ainsi que tout l'équipement du") say("débutant +9 (bouclier, armure, armes et bijoux) !") say("Alors qu'attendez vous ? Bonne chance !") end end end end Pour les coffres c'est levelup_boxes.quest Regarde si les 2 quêtes sont bien dans le fichier locale_list, puis refait une compilation des quêtes et tente de nouveau
  14. 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.
  15. J'ai trouvé ça Sinon pour supprimer une quête tu peux supprime la quête de la liste (dans le fichier "locale_list") , recompile les quêtes et tu reboot le serveur (et non la machine... )
  16. Héberge ton image ici par exemple [Hidden Content] et colle le lien de l'image en éditant ton premier post
  17. Il faut les activer dans les sources ( char_item.cpp )
  18. Files 2014/2016 Suffit simplement d'appliquer le fix et d'ouvrir les ports sur ta box pour que les gens puissent se connecter sur ton serveur, pas besoin d'Hamachi ou No-IP
  19. BlueDragon.lua (dossier France) + la quête n'est pas bonne sur ce sujet quest dragon_lair_access begin state start begin function get_settings() local settings = {} settings.cooldown_time = 3600 -- when can the dragon be killed again? settings.group_time = 300 -- how long can players enter after the first one is in the dragon's lair? settings.access_item = 30179 -- "Dragon God Symbols" settings.dragon_vnum = 2430 settings.spawn = {} settings.spawn.x = 181 settings.spawn.y = 173 settings.warp_in = {} settings.warp_in.first = {} settings.warp_in.last = {} settings.warp_in.first.x = 843677 settings.warp_in.first.y = 1066206 settings.warp_in.last.x = 844027 settings.warp_in.last.y = 1067599 settings.warp_out = {} settings.warp_out.first = {} settings.warp_out.last = {} settings.warp_out.first.x = 9200 settings.warp_out.first.y = 1206400 settings.warp_out.last.x = 10900 settings.warp_out.last.y = 1209100 settings.room_area = {} settings.room_area.first = {} settings.room_area.last = {} settings.room_area.first.x = 833000 settings.room_area.first.y = 1062500 settings.room_area.last.x = 844100 settings.room_area.last.y = 1071500 settings.access_item_amount = game.get_event_flag("dragon_lair_amount") if (settings.access_item_amount == 0) then settings.access_item_amount = 3 -- default value when event flag is not set elseif (settings.access_item_amount == -1) then settings.access_item_amount = 0 -- no dragon marks needed when event flag -1 (special case) end return settings end function get_random_point(area_coordinates) return math.random(area_coordinates.first.x, area_coordinates.last.x), math.random(area_coordinates.first.y, area_coordinates.last.y) end function warp_to_lair() local settings = dragon_lair_access.get_settings() local x, y = dragon_lair_access.get_random_point(settings.warp_in) char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' WARPTOLAIR: x:'.. x ..', y:' .. y) pc.warp(x,y) end function warp_from_lair() local settings = dragon_lair_access.get_settings() local x, y = dragon_lair_access.get_random_point(settings.warp_out) char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' WARPFROMLAIR: x:'.. x ..', y:' .. y) pc.warp(x,y) end function warp_all_from_lair() local settings = dragon_lair_access.get_settings() warp_all_in_area_to_area(settings.room_area.first.x, settings.room_area.first.y, settings.room_area.last.x, settings.room_area.last.y, settings.warp_out.first.x, settings.warp_out.first.y, settings.warp_out.last.x, settings.warp_out.last.y) game.set_event_flag("dragon_lair_alive", 0) -- dragon is dead char_log(0, 'LAIR', 'WARP ALL') end function get_time_remaining() local settings = dragon_lair_access.get_settings() return (game.get_event_flag("dragon_lair_time") + settings.cooldown_time - get_global_time()) end function give_item_to_ghost() local settings = dragon_lair_access.get_settings() say_title(gameforge.ghost_story._010_sayTitle) say(gameforge.dragon_lair_access._130_say) say(settings.access_item_amount.."x: ") say_item_vnum(settings.access_item) local give_item = select(gameforge.dragon_lair_access._140_select, gameforge.locale.cancel) if give_item == 1 then pc.remove_item(settings.access_item, settings.access_item_amount) char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' GIVE ITEM') return true else return false end end function show_time_remaining(time_remaining) q.set_title(gameforge.dragon_lair_access._165_sendLetter) send_letter(gameforge.dragon_lair_access._165_sendLetter) q.set_clock(gameforge.locale.monkey_dungeon.quest_rest_time, time_remaining) timer("dragon_lair_timer", time_remaining) notice_multiline(string.format(gameforge.dragon_lair_access._170_notice, time_remaining / 60), notice) q.start() end when enter or login begin pc.setqf("is_leader", 0) q.done() if pc.get_map_index() == 208 and not pc.is_gm() then dragon_lair_access.warp_from_lair() end end when blue_dragon_timer.server_timer begin game.set_event_flag("dragon_lair_timer_used", 0) if game.get_event_flag("dragon_lair_alive") == 1 then notice_multiline(gameforge.dragon_lair_access._150_notice, notice_all) else notice_multiline(gameforge.dragon_lair_access._160_notice, notice_all) end dragon_lair_access.warp_all_from_lair() end when 30121.chat."시발" with pc.get_map_index() != 208 and npc.lock() begin local starttime = game.get_event_flag("dragon_lair_time") local current_time = get_global_time() local settings = dragon_lair_access.get_settings() local time_remaining = dragon_lair_access.get_time_remaining() if pc.count_item(settings.access_item) >= settings.access_item_amount then if starttime + settings.group_time >= current_time then local password_input; repeat say ("시발") password_input = tonumber(input()) if password_input != game.get_event_flag("dragon_lair_password") then say ("시발") local again = select("응", "아니") if again == 2 then return end end until password_input == game.get_event_flag("dragon_lair_password") if not dragon_lair_access.give_item_to_ghost() then return end -- right password pc.setqf("time", starttime) dragon_lair_access.warp_to_lair() set_state(kill_dragon) elseif time_remaining < 0 and npc.lock() then -- it is the first player talking with the ghost say ("시발") local abort = select("응","아니") if abort == 2 then npc.unlock() return end local password_number; repeat say ("시발") password_number = tonumber(input()) local again; if type(password_number) != 'number' then say ("시발") again = select("응", "아니") if again == 2 then npc.unlock() return end end until type(password_number) == 'number' if not dragon_lair_access.give_item_to_ghost() then npc.unlock() return end if dragon_lair_access.get_time_remaining() > 0 then pc.give_item2(settings.access_item, settings.access_item_amount) npc.unlock() say ("시발") return end pc.setqf("password", password_number) timer("dragon_lair_warptimer", pc.get_channel_id()*2) npc.unlock() else say ("시발") return end else say ("시발") say(settings.access_item_amount.."x: ") say_item_vnum(settings.access_item) return end npc.unlock() end when 30121.chat."시발" with pc.get_map_index() == 208 begin say ("시발") local warp = select("응", "아니") if warp == 1 then say ("다 떠난다.") wait() dragon_lair_access.warp_all_from_lair() set_state(start) end end when dragon_lair_warptimer.timer begin local settings = dragon_lair_access.get_settings() if dragon_lair_access.get_time_remaining() < 0 then local starttime = get_global_time() game.set_event_flag("dragon_lair_time", starttime) -- set start time char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' SET STARTTIME: ' .. starttime) pc.setqf("time", starttime) pc.setqf("is_leader", 1) game.set_event_flag("dragon_lair_password", pc.getqf("password")) -- set password char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' SET PASSWORD: '.. pc.getqf("password")) server_timer("blue_dragon_timer", settings.cooldown_time) dragon_lair_access.warp_to_lair() set_state(spawn_dragon) else pc.give_item2(settings.access_item, settings.access_item_amount) say ("시발") end pc.setqf("password", 0) end end state spawn_dragon begin when login begin local settings = dragon_lair_access.get_settings() purge_area(settings.room_area.first.x, settings.room_area.first.y, settings.room_area.last.x, settings.room_area.last.y) notice_multiline(string.format(gameforge.dragon_lair_access._090_notice, pc.name), notice_all) -- spawn all mobs needed regen_in_map(208, "locale/_master/map/metin2_map_skipia_dungeon_boss/regen.txt") mob.spawn_group(settings.dragon_vnum, settings.spawn.x, settings.spawn.y, 1, 1, 1) -- spawn the dragon game.set_event_flag("dragon_lair_alive", 1) -- dragon is alive char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' SPAWN DRAGON') notice_multiline(string.format(gameforge.dragon_lair_access._145_notice, game.get_event_flag("dragon_lair_password")), notice) dragon_lair_access.show_time_remaining(settings.cooldown_time) set_state(kill_dragon) end when 30121.chat.gameforge.dragon_lair_access._110_npcChat with pc.get_map_index() == 208 begin say_title(gameforge.ghost_story._010_sayTitle) say(gameforge.dragon_lair_access._115_say) local warp = select(gameforge.dragon_lair_access._116_select, gameforge.dragon_lair_access._117_select) if warp == 1 then dragon_lair_access.warp_from_lair() set_state(start) end end end state kill_dragon begin when dragon_lair_timer.timer begin set_state(start) end when login begin if pc.getqf("time") != game.get_event_flag("dragon_lair_time") or dragon_lair_access.get_time_remaining() <= 0 then set_state(start) else dragon_lair_access.show_time_remaining(dragon_lair_access.get_time_remaining()) end end when button or info begin notice_multiline(string.format(gameforge.dragon_lair_access._170_notice, dragon_lair_access.get_time_remaining() / 60), notice) local settings = dragon_lair_access.get_settings() if (pc.getqf("is_leader") == 1 and settings.cooldown_time-dragon_lair_access.get_time_remaining() < settings.group_time) then notice_multiline(string.format(gameforge.dragon_lair_access._145_notice, game.get_event_flag("dragon_lair_password")), notice) end end when 30121.chat.gameforge.dragon_lair_access._110_npcChat with pc.get_map_index() == 208 begin say_title(gameforge.ghost_story._010_sayTitle) say(gameforge.dragon_lair_access._115_say) local warp = select(gameforge.dragon_lair_access._116_select, gameforge.dragon_lair_access._117_select) if warp == 1 then dragon_lair_access.warp_from_lair() set_state(start) end end when 20009.chat.gameforge.dragon_lair_access._190_npcChat or 9012.chat.gameforge.dragon_lair_access._190_npcChat or 30121.chat.gameforge.dragon_lair_access._190_npcChat with pc.get_map_index() != 208 begin if pc.getqf("time") > 0 and pc.getqf("time") == game.get_event_flag("dragon_lair_time") then dragon_lair_access.warp_to_lair() else say_title(gameforge.neutral_warp._20_sayTitle) say(gameforge.dragon_lair_access._120_say) set_state(start) end end when 2493.kill with pc.get_map_index() == 208 begin char_log(pc.get_player_id(), 'LAIR', pc.get_channel_id() ..' DRAGON KILLED') game.set_event_flag("dragon_lair_alive", 0) -- dragon is dead game.drop_item_with_ownership(71123, 1) -- dropping dragon scale game.drop_item_with_ownership(71129, 1) -- dropping toe nail notice_multiline(string.format(gameforge.dragon_lair_access._180_notice, pc.name), notice_all) -- the dragon has been killed by <name>! local settings = dragon_lair_access.get_settings() purge_area(settings.room_area.first.x, settings.room_area.first.y, settings.room_area.last.x, settings.room_area.last.y) end end end
  20. Veltor88

    Présentation Julith

    Salut le Vosgien et bienvenue
  21. A la racine tu créé un dossier nommé "share" et tu le mets dedans, et non le share dans /usr/metin2
  22. Pour ce message, tu places exppettable.txt dans /share ou tu modifies la lignes qu'il faut dans ton main.cpp et tu compiles

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.