Jump to content

Search the Community

Showing results for tags 'metin2zone'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Metin2 Zone
    • Community
    • Presentations and farewells
  • Private Servers
    • Server Presentations
    • Project showcase
  • General
    • General Discussions
    • Partnerships and Cooperation
    • Services and trading
    • Helps and questions
    • Reviews and advice
    • Offtopic
  • Technical
    • Programming
    • Metin2 Server Modding
    • Web Development
    • Security
    • Operating Systems
    • Computing
  • Art
    • Design and graphic section
    • Gallery of images and videos
    • 3D Modelling
    • Mapping
  • Downloads
    • Client and Server files
    • 3D Models
    • Metin2 Images
    • Maps
    • Translation
  • Archive
    • Offline Servers
    • Temas Links Caidos

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Email


Sitio web


Jabber


Skype


Discord


Location


Intereses

  1. Hola hoy vengo a traerle este set de arma que lo vi por hay y me pareció muy bonito. Link ↓↓↓↓↓↓↓ NO SE SI YA ESTÁN POSTEADAS SI LO ESTÁN ME DICEN :c Saludos :D
  2. Hola muy buenas gente, vengo a traerles lo ultimo que hice hara 1 o 2 años no recuerdo exactamente, como ya no me dedico a esto, veo una estupidez seguir guardando algo que no voy a usar ni a vender. Por ello aquí os dejo lo siguiente. 2 set de armaduras 3 set de armas 6 pets nuevos 2 monturas 1 NPC "Herro" No pongo fotos por que me da todo el palo asi que lo vais bajando y mirando. Pack RyenWorks Un saludete a todos/as <3
  3. Hola vengo a traerles este set de armas que lo encontré por hay y me pareció lindo. Trae 5 armas y los iconos los hacen ustedes, les dejo una captura y el link lo dejo en adjunto si no es mucha molestia xdd SALUDOS PD : No se si ya este posteado no recuerdo si lo he visto por aquí :c Armas..txt
  4. Wenas a todos!!! He hecho una aplicacion que se que ha muchos no les va a gustar, o que no se van a fiar, pero weno, la he hecho porque queria practicar conexiones a mysql desde Java. asique he decidido publicarla por si a alguien le sirve. Me gustaria que quien no se fie no se lo descargue, porque desde ya os digo que para que funcione el programa necesita vuestros datos de conexion a la DB. Ahora que ya estais advertidos, xD, el programa es para ver el inventario y el almacen de los jugadores, es muy facil de usar. Capturas del programa: Tutorial de Youtube, recomiendo verlo, para empezar a usarlo Links de descarga de la aplicacion: Mega,Mediafire Si teneis alguna duda intentare ayudaros Saludos, Yori
  5. Hola chicos hoy os traigo una antigua pero útil herramienta, ya que varios usuarios me preguntaron como meter un diff al game, pues os traigo esta espléndida herramienta. Parcheador de Diffs. Es un programa en el cual solo tendrás que seleccionar el diff que le quieres meter al game, y el archivo game. Para meter un diff lo único que teneis que hacer es editar el archivo diff que viene en la descarga con un editor de texto y ponerle vuestro diff, una vez hecho esto ya solo queda parchear. Descarga: http://www.4shared.com/rar/CW9xINnB/Parcheador_Diffs.html?
  6. wenas a todos!! He estado haciendo una quest para los que les da pereza andar con comandos de mutear y esas cosas, tambien puse todos lo que se me ocurrieron, si se me paso alguno, decirlo y lo añado. Para poder usar la parte de banear gente, hace falta tener lo del mysql para quest, podeis encontrarlo aqui , no se si funcionara la quest sin eso... Click aqui para descargar la quest Descripcion de opciones: Halloween: Lo que hace es invocar unos npcs para halloween, deben ser configurados en la quest. Como usar el comando "/m" Dia/noche: creo que no hace falta explicacion xD Rates: para poner cualquier rate para reinos o por separado. Pronto rates para gremios xD Bloquear chat: como su nombre dice, es para silenciar el chat, para quitar el silencio o ver la lista de silenciados. Navidad: Para activar/desactivar cualquier evento de navidad, como la nieva, el arbol de navidad, los villancicos, Santa Claus, venta de fuegos artificiales, etc Banear: Banea/Desbanear la cuenta de la persona que quieras, pero necesitas implementar mysql para quest, aqui el post. Teleport: Para que te teletrasportes hacia una persona, o para traerlo hacia ti. Recordad: No os olvideis de poner vuestros datos y esas cosas en las funciones de mysql_query() al final de la quest hay 4 funciones parecidas a la siguiente, en "root" es el usuario del navicat(suele ser root), en PassNavicat, pos eso, la pass xD, en account no tocarle, y en ipNavicat, es la ip del server, los datos esos, van entre comillas como estan puestos ahy, si las quitais os dara error. mysql_query("Update account.account set account.status = 'OK' WHERE account.id ="..id.account_id[1].."" ,"root","PassNavicat", "account", "IPNavicat") Si teneis alguna duda, preguntaros, y recordad que nunca esta de mas dar las gracias xD Saludos!!
  7. A guy asked from other community a tutorial on how to add a bonus of alignment. Well today I show you a small tutorial that can do that, i not tested. - [ File: /Src/game/affect.h ] #1.) Search: AFFECT_BLEND // 2) After make a new line and paste: ALIGNMENT_BONUS_1, ALIGNMENT_BONUS_2, Code for use: #ifdef __ALIGNMENT_BONUS__ if (GetRealAlignment() == NAME_ALIGNMENT_1) { AddAffect(ALIGNMENT_BONUS_1, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_1, 0, ALIGNMENT_TIME, 0, true); } if (GetRealAlignment() == NAME_ALIGNMENT_2) { AddAffect(ALIGNMENT_BONUS_2, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_2, 0, ALIGNMENT_TIME, 0, true); } #endif #ifdef __ALIGNMENT_BONUS__ if (FindAffect(ALIGNMENT_BONUS_1)) { if (GetRealAlignment() != NAME_ALIGNMENT_1) { RemoveAffect(ALIGNMENT_BONUS_1); } } #endif - [ File: /Src/common/service.h ] #define __ALIGNMENT_BONUS__ - [ File: /Src/common/ length .h ] #ifdef __ALIGNMENT_BONUS__ enum EAlignmentBonus { NAME_ALIGNMENT_1 = 100000 NAME_ALIGNMENT_2 = 200000, ALIGNMENT_TIME = 60*60*24*365, VALUE_BONUS_ALIGNMENT_1 = 1000, VALUE_BONUS_ALIGNMENT_2 = 2000, }; #endif You can use the code in function ComputePoints() from char.cpp or EnterGame() from input_main.cpp
  8. Wenas a todos!! les traigo una quest para hecar un evento de tanakas. Explicacion de lo que hace: cuando un GM activa la quest, aparece un mensaje de GM que lo anuncia, para que la gente se suba a su burro y a galope tendido hasta el centro de oasis en desierto xD. Cuando el GM decide que hay suficiente gente para empezar saca algun tanaks, para que los maten. algunos tanakas tiraran una oreja y otros ninguna (drop por quest, es decir cae sin nombre). Por cada tanaka muerto aparecera otro tanaka dentro del oasis pero nunca en el mismo sitio. es decir que si soltamos 5 tanakas al principio, siempre habra 5 tanakas. En cuanto el GM cierre el evento, los tanakas que queden, no tiraran orejas y tampoco apareceran mas. el uriel(Yo puse ese) te dara un cambio 6 y 7 o añadir 6 y 7, con un 50% de probabilidad de que sea uno u otro, claro que lo podeis cambiar, xD. Aqui dejo la quest que ya me enrollo demasiado xD Saludos!!
  9. def getModule(): EnvironmentData = { # Explanation: # 16 - (16:00:00 - 16:59:59) # "d:/ymir work/environment/capedragonhead.msenv" - Environment what will be set on this time. # You can add how many environments you want. 4: "d:/ymir work/environment/metin2_map_n_flame_dragon_01.msenv", 8: "d:/ymir work/environment/mtthunder.msenv", 12: "d:/ymir work/environment/bayblacksand.msenv", 16: "d:/ymir work/environment/capedragonhead.msenv", 20: "d:/ymir work/environment/snowm02.msenv", 22: "d:/ymir work/environment/trent02.msenv" } return EnvironmentData # Returns the dict with all items def getHour(): return ((app.GetGlobalTimeStamp() / 60) / 60 % 24) # Returns the hour from server timestamp (loaded by TPacketGCTime) def Main(): for key, c_pszName in getModule().iteritems(): if getHour() is key and app.IsExistFile(c_pszName): # Checks if current hour is equal with index from dict EnvironmentData and it checks if environment exists (file .msenv) in pack. background.RegisterEnvironmentData(0, c_pszName) # Set the environment background.SetEnvironmentData(0) You can execute the function in two parts for loaded automatically. File: root/game.py On function: def OnUpdate(self): - Check every time hour and inserted environment, you should add a break to stop condition after check is true. def Open(self): - Check on every start the client / teleport - Much better optimization.
  10. Hello world last night at around 5 am bored me and I created a short teleport order in minutes. What is this order? - Order can be used for teleporting a player. - By accessing the / teleport <number> you have to choose one of the numbers that are in the map settings. - Each map has a configuration proposed for the minimum and maximum level. - You can teleport a map if you do not have the required minimum. - You can teleport a map if you level higher than the configuration map. - List of papers default starts from 1 to 13. - You can not enter a number less than 1. - You can not enter a number greater than 13. - You can not enter characters than numbers. - When you tried to use the command without arguments will show the list as the number of error information, as well as where you enter a character or use / teleport show_list. You can add as many maps you want. - Everything is configurable. - Must have knowledge of C++ 0.1% to add more maps. Download link: https://mega.nz/#!nQojDDrJ!azzGGoQYILIcJ2deDLuvMFW2HoyQBuxYdv1ikysDVyk
  11. Here is a small playground for owners of servers . xD I made a small improvements statics for players via command. //@svn/Server/common/service.h #define ENABLE_ONLINE_COMMAND #define ENABLE_COUNTER_FAKE //@ DISABLE IF YOU NOT WANT TO HAVE FAKE PLAYER ON COMMAND //@svn/Server/game/src/cmd.cpp //1.) Search: { "messenger_auth", do_messenger_auth, 0, POS_DEAD, GM_PLAYER }, //2.) Add bellow: #ifdef ENABLE_ONLINE_COMMAND { "online", do_online, 0, POS_DEAD, GM_PLAYER }, #endif //1.) Search: ACMD(do_messenger_auth); //2.) Add bellow: #ifdef ENABLE_ONLINE_COMMAND ACMD(do_online); #endif //@svn/Server/game/src/cmd_general.cpp //1.) Add where you want: ACMD(do_online) { /********************************************************************* * date : 2016.10.25 * file : cmd_general.cpp * author : VegaS * description : Statistics server + configuration for fake */ time_t currentTime; struct tm *localTime; time(&currentTime); localTime = localtime(&currentTime); #define ENABLE_OFFLINE_SHOP_SYSTEM //@disable if you not have offlineShop #ifdef ENABLE_OFFLINE_SHOP_SYSTEM std::auto_ptr<SQLMsg> pmsg(DBManager::instance().DirectQuery("SELECT COUNT(*) FROM player.offline_shop_npc WHERE owner_id and channel = %d", g_bChannel)); MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); int mShopsOffline = 0; str_to_number(mShopsOffline, row[0]); #endif int mResultHour = localTime->tm_hour, mResultMin = localTime->tm_min, mResultSec = localTime->tm_sec; int mTotalOnline; int * mEmpire; int mLocal; DESC_MANAGER::instance().GetUserCount(mTotalOnline, &mEmpire, mLocal); /* 0 = 00:00 1 = 01:00 2 = 02:00 3 = 03:00 4 = 04:00 5 = 05:00 6 = 06:00 7 = 07:00 8 = 08:00 9 = 09:00 10 = 10:00 11 = 11:00 12 = 12:00 13 = 13:00 14 = 14:00 15 = 15:00 16 = 16:00 17 = 17:00 18 = 18:00 19 = 19:00 20 = 20:00 21 = 21:00 22 = 22:00 23 = 23:00 */ #ifdef ENABLE_COUNTER_FAKE static int arrayDesc[23 + 1][2] = { /* First row -> Current hour | Second row -> Value added for players fake Example: From 15:00 until 15:59:59 will be added on statics + 75 players online fake. Because -> { 15, 75 } */ { 0, 190 }, { 1, 175 }, { 2, 160 }, { 3, 140 }, { 4, 130 }, { 5, 100 }, { 6, 80 }, { 7, 75 }, { 8, 60 }, { 9, 55 }, { 10, 40 }, { 11, 30 }, { 12, 50 }, { 13, 60 }, { 14, 70 }, { 15, 75 }, { 16, 80 }, { 17, 90 }, { 18, 105 }, { 19, 120 }, { 20, 135 }, { 21, 155 }, { 22, 175 }, { 23, 180 } }; for (int i=0; i<_countof(arrayDesc); i++) { if (mResultHour == arrayDesc[i][0]) { for (int j=1; j<=3; j++) mEmpire[i] += arrayDesc[i][1] / 3; mTotalOnline += arrayDesc[i][1]; break; } } #endif if (ch->IsGM()) { ch->ChatPacket(CHAT_TYPE_INFO, "[i] Current time on server: %d:%d:%d", mResultHour, mResultMin, mResultSec); } ch->ChatPacket(CHAT_TYPE_INFO, "[i] Current channel: [%d]", g_bChannel); ch->ChatPacket(CHAT_TYPE_INFO, "[i] Current players online on this channel (all empire): [%d]", mTotalOnline); ch->ChatPacket(CHAT_TYPE_INFO, "[i] Current players online on empire: Shinshoo - [%d] | Chunjo - [%d] | Jinno - [%d]", mEmpire[1], mEmpire[2], mEmpire[3]); #ifdef ENABLE_OFFLINE_SHOP ch->ChatPacket(CHAT_TYPE_INFO, "[i] Current shops offline on this channel: [%d]", mShopsOffline); #endif } Download: https://mega.nz/#!rQgG0C5L!5yIGTEsJoiF5UVJ7l7jJKKaSrBY4izI_A_ylmlLEP2U Have fun (not tested full, sorry for shit code, It was quickly made fun)
  12. Tab Targeting: Player has the possibility to select the nearest monster around the character by pressing the Tab key. NOTE: Players are not able to select NPCs, Metin Stones and players as target! Repository GitHub: https://github.com/Vegas007/Metin2-Tab-Targeting-GF-v16.1
  13. Hola buenos dias zoneros, ¿Alguien me puede decir porque me da este error al compilar el binario? si me podrian echar una mano n_n gracias que tengan un buen dia
  14. #@../root/ui.py #@Search for: def RegisterToolTipWindow(type, createToolTipWindow): createToolTipWindowDict[type]=createToolTipWindow #@Add after: ####################################### #### START OF REGISTER STRUCT CLASS #### """ How To Use Ex: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @E.g #1: class ZodiacTempleToolTipBoard(ui.ThinBoard): CONFIG = ui.RegisterStructClass('TOOLTIP_BASE_POS TOOLTIP_WIDTH TOOLTIP_HEIGHT TOOLTIP_DEFAULT_SIZE_DICT ' 'TOOLTIP_TOP_RANK_LIST TOOLTIP_ADD_STRING')(100, 450, 300, {'w': 400, 'h': 500}, [1, 2, 3], 'String') def __mem_func__(self): print (self.CONFIG.TOOLTIP_BASE_POS, self.CONFIG.TOOLTIP_WIDTH, self.CONFIG.TOOLTIP_HEIGHT, self.CONFIG.TOOLTIP_ADD_STRING) print (self.CONFIG.TOOLTIP_DEFAULT_SIZE_DICT.get('w'), self.CONFIG.TOOLTIP_DEFAULT_SIZE_DICT.get('h')) print self.CONFIG.TOOLTIP_TOP_RANK_LIST @E.g #2: self.Transfer(ui.RegisterStructClass('szName lX lY')(player.GetName(), player.GetX(), player.GetY())) # TPacketGGTransfer def Transfer(self, c_pData): print(c_pData.szName, c_pData.lX, c_pData.lY) @E.g #3: pack = ui.RegisterStructClass('a b c')(15, {}, []) pack.a += 50 pack.b.update({0: 250}) pack.c.append(100) print (pack.a, pack.b, pack.c) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """ def RegisterStructClass(obj): import exception if (not isinstance(obj, str)): exception.Abort('RegisterStructClass:: Objects {0} need to be as {1}.'.format(type(obj), type(str))) def register(self, * kwargs): args = obj.split() if (len(args) <> len(kwargs)): exception.Abort('RegisterStructClass:: Failed to read arguments.') [self.__dict__.setdefault(key, value) for (key, value) in zip(args, kwargs)] return type('__struct__', (object, ), {'__init__': register}) ###################################### #### END OF REGISTER STRUCT CLASS ####
  15. Have fun. Download link: https://mega.nz/#!dXp0BbzL!btvYx_132MuyZIO6E4SOkbrW2dvsua34NVQc5g1Q2lI
  16. #! /usr/bin/env python import app, dbg, chr, chrmgr, os, introSelect """ Render Monster Card ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A simple Python Module which gives you the chance to be able to turn mob differently with a specific animation such as atack, motion, death etc. This module was not designed for beginners in python, this is just a beginning for the rendering of every monster. You can also use it for other systems for render. WARNING: I don't offer any support for this, that module is just for guys who know what have to do. Code isn't working like official one. This script has not been tested, is just a simple idea like better then 'pseudocode', you need to improve and do compatible with your scripts. Copyright: (c) 2016 VegaS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """ class RenderMonsterCardParser(): def __init__(self): self.monsterCardDict = GetMonsterCardPaths() self.srcFileName = 'monster_card.txt' self.startInstanceIndex = 90000 self.destRotation = 25.0 self.renderPos = { 'x': 70.0, 'y': 22.0, 'z': 30.0 } self.chrRenderer = introSelect.SelectCharacterWindow().CharacterRenderer() self.chrRenderer.SetParent(self) self.chrRenderer.Show() def GetMonsterCardPaths(self): m2dict = {'pathName': '','raceData': ''} try: lines = pack_open(self.srcFileName, "r").readlines() except IOError: dbg.LogBox("Can't load: {0}".format(self.srcFileName)) app.Abort() for (key, value) in enumerate(lines): data = value[:-1].split(",") if (not len(data) or not data[0] or not data[1]): continue m2dict.update({key : {'pathName': data[0].strip(), 'raceData': data[1].strip()}}) return m2dict def RegisterDefaultMotion(self): chrmgr.RegisterMotionMode(chr.MOTION_MODE_GENERAL) chrmgr.RegisterMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_WAIT, 'wait.msa') chrmgr.RegisterMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_RUN, 'wait2.msa') def OnUpdate(self): chr.Update() self.destRotation = self.destRotation - 0.5 chr.SetRotation(self.destRotation) def OnRender(self, slotIndex): def CreateMonsterInstance(slotIndex): chrmgr.CreateRace(slotIndex) chrmgr.SelectRace(slotIndex) chrmgr.SetPathName(self.monsterCardDict[slotIndex]['pathName']) chrmgr.LoadRaceData(self.monsterCardDict[slotIndex]['raceData']) CreateMonsterInstance(slotIndex) chrEventDict = { 0 : (lambda : chr.CreateInstance(slotIndex)), 1 : (lambda : chr.SelectInstance(slotIndex)), 2 : (lambda : chr.SetVirtualID(slotIndex)), 3 : (lambda : chr.SetRace(slotIndex)), 4 : (lambda : chr.SetArmor(0)), 5 : (lambda : chr.SetRotation(self.destRotation)), 6 : (lambda : chr.SetPixelPosition(self.renderPos['x'], self.renderPos['y'], self.renderPos['z'])), 7 : (lambda : chr.SetMotionMode(chr.MOTION_MODE_GENERAL)), 8 : (lambda : chr.SetLoopMotion(chr.MOTION_WAIT)), 9 : (lambda : chr.Refresh()), 10 : (lambda : chr.Show()) } [chrEventDict.get(chrObject, lambda *arg: None)() for chrObject in chrEventDict.values()] def OnChangeMotionData(self, motionMode = chr.MOTION_MODE_GENERAL, motionType = chr.MOTION_COMBO_ATTACK_1, motionPathName = '', motionWeight = 0) chrmgr.RegisterMotionData(motionMode, motionType, motionPathName, motionWeight) def OnRenderMonsterCard(self, slotIndex): def ClearInstance(max_range_num): [chr.DeleteInstance(self.startInstanceIndex + rangeInst) for rangeInst in xrange(max_range_num)] if (not self.monsterCardDict.has_key(slotIndex)): return ClearInstance(len(self.monsterCardDict[0])) self.RegisterDefaultMotion() self.OnRender(self.startInstanceIndex + slotIndex)
  17. http://metin2zone.net/index.php?/topic/24114-c-affect-blend-potion/
  18. A collision or crash is an event in which two or more bodies exert forces on each other for a relatively short time. Although the most common colloquial use of the word "collision" refers to incidents in which two or more objects collide, the scientific use of the word "collision" implies nothing about the magnitude of the force. Some examples of physical interactions that scientists would consider collisions: An insect touches its antenna to the leaf of a plant. The antenna is said to collide with leaf. A cat walks delicately through the grass. Each contact that its paws make with the ground is a collision. Each brush of its fur against a blade of grass is a collision. [File: src/Client/Source/GameLib/ActorInstanceCollisionDetection.cpp] //1.) Search: ​ #include "../eterLib/GrpMath.h" ​ //2.) Add bellow: #include "../UserInterface/PythonBackground.h" #include "../UserInterface/Locale_inc.h" //3.) Search: BOOL CActorInstance::TestActorCollision(CActorInstance & rVictim) { //4.) Add bellow: #ifdef ENABLE_STOP_COLISSION_GLOBAL /********************************************************************* * date : 2016.02.16 * function : Stop Colission * developer : VegaS * skype : sacadatt.amazon * description : Checks if the victim is one of the examples below you can easily configure. If the victim was found success as vnum site / breed ve you could go through it no longer block. */ /************ * The first value is the minimum value and the second value is the maximum value of pet vnum (mob_proto) - change 34051 with your max vnum of pet */ int pListPet[2] = {34001, 34051}; /************ * You can add whatever you like vnum of npc or monster (mob_proto) */ int pListGlobal[] = {9001, 9002, 9003, 9004, 9005, 9006, 20011, 20091, 20092, 20093, 20094, 20095, 30000}; /************ * You can add what mapname you want for enable this stop collission global like pet / npc */ const char* strMapListGlobal[] = {"metin2_map_a1", "metin2_map_a3", "metin2_map_b1", "metin2_map_b3", "metin2_map_c1", "metin2_map_c3", "season2/metin2_map_skipia_dungeon_01", "season2/metin2_map_skipia_dungeon_02", "metin2_map_duel"}; /************ * Location name of the map where the event takes place ox */ const char* strMapEventOx = "season1/metin2_map_oxevent"; std::string stringName = CPythonBackground::Instance().GetWarpMapName(); for (int i = 0; i < _countof(strMapListGlobal); i++) { #ifdef ENABLE_STOP_COLLISION_PLAYER_OX if (strMapEventOx == stringName) // Check if u are place in map ox { if (0 <= rVictim.GetRace() && rVictim.GetRace() <= 7) // Check if the victim through which pass over a player (change 7 with 8 if u have wolfman) return FALSE; // Stop collission for player --> You can go through players now successfully without lock yourself } #endif if (strMapListGlobal[i] == stringName) // Check if you are in one of the maps listed in the global list { for (int i = 0; i < _countof(pListGlobal); i++) { if (rVictim.GetRace() == pListGlobal[i] || pListPet[0] <= rVictim.GetRace() && rVictim.GetRace() <= pListPet[1]) // Verify that the victim is npc vnum listed above, or if a pet. return FALSE; // Stop collission for global vnum like a pet or npc } } } #endif [File: src/Client/Source/UserInterface/Locale_inc.h] //1.) Search: #define ENABLE_COSTUME_SYSTEM //2.) Add bellow: #ifndef ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLLISION_PLAYER_OX #endif
  19. It is for scripts online player or developer php that make connections to the database to achieve something, one who came to me to help him with that worked on a market online and item-shop and no time it was updated in real time and cause them a thousand a problem/bugs. /********* * author: VegaS * file: input_login.cpp * description: Time update in real-time table last_play * date: Tuesday, Aug 01 st 2016, 02:44am */ //1.) Search: void CInputLogin::Entergame(LPDESC d, const char * data) { LPCHARACTER ch; [........................................] } //2.) Add bellow: #ifdef ENABLE_UPDATE_LASTPLAY_REAL_TIME /********* * I put this verification level as not to over apply database updates elsewhere for characters that start at * first on the game that is at level 1, I believe that it is not necessary for a player of that level to have time adapted real-time. */ int pLevel = 5; // To begin initialize of level 5 ++ if (ch->GetLevel() > pLevel) { char pUpdateTime[1024]; snprintf(pUpdateTime, sizeof(pUpdateTime), "UPDATE player.player SET last_play = NOW() WHERE id = %u", ch->GetPlayerID()); std::auto_ptr<SQLMsg> sUpdate(DBManager::instance().DirectQuery(pUpdateTime)); } #endif
  20. As you know many people have wanted to do this and they did not know how. I posted a few months ago another community on how to do this, the only tutorial, and then I noticed that everyone was used for those functions that I put. So today I improve my bit version, and you've made a small gift. Sorry for that code, is very shit maybe but is *free*, I do not ask money for crap written in a few minutes. [File: Src/Client/UserInterface/Locale_inc.h] // ------------------------------------------------------------------------ // #define ENABLE_EFFECT_COSTUME // Enable check for add effect costume // ------------------------------------------------------------------------ // // ------------------------------------------------------------------------ // #define GET_EFFECT_VIA_MSM // Enable check from value3 item_proto(client) // ------------------------------------------------------------------------ // // ------------------------------------------------------------------------ // #define GET_EFFECT_VIA_VNUM // Enable check from item vnum // ------------------------------------------------------------------------ // [File: Src/Client/UserInterface/InstanceBase.h] #1.) Search: enum { WEAPON_DUALHAND, WEAPON_ONEHAND, WEAPON_TWOHAND, WEAPON_NUM, }; #2.) Add bellow: #ifdef ENABLE_EFFECT_COSTUME // ------------------------------------------------------------------------ // // This enum from ECostumeEffectMsm value is loaded from item_proto(client)// // Value is loaded from your Value3="xxxxx" // // Value3 = ShapeIndex from yourrace.msm (root) // // ------------------------------------------------------------------------ // enum ECostumeEffectMsm { VALUE_MSM_1 = 40032, // = vnum [ (M) -> 41003, (F) -> 41004] VALUE_MSM_2 = 40033, // = vnum [ (M) -> 41005, (F) -> 41006] VALUE_MSM_3 = 40034, // = vnum [ (M) -> 41007, (F) -> 41008] VALUE_MSM_4 = 40035, // = vnum [ (M) -> 41009, (F) -> 41010] VALUE_MSM_5 = 40036, // = vnum [ (M) -> 41011, (F) -> 41012] VALUE_MSM_6 = 40037, // = vnum [ (M) -> 41013, (F) -> 41014] VALUE_MSM_7 = 40038, // = vnum [ (M) -> 41015, (F) -> 41016] VALUE_MSM_8 = 40039, // = vnum [ (M) -> 41017, (F) -> 41018] VALUE_MSM_9 = 40040, // = vnum [ (M) -> 41019, (F) -> 41020] VALUE_MSM_10 = 40041, // = vnum [ (M) -> 41021, (F) -> 41022] }; enum ECostumeEffectVnum { VALUE_VNUM_1 = 41003, VALUE_VNUM_2 = 41304, VALUE_VNUM_3 = 41005, VALUE_VNUM_4 = 41006, VALUE_VNUM_5 = 41307, VALUE_VNUM_6 = 41308, VALUE_VNUM_7 = 41309, VALUE_VNUM_8 = 41310, VALUE_VNUM_9 = 41311, VALUE_VNUM_10 = 41312, }; #endif [File: Src/Client/UserInterface/InstanceBase.cpp] #1.) Search: if (m_swordRefineEffectRight) m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight); if (m_swordRefineEffectLeft) m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft); break; #2.) Add bellow: #ifdef ENABLE_EFFECT_COSTUME case CItemData::ITEM_TYPE_COSTUME: if (pItem->GetSubType() == CItemData::COSTUME_BODY) { DWORD szItem = pItem->GetIndex(); long szMsm = pItem->GetValue(3); #ifdef GET_EFFECT_VIA_MSM if (szMsm == VALUE_MSM_1 || szMsm == VALUE_MSM_2 || szMsm == VALUE_MSM_3 || szMsm == VALUE_MSM_4 || szMsm == VALUE_MSM_5 || szMsm == VALUE_MSM_6 || szMsm == VALUE_MSM_7 || szMsm == VALUE_MSM_8 || szMsm == VALUE_MSM_9 || szMsm == VALUE_MSM_10) #endif #ifdef GET_EFFECT_VIA_VNUM if (szItem == VALUE_VNUM_1 || szItem == VALUE_VNUM_2 || szItem == VALUE_VNUM_3 || szItem == VALUE_VNUM_4 || szItem == VALUE_VNUM_5 || szItem == VALUE_VNUM_6 || szItem == VALUE_VNUM_7 || szItem == VALUE_VNUM_8 || szItem == VALUE_VNUM_9 || szItem == VALUE_VNUM_10) #endif { __AttachEffect(EFFECT_REFINED+EFFECT_NAME); // Put your effect } } #endif
  21. ¿Que es el Pot Bomber? Bueno, el Pot Bomber es un hack que ya lleva bastante tiempo por foros, y un hack bastante fácil de usar con el que cualquiera os puede lagear o tumbar vuestro servidor. ¿En qué consiste, cómo funciona? Pot Bomber, es un archvo.py que se inyecta al cliente, a través de cualquier inyector, una vez esta inyectado, aparece una pequeña ventanita en la que seleccionas la id del item, y lo activas o desactivas, selecionando por ejemplo, las flechas (8001) y llenando tu inventario de pack de flechas de 200, el Pot Bomber una vez es activado empieza a soltar bestialmente rápido todas las flechas al suelo, lo que provoca un lag increíble e incluso la caída del servidor, imaginaos, 3 o 4 personas usando este hack.. ¿Como nos vamos a proteger? Mucha gente hizo lo siguiente: poner no comerciables todos los items que van en packs, pero veo esto una auténtica tontería, y muy molesta para los user, ¿Como lo solucionamos entonces? Cambiando el tiempo de desaparición de los items una vez un personaje los tira al suelo, (Estos Diffs no afectan a los items que dropean los mobs). Diffs para Game_2089: -Items desaparecen en 1 segundo. This difference file has been created by IDA Pro game 0004D0A4: 2C 01 0004D0A5: 01 00 -Items desaparecen en 3 segundos. This difference file has been created by IDA Pro game 0004D0A4: 2C 03 0004D0A5: 01 00 -Items desaparecen en 5 segundos. This difference file has been created by IDA Pro game 0004D0A4: 2C 05 0004D0A5: 01 00 -Items desaparecen en 10 segundos. This difference file has been created by IDA Pro game 0004D0A4: 2C 0A 0004D0A5: 01 00
  22. I saw this guy looking hasta .. it provides money for shit, so I wanted to paint a small tutorial sucks these functions. [File: Src/game/src/service.h] #define ENABLE_PROTECT_ALIGNMENT #ifdef ENABLE_PROTECT_ALIGNMENT #define IS_MAPINDEX_PROTECT_ALIGN(map) (200==(map)||201==(map)||(202)==(map)) #endif [File: Src/game/src/char_battle.cpp] //1.) Search: if (g_iUseLocale && pkKiller->GetParty()) { FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY()); pkKiller->GetParty()->ForEachOnlineMember(f); if (f.m_iCount == 0) pkKiller->UpdateAlignment(-20000); //2.) Delete and replaced with this: if (g_iUseLocale && pkKiller->GetParty()) { #ifdef ENABLE_PROTECT_ALIGNMENT if (IS_MAPINDEX_PROTECT_ALIGN(GetMapIndex())) { return; } #endif FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY()); pkKiller->GetParty()->ForEachOnlineMember(f); if (f.m_iCount == 0) pkKiller->UpdateAlignment(-20000); [File: Src/game/src/char.cpp] //1.) Search: UpdateAlignment(5 * (dwPlayedTime / 60000)); //2.) Delete and replaced with this: #ifdef ENABLE_PROTECT_ALIGNMENT if (IS_MAPINDEX_PROTECT_ALIGN(GetMapIndex())) { return; } else { UpdateAlignment(5 * (dwPlayedTime / 60000)); } #else UpdateAlignment(5 * (dwPlayedTime / 60000)); #endif PS: I have not tested this, I just wrote. But in principle it should work. ----------------------------------------------------------------------------------------- EDIT: Fcking shit or you can make that easy: [File: Src/game/src/char_battle.cpp] #ifdef ENABLE_PROTECT_ALIGNMENT void CHARACTER::UpdateAlignment(int iAmount) { if (IS_MAPINDEX_PROTECT_ALIGN(GetMapIndex())) { return; } else { bool bShow = false; if (m_iAlignment == m_iRealAlignment) bShow = true; int i = m_iAlignment / 10; m_iRealAlignment = MINMAX(-200000, m_iRealAlignment + iAmount, 200000); if (bShow) { m_iAlignment = m_iRealAlignment; if (i != m_iAlignment / 10) UpdatePacket(); } } } #endif
×
×
  • Create New...