Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 07/05/19 in all areas

  1. "Rubinum pirate server was destroyed. Private servers are announced to those who do not shut down. The turn will be destroyed. Those responsible will get heavy penalties. In addition, personal and corporate lawsuits are coming soon. All of these videos will be downloaded and forwarded to legal authorities. Not warned. Look, I'm not obligatory, but I warn you not to get hurt, but some of them do not listen unfortunately. Some of them do not take advice and throw in their minds will fight. There's no war. I hope that those who break the law will show the virtue to bear the consequences." Google translate Let's change the hosts to China. ____________________________________________________________________________________________________________________________________________ Prediction from: 29 June 2019, 12:23 am Hello, after almost 6 passive years I would like to inform you today. At that time (at the time of the Source Leaks) and today we were in close contact with a certain employee, who belongs to the Metin2 department in Karlsruhe. Over the past few months, the measures against P Server (Investigations & Promotion) have been pretty quiet, but this will change in the near future, with (presumably) some busts following. Gameforge has achieved that the State Criminal Police Office of Baden-Württemberg has established a (according to our information) 3-member investigation team against the operation of Metin2 private servers. So take care of your ass - make certain arrangements and stay under the radar !!! Greetings from an old hand! ____________________________________________________________________________________________________________________________________________ Update: Another message from the same CoMa of GameForge (TR). - Link First of all, the royalties are not related to the person or the TR team. We have no authority in this matter. This is a legal matter. Publications are now tracked with special algorithms. The relevant units worked on this issue and we all saw the results. Gameforge started to send warnings to pirated channels on 27.06.2019 as Global and this will continue. It was an action we've been waiting for recently. From now on, those who do not take this seriously and make fun of Gameforge and those who continue to pirate broadcast are a topic to consider. I already find it meaningless for those who keep repeating every day knowing that something is a crime and those who think that they can't do anything, waiting for a special warning before. Those who get angry with 2-3 caution should not forget that they have violated Gameforge's rights 500-1000 times with 5000-1000 videos. Don't misunderstand my Instagram sharing. We will not recruit publishers who insult us, denigrate, denigrate, target, humiliate, support pirate servers and illegal methods. Our decision on this issue has not changed. Hard is! Pirate; is theft and disrespect to the pirate ad emege. It is not possible to comprehend the pirate servers who disrespect Eme and make the premium talk about labor. This is a moral issue. Selling a product that does not belong to you, marketing, earning over this product, then selling "I spent a lot of labor, my labor has been lost" is no sense for us. The goods are already stolen. Bread literature is not made over stolen goods. Those who market stolen goods are considered to have taken all possible consequences. What can be expected when illegal content is shared ?. We will be with the publishers who continue to be with us. We'il be even closer with them. The warnings will continue and spread to all platforms. (Twitch, d-live, etc.) We do not understand the understanding of different thinkers. In the night people yedigün P servers copyright, copyright and they eat does not bring us money .. We did not do to revive the Turkey servers that. Gameforge's taxes, webzen shares, employees, and never made the server to spend on the server P servers, we do not throw royalties because people give money. It is not an attack on the publisher's income. Maybe you don't see it, but the biggest channels in TR were smaller than the other p-server channels that ate ban in many parts of the world. 25000 videos were released on youtube in different languages. This process is not specific to the TR:) region, and will never stop. The new team will never stop. Discarded royalties were thrown to people who were part of the illegal business system. When you introduce P server and play here, you work with people who don't pay taxes, don't give shares to manufacturer or publisher. How to work for people who do not pay taxes in the law (fake documents or deliberate use of tax offenses in the form of punishment of 2 years to 5 years imprisonment (VUK md.359 / c) If it corresponds to imprisonment, youtube on these accounts is a right action to remove. 3-year 5-year labor on the servers that make kacakcilik and offense people, such as the children in the field of the size of the channels they grow up knowing that they have grown. Gameforge, which grants taxes and shares for the broadcasting rights of other games such as Metin2, is also entitled to copyright for all non-P or P content. As a publisher, both the music company and the book company; has the right to manage how the content it publishes is spoken. Note: I don't have a page on my Facebook platform. Do not be deceived by impersonation.
    7 points
  2. M2 Download Center Download Here ( Internal ) yo, have fun! [Hidden Content] [Hidden Content] Best regards, Ramses
    3 points
  3. item_names.txt (all countries without mother russia ?) please don't replace (just copy and past some parts). Patch v19.3.6 Download
    2 points
  4. How many people found this error on pserver or Official Metin2? With Windows >= 8 we found this problem and we have fixed with the compatibility checker but this is not the best way! The real problem is this string on the source of client EterLib/GrpDevice.cpp if (!ms_kD3DDetector.Find(800, 600, 32, TRUE, &ms_iD3DModeInfo, &ms_iD3DDevInfo, &ms_iD3DAdapterInfo)) The application go to find the default resolution "800x600" but this is not the correct way! With new generation some computer have deleted the 800x600 resolution and this cause problems! to solve this we change previous line with this: if (!ms_kD3DDetector.Find(iHres, iVres, 32, TRUE, &ms_iD3DModeInfo, &ms_iD3DDevInfo, &ms_iD3DAdapterInfo)) We force the application to find the resolution we have set up with config.exe "I remind you that config.exe get the possible resolutions automatically"! With this method the application always start without problem and compatibility setting. And if you have a Metin2 Official? if you have intel chip with the intel control panel you can add personal resolution if not you can add the resolution with edit some things in the registry but i not suggest it if you not know how registry work! Hope can i help someone!
    1 point
  5. M2 Download Center Download Here ( Internal ) Hey there, I have an Halloween gift for you all. i have been working for a few hours on official like element image on target window(See screenshots below). When you click on a mob if it is defined as elemental, it will open an element image in addition to the target window. Don't forget to hit the like button! (C) Metin2 guild wars - coded by [GA]Ruin - 27/10/2017 (I create custom metin2 systems in c++/python. if you want a custom system send me a pm and we can talk over skype). Let's begin! Server Side: Open service.h, add in the end: #define ELEMENT_TARGET Open char.cpp, search for else { p.dwVID = 0; p.bHPPercent = 0; } add below: #ifdef ELEMENT_TARGET const int ELEMENT_BASE = 11; DWORD curElementBase = ELEMENT_BASE; DWORD raceFlag; if (m_pkChrTarget && m_pkChrTarget->IsMonster() && (raceFlag = m_pkChrTarget->GetMobTable().dwRaceFlag) >= RACE_FLAG_ATT_ELEC) { for (int i = RACE_FLAG_ATT_ELEC; i <= RACE_FLAG_ATT_DARK; i *= 2) { curElementBase++; int diff = raceFlag - i; if (abs(diff) <= 1024) break; } p.bElement = curElementBase - ELEMENT_BASE; } else { p.bElement = 0; } #endif open packet.h, search for: } TPacketGCTarget; add above: #ifdef ELEMENT_TARGET BYTE bElement; #endif Client side: open locale_inc.h, add in the end: #define ELEMENT_TARGET open packet.h, search for } TPacketGCTarget; add above: #ifdef ELEMENT_TARGET BYTE bElement; #endif open PythonNetworkPhaseGame.cpp, look for: else if (pInstPlayer->CanViewTargetHP(*pInstTarget)) replace below with the following: #ifdef ELEMENT_TARGET PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement)); #else PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(ii)", TargetPacket.dwVID, TargetPacket.bHPPercent)); #endif open PythonApplicationModule.cpp, look for #ifdef ENABLE_ENERGY_SYSTEM add above: #ifdef ELEMENT_TARGET PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 0); #endif open game.py, look for def SetHPTargetBoard(self, vid, hpPercentage): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.Show() replace with: if app.ENABLE_VIEW_ELEMENT: def SetHPTargetBoard(self, vid, hpPercentage,bElement): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.SetElementImage(bElement) self.targetBoard.Show() else: def SetHPTargetBoard(self, vid, hpPercentage): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.Show() open uitarget.py, look for import background add below: if app.ENABLE_VIEW_ELEMENT: ELEMENT_IMAGE_DIC = {1: "elect", 2: "fire", 3: "ice", 4: "wind", 5: "earth", 6 : "dark"} look for: self.isShowButton = False add below: if app.ENABLE_VIEW_ELEMENT: self.elementImage = None inside Destroy method, look for: self.__Initialize() add below: if app.ENABLE_VIEW_ELEMENT: self.elementImage = None inside ResetTargetBoard method, look for: self.hpGauge.Hide() add below: if app.ENABLE_VIEW_ELEMENT and self.elementImage: self.elementImage = None look for : def SetElementImage(self,elementId): add above: if app.ENABLE_VIEW_ELEMENT: def SetElementImage(self,elementId): try: if elementId > 0 and elementId in ELEMENT_IMAGE_DIC.keys(): self.elementImage = ui.ImageBox() self.elementImage.SetParent(self.name) self.elementImage.SetPosition(-60,-12) self.elementImage.LoadImage("d:/ymir work/ui/game/12zi/element/%s.sub" % (ELEMENT_IMAGE_DIC[elementId])) self.elementImage.Show() except: pass Compile server, client source and root pack and that's it! Enjoy! Happy halloween!
    1 point
  6. Hello, There is a little memory leak associated with ITEM_BLEND item you would probably like to sort out. Find: LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, WORD bCount, int iRarePct, bool bMsg) Scroll down until you find this kind of code piece: if (item->GetType() == ITEM_BLEND) { for (int i=0; i < INVENTORY_MAX_NUM; i++) { LPITEM inv_item = GetInventoryItem(i); if (inv_item == NULL) continue; if (inv_item->GetType() == ITEM_BLEND) { if (inv_item->GetVnum() == item->GetVnum()) { if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() < ITEM_MAX_COUNT) { inv_item->SetCount(inv_item->GetCount() + item->GetCount()); return inv_item; } } } } } And add there destroy item's function before return statement. The result should look like this: if (item->GetType() == ITEM_BLEND) { for (int i=0; i < INVENTORY_MAX_NUM; i++) { LPITEM inv_item = GetInventoryItem(i); if (inv_item == NULL) continue; if (inv_item->GetType() == ITEM_BLEND) { if (inv_item->GetVnum() == item->GetVnum()) { if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() < ITEM_MAX_COUNT) { inv_item->SetCount(inv_item->GetCount() + item->GetCount()); // Memory Leak Fix M2_DESTROY_ITEM(item); return inv_item; } } } } } Item created above using CreateItem function would never be destroyed at all (it's usually returned from function for further use). Thus you need to wipe it out manually. Regards
    1 point
  7. As promised, here's to you: 1 - NullPtr + NewCase on famous Item MYTHICAL_PEACH char_item.cpp Find for: case 71107: Add below of this line: quest::PC* pPC = quest::CQuestManager::instance().GetPC(GetPlayerID()); This prevent: if (!pPC) return false; In your database there is an item like 71107, add the other case for it. case 71107: case 39032: 2 - Warp_all_to_village function was keeping also STAFF out. Replace the struct like this in questlua_global.cpp struct FWarpAllToVillage { FWarpAllToVillage() {}; void operator()(LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { const LPCHARACTER ch = (LPCHARACTER) ent; if (ch) { if (ch->IsPC() && !ch->IsGM()) { const auto bEmpire = ch->GetEmpire(); if (!bEmpire) return; ch->WarpSet( g_start_position[bEmpire][0], g_start_position[bEmpire][1] ); } } } } }; 3 - Enable Syserr also in LUA. In file questlua_global.cpp find for int _syserr(lua_State* L) or ALUA(_syserr) If you don't have it or if you have, replace or insert this function . int _syserr(lua_State* L) { if (!lua_isstring(L, 1)) return 0; sys_err("From LUA: %s", lua_tostring(L, 1)); /* PC* pc = CQuestManager::instance().GetCurrentPC(); if (!pc) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; ch->ChatPacket(CHAT_TYPE_INFO, "QUEST_SYSERR %s", lua_tostring(L, 1)); */ return 0; } OR int _syserr(lua_State* L) { if (!lua_isstring(L, 1)) return 0; sys_err("From LUA: %s", lua_tostring(L, 1)); PC* pc = CQuestManager::instance().GetCurrentPC(); if (!pc) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch) ch->ChatPacket(CHAT_TYPE_INFO, "QUEST_SYSERR %s", lua_tostring(L, 1)); return 0; } As you can see I commented the char part, because I suggest to use without! For server_timer and automatic things without char entity etc. Don't forget to add the function in RegisterGlobalFunctionTable and quest_functions file. 4 - Fix of bonus application like Official on special mineral slots. File item.cpp find for: if (0 != accessoryGrade) replace the if statement with this for 2 bonus only: if (0 != accessoryGrade && i < ITEM_APPLY_MAX_NUM - 1) UPDATE: From 2020-21 in official site, the bonus are shown and apply x3. So if you want to have like official, just leave c++ default and fix in python the show of the 3rd bonus. 5 - item with remain time stay into a shop, time shows: "Remain time 0 Sec.". In file uitooltip.py replace these functions: def AppendUniqueItemLastTime(self, restMin): def AppendMallItemLastTime(self, endTime): Like this: def AppendUniqueItemLastTime(self, restMin): if restMin > 0: restSecond = restMin*60 self.AppendSpace(5) self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToHM(restSecond), self.NORMAL_COLOR) def AppendMallItemLastTime(self, endTime): if endTime > 0: leftSec = max(0, endTime - app.GetGlobalTimeStamp()) self.AppendSpace(5) self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.SecondToDHM(leftSec), self.NORMAL_COLOR)
    1 point
  8. M2 Download Center Download Here ( Internal ) I edited Async Class to use C++ Standard mutex and thread support AsyncSQL.h ASyncSQL.cpp plus if you have this line in main.cpp inside the main function inside the db core source delete it DBManager.Quit(); this line will close MySQL connections before making sure that all the queries are done (which may not save the last thing a player do before closing the server) plus it will dump a core file since the db core will abort without successful exit! #edited Using std::gurad (which unlock the mutex when the object is destroyed) instead of manually lock and unlock mutex rewrote the Profiler class with std::chrono #Note : Don't just copy and paste .. make a backup , test , then use it Best regards.
    1 point
  9. Hello folks. Today i will show you have to solve some more or less serious bugs. P2P BASHPANEL: DB Account BUG: Kind regards.
    1 point
  10. Hello everyone, A lot of people might already know the issue. If you choose Arial as Font for Metin2, texts will be displayed in a weird way and with dots. There are a few reasons for this to happen and increasing font size fixes it, but no one wants huge texts everywhere and obviously, we wannt a nice font. Not a trial and error. So here's a partial fix for it. If you choose very small font sizes (e. g. font size 9px) in locale_game.txt it'll still look a bit off but it's definitely readable. With these changes, you'll have no problem with font sizes 14px and higher. Maybe someone wants to share different approaches or ideas. I think with these changes the problem is almost entirely fixed, no one needs size 9 especially with Arial.. First open your Binary source and search for "LOGFONT" (without "" of course). You'll find two matches where it's being used for initialization of new fonts: One in TextBar.cpp(CTextBar::__SetFont) and one in GrpFontTexture(CGraphicFontTexture::GetFont). And these are the two functions where we need to make some changes first. Under the line where LOGFONT is used, you're gonna add the following code: HDC hDC = m_dib.GetDCHandle(); if (hDC) { auto px = fontSize * 72 / 96; fontSize = -MulDiv(px, GetDeviceCaps(hDC, LOGPIXELSY), 72); } This code segment does two things: First it converst px -> pt, since LOGFONT expects pt. And on second, it calculates the correct displaying size according to the ppi and the cell height. This leads to the variable we need: The point size. Note that there's a minus, which means that we'll automatically choose the nearest possible size according to the specified font size. So everything's good here. Als note that you need add this segment to BOTH places where LOGFONT is being used for initialization. You have to change the name fontSize according to the files you edit. In TextBar.cpp the example above fits, for GrpFontTexture you just need to change fontSize to m_fontSize. Now change the following parts in both functions: logFont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logFont.lfQuality = NONANTIALIASED_QUALITY; logFont.lfPitchAndFamily = VARIABLE_PITCH; Note: You can also change logFont.lfWeight from FONT_NORMAL to FONT_MEDIUM or any other font weight if you wanna add up a mit more strength to your fonts. I just left it to FONT_NORMAL, which is fine. Also note that I chose NONANTIALIASED_QUALITY since anti-aliasing didn't make any change (not sure if Arial is even compatible, at least not those small font sized that I tested it with..). You can also change them to something like ClearType to do the job, that's up to you. I wanted to display the fonts just like they are, no mangling with them. But depending on your needs you can tweak a bit here. that's almost it! Last but not least, we have to change the way our adapter hDC does it's job. Especially since the above calculation for point size is only 100% true for MapMode MM_TEXT. And that's what we're gonna establish now. If you are in CGraphicFontTexture::GetFont, you can just scroll a bit higher. You'll see the initialization of hdC (function CGraphicFontTexture::Create). just below SetBkColor(hDC, 0); you can add these two lines: SetGraphicsMode(hDC, GM_ADVANCED); SetMapMode(hDC, MM_TEXT); Aaand you're done! That's it! Compile and enjoy! Best Regards Vanilla
    1 point
  11. M2 Download Center Download Here ( Internal ) Hello, thanks to @masodikbela ideea about motions i could find a way of how to improve the loading of players. You must follow the tutorial exactly as it is. 1. Open root/playersettingmodule.py and replace all RegisterCacheMotionData with RegisterMotionData 2. Open \UserInterface\PythonCharacterManagerModule.cpp Search for PyObject * chrmgrRegisterMotionData(PyObject* poSelf, PyObject* poArgs) Replace this line pRaceData->RegisterMotionData(iMode, iMotion, c_szFullFileName, iWeight); With const char * c_szFullFileName = CRaceManager::Instance().GetFullPathFileName(szFileName); CGraphicThing* pkMotionThing=pRaceData->RegisterMotionData(iMode, iMotion, c_szFullFileName, iWeight); if (pkMotionThing) CResourceManager::Instance().LoadStaticCache(pkMotionThing->GetFileName()); 3. Open \EterLib\ResourceManager.cpp and replace int g_iLoadingDelayTime = 1; const long c_Deleting_Wait_Time = 3600000*4; const long c_DeletingCountPerFrame = 1; const long c_Reference_Decrease_Wait_Time = 3600000*4; Search for and comment it (not really necessary, it's your will ) //m_pCacheMap.clear(); Search for GameLib\RaceData.cpp void CRaceData::RegisterMotionMode(WORD wMotionModeIndex) comment //pMotionModeData->MotionVectorMap.clear(); This is what will load for cache at your first login [Hidden Content] What will fix this: When your walk and see new players screen freeze whould be way shorter or not happening at all. Recommended after this tutorial to update the granny in the source and the gr2 models (except the buildings).
    1 point
  12. try more times is working but very slow...
    1 point
  13. quest timer_notice begin state start begin when login begin loop_timer("tips_notice",180) end -- Tips notice when tips_notice.timer begin dofile("locale/germany/notice/tips_text.lua") table.insert(phrases,"Info: Search shop (F11) / Switchboot (F10)") -- alternative syntax notice("Info: ", phrases[math.random(table.getn(phrases))]) end end end For germany/notice/tips_text.lua phrases = { "You can reset your skills from the general store.", "The event calendar can be read from the patcher.", } Lua script. The text from tips_text.lua can be changed with server online. Just write or remove something. Better than a mysql query.
    1 point
  14. Dualities - No One Like You (feat. Loé)
    1 point
  15. You must send the vnum of the mount. I dont know if you save that value in Value4 but as i see in your gif is not working. Maybe you should try to make a dictionary with the vnum of the seals and the mount vnum, i know is not the best solution, but it could work. Example: PetsAndMounts = { 53001 : 34001, 53002 : 34002, 53003 : 34003, 53005 : 34004, } if PetsAndMounts.has_key(itemVnum): renderTarget.SelectModel(2, PetsAndMounts[itemVnum]) I hope this can help you.
    1 point
  16. If you want to do this in quest, you've to do a boolean variable in source and set it to true or false from quest functions like: pc.set_active_critical(true) pc.set_active_critical(false) If you don't know how to do it, you should use a simple pc quest flag. [Hidden Content] Not tested.
    1 point
  17. There are many ways on how to start being a "developer". But first, you need to understand what you're doing. Do you have any experience with programming so far? Do you know the difference between procedural and object-oriented programming? Do you understand the language that's behind it? If not, you'd start there. No one will write guides about how to develop your own systems in metin2 since... yeah, if you know what you're doing, then there's no need for it. And if you don't know what you're doing, you'd start learning programming. And there are tons of good guides about that. If you encounter any trouble or problem while coding, you can ask this board. But why should anyone reinvent the wheel? You can't start programming if you don't know what to do and if you do know, you won't need a guide. So at first if you don't have any knowledge about programming you'd start with procedural programming. This helps you understand how the machine works through each line of code. You can start with simple quests for metin2 and go into more advanced techniques. After that, take a step further into object oriented programming. Read about it, understand what it means and read a bit about c++, progress will come sooner or later and you'll start to understand what the code in these sources actually mean. As soon as you understand it, you can modify and even create your own code. But first you'd understand it. This is mandatory. Please DON'T copy paste stuff from boards. Understand it and write your own.
    1 point
  18. If it's so easy, why don't you mind sharing it with the community instead of telling everyone how good you are? As I said, on my client it's fixed, but I don't remember every change I've made on it, so that's why I asked for the functions and will review them now. If you have a fix and wanna share it, post it, if not, please do not spam this topic with showing yourself off.
    1 point
  19. M2 Download Center Download Here ( Internal ) Hello guys, here's free metin2 server presentation + editable logo for you.
    1 point
  20. 1 point
  21. Welcome! We are here for you, I have same story long ago.. Good luck.
    1 point
  22. Hello! Best regards, Sielu
    1 point
  23. First point: yes, protect your eix/epk is important...you can "integrate" in client exe all eix files but can be a possibility that people extract eix from exe Second point: as i know (maybe) M2Bob need to start himself a client exe but if you find a way to start client ONLY with patcher you block it
    1 point
  24. Hello, let's start! 1- char_item.cpp Find for double ";;" It's ok for compiler but not good for other things that may happen. 2- On bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell) Find: if (iWearCell < 0) return false; Add below: //FIX BLOCK MARRIAGE ITEMS WHILE RIDING if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11901 && item->GetVnum() <= 11914)) //Marriage Armors { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?????????????????????????????")); return false; } if (iWearCell == WEAR_WEAPON && IsRiding() && (item->GetVnum() == 50201)) //Marriage Weapon { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("?????????????????????????????")); return false; } 3- SMALL PREVENTS ON questlua_global.cpp int _clear_server_timer(lua_State* L) { CQuestManager & q = CQuestManager::instance(); const char * name = lua_tostring(L, 1); DWORD arg = (DWORD) lua_tonumber(L, 2); if (name && arg) q.ClearServerTimer(name, arg); else sys_err("LUA PREVENT: Wrong argument on ClearServerTimer!"); return 0; } int _char_log(lua_State * L) { CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); DWORD what = 0; const char* how = ""; const char* hint = ""; if (lua_isnumber(L, 1)) what = (DWORD)lua_tonumber(L, 1); if (lua_isstring(L, 2)) how = lua_tostring(L, 2); if (lua_tostring(L, 3)) hint = lua_tostring(L, 3); if (ch) LogManager::instance().CharLog(ch, what, how, hint); else sys_err("LUA PREVENT: !ch on _char_log!"); return 0; } 4- FIX ISSUE ON WAR: battle.cpp Find: battle_is_attackable Must be like this: if (victim->IsDead() || victim->IsObserverMode()) return false; if (ch->IsStun() || ch->IsDead() || ch->IsObserverMode()) return false; Hope it'll be useful.
    1 point
×
×
  • Create New...

Important Information

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