Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 11/06/20 in all areas

  1. GF v20.5.4 Patch (Metin2 Download) Dunno what is inside GF v20.5.4 Whole client resources ( M2 Download Center )
    5 points
  2. soon full xmas set (weapons, pets, mounts,sashes and another costumes!)
    4 points
  3. double AttBonusMin = static_cast<double>(pkItemAbsorbed->alValues[3] + pkItemAbsorbed->alValues[5]); AttBonusMin *= acceItem->GetSocket(ACCE_ABSORPTION_SOCKET); AttBonusMin /= 100; AttBonusMin += 0.5; //todebug if(ch->IsPhase(PHASE_GAME)) ch->ChatPacket(CHAT_TYPE_INFO, "Going to add to your attack : min(%0.2f) max(%0.2f) ", AttBonusMin, AttBonusMax); *pdamMax += static_cast<int>(AttBonusMax); *pdamMin += static_cast<int>(AttBonusMin); They are just rounded to integer (throught static_cast<int>) after the chat packet, that's why you are getting them as float in your chat. but the way you may add more chat packets in this function to check step by step how it is calculating the values
    2 points
  4. M2 Download Center Download Here ( Internal )
    2 points
  5. M2 Download Center Download Here ( Internal ) There is a bug about the stealth of the assassin with buffs actived. If the players near the assassin that is using the stealth move the camera zoom , the effects become visible again. here the fix of this problem source : myself Sameone could need to add #include "../UserInterface/Locale_inc.h" at the beginning of the file source/EterBase/StdAfx.h to include the defines in Locale_inc.h ------- EDIT ------ Due to some change on client-source someone may require a small fix to be added to this system: // SEARCH void CEffectInstance::__Initialize() { // ADD #ifdef __ENABLE_STEALTH_FIX__ ReleaseAlwaysHidden(); #endif
    1 point
  6. M2 Download Center Download Here ( Internal )
    1 point
  7. M2 Download Center Download Here ( Internal ) 3dsMax 2011 + Activator: Here Plugins GR2 for 3dsmax 2011: Here
    1 point
  8. Hello Today I want to share with all of you a little thing. All times when you are trying to open your safebox, it's requesting the password, isn't it? But for what? I modified to limit these requests to one input per login. Of course if you warp or change character, you need to retype your password again. But with extra modifications you can do it to store the password until you close the client, but I don't recommend this. So, first go to the uiSafeBox.py file and paste this line into the __init__ method of the PasswordDialog class, with taking care of the tabulators: self.lastPassword = "" This variable will store your last entered password. Then replace the Accept method of the same class with this: (take a look for the syntax, modulename, and true/false!) def OnAccept(self): self.lastPassword = str(self.passwordValue.GetText()) m2net.SendChatPacket(self.sendMessage + self.lastPassword) self.CloseDialog() return True When you accept the password input dialog, the entered password will be saved, if it's correct if it isn't as well. Don't worry about it, it will be reset if you entered wrong password. The next step is that to paste these new functions into the same class. def InitSafeboxPassword(self): self.lastPassword = "" def GetSafeboxPwd(self): return self.lastPassword As you can see, here is a function which will reset the entered password . With this, the file is done. Open interfaceModule.py and serach this line: ## Safebox then paste this function below: def InitSafeboxPassword(self): self.dlgPassword.InitSafeboxPassword() Then replace the AskSafeboxPassword and AskMallPassword functions with these: def AskSafeboxPassword(self): if self.wndSafebox.IsShow(): return if self.dlgPassword.IsShow(): self.dlgPassword.CloseDialog() return self.dlgPassword.SetSendMessage("/safebox_password ") if self.dlgPassword.GetSafeboxPwd() != "": self.dlgPassword.OnAccept() return self.dlgPassword.SetTitle(localeInfo.PASSWORD_TITLE) self.dlgPassword.ShowDialog() def AskMallPassword(self): if self.wndMall.IsShow(): return if self.dlgPassword.IsShow(): self.dlgPassword.CloseDialog() return self.dlgPassword.SetSendMessage("/mall_password ") if self.dlgPassword.GetSafeboxPwd() != "": self.dlgPassword.OnAccept() return self.dlgPassword.SetTitle(localeInfo.MALL_PASSWORD_TITLE) self.dlgPassword.ShowDialog() With these functions, if the last entered password is correct, the storages will open automatically with the last entered password. The file is done. Next, open your game.py and search this function: OnSafeBoxError and extend it with this line: self.interface.InitSafeboxPassword() So, as you can see this is the answer from the server to entered wrong password and this function will reset the last entered password as well . That's all, I hope you like it, and have fun. Edit.: Fix for change password. game/src/input_db.cpp void CInputDB::SafeboxChangePasswordAnswer(LPDESC d, const char* c_pData) { //[...] d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "safebox_change_passwd %d", p->flag); // to the bottom of the function } client/UserInterface/PythonNetworkStreamCommand.cpp void CPythonNetworkStream::ServerCommand(char * c_szCommand) { // [...] const char * szCmd = TokenVector[0].c_str(); if (!strcmpi(szCmd, "quit")) { // [...] } else if (!strcmpi(szCmd, "BettingMoney")) { // [...] } //Add between the "else if" cases: else if (!strcmpi(szCmd, "safebox_change_passwd")) { if (2 != TokenVector.size()) { TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, TokenVector.size()); return; } const int iFlag = atoi(TokenVector[1].c_str()); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvSafeboxPasswordChangeAnswer", Py_BuildValue("(i)", iFlag)); } else if (!strcmpi(szCmd, "gift")) { // [...] } // [...] } client/root/game.py # below of CommandCloseSafebox function add: def RecvSafeboxPasswordChangeAnswer(self, flag): self.interface.RecvSafeboxPasswordChangeAnswer(flag) client/root/interfaceModule.py # Below of CommandCloseSafebox function add: def RecvSafeboxPasswordChangeAnswer(self, flag): if flag: self.dlgPassword.SetSafeboxPwd(str(self.wndSafebox.dlgChangePassword.GetNewPasswordText())) client/root/uiSafeBox.py # change the OnAccept function of the PasswordDialog class with this: def OnAccept(self): if self.lastPassword == "" and "" != str(self.passwordValue.GetText()): self.lastPassword = str(self.passwordValue.GetText()) net.SendChatPacket(self.sendMessage + self.lastPassword) self.CloseDialog() return True # add this new function to the PasswordDialog class: def SetSafeboxPwd(self, pwd): self.lastPassword=pwd # add this line into the ChangePasswordDialog.__init__ function: self.__newPassword = "" # add this line into the ChangePasswordDialog.Open function: self.__newPassword = "" # add this function to the ChangePasswordDialog class: def GetNewPasswordText(self): return self.__newPassword # add the following line into the ChangePasswordDialog.OnAccept function (between the password check and the SendChatPacket): # return True self.__newPassword = newPasswordText #m2net.SendChatPacket("/safebox_change_password %s %s" % (oldPasswordText, newPasswordText)) Edit: fix of flooding: moving the saving method of the password from the OnAccept function to a separated one and calling it when the Safebox opens, this will be enough I guess. client/root/uiSafeBox.py # add the following function to the PasswordDialog class: def SavePassword(self): if self.lastPassword == "" and "" != str(self.passwordValue.GetText()): self.lastPassword = str(self.passwordValue.GetText()) # make the changes on the function in the PasswordDialog class def OnAccept(self): net.SendChatPacket(self.sendMessage + (self.lastPassword if self.lastPassword != "" else self.passwordValue.GetText())) self.CloseDialog() return True client/root/interfaceModule.py # add the following line into the beginning of the OpenSafeboxWindow and the OpenMallWindow function self.dlgPassword.SavePassword()
    1 point
  9. I want share you critical effect: UserInterface/InstanceBaseEffect.cpp open and search: else if (flag & DAMAGE_CRITICAL) { //rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot); //return; 숫자도 표시. } Thus replaced: else if (flag & DAMAGE_CRITICAL) { rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot); //return; 숫자도 표시. } root/playersettingmodule.py open and search: #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DAMAGE_CRITICAL, "", "d:/ymir work/effect/affect/damagevalue/critical.mse") Thus replaced: chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DAMAGE_CRITICAL, "", "d:/ymir work/effect/affect/damagevalue/critical.mse") Effect: [Hidden Content] [Hidden Content]
    1 point
  10. I will show you how to easily create animations. Do you know this animation? You must have seen her on some server. It would seem that someone went to the trouble to match her with metin, right? This is just the first impression. If you deal with models in metin then you will do such animation in a simple way. Here is a page with thousands of different animations. All you have to do is load your model in FBX format and the animations will adapt themselves. Then you save the file and later adjust it slightly in the program, because the animation does not include hair bones and various armor elements, such as leg or shoulders (although this is not necessary, because I saw that people sell these animations without any editing). [Hidden Content]
    1 point
  11. M2 Download Center Download Here ( Internal ) Hello, I'll show you how to import gr2 file. If I get 30 react I am thinking of sharing the plugin file. grnreader.exe > [Hidden Content] virustotal > [Hidden Content]
    1 point
  12. M2 Download Center Download Here ( Internal ) char_skill.cpp search: if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY)) ComputeSkill(dwVnum, this); add before: //Party buff system if (GetParty() && (dwVnum == 94 || dwVnum == 95 || dwVnum == 96 || dwVnum == 110 || dwVnum == 111)) { if (pkVictim->GetParty()){ if (pkVictim->GetParty() == GetParty()){ ComputeSkillParty(dwVnum, this); } } }
    1 point
  13. 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
  14. Hey, so, basically I recently got into making environment effects and skyboxes, I'm pretty satisfied with the results so far, nevertheless, I had two issues: I was playing with the LensFlare on WorldEditor, that's how it should be, or at least, that's what the result the World Editor window showed me: When the camera is looking the MainFlare (the sun), the window should get blurrier and brighter, and it should also show the Flare effect you see. (the circles) But the problem was that, when I got in-game, it was like this: So the issues were 2: First problem: You see it only was getting brighter for only like half of the window, depending on my resolution (It was perfect on 800x600 and 1024x768, if I chose a resolution even just a little bit wider, a part of the screen bugged out, but it worked even on fullscreen as long as I used one of those 2 resolutions). Fix: 1. Open your ClientSide sources and then your LensFlare.cpp file. Search for: RenderBar2d(0.0f, 0.0f, 1024.0f, 1024.0f); Change it into: RenderBar2d(0.0f, 0.0f, 3840.0f, 2400.0f); ^ I overdid the fix so it supports even the most advanced gaming resolutions. Second problem: It didn't show the LensFlare effect ([Hidden Content]), no matter what I did. (Yes the binary loaded the 6 flare files from my client correctly). Fix: 1. Open your ClientSide sources and then your LensFlare.cpp file. Search for: static float g_afColors[][4] = {{1.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {0.0f, 1.0f, 0.0f, 0.8f}, {0.3f, 0.5f, 1.0f, 0.9f}, {0.3f, 0.5f, 1.0f, 0.6f}, {1.0f, 0.6f, 0.9f, 0.4f}, {1.0f, 0.0f, 0.0f, 0.5f}, {1.0f, 0.6f, 0.3f, 0.4f}}; Each of these subarrays is a color, structure = R, G, B, A, the last argument, A, is the Alpha, by increasing it, it will eventually show them, make them as transparent as you like! My end result at max brightness: [Hidden Content] For the moderators: This thread was originally a help request, but since I managed to fix both of those issues, I think the thread should/could be moved to Guides/HowTo, I've already changed it so it fits for that section.
    1 point
  15. M2 Download Center Download Here ( Internal ) Hi everyone, Today I bring you a collection of maps made by Ymir that were included at some point in an official client but were never used. The maps are: GM Guild Building Field Dungeon Ginseng Valley (b2) - Second version of Dragon Valley (Orcs area) Heavenly Valley (c2) - Third version of Dragon Valley (Orcs area) Dragon Timeattack 1 - Dungeon possibly used in Korea, used by SG for Dragon Timeattack event Dragon Timeattack 2 Dragon Timeattack 3 Test map - Actually a town EW02 - ? Guild Inside - Supposed to be the inside of a guild house Milgyo Pass & Sungzi - A collection of alternative maps for Nation War. Requires editing forked_road.txt in order to add them to this event. Siege - Three maps one for each kingdom, for a kingdom event You might also be interested in the Metin2 Korea Naga map available here
    1 point
  16. M2 Download Center Download Here ( Internal ) Hey guys, I needed to be able to scroll on the ui with the mouse wheel and I thought it will be useful for others too so here's what to do. EterPythonLib PythonWindow.h Add virtual BOOL OnMouseWheel(int nLen); after like virtual BOOL OnMouseMiddleButtonUp(); In PythonWindow.cpp add the following function: BOOL CWindow::OnMouseWheel(int nLen) { long lValue; return PyCallClassMemberFunc(m_poHandler, "OnMouseWheel", Py_BuildValue("(i)", nLen), &lValue) && 0 != lValue; } In PythonWindowManager.h add bool RunMouseWheel(int nLen); after like void RunMouseMiddleButtonUp(long x, long y); In PythonWindowManager.cpp add the definition somewhere: bool CWindowManager::RunMouseWheel(int nLen) { CWindow* pWin = GetPointWindow(); while (pWin) { if (pWin->OnMouseWheel(nLen)) return true; pWin = pWin->GetParent(); } return false; } UserInterface In PythonApplicationEvent.cpp override the following function: void CPythonApplication::OnMouseWheel(int nLen) { UI::CWindowManager& rkWndMgr = UI::CWindowManager::Instance(); if (!rkWndMgr.RunMouseWheel(nLen)) { CCameraManager& rkCmrMgr = CCameraManager::Instance(); if (CCamera* pkCmrCur = rkCmrMgr.GetCurrentCamera()) pkCmrCur->Wheel(nLen); } } Then root/ui.py and find ScrollBar class and add this function to it: def OnMouseWheel(self, nLen): if nLen > 0: self.OnUp() return True elif nLen < 0: self.OnDown() return True return False But you can use OnMouseWheel everywhere to listen to scrolling. Good luck!
    1 point
  17. M2 Download Center Download Here ( Internal ) Hello, I publish the light version of my ProtoReader here, the light version has one functionality. It converts client item_proto and mob_proto the their server version Input: item_proto mob_proto Output: item_names.txt item_proto.txt mob_names.txt mob_proto.txt Its fully automated just double click on it when its in the same folder as the item_proto and mob_proto. It works like dump_proto but in reverse. Attention! Not every value is included in the clientside proto tables it could happen that you have to change some values on your own. ProtoReader is for old item_proto files (before dragon soul (dragon stone alchemy)). ProtoReaderNewFormat is for the current files. Virustotal: [Hidden Content] You find the download in the attachments. When you like my work and this tool, go and visit: I might also do a Pro Version with some other Features like clientside proto to xml or sql or sql to server item_proto and so
    1 point
  18. M2 Download Center Download Here ( Internal ) Hello guys, i want to share this website with you. This website is just html, and if you want anything from me, you can contact me on discord(meisterViper#2656) Well, this is my last release, because i dont have time for making stuffs just 4 fun. I release to much mounts which some guys this mounts really used. Thanks for everything, and good luck with your project. Best Regards meisterViper
    1 point
  19. M2 Download Center Download Here ( Internal ) Hope music isnt too loud
    1 point
  20. In my code i ve used the identical formula client-side and server-side, so the result values are equal. Also in python the formula is identical, so why are u trying to change the formula? Also you can't define what is a 'normal round' and what isn't. for example a number like 15.5 can be consider in many cases as 15 and in other cases as 16. Doesn't exists a standard to apply in this case, that's why we have to add a + 0.5 every where, in order to round always to the upper integer number, both python and c++. without the +0.5 we may find different values on python rouding and on c++ rounding.
    1 point
  21. game/src/packet.h missing lines typedef struct packet_fast_stack { BYTE header; TItemPos pos; } TPacketCGFastStack;
    1 point
  22. This is so great!! Thank you, kind sir I appreciate it!
    1 point
  23. try this add below this: CONDITION_COLOR = 0xffBEB47D SASH_1 = 0xFFFBE700 SASH_2 = 0xFFFB9200 and replace this with your function absChance = int(metinSlot[acce.ABSORPTION_SOCKET]) if absChance >= 20 and absChance <= 24: self.AppendTextLine(localeInfo.ACCE_ABSORB_CHANCE % (absChance), self.SASH_1) elif absChance >= 25: self.AppendTextLine(localeInfo.ACCE_ABSORB_CHANCE % (absChance), self.SASH_2) else: self.AppendTextLine(localeInfo.ACCE_ABSORB_CHANCE % (absChance), self.CONDITION_COLOR)
    1 point
  24. check how it is calculated and you will know why. I ve just used the identical formula on c++ (serverside and clientside) and in python so all values now should be aligned.
    1 point
  25. can i see your Status board (aka character window) while wearing the sash and without sash?
    1 point
  26. Ok so the bug is just a visual bug. You have to wear a sash with att min and max and to read the client syserr.txt Let's debug it. (look at //todebug comment) void CPythonPlayer::__UpdateBattleStatus() { m_playerStatus.SetPoint(POINT_NONE, 0); m_playerStatus.SetPoint(POINT_EVADE_RATE, __GetEvadeRate()); m_playerStatus.SetPoint(POINT_HIT_RATE, __GetHitRate()); m_playerStatus.SetPoint(POINT_MIN_WEP, m_dwWeaponMinPower+m_dwWeaponAddPower); m_playerStatus.SetPoint(POINT_MAX_WEP, m_dwWeaponMaxPower+m_dwWeaponAddPower); m_playerStatus.SetPoint(POINT_MIN_MAGIC_WEP, m_dwWeaponMinMagicPower+m_dwWeaponAddPower); m_playerStatus.SetPoint(POINT_MAX_MAGIC_WEP, m_dwWeaponMaxMagicPower+m_dwWeaponAddPower); m_playerStatus.SetPoint(POINT_MIN_ATK, __GetTotalAtk(m_dwWeaponMinPower, m_dwWeaponAddPower)); m_playerStatus.SetPoint(POINT_MAX_ATK, __GetTotalAtk(m_dwWeaponMaxPower, m_dwWeaponAddPower)); #ifdef ENABLE_ACCE_SYSTEM //change it with your sash define auto ItemData = GetItemData({INVENTORY, c_Costume_Slot_Acce}); if (ItemData) { auto AbsorbedVnum = ItemData->alSockets[1]; if (AbsorbedVnum != 0 && CItemManager::Instance().SelectItemData(AbsorbedVnum)) { auto SelectedItemData = CItemManager::Instance().GetSelectedItemDataPointer(); if (SelectedItemData->GetType() == CItemData::ITEM_TYPE_WEAPON) { auto oldMinWep = m_playerStatus.GetPoint(POINT_MIN_WEP); auto oldMaxWep = m_playerStatus.GetPoint(POINT_MAX_WEP); auto oldMinMag = m_playerStatus.GetPoint(POINT_MIN_MAGIC_WEP); auto oldMaxMag = m_playerStatus.GetPoint(POINT_MAX_MAGIC_WEP); double sashAbsorbPerc = static_cast<double>(ItemData->alSockets[0]); auto sashMinWep = static_cast<double>(SelectedItemData->GetValue(3) + SelectedItemData->GetValue(5)) * (sashAbsorbPerc/100.0); auto sashMaxWep = static_cast<double>(SelectedItemData->GetValue(4) + SelectedItemData->GetValue(5)) * (sashAbsorbPerc/100.0); auto sashMinMag = static_cast<double>(SelectedItemData->GetValue(1) + SelectedItemData->GetValue(5)) * (sashAbsorbPerc/100.0); auto sashMaxMag = static_cast<double>(SelectedItemData->GetValue(2) + SelectedItemData->GetValue(5)) * (sashAbsorbPerc/100.0); //todebug TraceError("Going to add to your points : wep(min %f max %f) mag(min %f max%f)", sashMinWep, sashMaxWep, sashMinMag, sashMaxMag); m_playerStatus.SetPoint(POINT_MIN_WEP, oldMinWep + sashMinWep); m_playerStatus.SetPoint(POINT_MAX_WEP, oldMaxWep + sashMaxWep); m_playerStatus.SetPoint(POINT_MIN_MAGIC_WEP, oldMinMag + sashMinMag); m_playerStatus.SetPoint(POINT_MAX_MAGIC_WEP, oldMaxMag + sashMaxMag); } } } #endif } We should replace the if statement with this: if (SelectedItemData->GetType() == CItemData::ITEM_TYPE_WEAPON || (SelectedItemData->GetType() == CItemData::ITEM_TYPE_COSTUME && SelectedItemData->GetSubType() == CItemData::COSTUME_WEAPON))
    1 point
  27. I ve confused you i think. here the complete ifstatement if(ch->GetDesc()->IsPhase(PHASE_GAME))
    1 point
  28. My bad, ch->GetDesc()->IsPhase
    1 point
  29. Let's debug it one by one. At first, the hit damage adjustments. //todebug help you to find where i ve added debug #ifdef ENABLE_ACCE_SYSTEM //replace it with your define for sash static void ApplyAcceAttackValue(LPITEM pkItem, int* pdamMin, int* pdamMax) { LPCHARACTER ch = pkItem ? pkItem->GetOwner() : NULL; if (!ch) return; LPITEM acceItem = ch->GetWear(WEAR_COSTUME_ACCE); if (!acceItem) return; TItemTable* pkItemAbsorbed = ITEM_MANAGER::instance().GetTable(acceItem->GetSocket(ACCE_ABSORBED_SOCKET)); if (!pkItemAbsorbed) return; if (pkItemAbsorbed->bType != ITEM_WEAPON) return; double AttBonusMax = static_cast<double>(pkItemAbsorbed->alValues[4] + pkItemAbsorbed->alValues[5]); AttBonusMax *= acceItem->GetSocket(ACCE_ABSORPTION_SOCKET); AttBonusMax /= 100; AttBonusMax += 0.5; double AttBonusMin = static_cast<double>(pkItemAbsorbed->alValues[3] + pkItemAbsorbed->alValues[5]); AttBonusMin *= acceItem->GetSocket(ACCE_ABSORPTION_SOCKET); AttBonusMin /= 100; AttBonusMin += 0.5; //todebug if(ch->IsPhase(PHASE_GAME)) ch->ChatPacket(CHAT_TYPE_INFO, "Going to add to your attack : min(%0.2f) max(%0.2f) ", AttBonusMin, AttBonusMax); *pdamMax += static_cast<int>(AttBonusMax); *pdamMin += static_cast<int>(AttBonusMin); } You may need to add #include "desc.h" at the beginning of the file if you got errors on IsPhase line In order to debug the code you need to use a sash with attack min and max as bonuses and to hit a mob
    1 point
  30. Can you please show me your void CPythonPlayer::__UpdateBattleStatus() Can you please try to hit a mob with and without the sash to check if server-side the bonus are applied? And last question, can you tell me if you changed the define with your one?
    1 point
  31. Nope thanks, i really prefer to write here what i ve to explain you, because i don't really do this for you, i do this for the whole community. I prefer my explanation to be accessible to all who have your problem. I ve updated with the complete answer.
    1 point
  32. Hi i'm looking for that system , if any one have it [Hidden Content]
    1 point
  33. M2 Download Center Download Here ( Internal ) Halloween sashes in three variants DOWNLOAD: [Hidden Content] Special place: [Hidden Content]
    1 point
  34. Recently there was a crash in the forum and some things were missing. I re-insert the hallowen image and a few images with some small edits.
    1 point
  35. M2 Download Center Download Here ( Internal ) Hey, Today i will share how can you change the Whitemark in Minimap with a new one. I saw that there is a topic in Questions & Answers but seems not complete so. Minimap Whitemark - New Download:
    1 point
  36. The RecvMainCharacter is useless HEADER_GC_MAIN_CHARACTER = 15 (Binary) and serverside HEADER_GC_MAIN_CHARACTER_OLD = 15. The right packet is the HEADER_GC_MAIN_CHARACTER2_EMPIRE = 113 (Binary) and serverside HEADER_GC_MAIN_CHARACTER = 113. About the BGM packets that updating the warp is all fine, cause you need to update the wrap for the right sound (I'm not sure if is really needed in binary though). I'm just saying this for understanding.
    1 point
  37. Well on my server we used 50 and there are more than 3k online, nobody reported any issue and it works perfect.
    1 point
  38. Hello DEVs I understand that most people use cloudless skyboxes in these times, but there is a graphic glitch (usually when the player teleports/dragging a game window) with "jumping" clouds. [Preview with glitch - slow cloud speed] This is very annoying with fast moving clouds: [Preview with glitch - fast cloud speed] and warping: [Preview with glitch - warping] Fix: Client source: \EterLib\SkyBox.cpp void CSkyBox::RenderCloud() replace whole: DWORD dwCurTime = CTimer::Instance().GetCurrentMillisecond(); m_fCloudPositionU += m_fCloudScrollSpeedU * (float)( dwCurTime - m_dwlastTime ) * 0.001f; if (m_fCloudPositionU >= 1.0f) m_fCloudPositionU = 0.0f; m_fCloudPositionV += m_fCloudScrollSpeedV * (float)( dwCurTime - m_dwlastTime ) * 0.001f; if (m_fCloudPositionV >= 1.0f) m_fCloudPositionV = 0.0f; m_dwlastTime = dwCurTime; with: if (m_fCloudPositionU >= 1.0f) m_fCloudPositionU = 0.0f; if (m_fCloudPositionV >= 1.0f) m_fCloudPositionV = 0.0f; m_fCloudPositionU += m_fCloudScrollSpeedU * 0.030f; m_fCloudPositionV += m_fCloudScrollSpeedV * 0.030f; like that: > * 0.030f is optimal I have no idea why they decided to use ms timer for scrolling clouds in the rendering function that already has own clock and frameskip settings (now it just scales with game fps counter). With fix (when dragging client window) [Preview without glitch - slow cloud speed] [Preview without glitch - fast cloud speed] Warping: [Preview without glitch - warp] Have a nice day
    1 point
  39. I like when i see people care about a such small things.
    1 point
  40. There's not much difference. [Hidden Content] TEST
    1 point
  41. M2 Download Center Download Here ( Internal ) A small detail, but how nice to look at I prepared the effect in two versions, with dark smoke and white smoke. DOWNLOAD: [Hidden Content]
    1 point
  42. Because I didnt found anything helpful, here a small release how to change your skills jumping from 17 to M1 or what ever you want 1. open char_skill.cpp 2. search for "case SKILL_NORMAL:" 3. 810 case SKILL_NORMAL: 811 // 번섭은 스킬 업그레이드 17~20 사이 랜덤 마스터 수련 812 if (GetSkillLevel(pkSk->dwVnum) >= 17) 813 SetSkillLevel (pkSk->dwVnum, 20); 814 { 815 816 } 817 break; change to this. Maybe i could help some people If its already public im sorry ^^
    1 point
  43. I noticed that every my client have the same bug, maybe sharing the fix prevents me from having to apply it to everyone and it also helps others who try the function and have problems. an example of buggy usage: File: scriptLib\PythonUtils.cpp bool PyTuple_GetUnsignedLong(PyObject* poArgs, int pos, unsigned long* ret) { if (pos >= PyTuple_Size(poArgs)) return false; PyObject * poItem = PyTuple_GetItem(poArgs, pos); if (!poItem) return false; *ret = PyLong_AsUnsignedLong(poItem); return true; } the problem seems to be PyLong_AsUnsignedLongLong which is buggy: #define PyLong_AsUnsignedLong PyLong_AsUnsignedLongLong how we could fix it? //replacing #define PyLong_AsUnsignedLong (unsigned long)PyLong_AsLongLong
    1 point
  44. I hope i say the Title with the right words for it i found this on a Chinese Site that is related to "Ymir Entertainment Co. Ltd" There are maskes for Old Armors that never have been seen before. and the first one i realy like because i never seen it in a "Black Color" I love it
    1 point
  45. Are that kind of developer who writes 100 lines of code without any comment?
    1 point
  46. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) There's just a smart python module which i did for fun, for a friend, no support for implementation. Enjoy. Github repository: [Hidden Content]
    1 point
  47. So you can define a new function, before def __GetAttributeColor(self, index, value) like this: def __AppendItemRarity(self, attrSlot): RareList = ["Common","Uncommon","Rare","Legendary","Epic","From other universe"] idxRarity = 0 if 0 != attrSlot: for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM): type = attrSlot[i][0] value = attrSlot[i][1] if value == 0: continue # HERE IS WHERE YOU MUST CHECK THE VALUES AND TYPES # # you have type and value, so you can increase idxRarity # like you want # ............... # The next lines is if idxRarity between 0 and 100 if idxRarity == 0: self.AppendTextLine(RareList[0], self.COLOR_RARE_0) elif idxRarity < 20: self.AppendTextLine(RareList[1], self.COLOR_RARE_1) elif idxRarity < 40: self.AppendTextLine(RareList[2], self.COLOR_RARE_2) elif idxRarity < 60: self.AppendTextLine(RareList[3], self.COLOR_RARE_3) elif idxRarity < 80: self.AppendTextLine(RareList[4], self.COLOR_RARE_4) else: self.AppendTextLine(RareList[5], self.COLOR_RARE_5) Search: self.__AppendAttributeInformation(attrSlot) And add after: self.__AppendItemRarity(attrSlot) And don't forget to define the colors in class ToolTip(ui.ThinBoard). ############ Some tips: - You can make a dictionary with some types and ranges of values to simplify. - You can use the same condition in attributes with "same values" (for example in defenses against weapons). ############ Example (i did it to test) :
    1 point
  48. 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.