Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 04/19/2023 in all areas

  1. Version 1.0.0

    275 downloads

    Contains: Server source Client source Client unpacked Client structure Patcher maker Serverfiles share folder From 2014 leak.
    2 points
  2. Hi This system have very problem but this all fix Sorry my englsih so bad. Enjoy. system picture :
    1 point
  3. wom_client_pack_src.7z added Password: m2dev.net
    1 point
  4. Ok I recovered it. Will compress and upload in the next few hours.
    1 point
  5. OnixDragon2 | Server MiddleSchool | Next opening Website/Register - Forum - Discord
    1 point
  6. Disclaimer: Não lê conteúdo do item_scale.txtTutorial não estruturado, será necessário comparar os ficheiros.Caso alguém queira fazer o tutorial, todos agradecemos.Password: Shoulder Sash.7z
    1 point
  7. 1 point
  8. corrige o link do AddictMt2_r40267_Client_Tools.7z baixa 40mb e depois da erro e nao deixa baixar mais
    1 point
  9. Este erro apareceu no meu cliente e demorei algum tempo até perceber de onde vinha. Acontece, que este erro aparece quando nós damos vários click's em um item (mesmo item) para o equipar. Como por exemplo aqui: https://prnt.sc/FDa7S9dR5Njg Se tentarmos equipar os itens de uma forma rápida, vamos acabar por dar 2 ou mais clicks no mesmo item. O que acontece é que o cliente apenas assume o primeiro click, reconhece o item e equipa-o. No segundo click o cliente quer equipar algo, que já la não está. Pesquisei bastante na net sobre este erro... mas nada era claro o suficiente. Fix: bin/root/uiinventory.py Tal como referi, segundo a internet :D existe muitos motivos que podem causar este erro. Mas segundo o meu test apenas o que refiro o causa.
    1 point
  10. https://drive.google.com/file/d/1EY62SyxUbg9F78cv1SUx1DEAh0UfdfeA/view Trazem tudo o que é necessário. Não testei, não têm fotos. Pelo que eu li têm varios bugs corrigidos etc... Só trazem o sistema de costumes. Têm um bug na window de negócios, mas é fácil de corrigir pelos vistos. Source: Metin2Zone
    1 point
  11. Version 1.0.0

    210 downloads

    Some of plechito's models/maps/objects
    1 point
  12. View File Pet System + Fix Age || Metin2 Submitter Marco Submitted 03/13/2018 Category Other Downloads
    1 point
  13. Alguém ajuda com esse erroErro ao Copilar game_SRC.txt Já ate mesmo mudei o valor 218 no packet.h pra ver se era isso, mais o erro continua. Estou mandando os arquivos da minha o Src_game em anexo se alguem aqui do forum puder ajudar eu fico agradecido . src.rar
    1 point
  14. View File Professional Biolog System Submitter Tierri Lopes Submitted 03/13/2018 Category Other Downloads
    1 point
  15. Go to file root/introcreate.py Look for: DESCRIPTION_FILE_NAME = ( uiScriptLocale.JOBDESC_WARRIOR_PATH, uiScriptLocale.JOBDESC_ASSASSIN_PATH, Add this before: 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 ) Look for: ########################################################### 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 ########################################################### Replace with: ########################################################### 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 ########################################################### Look for: def OverOutStatButton(self): self.toolTip.Hide() Add this after: 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) Look for: 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") Add this after: self.btnIncreaseHair = getChild("increase_hair") self.hairNumber = getChild("hair_number") self.btnDecreaseHair = getChild("decrease_hair") Look for: 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() Add this after: self.btnIncreaseHair.SetEvent(ui.__mem_func__(self.IncreaseHair)) self.btnDecreaseHair.SetEvent(ui.__mem_func__(self.DecreaseHair)) Look for: def Open(self): print "OPEN CREATE WINDOW ----------------------------------------------------------------------------" playerSettingModule.LoadGameData("INIT") self.reservingRaceIndex = -1 self.reservingShapeIndex = -1 Add this after: self.hairIndex = 0 Look for: def __DecreaseSlotIndex(self): Add this bellow: 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)) Look for: def __IncreaseSlotIndex(self): Add this bellow: 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) Go to file locale/xx/ui/createcharacterwindow.py Look for: { "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", }, Add this after: { "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", }, On this 2 functions: "name" : "create_button", "name" : "cancel_button", Look for: "y" : 265 + TEMPORARY_HEIGHT, Change with: "y" : 285 + TEMPORARY_HEIGHT, Go to UserInterface/Packet.h Look for: 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; Replace with: 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; Go to UserInterface/PythonNetworkStreamPhaseSelect.cpp Look for: 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; Replace with: 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; Go to UserInterface/PythonNetworkStream.h Look for: bool SendCreateCharacterPacket (BYTE index, const char *name, BYTE job, BYTE shape, BYTE byStat1, BYTE byStat2, BYTE byStat3, BYTE byStat4); Replace with: bool SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape, WORD wHair, BYTE byStat1, BYTE byStat2, BYTE byStat3, BYTE byStat4); Go to UserInterface/PythonNetworkStreamModule.cpp Look for: 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(); } Replace with: 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(); } Go to game/src/Packet.h Look for: 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; Replace with: 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 Inside: 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. Look for: 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 with: 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]); Look for: pack.player.wMainPart = packet->player_table.part_base; Add after: pack.player.wHairPart = packet->player_table.parts[PART_HAIR]; Go to game/src/input_login.cpp Look for: bool NewPlayerTable2(TPlayerTable * table, const char * name, BYTE race, BYTE shape, BYTE bEmpire) Replace with: bool NewPlayerTable2(TPlayerTable * table, const char * name, BYTE race, BYTE shape, WORD hair, BYTE bEmpire) Look for: table->part_base = shape; Add after: table->parts[PART_HAIR] = hair; Look for: 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); Replace with: 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); Look for: if (!NewPlayerTable2(&player_create_packet.player_table, pinfo->name, pinfo->job, pinfo->shape, d->GetEmpire())) Replace with: if (!NewPlayerTable2(&player_create_packet.player_table, pinfo->name, pinfo->job, pinfo->shape, pinfo->hair, d->GetEmpire()))
    1 point
  16. Bem, fiz isto já há algum tempo para o servidor pvp e penso que não darei muito uso dela. O evento (ou sistema, como preferirem dizer) é meter todos os jogadores free-for-all, ou seja, têm como objetivo matar outros jogadores para ganhar pontos e serem os vencedores. Isto é ideal para um servidor pvp. Ele está estruturado da seguinte forma: O GM ativa o evento e os jogadores terão 5 minutos para entrarem no mapa; O evento tem como duração 20 minutos; O jogador tem 10 vidas, sendo que se as perder, é removido do mapa (anunciado como eliminação); Quando o jogador morre 5x, aparece um aviso de como só lhe resta mais 5 vidas; A cada morte, o jogador perde 1 ponto; A cada 1 minuto, aparece o top 5 das pessoas com mais pontos do evento somente no mapa; Existem duas hipóteses: Jogadores de nível 1-75 poderem participar ou 75-105; Tudo o que disse é totalmente editável pela quest: settings.map_index = 64 -- map index where the event will be set to settings.name = "Mapa PvP" -- name of the map settings.low_level = 75 -- min level to participate settings.max_level = 105 -- max level to participate settings.time = 60*20 -- You can set time for the event settings.warning_die = 5 -- Warning if the player die 5 times settings.limit_die = 10 -- Limit lives that you have in order to get kicked out settings.warp_out = 5 -- Time to warp out if the event is off settings.timer = 60*5 -- Time in order to participate in the event settings.ranking = 60*1 -- Time to set a loop for ranking settings.test = false -- return false for debug mode just for testing -- settings.true = true -- enable the event = true | disable the event = false Source 1) Adicionar no service.h: #define LSM2_EVENT_DEATHMATCH 2) No char_battle.cpp, procura por: if (bPKMode == PK_MODE_GUILD && !GetGuild()) bPKMode = PK_MODE_FREE; Adiciona por baixo: #ifdef LSM2_EVENT_DEATHMATCH if (GetMapIndex() == 29){ if (IsGM()) bPKMode = PK_MODE_PROTECT; // se for GM, ele ficará protegido e não o conseguirão matar else bPKMode = PK_MODE_FREE; // se for jogador normal, ele ficará livre } #endif PS: Altera o 29 pelo INDEX do mapa a ser utilizado. Server 1) Abrir o questlib.lua e adicionar: dofile(get_locale_base_path().."/quest/sistema.lua") 2) Na pasta /quest criar um ficheiro chamado sistema.lua e adicionar: sistema = {} sistema.evento_deathmatch = {} sistema.evento_deathmatch.palavra = "deathmatch" sistema.evento_deathmatch.desligado = 0 sistema.evento_deathmatch.ligado = 1 sistema.evento_deathmatch.palavra75 = "apenas75" sistema.evento_deathmatch.palavra75p = "acima75" sistema.evento_deathmatch.palavraranking = "ranking" sistema.evento_deathmatch.titulo = "Evento Último Sobrevivente:" sistema.evento_deathmatch.apenas75 = "Somente os jogadores que estiverem a nível 75 poderão participar no evento." sistema.evento_deathmatch.apenas105 = "Somente os jogadores que estiverem a nível 75+ poderão participar no evento." sistema.evento_deathmatch.grupo = "Infelizmente estás em grupo." sistema.evento_deathmatch.teleportado = "O evento não está ativo, serás teleportado para fora do mapa." sistema.evento_deathmatch.vidas = "Já morreste 5 vezes.[ENTER]Lembrando que se morreres 10 vezes serás desqualificado independente das mortes que tenhas." sistema.evento_deathmatch.adeus = "O jogador %s foi desqualificado do evento por ter morrido" sistema.evento_deathmatch.npc = "Último Sobrevivente" sistema.evento_deathmatch.npcgm = "Evento: Último Sobrevivente" sistema.evento_deathmatch.calendario = "O Calendário está proposto para ser o seguinte:" sistema.evento_deathmatch.calendario1 = "SEGUNDA-FEIRA: Desligado[ENTER]TERÇA-FEIRA: Desligado[ENTER]QUARTA-FEIRA: Desligado[ENTER]QUINTA-FEIRA: Desligado[ENTER]SEXTA-FEIRA: 21H[ENTER]SÁBADO: 16H[ENTER]DOMINGO: Desligado" sistema.evento_deathmatch.ativar = "Queres ativar o evento?" sistema.evento_deathmatchyes = "Sim" sistema.evento_deathmatchno = "Não" sistema.evento_deathmatch.escolhenivel = "Escolhe qual é a opção que desejas ativar:" sistema.evento_deathmatch.so75 = "Nível 75 - 75" sistema.evento_deathmatch.mais75 = "Nível 75+" sistema.evento_deathmatch.eventofoiligado75 = "O Evento Último Sobrevivente encontra-se ativado.[ENTER]Participa através do Beleguim da Batalha.[ENTER]Somente personagens de nível 75 serão aceites." sistema.evento_deathmatch.eventofoiligado75p = "O Evento Último Sobrevivente encontra-se ativado.[ENTER]Participa através do Beleguim da Batalha.[ENTER]Somente personagens de nível 75+ serão aceites." sistema.evento_deathmatch.desativar = "Queres desativar o evento?" sistema.evento_deathmatch.eventofoidesligado = "O Evento Último Sobrevivente foi encerrado." sistema.evento_deathmatch.portasfechadas = "As participações para o Evento foram encerradas.[ENTER]Boa sorte a todos os participantes, que vença o melhor." sistema.evento_deathmatch.ranking = "O jogador %s encontra-se no topo da tabela com %s mortes." sistema.evento_deathmatch.acabou = "O evento acaba de terminar, sendo o vencedor o jogador %s com %s mortes.[ENTER]A administração parabeniza o jogador com 250 moedas de dragão." sistema.evento_deathmatch.mensagemdesligado = "O evento encontra-se desligado, aguarda por mais informações." sistema.evento_deathmatch.mensagemligado = "Isto é para os jogadores que sabem duelar e mostrar a sua persistência dentro do campo da batalha. Achas que estás preparado para entrares num mapa onde só o mais forte sairá vitorioso?" sistema.evento_deathmatch.error = "ERRO: Contacta a administração e explica-lhes como é que chegaste até aqui." sistema.evento_deathmatch.npcfechado = "Infelizmente já não podes participar, as inscrições fecharam.[ENTER]Podes acompanhar o evento estando atento as notícias." sistema.evento_deathmatch.kills = "Possuís %s mortes." sistema.evento_deathmatch.ranking = "Classificações:" sistema.evento_deathmatch.ranking1 = "%s - %s mortes" sistema.evento_deathmatch.importante = "É necessário que fiques mapa do Deserto para que os jogadores sejam teleportados." 3) Inserir a seguinte função na questlib.lua: function say_lsm2(msg) msg_size = string.len(msg) if msg_size > 59 then local i = 59 last_word = nil while last_word == nil and i > 0 do if string.sub(msg,i,i) == " " or string.sub(msg,i,i) == "." or string.sub(msg,i,i) == "," then last_word = i end i = i-1 end if i == 0 then last_word = 59 end say(string.sub(msg,0,last_word)) say2(string.sub(msg,last_word+1)) else say(msg) end end 4) Instalar o deathmatch.sql que está disponível abaixo e inserir na tabela log da base de dados. Deixo-vos aqui a quest: quest lsm2_event begin state start begin function get_settings() local settings = {} settings.map_index = 64 -- map index where the event will be set to settings.name = "Mapa PvP" -- name of the map settings.low_level = 75 -- min level to participate settings.max_level = 105 -- max level to participate settings.time = 60*20 -- You can set time for the event settings.warning_die = 5 -- Warning if the player die 5 times settings.limit_die = 10 -- Limit lives that you have in order to get kicked out settings.warp_out = 5 -- Time to warp out if the event is off settings.timer = 60*5 -- Time in order to participate in the event settings.ranking = 60*1 -- Time to set a loop for ranking settings.test = false -- return false for debug mode just for testing -- settings.true = true -- enable the event = true | disable the event = false return settings end function only_low_level() local settings = lsm2_event.get_settings() if settings.low_level != pc.get_level() then say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.apenas75) -- only 75 return else -- [1] - reds | [2] - yellows | [3] - blues local empire = pc.get_empire() local warp_xy = {[1] = {794100, 958200}, [2] = {799900, 940000}, [3] = {782600, 943100}} pc.warp(warp_xy[empire][1], warp_xy[empire][2]) end end function only_max_level() local settings = lsm2_event.get_settings() if settings.low_level > pc.get_level() then say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.apenas105) -- only 75 plus return else -- [1] - reds | [2] - yellows | [3] - blues local empire = pc.get_empire() local warp_xy = {[1] = {794100, 958200}, [2] = {799900, 940000}, [3] = {782600, 943100}} pc.warp(warp_xy[empire][1], warp_xy[empire][2]) end end -- only for test function only_for_test() local settings = lsm2_event.get_settings() if settings.test == true then return true else return false end return false end function clear_all() game.set_event_flag(sistema.evento_deathmatch.palavra,sistema.evento_deathmatch.desligado) game.set_event_flag(sistema.evento_deathmatch.palavra75,sistema.evento_deathmatch.desligado) game.set_event_flag(sistema.evento_deathmatch.palavra75p,sistema.evento_deathmatch.desligado) clear_server_timer("ranking") clear_server_timer("lsm2_event") clear_server_timer("adecorrer") end when login begin local settings = lsm2_event.get_settings() if pc.get_map_index() == settings.map_index and game.get_event_flag(sistema.evento_deathmatch.palavra) == sistema.evento_deathmatch.desligado then if pc.is_gm() then return end notice_multiline(sistema.evento_deathmatch.teleportado, notice) warp_to_village(settings.warp_out) -- tlthings01 -- elseif pc.get_map_index() == settings.map_index and game.get_event_flag(sistema.evento_deathmatch.palavra) != sistema.evento_deathmatch.desligado then -- if pc.is_dead() == true then -- local count = pc.getf("die","deathmatch")+1 -- local contagem = pc.getf("kill","deathmatch")-1 -- pc.setf("die","deatmatch",pc.getf("die","deathmatch")+1) -- pc.setf("kill","deathmatch",pc.getf("kill","deathmatch")-1) -- chat("Como morreste, perdeste uma morte. Neste momento possuis "..contagem.. " morte(s).") -- if count == settings.warning_die then -- notice_multiline(sistema.evento_deathmatch.vidas,notice) -- elseif count == settings.die then -- notice_all(string.format(sistema.evento_deathmatch.adeus,pc.get_name())) -- warp_to_village() -- pc.setf("die","deathmatch",0) -- end else return end end -- tlthings02 when die begin local settings = lsm2_event.get_settings() if pc.get_map_index() == settings.map_index and game.get_event_flag(sistema.evento_deathmatch.palavra) != sistema.evento_deathmatch.desligado then local count = pc.getf("die","deathmatch")+1 local settings = lsm2_event.get_settings() local contagem = pc.getf("kill","deathmatch")-1 pc.setf("die","deathmatch",pc.getf("die","deathmatch")+1) pc.setf("kill","deathmatch",pc.getf("kill","deathmatch")-1) chat("Como morreste, perdeste uma morte. Neste momento possuis "..contagem.. " morte(s).") if count == settings.warning_die then notice_multiline(sistema.evento_deathmatch.vidas,notice) elseif count >= settings.limit_die then notice_all(string.format(sistema.evento_deathmatch.adeus,pc.get_name())) warp_to_village() pc.setf("die","deathmatch",0) end end end when 9004.chat.sistema.evento_deathmatch.npcgm with pc.is_gm() begin local settings = lsm2_event.get_settings() if game.get_event_flag(sistema.evento_deathmatch.palavra) == sistema.evento_deathmatch.desligado then say_title(sistema.evento_deathmatch.titulo) say(sistema.evento_deathmatch.calendario) say(sistema.evento_deathmatch.calendario1) wait() say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.ativar) if select(sistema.evento_deathmatchyes, sistema.evento_deathmatchno) == 1 then say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.escolhenivel) local choose = select(sistema.evento_deathmatch.so75,sistema.evento_deathmatch.mais75,locale.cancel) if choose == 1 then game.set_event_flag(sistema.evento_deathmatch.palavra75,sistema.evento_deathmatch.ligado) game.set_event_flag(sistema.evento_deathmatch.palavra,sistema.evento_deathmatch.ligado) notice_multiline(sistema.evento_deathmatch.eventofoiligado75,notice_all) server_timer("lsm2_event",settings.timer) else game.set_event_flag(sistema.evento_deathmatch.palavra75p,sistema.evento_deathmatch.ligado) game.set_event_flag(sistema.evento_deathmatch.palavra,sistema.evento_deathmatch.ligado) notice_multiline(sistema.evento_deathmatch.eventofoiligado75p,notice_all) server_timer("lsm2_event",settings.timer) end else return end else say_title(sistema.evento_deathmatch.titulo) say(sistema.evento_deathmatch.desativar) say() say_lsm2(sistema.evento_deathmatch.importante,settings.name) if select(sistema.evento_deathmatchyes, sistema.evento_deathmatchno) == 1 then lsm2_event.clear_all() notice_multiline(sistema.evento_deathmatch.eventofoidesligado,notice_all) warp_all_to_village(pc.get_map_index(),settings.warp_out) else return end end end when lsm2_event.server_timer begin local settings = lsm2_event.get_settings() notice_multiline(sistema.evento_deathmatch.portasfechadas,notice_all) game.set_event_flag(sistema.evento_deathmatch.palavra,sistema.evento_deathmatch.fechado) server_loop_timer("ranking",settings.ranking) server_timer("adecorrer",settings.time) end when ranking.server_timer begin local ranking = mysql_query("SELECT nome, mortes FROM log.deathmatch ORDER by mortes DESC LIMIT 5;") notice_all(sistema.evento_deathmatch.ranking) for position in ipairs(ranking) do notice_all(string.format(position..".º lugar: "..ranking.nome[position].." - "..ranking.mortes[position].." mortes.")) end end when adecorrer.server_timer begin local ranking = mysql_query("SELECT nome, mortes FROM log.deathmatch ORDER by mortes DESC LIMIT 1;") for position in ipairs(ranking) do notice_multiline(string.format(sistema.evento_deathmatch.acabou,ranking.nome[position],ranking.mortes[position]),notice_all) lsm2_event.clear_all() end end when guild_war_observer1.chat.sistema.evento_deathmatch.npc or guild_war_observer2.chat.sistema.evento_deathmatch.npc or guild_war_observer3.chat.sistema.evento_deathmatch.npc begin local settings = lsm2_event.get_settings() if game.get_event_flag(sistema.evento_deathmatch.palavra) == sistema.evento_deathmatch.desligado then say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.mensagemdesligado) return elseif game.get_event_flag(sistema.evento_deathmatch.palavra) == sistema.evento_deathmatch.ligado then say_title(sistema.evento_deathmatch.titulo) say() say_lsm2(sistema.evento_deathmatch.mensagemligado) if select(sistema.evento_deathmatchyes, sistema.evento_deathmatchno) == 1 then if game.get_event_flag(sistema.evento_deathmatch.palavra75) == sistema.evento_deathmatch.ligado then lsm2_event.only_low_level() elseif game.get_event_flag(sistema.evento_deathmatch.palavra75p) == sistema.evento_deathmatch.ligado then lsm2_event.only_max_level() elseif party.is_party() then say(sistema.evento_deathmatch.grupo) return else say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.error) return end else return end elseif game.get_event_flag(sistema.evento_deathmatch.palavra) == sistema.evento_deathmatch.fechado then say_title(sistema.evento_deathmatch.titulo) say() say(sistema.evento_deathmatch.npcfechado) return end end when kill with npc.is_pc() begin local settings = lsm2_event.get_settings() if pc.get_map_index() == settings.map_index then local contagem = pc.getf("kill","deathmatch")+1 pc.setf("kill","deathmatch",pc.getf("kill","deathmatch")+1) mysql_query("UPDATE log.deathmatch SET mortes ='"..contagem.."' WHERE name ='"..pc.get_name().."' LIMIT 1") chat("Neste momento contas com "..contagem.. " morte(s).") end end end end ATENÇÃO: Utilizei a função when die begin mas em caso de não tiverem pesquisem por tlthings01 dentro da quest e descomentem tudo o que está por baixo e removem/comentem o que está no tlthings02 Infelizmente não tenho qualquer imagem nem tenho tempo para tal mas foi testado e usado em cenário real. OBS: É recomendado usarem mysql_direct_query para melhor performance mas a diferença de uma para a outra neste cenário é de 0.0343s por isso é indiferente a escolha de uma para a outra. Ah e ignorem o facto dos comentários estarem em inglês, apeteceu-me escrever dessa forma na altura. PS: Isto é igual/semelhante ao Evento Coliseu. deathmatch.sql questing.lua
    1 point
  17. //Reload mob_drop_item Ir para: source/server/game/src/cmd_gm.cpp procurar ACMD(do_reload) dentro do ficheiro encontrar: case 'c': ch->ChatPacket(CHAT_TYPE_INFO, "Reloading cube table."); Cube_init(); break; Adicionar em baixo: de break; #ifdef RELOAD_MOB_DROP_ITEM case 'm': char szFileName[256]; snprintf(szFileName, sizeof(szFileName), "%s/mob_drop_item.txt", LocaleService_GetBasePath().c_str()); ITEM_MANAGER::Instance().DestroyMobDropItem(); if (!ITEM_MANAGER::Instance().ReadMonsterDropItemGroup(szFileName)) { ch->ChatPacket(CHAT_TYPE_INFO, "[!]Cannot reload mob_drop_item.txt."); return; } else { ch->ChatPacket(CHAT_TYPE_INFO, "Reloading mob_drop_item.txt."); } break; #endif Ir para: source/server/game/src/item_manager.cpp No final de todo o codigo por: #ifdef RELOAD_MOB_DROP_ITEM void ITEM_MANAGER::DestroyMobDropItem() { if (!m_map_pkMobItemGroup.empty()) m_map_pkMobItemGroup.clear(); if (!m_map_pkDropItemGroup.empty()) m_map_pkDropItemGroup.clear(); if (!m_map_pkLevelItemGroup.empty()) m_map_pkLevelItemGroup.clear(); if (!m_map_pkGloveItemGroup.empty()) m_map_pkGloveItemGroup.clear(); } #endif Ir para: source/server/game/src/item_manager.h procurar por: void Destroy(); Adicionar em baixo: #ifdef RELOAD_MOB_DROP_ITEM void DestroyMobDropItem(); #endif Comando no jogo: (/reload m) para dar reload no mob_drop_item Adaptado:Caneiras
    1 point
  18. Version 1.0.0

    217 downloads

    pack de sistemas vegas não testados, usem por conta própria, não dou qualquer auxilio. fonte turkmmo
    1 point
  19. Fix Stack items in party || Metin2 View File Fix Stack items dropados para os jogadores em grupo. Submitter Marco Submitted 03/14/2018 Category Other Downloads
    1 point
  20. Poderias fazer um tutorial com o teu :$
    1 point
  21. View File Eter Manager Ferramenta para desencriptar e encriptar o cliente. Virtual tree view permite visualizar os arquivos do cliente, o seu caminho virtual e o ficheiro físico da pasta pack em que se encontram. Análise: VirusTotal Submitter [Admin] tierrilopes Submitted 08/26/17 Category Tools
    1 point
  22. Hi, at the client packs there is only root locale ui uiscript folders but no item icon monster monster2.. folders. Do i miss something or is it missing at the files ?
    0 points
×
×
  • Create New...